Ticket #8522: commflag_split_blanks_v2.patch

File commflag_split_blanks_v2.patch, 10.2 KB (added by Jim Stichnoth <stichnot@…>, 11 years ago)
  • programs/mythfrontend/globalsettings.cpp

     
    559559    return bc;
    560560}
    561561
    562 static GlobalCheckBox *CommSkipAllBlanks()
     562static GlobalComboBox *CommSkipAllBlanks()
    563563{
    564     GlobalCheckBox *bc = new GlobalCheckBox("CommSkipAllBlanks");
     564    GlobalComboBox *bc = new GlobalComboBox("CommSkipAllBlanks");
    565565    bc->setLabel(QObject::tr("Skip blank frames after commercials"));
    566     bc->setValue(true);
     566    bc->addSelection(QObject::tr("Never"), "0");
     567    bc->addSelection(QObject::tr("Always"), "1");
     568    bc->addSelection(QObject::tr("Skip half the blank frames"), "2");
     569    bc->setValue(1);
    567570    bc->setHelpText(QObject::tr("When using blank frame detection and "
    568571                    "automatic flagging, include blank frames following "
    569572                    "commercial breaks as part of the commercial break."));
  • programs/mythcommflag/BlankFrameDetector.h

     
    3131        { return (index) ? blankMap : breakMap; }
    3232
    3333    /* BlankFrameDetector interface. */
    34     bool getSkipCommBlanks(void) const { return skipcommblanks; }
     34    int getSkipCommBlanks(void) const { return skipcommblanks; }
    3535    const FrameAnalyzer::FrameMap *getBlanks(void) const { return &blankMap; }
    3636    int computeForLogoSurplus(const TemplateMatcher *tm);
    3737    int computeForLogoDeficit(const TemplateMatcher *tm);
     
    4040private:
    4141    HistogramAnalyzer       *histogramAnalyzer;
    4242    float                   fps;
    43     bool                    skipcommblanks;         /* skip commercial blanks */
     43    int                     skipcommblanks;         /* skip commercial blanks */
    4444
    4545    FrameAnalyzer::FrameMap blankMap;
    4646    FrameAnalyzer::FrameMap breakMap;
  • programs/mythcommflag/ClassicCommDetector.h

     
    153153        bool logoInfoAvailable;
    154154        LogoDetectorBase* logoDetector;
    155155
    156         bool skipAllBlanks;
     156        int skipAllBlanks;
    157157
    158158        unsigned char *framePtr;
    159159
  • programs/mythcommflag/BlankFrameDetector.cpp

     
    204204
    205205void
    206206computeBreakMap(FrameAnalyzer::FrameMap *breakMap,
    207         const FrameAnalyzer::FrameMap *blankMap, float fps, bool skipcommblanks,
     207        const FrameAnalyzer::FrameMap *blankMap, float fps, int skipcommblanks,
    208208        int debugLevel)
    209209{
    210210    /*
     
    345345    {
    346346        long long iib = iibreak.key();
    347347        long long iie = iib + *iibreak;
     348        FrameAnalyzer::FrameMap::iterator jjbreak = iibreak;
     349        ++jjbreak;
     350        breakMap->erase(iibreak);
    348351
    349         if (!skipcommblanks)
     352        if (skipcommblanks == 0 || skipcommblanks == 2)
    350353        {
    351354            /* Trim leading blanks from commercial break. */
    352             FrameAnalyzer::FrameMap::const_iterator iiblank =
    353                 blankMap->find(iib);
    354             FrameAnalyzer::FrameMap::iterator jjbreak = iibreak;
    355             ++jjbreak;
    356             iib += *iiblank;
    357             breakMap->erase(iibreak);
    358             breakMap->insert(iib, iie - iib);
    359             iibreak = jjbreak;
     355            long long addb = *blankMap->find(iib);
     356            if (skipcommblanks == 2)
     357                addb /= 2;
     358            iib += addb;
    360359        }
    361         else
     360        if (skipcommblanks == 1 || skipcommblanks == 2)
    362361        {
    363362            /* Add trailing blanks to commercial break. */
    364             ++iibreak;
    365             FrameAnalyzer::FrameMap::const_iterator jjblank =
    366                 blankMap->find(iie);
    367             iie += *jjblank;
    368             breakMap->remove(iib);
    369             breakMap->insert(iib, iie - iib);
     363            long long adde = *blankMap->find(iie);
     364            if (skipcommblanks == 2)
     365                adde /= 2;
     366            iie += adde;
    370367        }
     368        breakMap->insert(iib, iie - iib);
     369        iibreak = jjbreak;
    371370    }
    372371}
    373372
     
    379378    , fps(0.0f)
    380379    , debugLevel(0)
    381380{
    382     skipcommblanks = gCoreContext->GetNumSetting("CommSkipAllBlanks", 1) != 0;
     381    skipcommblanks = gCoreContext->GetNumSetting("CommSkipAllBlanks", 1);
    383382
    384383    VERBOSE(VB_COMMFLAG, QString("BlankFrameDetector: skipcommblanks=%1")
    385             .arg(skipcommblanks ? "true" : "false"));
     384            .arg(skipcommblanks));
    386385
    387386    /*
    388387     * debugLevel:
  • programs/mythcommflag/TemplateMatcher.cpp

     
    673673TemplateMatcher::adjustForBlanks(const BlankFrameDetector *blankFrameDetector,
    674674    long long nframes)
    675675{
    676     const bool skipCommBlanks = blankFrameDetector->getSkipCommBlanks();
     676    const int skipCommBlanks = blankFrameDetector->getSkipCommBlanks();
    677677    const FrameAnalyzer::FrameMap *blankMap = blankFrameDetector->getBlanks();
    678678
    679679    /*
     
    778778        if (jj != blankMap->constEnd())
    779779        {
    780780            newbrkb = jj.key();
    781             if (!skipCommBlanks)
     781            if (skipCommBlanks == 0)
    782782                newbrkb += *jj;
     783            else if (skipCommBlanks == 2)
     784                newbrkb += *jj / 2;
    783785        }
    784786
    785787        /*
     
    796798        if (kk != blankMap->constEnd())
    797799        {
    798800            newbrke = kk.key();
    799             if (skipCommBlanks)
     801            if (skipCommBlanks == 1)
    800802                newbrke += *kk;
     803            else if (skipCommBlanks == 2)
     804                newbrke += *kk / 2;
    801805        }
    802806
    803807        /*
  • programs/mythcommflag/ClassicCommDetector.cpp

     
    170170    commDetectMaxCommLength =
    171171        gCoreContext->GetNumSetting("CommDetectMaxCommLength", 125);
    172172
    173     skipAllBlanks = !!gCoreContext->GetNumSetting("CommSkipAllBlanks", 1);
     173    skipAllBlanks = gCoreContext->GetNumSetting("CommSkipAllBlanks", 1);
    174174    commDetectBlankCanHaveLogo =
    175175        !!gCoreContext->GetNumSetting("CommDetectBlankCanHaveLogo", 1);
    176176}
     
    17911791    {
    17921792        if (*it == MARK_COMM_START)
    17931793        {
    1794             lastStart = it.key();
    1795             if (skipAllBlanks)
    1796             {
    1797                 while ((lastStart > 0) &&
    1798                         (frameInfo[lastStart - 1].flagMask & COMM_FRAME_BLANK))
    1799                     lastStart--;
    1800             }
    1801             else
    1802             {
    1803                 while ((lastStart < (framesProcessed - (2 * fps))) &&
    1804                         (frameInfo[lastStart + 1].flagMask & COMM_FRAME_BLANK))
    1805                     lastStart++;
    1806             }
     1794            uint64_t lastStartLower = it.key();
     1795            uint64_t lastStartUpper = it.key();
     1796            while ((lastStartLower > 0) &&
     1797                   (frameInfo[lastStartLower - 1].flagMask & COMM_FRAME_BLANK))
     1798                lastStartLower--;
     1799            while ((lastStartUpper < (framesProcessed - (2 * fps))) &&
     1800                   (frameInfo[lastStartUpper + 1].flagMask & COMM_FRAME_BLANK))
     1801                lastStartUpper++;
     1802            if (skipAllBlanks == 0)
     1803                lastStart = lastStartUpper;
     1804            else if (skipAllBlanks == 2)
     1805                lastStart = (lastStartLower + lastStartUpper) / 2;
     1806            else // default is 1
     1807                lastStart = lastStartLower;
    18071808
    18081809            if (verboseDebugging)
    18091810                VERBOSE(VB_COMMFLAG, QString("Start Mark: %1 -> %2")
     
    18141815        }
    18151816        else
    18161817        {
    1817             lastEnd = it.key();
    1818             if (skipAllBlanks)
    1819             {
    1820                 while ((lastEnd < (framesProcessed - (2 * fps))) &&
    1821                         (frameInfo[lastEnd + 1].flagMask & COMM_FRAME_BLANK))
    1822                     lastEnd++;
    1823             }
    1824             else
    1825             {
    1826                 while ((lastEnd > 0) &&
    1827                         (frameInfo[lastEnd - 1].flagMask & COMM_FRAME_BLANK))
    1828                     lastEnd--;
    1829             }
     1818            uint64_t lastEndLower = it.key();
     1819            uint64_t lastEndUpper = it.key();
     1820            while ((lastEndUpper < (framesProcessed - (2 * fps))) &&
     1821                   (frameInfo[lastEndUpper + 1].flagMask & COMM_FRAME_BLANK))
     1822                lastEndUpper++;
     1823            while ((lastEndLower > 0) &&
     1824                   (frameInfo[lastEndLower - 1].flagMask & COMM_FRAME_BLANK))
     1825                lastEndLower--;
     1826            if (skipAllBlanks == 0)
     1827                lastEnd = lastEndLower;
     1828            else if (skipAllBlanks == 2)
     1829                lastEnd = (lastEndLower + lastEndUpper) / 2;
     1830            else // default is 1
     1831                lastEnd = lastEndUpper;
    18301832
    18311833            if (verboseDebugging)
    18321834                VERBOSE(VB_COMMFLAG, QString("End Mark  : %1 -> %2")
     
    19391941    for(; i < (commercials-1); i++)
    19401942    {
    19411943        long long r = c_start[i];
     1944        long long adjustment = 0;
    19421945
    19431946        if ((r < (30 * fps)) &&
    19441947            (first_comm))
     
    19611964            }
    19621965
    19631966            if (skipAllBlanks)
     1967            {
    19641968                while((blankFrameMap.contains(r+1)) &&
    19651969                        (c_start[i+1] != (r+1)))
     1970                {
    19661971                    r++;
     1972                    adjustment++;
     1973                }
     1974            }
    19671975        }
    19681976        else
    19691977        {
    19701978            if (skipAllBlanks)
    19711979                while(blankFrameMap.contains(r+1))
     1980                {
    19721981                    r++;
     1982                    adjustment++;
     1983                }
    19731984        }
    19741985
     1986        if (skipAllBlanks == 2)
     1987            r -= (adjustment / 2);
    19751988        blankCommMap[r] = MARK_COMM_END;
    19761989        first_comm = false;
    19771990    }