diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 6a3f7f6ff..df1a6f57e 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -3614,6 +3614,17 @@ static void encode_frame_to_data_rate // Test code for segmentation of gf/arf (0,0) //segmentation_test_function((VP8_PTR) cpi); +#if CONFIG_REALTIME_ONLY + if(cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME) + { + if(cpi->force_next_frame_intra) + { + cm->frame_type = KEY_FRAME; /* delayed intra frame */ + } + } + cpi->force_next_frame_intra = 0; +#endif + // For an alt ref frame in 2 pass we skip the call to the second pass function that sets the target bandwidth #if !(CONFIG_REALTIME_ONLY) @@ -4124,6 +4135,14 @@ static void encode_frame_to_data_rate // (assuming that we didn't)! if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME) { + +#if CONFIG_REALTIME_ONLY + { + /* we don't do re-encoding in realtime mode + * if key frame is decided than we force it on next frame */ + cpi->force_next_frame_intra = decide_key_frame(cpi); + } +#else if (decide_key_frame(cpi)) { vp8_calc_auto_iframe_target_size(cpi); @@ -4162,6 +4181,7 @@ static void encode_frame_to_data_rate resize_key_frame(cpi); continue; } +#endif } vp8_clear_system_state(); diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h index 4d8f3ec61..e8a452dca 100644 --- a/vp8/encoder/onyx_int.h +++ b/vp8/encoder/onyx_int.h @@ -677,6 +677,9 @@ typedef struct int *lf_ref_frame_sign_bias; int *lf_ref_frame; +#if CONFIG_REALTIME_ONLY + int force_next_frame_intra; /* force next frame to intra when kf_auto says so */ +#endif } VP8_COMP; void control_data_rate(VP8_COMP *cpi);