Delay auto key frame insertion in realtime configuration
Whe auto keyframe insertion is enabled and conditions are right (scene change) the encoder can decide to insert a key frame and does a re-encoding. This can introduce extra latency. In RT mode we do not do the re-encoding of the current frame but force the next frame to key frame. Change-Id: I15c175fa845ac4c1a1f18bea3676e154669522a7
This commit is contained in:
		@@ -3603,6 +3603,17 @@ static void encode_frame_to_data_rate
 | 
				
			|||||||
    // Test code for segmentation of gf/arf (0,0)
 | 
					    // Test code for segmentation of gf/arf (0,0)
 | 
				
			||||||
    //segmentation_test_function((VP8_PTR) cpi);
 | 
					    //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
 | 
					    // 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)
 | 
					#if !(CONFIG_REALTIME_ONLY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -4113,6 +4124,14 @@ static void encode_frame_to_data_rate
 | 
				
			|||||||
        // (assuming that we didn't)!
 | 
					        // (assuming that we didn't)!
 | 
				
			||||||
        if (cpi->pass != 2 && cpi->oxcf.auto_key && cm->frame_type != KEY_FRAME)
 | 
					        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))
 | 
					            if (decide_key_frame(cpi))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                vp8_calc_auto_iframe_target_size(cpi);
 | 
					                vp8_calc_auto_iframe_target_size(cpi);
 | 
				
			||||||
@@ -4151,6 +4170,7 @@ static void encode_frame_to_data_rate
 | 
				
			|||||||
                resize_key_frame(cpi);
 | 
					                resize_key_frame(cpi);
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        vp8_clear_system_state();
 | 
					        vp8_clear_system_state();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -679,6 +679,9 @@ typedef struct
 | 
				
			|||||||
    int *lf_ref_frame_sign_bias;
 | 
					    int *lf_ref_frame_sign_bias;
 | 
				
			||||||
    int *lf_ref_frame;
 | 
					    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;
 | 
					} VP8_COMP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void control_data_rate(VP8_COMP *cpi);
 | 
					void control_data_rate(VP8_COMP *cpi);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user