Disable keyframe in real time that's placed one frame after a cut.

The codec as it stood placed a keyframe one frame after a
real cut scene - and ignored datarate and other considerations.

TODO: Its possible that we should detect a keyframe and recode
the frame ( in certain circumstances) to improve quality.

Change-Id: Ia1fd6d90103f4da4d21ca5ab62897d22e0b888a8
This commit is contained in:
Jim Bankoski 2012-10-01 14:17:43 -07:00
parent 9704cdec9f
commit 6f35b1958e
2 changed files with 12 additions and 12 deletions

View File

@ -62,7 +62,10 @@ TEST_P(KeyframeTest, TestRandomVideoSource) {
::libvpx_test::RandomVideoSource video;
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
EXPECT_GT(kf_count_, 1);
// In realtime mode - auto placed keyframes are exceedingly rare, don't
// bother with this check if(GetParam() > 0)
if(GetParam() > 0)
EXPECT_GT(kf_count_, 1);
}
TEST_P(KeyframeTest, TestDisableKeyframes) {
@ -121,7 +124,10 @@ TEST_P(KeyframeTest, TestAutoKeyframe) {
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
EXPECT_EQ(2u, kf_pts_list_.size()) << " Not the right number of keyframes ";
// In realtime mode - auto placed keyframes are exceedingly rare, don't
// bother with this check
if(GetParam() > 0)
EXPECT_EQ(2u, kf_pts_list_.size()) << " Not the right number of keyframes ";
// Verify that keyframes match the file keyframes in the file.
for (std::vector<vpx_codec_pts_t>::const_iterator iter = kf_pts_list_.begin();

View File

@ -3970,18 +3970,12 @@ static void encode_frame_to_data_rate
/* Test to see if the stats generated for this frame indicate that
* we should have coded a key frame (assuming that we didn't)!
*/
if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
{
int key_frame_decision = decide_key_frame(cpi);
if (cpi->compressor_speed == 2)
{
/* we don't do re-encoding in realtime mode
* if key frame is decided then we force it on next frame */
cpi->force_next_frame_intra = key_frame_decision;
}
if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME
&& cpi->compressor_speed != 2)
{
#if !(CONFIG_REALTIME_ONLY)
else if (key_frame_decision)
if (decide_key_frame(cpi))
{
/* Reset all our sizing numbers and recode */
cm->frame_type = KEY_FRAME;