Ticket #1558: ignore_cc_tc-9409.patch

File ignore_cc_tc-9409.patch, 8.9 KB (added by gtgj@…, 15 years ago)

Ignore timecode in EIA-608 CC decoder

  • libs/libmythtv/avformatdecoder.cpp

     
    284284    bzero(&params, sizeof(AVFormatParameters));
    285285    bzero(prvpkt, 3 * sizeof(char));
    286286    bzero(audioSamples, AVCODEC_MAX_AUDIO_FRAME_SIZE * sizeof(short int));
     287    ccd608->IgnoreTimecode();
    287288
    288289    bool debug = (bool)(print_verbose_messages & VB_LIBAV);
    289290    av_log_set_level((debug) ? AV_LOG_DEBUG : AV_LOG_ERROR);
  • libs/libmythtv/NuppelVideoPlayer.h

     
    2525}
    2626using namespace std;
    2727
    28 #define MAXTBUFFER 21
     28#define MAXTBUFFER 60
    2929
    3030#ifndef LONG_LONG_MIN
    3131#define LONG_LONG_MIN LLONG_MIN
  • libs/libmythtv/ccdecoder.h

     
    2121    CCDecoder(CCReader *ccr);
    2222    ~CCDecoder();
    2323
     24    void IgnoreTimecode(void) { ignore_tc = true; }
    2425    void FormatCC(int tc, int code1, int code2);
    2526    void FormatCCField(int tc, int field, int data);
     27    int FalseDup(int tc, int field, int data);
    2628
    2729    void DecodeVPS(const unsigned char *buf);
    2830    void DecodeWSS(const unsigned char *buf);
     
    4345
    4446    CCReader *reader;
    4547
     48    bool ignore_tc;
     49
    4650    // per-field
    4751    int badvbi[2];
    4852    int lasttc[2];
  • libs/libmythtv/ccdecoder.cpp

     
    1010
    1111CCDecoder::CCDecoder(CCReader *ccr)
    1212    : reader(ccr), rbuf(new unsigned char[sizeof(ccsubtitle)+255]),
     13      ignore_tc(false),
    1314      vps_l(0),
    1415      wss_flags(0),       wss_valid(false),
    1516      xds_vchip(false),   xds_ptype(false),
     
    130131
    131132    b1 = data & 0x7f;
    132133    b2 = (data >> 8) & 0x7f;
    133 //    printf("%10d:  %02x %02x\n", tc, b1, b2);
     134    VERBOSE(VB_VBI, QString("Format CC @%1/%2 = %3 %4")
     135                    .arg(tc).arg(field)
     136                    .arg((data&0xff), 2, 16)
     137                    .arg((data&0xff00)>>8, 2, 16));
    134138    if (ccmode[field] >= 0)
    135139    {
    136140        mode = field << 2 |
     
    144148        len = 0;
    145149    }
    146150
    147     // bttv-0.9 VBI reads are pretty reliable (1 read/33367us).
    148     // bttv-0.7 reads don't seem to work as well so if read intervals
    149     // vary from this, be more conservative in detecting duplicate
    150     // CC codes.
    151     int dup_text_fudge, dup_ctrl_fudge;
    152     if (badvbi[field] < 100 && b1 != 0 && b2 != 0)
    153     {
    154         int d = tc - lasttc[field];
    155         if (d < 25 || d > 42)
    156             badvbi[field]++;
    157         else if (badvbi[field] > 0)
    158             badvbi[field]--;
    159     }
    160     if (badvbi[field] < 4)
    161     {
    162         // this should pick up all codes
    163         dup_text_fudge = -2;
    164         // this should pick up 1st, 4th, 6th, 8th, ... codes
    165         dup_ctrl_fudge = 33 - 4;
    166     }
    167     else
    168     {
    169         dup_text_fudge = 4;
    170         dup_ctrl_fudge = 33 - 4;
    171     }
     151    if (FalseDup(tc, field, data))
     152        goto skip;
    172153
    173     if (data == lastcode[field])
    174     {
    175         int false_dup = 1;
    176         if ((b1 & 0x70) == 0x10)
    177         {
    178             if (tc > (lastcodetc[field] + 67 + dup_ctrl_fudge))
    179                 false_dup = 0;
    180         }
    181         else if (b1)
    182         {
    183             // text, XDS
    184             if (tc > (lastcodetc[field] + 33 + dup_text_fudge))
    185                 false_dup = 0;
    186         }
    187 
    188         if (false_dup)
    189             goto skip;
    190     }
    191 
    192154    DecodeXDS(field, b1, b2);
    193155
    194156    if (b1 & 0x60)
     
    427389                            style[mode] = CC_STYLE_ROLLUP;
    428390                            break;
    429391                        case 0x2C:      //erase displayed memory
    430                             if ((tc - lastclr[mode]) > 5000 ||
     392                            if (ignore_tc ||
     393                                (tc - lastclr[mode]) > 5000 ||
    431394                                lastclr[mode] == 0)
    432395                                // don't overflow the frontend with
    433396                                // too many redundant erase codes
     
    461424                                    // flush
    462425                                    BufferCC(mode, len, 0);
    463426                            }
    464                             else if ((tc - lastclr[mode]) > 5000 ||
     427                            else if (ignore_tc ||
     428                                     (tc - lastclr[mode]) > 5000 ||
    465429                                     lastclr[mode] == 0)
    466430                                // clear and flush
    467431                                BufferCC(mode, len, 1);
     
    514478    for (mode = field*4; mode < (field*4 + 4); mode++)
    515479    {
    516480        len = ccbuf[mode].length();
    517         if (((tc - timecode[mode]) > 100) &&
    518             (style[mode] != CC_STYLE_POPUP) && len)
     481        if ((ignore_tc || ((tc - timecode[mode]) > 100)) &&
     482             (style[mode] != CC_STYLE_POPUP) && len)
    519483        {
    520484            // flush unfinished line if waiting too long
    521485            // in paint-on or scroll-up mode
     
    535499    lasttc[field] = tc;
    536500}
    537501
     502int CCDecoder::FalseDup(int tc, int field, int data)
     503{
     504    int b1, b2;
     505
     506    b1 = data & 0x7f;
     507    b2 = (data >> 8) & 0x7f;
     508
     509    if (ignore_tc)
     510    {
     511        // just suppress duplicate control codes
     512        if ((data == lastcode[field]) &&
     513            ((b1 & 0x70) == 0x10))
     514            return 1;
     515        else
     516            return 0;
     517    }
     518
     519    // bttv-0.9 VBI reads are pretty reliable (1 read/33367us).
     520    // bttv-0.7 reads don't seem to work as well so if read intervals
     521    // vary from this, be more conservative in detecting duplicate
     522    // CC codes.
     523    int dup_text_fudge, dup_ctrl_fudge;
     524    if (badvbi[field] < 100 && b1 != 0 && b2 != 0)
     525    {
     526        int d = tc - lasttc[field];
     527        if (d < 25 || d > 42)
     528            badvbi[field]++;
     529        else if (badvbi[field] > 0)
     530            badvbi[field]--;
     531    }
     532    if (badvbi[field] < 4)
     533    {
     534        // this should pick up all codes
     535        dup_text_fudge = -2;
     536        // this should pick up 1st, 4th, 6th, 8th, ... codes
     537        dup_ctrl_fudge = 33 - 4;
     538    }
     539    else
     540    {
     541        dup_text_fudge = 4;
     542        dup_ctrl_fudge = 33 - 4;
     543    }
     544
     545    if (data == lastcode[field])
     546    {
     547        if ((b1 & 0x70) == 0x10)
     548        {
     549            if (tc > (lastcodetc[field] + 67 + dup_ctrl_fudge))
     550                return 0;
     551        }
     552        else if (b1)
     553        {
     554            // text, XDS
     555            if (tc > (lastcodetc[field] + 33 + dup_text_fudge))
     556                return 0;
     557        }
     558
     559        return 1;
     560    }
     561
     562    return 0;
     563}
     564
    538565void CCDecoder::ResetCC(int mode)
    539566{
    540567//    lastrow[mode] = 0;
     
    586613    else
    587614        len = sizeof(ccsubtitle);
    588615
     616    VERBOSE(VB_VBI, QString("### %1 %2 %3 %4 %5 %6 %7 -")
     617                           .arg(timecode[mode], 10)
     618                           .arg(row[mode], 2).arg(rowcount[mode])
     619                           .arg(style[mode]).arg(f, 2, 16)
     620                           .arg(clr).arg(len, 3));
     621    if ((print_verbose_messages & VB_VBI) != 0
     622        && len)
     623    {
     624        QString dispbuf = QString::fromUtf8(tmpbuf, len);
     625        VERBOSE(VB_VBI, QString("%1 '").arg(timecode[mode], 10));
     626        QString vbuf = "";
     627        unsigned int i = 0;
     628        while (i < dispbuf.length()) {
     629            QChar cp = dispbuf.at(i);
     630            switch (cp.unicode())
     631            {
     632                case 0x2120 :  vbuf += "(SM)"; break;
     633                case 0x2122 :  vbuf += "(TM)"; break;
     634                case 0x2014 :  vbuf += "(--)"; break;
     635                case 0x201C :  vbuf += "``"; break;
     636                case 0x201D :  vbuf += "''"; break;
     637                case 0x250C :  vbuf += "|-"; break;
     638                case 0x2510 :  vbuf += "-|"; break;
     639                case 0x2514 :  vbuf += "|_"; break;
     640                case 0x2518 :  vbuf += "_|"; break;
     641                case 0x2588 :  vbuf += "[]"; break;
     642                case 0x266A :  vbuf += "o/~"; break;
     643                case '\b'   :  vbuf += "\\b"; break;
     644                default     :  vbuf += cp.latin1();
     645            }
     646            i++;
     647        }
     648        VERBOSE(VB_VBI, vbuf);
     649    }
     650
    589651    reader->AddTextData(rbuf, len, timecode[mode], 'C');
    590652
    591653    resumetext[mode] = 0;
  • programs/mythcommflag/ClassicCommDetector.cpp

     
    285285                "NVP: Unable to initialize video for FlagCommercials.");
    286286        return false;
    287287    }
     288    nvp->SetCaptionsEnabled(false);
    288289
    289290    if ((commDetectMethod & COMM_DETECT_LOGO) &&
    290291        ((nvp->GetLength() == 0) ||