📄 invtelec.cpp
字号:
state->ulPulldownActiveTimerIntl = 0; } state->lastRemovedTimestamp = timestamp; goto REMOVE_FRAME; } else if (i == ((PULLDOWN_HIST_LEN - 2) % 5)) { obviousPatternFlag = TRUE; goto INTERLEAVE_EVEN; } else goto DO_NOTHING; } } // Do we have a pretty clear pattern? Only trust this test // if we have succeeded with the strongest test a couple of times for (i = 0; i < 5; i++) { if (groupValidFlagEven[i] == FALSE) continue; if (groupValidFlagOdd[i] == FALSE) continue; if (groupValidFlagEven[(i+2)%5] == FALSE) continue; if (groupValidFlagOdd[(i+2)%5] == FALSE) continue; if ((state->ulPulldownActiveTimerIntl > 10) && (inGroupMeanEven[i] + inThresh[patternStart]*inGroupStdEven[i] < outMinEven[i] ) && (inGroupMeanOdd[(i+2)%5] + inThresh[patternStart]*inGroupStdOdd[(i+2)%5] < outMinOdd[(i+2)%5]) && (inGroupMeanEven[i] + inGroupStdEven[i] < inGroupMeanOdd[i] ) && (inGroupMeanOdd[(i+2)%5] + inGroupStdOdd[(i+2)%5] < inGroupMeanEven[(i+2)%5])) {#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"pretty clear pattern, i is %d, pulldown timer is %d, patternStart is %d\n",i,state->ulPulldownActiveTimerIntl,patternStart);#endif // Set the removal pattern phase state->frameRemovalPattern=i; // If this is the right frame remove it! if(i == (PULLDOWN_HIST_LEN - 1) % 5) { // Set a counter that goes up if we have a consistent pattern 80+% of the time, down otherwise if ((timestamp - state->lastRemovedTimestamp > 145) && (timestamp - state->lastRemovedTimestamp < 175)) { if (state->ulPulldownActiveTimerIntl < 95) state->ulPulldownActiveTimerIntl += 5; else { state->ulPulldownActiveTimerIntl = 100; state->bInterlacedTelecineSeen = TRUE; } if (state->ulPulldownActiveTimerProg > 5) state->ulPulldownActiveTimerProg -= 5; else state->ulPulldownActiveTimerProg = 0; } else if (timestamp - state->lastRemovedTimestamp < 300) { if (state->ulPulldownActiveTimerIntl > 5) state->ulPulldownActiveTimerIntl -= 5; else state->ulPulldownActiveTimerIntl = 0; } state->lastRemovedTimestamp = timestamp; goto REMOVE_FRAME; } else if (i == ((PULLDOWN_HIST_LEN - 2) % 5)) { obviousPatternFlag = TRUE; goto INTERLEAVE_ODD; } else goto DO_NOTHING; } if ((state->ulPulldownActiveTimerIntl > 10) && (inGroupMeanOdd[i] + inThresh[patternStart]*inGroupStdOdd[i] < outMinOdd[i] ) && (inGroupMeanEven[(i+2)%5] + inThresh[patternStart]*inGroupStdEven[(i+2)%5] < outMinEven[(i+2)%5]) && (inGroupMeanOdd[i] + inGroupStdOdd[i] < inGroupMeanEven[i] ) && (inGroupMeanEven[(i+2)%5] + inGroupStdEven[(i+2)%5] < inGroupMeanOdd[(i+2)%5])) {#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"pretty clear pattern, i is %d, pulldown timer is %d, patternStart is %d\n",i,state->ulPulldownActiveTimerIntl,patternStart);#endif // Set the removal pattern phase state->frameRemovalPattern=i; // If this is the right frame remove it! if(i == (PULLDOWN_HIST_LEN - 1) % 5) { // Set a counter that goes up if we have a consistent pattern 80+% of the time, down otherwise if ((timestamp - state->lastRemovedTimestamp > 145) && (timestamp - state->lastRemovedTimestamp < 175)) { if (state->ulPulldownActiveTimerIntl < 95) state->ulPulldownActiveTimerIntl += 5; else { state->ulPulldownActiveTimerIntl = 100; state->bInterlacedTelecineSeen = TRUE; } if (state->ulPulldownActiveTimerProg > 5) state->ulPulldownActiveTimerProg -= 5; else state->ulPulldownActiveTimerProg = 0; } else if (timestamp - state->lastRemovedTimestamp < 300) { if (state->ulPulldownActiveTimerIntl > 5) state->ulPulldownActiveTimerIntl -= 5; else state->ulPulldownActiveTimerIntl = 0; } state->lastRemovedTimestamp = timestamp; goto REMOVE_FRAME; } else if (i == ((PULLDOWN_HIST_LEN - 2) % 5)) { obviousPatternFlag = TRUE; goto INTERLEAVE_EVEN; } else goto DO_NOTHING; } } } // Rule that maintains the pattern // No pattern, but things are VERY quiet, and we have been seeing a 3:2 pattern if ((state->frameRemovalPattern == ((PULLDOWN_HIST_LEN-1)%5)) && (state->ulPulldownActiveTimerIntl > 50) && (inMaxEven [(PULLDOWN_HIST_LEN-1)%5] < 13) && (inMaxOdd [(PULLDOWN_HIST_LEN-1)%5] < 13) && (outMaxOdd [(PULLDOWN_HIST_LEN-1)%5] < 13) && (outMaxEven[(PULLDOWN_HIST_LEN-1)%5] < 13) && (groupValidFlagEven[(PULLDOWN_HIST_LEN-1)%5] == TRUE) && (groupValidFlagOdd[(PULLDOWN_HIST_LEN-1)%5] == TRUE)) {#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"maintain pattern 1 - things are very quiet, pulldown timer is %d, patternStart is %d\n",state->ulPulldownActiveTimerIntl,patternStart);#endif state->lastRemovedTimestamp = timestamp; state->checkNextFrameForInterlace = TRUE; goto REMOVE_FRAME; } // Rule that maintains the pattern // If we have been seeing consistent pulldown, // and the last frame looks a bit interlaced, but it is in the right place. // This is a weak test. if ((state->frameRemovalPattern == ((PULLDOWN_HIST_LEN-1)%5)) && (state->ulPulldownActiveTimerIntl > 50) && (!state->checkNextFrameForInterlace) && (state->pulldownSadHistEven[(PULLDOWN_HIST_LEN-1)] < (.6*state->pulldownSadHistOdd[(PULLDOWN_HIST_LEN-1)]) || state->pulldownSadHistOdd[(PULLDOWN_HIST_LEN-1)] < (.6*state->pulldownSadHistEven[(PULLDOWN_HIST_LEN-1)]))) {#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"maintain pattern 2, pulldown timer is %d, patternStart is %d\n",state->ulPulldownActiveTimerIntl,patternStart);#endif state->lastRemovedTimestamp = timestamp; state->checkNextFrameForInterlace = TRUE; goto REMOVE_FRAME; } // If we have been seeing consistent pulldown, and the last frame looks very interlaced. // This is a weak test if ((state->ulPulldownActiveTimerIntl > 50) && (!state->checkNextFrameForInterlace) && ( (state->pulldownSadHistEven[(PULLDOWN_HIST_LEN-1)] < (state->pulldownSadHistOdd[(PULLDOWN_HIST_LEN-1)]*.3)) && (state->pulldownSadHistOdd[(PULLDOWN_HIST_LEN-1)] > 9) ) || ( (state->pulldownSadHistOdd[(PULLDOWN_HIST_LEN-1)] < (state->pulldownSadHistEven[(PULLDOWN_HIST_LEN-1)]*.3)) && (state->pulldownSadHistEven[(PULLDOWN_HIST_LEN-1)] > 9) ) ) {#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"things look interlaced, pulldown timer is %d, patternStart is %d\n",state->ulPulldownActiveTimerIntl,patternStart);#endif state->lastRemovedTimestamp = timestamp; state->checkNextFrameForInterlace = TRUE; goto REMOVE_FRAME; } if(state->checkNextFrameForInterlace) {#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"checking frame for interlace\n",i,state->ulPulldownActiveTimerIntl,patternStart);#endif state->checkNextFrameForInterlace = FALSE; if(state->interleaveEvenFlag) goto INTERLEAVE_EVEN; if(state->interleaveOddFlag) goto INTERLEAVE_ODD; } // Otherwise no pulldown!#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"no pattern, pulldown timer is %d, patternStart is %d\n",state->ulPulldownActiveTimerIntl,patternStart);#endif if ((inMaxEven[(PULLDOWN_HIST_LEN-1)%5] > 30) || (outMaxEven[(PULLDOWN_HIST_LEN-1)%5] > 30)) { if (state->ulPulldownActiveTimerIntl > 0) state->ulPulldownActiveTimerIntl--; } // should we attempt progressive patterns? if ((lines > 242) || (state->ulPulldownActiveTimerIntl > 90 && state->ulPulldownActiveTimerProg < 10)) { goto NO_PATTERN; }PROGRESSIVE_TESTS: // Now test to see if there is an entire repeated frame for (patternStart = histLength; patternStart < PULLDOWN_HIST_LEN; patternStart += 5) { for (i = 0; i < 5; i++) { inGroupMean[i] = 0; outGroupMean[i] = 0; inGroupStd[i] = 0; outGroupStd[i] = 0; inGroupCount = 0; outGroupCount = 0; outMin[i] = 255*255; outMax[i] = 0; inMax[i] = 0; for (j = patternStart + i; j < PULLDOWN_HIST_LEN; j++) { if (state->pulldownSadHistAll[j] == MISSING_SAD || state->pulldownSadHistAll[j] == UN_INIT_SAD) continue; if (((j - i) % 5) == 0) { inGroupMean[i] += state->pulldownSadHistAll[j]; inGroupStd[i] += state->pulldownSadHistAll[j] * state->pulldownSadHistAll[j]; if (inMax[i] < state->pulldownSadHistAll[j]) inMax[i] = state->pulldownSadHistAll[j]; inGroupCount++; } else { outGroupMean[i] += state->pulldownSadHistAll[j]; outGroupStd[i] += state->pulldownSadHistAll[j] * state->pulldownSadHistAll[j]; if (outMin[i] > state->pulldownSadHistAll[j]) outMin[i] = state->pulldownSadHistAll[j]; if (outMax[i] < state->pulldownSadHistAll[j]) outMax[i] = state->pulldownSadHistAll[j]; outGroupCount++; } } if ((inGroupCount > 1) && (outGroupCount > 3)) { groupValidFlag[i] = TRUE; inGroupMean[i] = inGroupMean[i]/inGroupCount; if ((inGroupStd[i]/inGroupCount)-(inGroupMean[i]*inGroupMean[i]) > 0.0f) inGroupStd[i] = (float)sqrt((inGroupStd[i]/inGroupCount)-(inGroupMean[i]*inGroupMean[i])); else inGroupStd[i] = 0.0f; outGroupMean[i] = outGroupMean[i]/outGroupCount; if ((outGroupStd[i]/outGroupCount)-(outGroupMean[i]*outGroupMean[i]) > 0.0f) outGroupStd[i] = (float)sqrt((outGroupStd[i]/outGroupCount)-(outGroupMean[i]*outGroupMean[i])); else outGroupStd[i] = 0.0f; } else { groupValidFlag[i] = FALSE; inGroupMean[i] = 0; outGroupMean[i] = 0; inGroupStd[i] = 1; outGroupStd[i] = 1; } } // Do we have a clear pattern? Always trust this test. for (i = 0;i < 5; i++) { if ((inGroupMean[i]+inThresh[patternStart]*inGroupStd[i] < outGroupMean[i] - outThresh[patternStart]*outGroupStd[i]) && (groupValidFlag[i] == TRUE)) {#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"clear pattern, i is %d, pulldown timer is %d, patternStart is %d\n",i,state->ulPulldownActiveTimerProg,patternStart);#endif // If this is the right frame remove it! state->frameRemovalPattern=i; if(i==(PULLDOWN_HIST_LEN-1)%5) { // Set a counter that goes up if we have a consistent pattern 80+% of the time, down otherwise if ((timestamp - state->lastRemovedTimestamp > 145) && (timestamp - state->lastRemovedTimestamp < 175)) { if (state->ulPulldownActiveTimerProg < 95) state->ulPulldownActiveTimerProg += 5; else { state->ulPulldownActiveTimerProg = 100; state->bProgressiveTelecineSeen = TRUE; } if (state->ulPulldownActiveTimerIntl > 5) state->ulPulldownActiveTimerIntl -= 5; else state->ulPulldownActiveTimerIntl = 0; } else if (timestamp - state->lastRemovedTimestamp < 300) { if (state->ulPulldownActiveTimerProg > 5) state->ulPulldownActiveTimerProg -= 5; else state->ulPulldownActiveTimerProg = 0; } state->lastRemovedTimestamp = timestamp; goto REMOVE_FRAME; } else goto DO_NOTHING; } } // Do we have a pretty clear pattern? Only trust this test if we have succeeded with the strongest test a couple of times for(i = 0; i < 5; i++) { if ((inGroupMean[i]+inThresh[patternStart]*inGroupStd[i] < outMin[i]) && (state->ulPulldownActiveTimerProg > 10) && (groupValidFlag[i] == TRUE)) {#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"pretty clear pattern, i is %d, pulldown timer is %d, patternStart is %d\n",i,state->ulPulldownActiveTimerProg,patternStart);#endif // If this is the right frame remove it! state->frameRemovalPattern = i; if (i == (PULLDOWN_HIST_LEN-1)%5) { // Set a counter that goes up if we have a consistent pattern 80+% of the time, down otherwise if ((timestamp - state->lastRemovedTimestamp > 145) && (timestamp - state->lastRemovedTimestamp < 175)) { if (state->ulPulldownActiveTimerProg < 95) state->ulPulldownActiveTimerProg += 5; else { state->ulPulldownActiveTimerProg = 100; state->bProgressiveTelecineSeen = TRUE; } if (state->ulPulldownActiveTimerIntl > 5) state->ulPulldownActiveTimerIntl -= 5; else state->ulPulldownActiveTimerIntl = 0; } else if (timestamp - state->lastRemovedTimestamp < 300) { if (state->ulPulldownActiveTimerProg > 5) state->ulPulldownActiveTimerProg -= 5; else state->ulPulldownActiveTimerProg = 0; } state->lastRemovedTimestamp = timestamp; goto REMOVE_FRAME; } else goto DO_NOTHING; } } // No pattern, but things are VERY quiet, and we have been seeing a 3:2 pattern if ((inMax[(PULLDOWN_HIST_LEN-1)%5] < 9) && (state->ulPulldownActiveTimerProg > 50) && (outMax[(PULLDOWN_HIST_LEN-1)%5] < 9) && (groupValidFlag[(PULLDOWN_HIST_LEN-1)%5] == TRUE) && (state->frameRemovalPattern==((PULLDOWN_HIST_LEN-1)%5)) ) {#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"things are quiet, pulldown timer is %d, patternStart is %d\n",state->ulPulldownActiveTimerProg,patternStart);#endif state->lastRemovedTimestamp = timestamp; goto REMOVE_FRAME; } } // If we have been seeing consistent pulldown, and the last two frames have been quiet frames. // This is our weakest test if (((state->pulldownSadHistAll[(PULLDOWN_HIST_LEN-1)] < 9) || (state->pulldownSadHistAll[(PULLDOWN_HIST_LEN-1)] < state->pulldownSadHistAll[(PULLDOWN_HIST_LEN-2)])) && (state->ulPulldownActiveTimerProg > 50) && (groupValidFlag[(PULLDOWN_HIST_LEN-1)%5] == TRUE)&&(state->frameRemovalPattern==((PULLDOWN_HIST_LEN-1)%5)) ) {#ifdef CODEC_DEBUG_32PULLDOWN fprintf(fp_log,"things are quiet, pulldown timer is %d, patternStart is %d\n",state->ulPulldownActiveTimerProg,patternStart);#endif state->lastRemovedTimestamp = timestamp; goto REMOVE_FRAME; } // If we have been seeing consistent pulldown, and the last frame looks very interlaced.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -