Ticket #8522: commflag_split_blanks_v3.patch
File commflag_split_blanks_v3.patch, 11.4 KB (added by , 14 years ago) |
---|
-
programs/mythfrontend/globalsettings.cpp
832 832 return bc; 833 833 } 834 834 835 static GlobalCheckBox *CommSkipAllBlanks()836 {837 GlobalCheckBox *bc = new GlobalCheckBox("CommSkipAllBlanks");838 bc->setLabel(QObject::tr("Skip blank frames after commercials"));839 bc->setValue(true);840 bc->setHelpText(QObject::tr("When using blank frame detection and "841 "automatic flagging, enable this option to include blank "842 "frames following commercial breaks as part of the "843 "commercial break."));844 return bc;845 }846 847 835 static HostSpinBox *CommRewindAmount() 848 836 { 849 837 HostSpinBox *gs = new HostSpinBox("CommRewindAmount", 0, 10, 1); … … 4143 4131 comms->addChild(CommNotifyAmount()); 4144 4132 comms->addChild(MaximumCommercialSkip()); 4145 4133 comms->addChild(MergeShortCommBreaks()); 4146 comms->addChild(CommSkipAllBlanks());4147 4134 addChild(comms); 4148 4135 4149 4136 #if CONFIG_DARWIN -
programs/mythcommflag/BlankFrameDetector.h
31 31 { return (index) ? blankMap : breakMap; } 32 32 33 33 /* BlankFrameDetector interface. */ 34 bool getSkipCommBlanks(void) const { return skipcommblanks; }35 34 const FrameAnalyzer::FrameMap *getBlanks(void) const { return &blankMap; } 36 35 int computeForLogoSurplus(const TemplateMatcher *tm); 37 36 int computeForLogoDeficit(const TemplateMatcher *tm); … … 40 39 private: 41 40 HistogramAnalyzer *histogramAnalyzer; 42 41 float fps; 43 bool skipcommblanks; /* skip commercial blanks */44 42 45 43 FrameAnalyzer::FrameMap blankMap; 46 44 FrameAnalyzer::FrameMap breakMap; -
programs/mythcommflag/BlankFrameDetector.cpp
204 204 205 205 void 206 206 computeBreakMap(FrameAnalyzer::FrameMap *breakMap, 207 const FrameAnalyzer::FrameMap *blankMap, float fps, bool skipcommblanks,207 const FrameAnalyzer::FrameMap *blankMap, float fps, 208 208 int debugLevel) 209 209 { 210 210 /* … … 339 339 break; 340 340 } 341 341 342 /* Adjust for skipcommblanks configuration. */342 /* Adjust for blank intervals. */ 343 343 FrameAnalyzer::FrameMap::iterator iibreak = breakMap->begin(); 344 344 while (iibreak != breakMap->end()) 345 345 { 346 346 long long iib = iibreak.key(); 347 347 long long iie = iib + *iibreak; 348 FrameAnalyzer::FrameMap::iterator jjbreak = iibreak; 349 ++jjbreak; 350 breakMap->erase(iibreak); 348 351 349 if (!skipcommblanks) 350 { 351 /* 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; 360 } 361 else 362 { 363 /* 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); 370 } 352 /* Trim leading blanks from commercial break. */ 353 long long addb = *blankMap->find(iib); 354 addb = addb / 2; 355 if (addb > MAX_BLANK_FRAMES) 356 addb = MAX_BLANK_FRAMES; 357 iib += addb; 358 /* Add trailing blanks to commercial break. */ 359 long long adde = *blankMap->find(iie); 360 iie += adde; 361 long long sube = adde / 2; 362 if (sube > MAX_BLANK_FRAMES) 363 sube = MAX_BLANK_FRAMES; 364 iie -= sube; 365 breakMap->insert(iib, iie - iib); 366 iibreak = jjbreak; 371 367 } 372 368 } 373 369 … … 379 375 , fps(0.0f) 380 376 , debugLevel(0) 381 377 { 382 skipcommblanks = gCoreContext->GetNumSetting("CommSkipAllBlanks", 1) != 0;383 384 VERBOSE(VB_COMMFLAG, QString("BlankFrameDetector: skipcommblanks=%1")385 .arg(skipcommblanks ? "true" : "false"));386 387 378 /* 388 379 * debugLevel: 389 380 * 0: no debugging … … 573 564 /* 574 565 * Compute breaks (breakMap). 575 566 */ 576 computeBreakMap(&breakMap, &blankMap, fps, skipcommblanks,debugLevel);567 computeBreakMap(&breakMap, &blankMap, fps, debugLevel); 577 568 578 569 /* 579 570 * Expand blank-frame breaks to fully include overlapping logo breaks. … … 650 641 if (breakMap.empty()) 651 642 { 652 643 /* Compute breaks (breakMap). */ 653 computeBreakMap(&breakMap, &blankMap, fps, skipcommblanks,debugLevel);644 computeBreakMap(&breakMap, &blankMap, fps, debugLevel); 654 645 frameAnalyzerReportMap(&breakMap, fps, "BF Break"); 655 646 } 656 647 -
programs/mythcommflag/ClassicCommDetector.h
153 153 bool logoInfoAvailable; 154 154 LogoDetectorBase* logoDetector; 155 155 156 bool skipAllBlanks;157 158 156 unsigned char *framePtr; 159 157 160 158 frm_dir_map_t blankFrameMap; -
programs/mythcommflag/TemplateMatcher.cpp
673 673 TemplateMatcher::adjustForBlanks(const BlankFrameDetector *blankFrameDetector, 674 674 long long nframes) 675 675 { 676 const bool skipCommBlanks = blankFrameDetector->getSkipCommBlanks();677 676 const FrameAnalyzer::FrameMap *blankMap = blankFrameDetector->getBlanks(); 678 677 679 678 /* … … 778 777 if (jj != blankMap->constEnd()) 779 778 { 780 779 newbrkb = jj.key(); 781 if (!skipCommBlanks) 782 newbrkb += *jj; 780 long long adj = *jj / 2; 781 if (adj > MAX_BLANK_FRAMES) 782 adj = MAX_BLANK_FRAMES; 783 newbrkb += adj; 783 784 } 784 785 785 786 /* … … 796 797 if (kk != blankMap->constEnd()) 797 798 { 798 799 newbrke = kk.key(); 799 if (skipCommBlanks) 800 newbrke += *kk; 800 long long adj = *kk; 801 newbrke += adj; 802 adj /= 2; 803 if (adj > MAX_BLANK_FRAMES) 804 adj = MAX_BLANK_FRAMES; 805 newbrke -= adj; 801 806 } 802 807 803 808 /* -
programs/mythcommflag/CommDetectorBase.h
9 9 10 10 #include "programtypes.h" 11 11 12 #define MAX_BLANK_FRAMES 60 13 12 14 typedef enum commMapValues { 13 15 MARK_START = 0, 14 16 MARK_END = 1, -
programs/mythcommflag/ClassicCommDetector.cpp
170 170 commDetectMaxCommLength = 171 171 gCoreContext->GetNumSetting("CommDetectMaxCommLength", 125); 172 172 173 skipAllBlanks = !!gCoreContext->GetNumSetting("CommSkipAllBlanks", 1);174 173 commDetectBlankCanHaveLogo = 175 174 !!gCoreContext->GetNumSetting("CommDetectBlankCanHaveLogo", 1); 176 175 } … … 1786 1785 { 1787 1786 if (*it == MARK_COMM_START) 1788 1787 { 1789 lastStart = it.key(); 1790 if (skipAllBlanks) 1791 { 1792 while ((lastStart > 0) && 1793 (frameInfo[lastStart - 1].flagMask & COMM_FRAME_BLANK)) 1794 lastStart--; 1795 } 1796 else 1797 { 1798 while ((lastStart < (framesProcessed - (2 * fps))) && 1799 (frameInfo[lastStart + 1].flagMask & COMM_FRAME_BLANK)) 1800 lastStart++; 1801 } 1788 uint64_t lastStartLower = it.key(); 1789 uint64_t lastStartUpper = it.key(); 1790 while ((lastStartLower > 0) && 1791 (frameInfo[lastStartLower - 1].flagMask & COMM_FRAME_BLANK)) 1792 lastStartLower--; 1793 while ((lastStartUpper < (framesProcessed - (2 * fps))) && 1794 (frameInfo[lastStartUpper + 1].flagMask & COMM_FRAME_BLANK)) 1795 lastStartUpper++; 1796 uint64_t adj = (lastStartUpper - lastStartLower) / 2; 1797 if (adj > MAX_BLANK_FRAMES) 1798 adj = MAX_BLANK_FRAMES; 1799 lastStart = lastStartLower + adj; 1802 1800 1803 1801 if (verboseDebugging) 1804 1802 VERBOSE(VB_COMMFLAG, QString("Start Mark: %1 -> %2") … … 1809 1807 } 1810 1808 else 1811 1809 { 1812 lastEnd = it.key(); 1813 if (skipAllBlanks) 1814 { 1815 while ((lastEnd < (framesProcessed - (2 * fps))) && 1816 (frameInfo[lastEnd + 1].flagMask & COMM_FRAME_BLANK)) 1817 lastEnd++; 1818 } 1819 else 1820 { 1821 while ((lastEnd > 0) && 1822 (frameInfo[lastEnd - 1].flagMask & COMM_FRAME_BLANK)) 1823 lastEnd--; 1824 } 1810 uint64_t lastEndLower = it.key(); 1811 uint64_t lastEndUpper = it.key(); 1812 while ((lastEndUpper < (framesProcessed - (2 * fps))) && 1813 (frameInfo[lastEndUpper + 1].flagMask & COMM_FRAME_BLANK)) 1814 lastEndUpper++; 1815 while ((lastEndLower > 0) && 1816 (frameInfo[lastEndLower - 1].flagMask & COMM_FRAME_BLANK)) 1817 lastEndLower--; 1818 uint64_t adj = (lastEndUpper - lastEndLower) / 2; 1819 if (adj > MAX_BLANK_FRAMES) 1820 adj = MAX_BLANK_FRAMES; 1821 lastEnd = lastEndUpper - adj; 1825 1822 1826 1823 if (verboseDebugging) 1827 1824 VERBOSE(VB_COMMFLAG, QString("End Mark : %1 -> %2") … … 1934 1931 for(; i < (commercials-1); i++) 1935 1932 { 1936 1933 long long r = c_start[i]; 1934 long long adjustment = 0; 1937 1935 1938 1936 if ((r < (30 * fps)) && 1939 1937 (first_comm)) … … 1955 1953 x++; 1956 1954 } 1957 1955 1958 if (skipAllBlanks)1959 while((blankFrameMap.contains(r+1)) &&1960 (c_start[i+1] != (r+1)))1956 while((blankFrameMap.contains(r+1)) && 1957 (c_start[i+1] != (r+1))) 1958 { 1961 1959 r++; 1960 adjustment++; 1961 } 1962 1962 } 1963 1963 else 1964 1964 { 1965 if (skipAllBlanks) 1966 while(blankFrameMap.contains(r+1)) 1967 r++; 1965 while(blankFrameMap.contains(r+1)) 1966 { 1967 r++; 1968 adjustment++; 1969 } 1968 1970 } 1969 1971 1972 adjustment /= 2; 1973 if (adjustment > MAX_BLANK_FRAMES) 1974 adjustment = MAX_BLANK_FRAMES; 1975 r -= adjustment; 1970 1976 blankCommMap[r] = MARK_COMM_END; 1971 1977 first_comm = false; 1972 1978 }