Ticket #862: xds.diff

File xds.diff, 7.9 KB (added by kkuphal, 20 years ago)

Updated patch with more human readable information. Be warned, lots of VERBOSITY here as before.

  • libs/libmythtv/ccdecoder.h

     
    7272    // WSS data
    7373    uint            wss_flags;
    7474    bool            wss_valid;
     75
     76    // XDS data
     77    bool            xds_vchip;
     78    bool            xds_ptype;
     79    bool            xds_stime;
     80    bool            xds_plength;
     81    bool            xds_pname;
     82    QString         xds_ProgramName;
     83    int             xds_cnt;
     84    int             xds_buf[32];
    7585};
    7686
    7787#endif
  • libs/libmythtv/ccdecoder.cpp

     
    1111CCDecoder::CCDecoder(CCReader *ccr)
    1212    : reader(ccr), rbuf(new unsigned char[sizeof(ccsubtitle)+255]),
    1313      vps_l(0),
    14       wss_flags(0), wss_valid(false)
     14      wss_flags(0), wss_valid(false), xds_vchip(false), xds_ptype(false),
     15      xds_plength(false), xds_pname(false), xds_stime(false)
    1516{
    1617    for (uint i = 0; i < 2; i++)
    1718    {
     
    5657
    5758    bzero(vps_pr_label, sizeof(vps_pr_label));
    5859    bzero(vps_label,    sizeof(vps_label));
     60
     61    xds_ProgramName = "";
     62    xds_cnt = 0;
     63    bzero(xds_buf,      sizeof(xds_buf));
    5964}
    6065
    6166CCDecoder::~CCDecoder(void)
     
    190195        int xds_packet = 1;
    191196
    192197        // TODO: process XDS packets
     198        // VERBOSE(VB_VBI, QString("XDS Packet : %1 %2").arg(b1).arg(b2));
    193199        if (b1 == 0x0F)
    194200        {
    195201            // end XDS
     
    209215        }
    210216
    211217        if (xds_packet)
    212             goto skip;
     218//             goto skip;
     219        {
     220            // VERBOSE(VB_VBI, QString("XDS Packet : %1 %2").arg(b1).arg(b2));
     221            // Detect data packets
     222            if (xds_stime) {
     223               if (b1 == 0x0F)
     224               {
     225                   xds_stime = 0;
     226                   VERBOSE(VB_VBI, QString("XDS Packet: Start Time/Program ID: End"));
     227               } else {
     228                   // Process Start Time packets here
     229                   VERBOSE(VB_VBI, QString("XDS Packet: Start Time/Program ID: Packet %1 %2").arg(b1).arg(b2));
     230               }
     231            } else if (xds_plength) {
     232               if (b1 == 0x0F)
     233               {
     234                   xds_plength = 0;
     235                   // Payload bytes 1 and 2 are minutes and hours in length
     236                   if (xds_cnt > 0)
     237                       VERBOSE(VB_VBI, QString("XDS Packet: Program Length: %1 hours, %1 minutes").arg(xds_buf[1]-64).arg(xds_buf[0]-64));
     238                   // Payload bytes 3 and 4 are elapsed minutes and hours in length
     239                  if (xds_cnt >= 2)
     240                       VERBOSE(VB_VBI, QString("XDS Packet: Program Elapsed: %1 hours, %1 mintues").arg(xds_buf[3]-64).arg(xds_buf[2]-64));
     241                   // If Payload byte 6 is filler 0x40, then payload byte 5 is elapsed seconds
     242                   if ((xds_cnt >= 4) && (xds_buf[5]==0x40))
     243                       VERBOSE(VB_VBI, QString("XDS Packet: Program Elapsed: %1 seconds").arg(xds_buf[4]-64));
     244
     245                   // VERBOSE(VB_VBI, QString("XDS Packet: Program Length/Time in Show: End"));
     246               } else {
     247                   // Process Program Length packets here
     248                   // VERBOSE(VB_VBI, QString("XDS Packet: Program Length/Time in Show: Packet %1 %2").arg(b1).arg(b2));
     249                   xds_buf[xds_cnt] = b1;
     250                   xds_cnt++;
     251                   xds_buf[xds_cnt] = b2;
     252                   xds_cnt++;
     253               }
     254            } else if (xds_pname) {
     255               if (b1 == 0x0F)
     256               {
     257                   xds_pname = 0;
     258                   // VERBOSE(VB_VBI, QString("XDS Packet: Program Name: B2 %1").arg(b2));
     259                   VERBOSE(VB_VBI, QString("XDS Packet: Program Name: %1").arg(xds_ProgramName));
     260                   // VERBOSE(VB_VBI, QString("XDS Packet: Program Name: End"));
     261               } else {
     262                   // Process Program Name packets here
     263                   // VERBOSE(VB_VBI, QString("XDS Packet: Program Name: Packet %1 %2").arg(b1).arg(b2));
     264                   xds_ProgramName += CharCC(b1);
     265                   xds_ProgramName += CharCC(b2);
     266               }
     267            } else if (xds_ptype) {
     268               if (b1 == 0x0F)
     269               {
     270                   xds_ptype = 0;
     271                   VERBOSE(VB_VBI, QString("XDS Packet: Program Type: End"));
     272               } else {
     273                   // Process Program Type packets here
     274                   if ((b1 == 0xA8) || (b2 == 0xA8))
     275                       VERBOSE(VB_VBI, QString("XDS Packet: Program Type: Advertisement"));
     276       
     277                    VERBOSE(VB_VBI, QString("XDS Packet: Program Type: %1 %2").arg(b1).arg(b2));
     278               }
     279            } else if (xds_vchip) {
     280                if (b1 == 0x0F)
     281                {
     282                    xds_vchip = 0;
     283                    // VERBOSE(VB_VBI, QString("XDS Packet: VChip: End"));
     284                } else {
     285                    int xds_vchip_mpaa = (b2 & 0x07);
     286                    switch (xds_vchip_mpaa) {
     287                        case 0x01:
     288                            VERBOSE(VB_VBI, QString("XDS Packet: VChip Rating: TV-Y"));
     289                            break;
     290                        case 0x02:
     291                            VERBOSE(VB_VBI, QString("XDS Packet: VChip Rating: TV-Y7"));
     292                            break;
     293                        case 0x03:
     294                            VERBOSE(VB_VBI, QString("XDS Packet: VChip Rating: TV-G"));
     295                            break;
     296                        case 0x04:
     297                            VERBOSE(VB_VBI, QString("XDS Packet: VChip Rating: TV-PG"));
     298                            break;
     299                        case 0x05:
     300                            VERBOSE(VB_VBI, QString("XDS Packet: VChip Rating: TV-14"));
     301                            break;
     302                        case 0x06:
     303                            VERBOSE(VB_VBI, QString("XDS Packet: VChip Rating: TV-MA"));
     304                            break;
     305                        default:
     306                            VERBOSE(VB_VBI, QString("XDS Packet: VChip Rating: None"));
     307                            break;
     308                    }
     309                    if (b1 & 0x20)
     310                        VERBOSE(VB_VBI, QString("XDS Packet: VChip Flag: Suggestive Dialog"));
     311                    if (b2 & 0x20)
     312                        VERBOSE(VB_VBI, QString("XDS Packet: VChip Flag: Violence"));
     313                    if (b2 & 0x08)
     314                        VERBOSE(VB_VBI, QString("XDS Packet: VChip Flag: Language"));
     315                    if (b2 & 0x10)
     316                        VERBOSE(VB_VBI, QString("XDS Packet: VChip Flag: Sexual Situations"));
     317                }
     318            // Detect start packets
     319            } else if ((b1 == 0x01) && (b2 == 0x01)) {
     320                VERBOSE(VB_VBI, QString("XDS Packet: Start Time/Program ID"));
     321                xds_stime = 1;
     322            } else if ((b1 == 0x01) && (b2 == 0x02)) {
     323                // VERBOSE(VB_VBI, QString("XDS Packet: Program Length/Time in Show"));
     324                xds_plength = 1;
     325                bzero(xds_buf, sizeof(xds_buf));
     326                xds_cnt = 0;
     327            } else if ((b1 == 0x01) && (b2 == 0x03)) {
     328                // VERBOSE(VB_VBI, QString("XDS Packet: Program Name"));
     329                xds_pname = 1;
     330                xds_ProgramName = "";
     331            } else if ((b1 == 0x01) && (b2 == 0x04)) {
     332                VERBOSE(VB_VBI, QString("XDS Packet: Program Type"));
     333                xds_ptype = 1;
     334            } else if ((b1 == 0x01) && (b2 == 0x05)) {
     335                // VERBOSE(VB_VBI, QString("XDS Packet: V-Chip"));
     336                xds_vchip = 1;
     337            } else
     338                VERBOSE(VB_VBI, QString("Unknown XDS Packet : %1 %2").arg(b1).arg(b2));
     339        }
    213340    }
    214341
    215342    if (b1 & 0x60)