diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 92b2f6fc585b505d8083635b5fd49e96149d95fd..d96703146e2ff625ce91bcf1fbedddc10f729c38 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -3603,6 +3603,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) @@ -4113,6 +4124,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); @@ -4151,6 +4170,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 7618a0a3d68d54805db66e1a6eabd26e13b3a426..50f81589e58ab41b617ecb70e423440d69d6c72e 100644 --- a/vp8/encoder/onyx_int.h +++ b/vp8/encoder/onyx_int.h @@ -679,6 +679,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);