Fixed issues with forcing I and IDR frames.

Setting I frame interval to 1 caused encoder to go into
infinite loop. Fixed that by stopping RC update.

Forcing of I and IDR frame did not cause the frames at expected time
due to delayed encoding. This is fixed now.

Change-Id: Ibf549fb335c053ee33de768455b20e46be3e7c1c
This commit is contained in:
Harinarayanan K K 2015-06-19 11:35:16 +05:30 committed by Marco Nelissen
parent d020be5ac7
commit 63f40a8f85
3 changed files with 37 additions and 25 deletions

View file

@ -2622,6 +2622,10 @@ struct _codec_t
*/
inp_buf_t as_inp_list[MAX_NUM_BFRAMES];
/**
* IDR flags for each input
*/
WORD32 i4_idr_inp_list[MAX_NUM_BFRAMES];
/*
*Flag to indicate if we have recived the last input frame

View file

@ -245,12 +245,35 @@ WORD32 ih264e_input_queue_update(codec_t *ps_codec,
/***************************************************************************
* Now we should add the picture to RC stack here
**************************************************************************/
/*
* If an I frame has been requested, ask RC to force it
* For IDR requests, we have to ask RC to force I and set IDR by our selves
* since RC Donot know about IDR. For forcing an IDR at dequeue stage we
* should record that an IDR has been requested some where. Hence we will
* store it in the u4_idr_inp_list at a position same as that of input frame
*/
{
WORD32 i4_force_idr, i4_force_i;
i4_force_idr = (ps_codec->force_curr_frame_type == IV_IDR_FRAME);
i4_force_idr |= !(ps_codec->i4_pic_cnt % ps_codec->s_cfg.u4_idr_frm_interval);
i4_force_i = (ps_codec->force_curr_frame_type == IV_I_FRAME);
ps_codec->i4_idr_inp_list[ps_codec->i4_pic_cnt % MAX_NUM_BFRAMES] = i4_force_idr;
if ((ps_codec->i4_frame_num > 0) && (i4_force_idr || i4_force_i))
{
irc_force_I_frame(ps_codec->s_rate_control.pps_rate_control_api);
}
ps_codec->force_curr_frame_type = IV_NA_FRAME;
}
irc_add_picture_to_stack(ps_codec->s_rate_control.pps_rate_control_api,
ps_codec->i4_pic_cnt);
/*
* Rc has a problem with this delayed processing
*/
/* Delay */
if (ps_codec->i4_encode_api_call_cnt
< (WORD32)(ps_codec->s_cfg.u4_num_bframes))
{
@ -261,18 +284,6 @@ WORD32 ih264e_input_queue_update(codec_t *ps_codec,
/***************************************************************************
* Get a new pic to encode
**************************************************************************/
/*
* If a frame is forced, apply it
* We cannot force an I frame for first frame
*/
if ((ps_codec->i4_frame_num > 0)&&
((ps_codec->force_curr_frame_type == IV_I_FRAME)||
(ps_codec->force_curr_frame_type == IV_IDR_FRAME)))
{
irc_force_I_frame(ps_codec->s_rate_control.pps_rate_control_api);
}
/* Query the picture_type */
e_pictype = ih264e_rc_get_picture_details(
ps_codec->s_rate_control.pps_rate_control_api, (WORD32 *)(&u4_pic_id),
@ -295,12 +306,12 @@ WORD32 ih264e_input_queue_update(codec_t *ps_codec,
return 0;
}
/* Set IDR if it has been requested or its the IDR interval */
ps_codec->pic_type = ps_codec->i4_idr_inp_list[u4_pic_id % MAX_NUM_BFRAMES] ?
PIC_IDR : ps_codec->pic_type;
ps_codec->i4_idr_inp_list[u4_pic_id % MAX_NUM_BFRAMES] = 0;
ps_codec->pic_type = ( (u4_pic_id % ps_codec->s_cfg.u4_idr_frm_interval) ||
(ps_codec->force_curr_frame_type != IV_IDR_FRAME) ) ?
ps_codec->pic_type : PIC_IDR;
ps_codec->force_curr_frame_type = IV_NA_FRAME;
/* Get current frame Qp */
u1_frame_qp = (UWORD8)irc_get_frame_level_qp(

View file

@ -916,12 +916,9 @@ void irc_add_pic_to_stack(pic_handling_t *ps_pic_handling, WORD32 i4_enc_pic_id)
}
/* Updating the vars which work on the encoded pics */
/* For the first gop
* TODO (BPIC) this // || (i4_intra_frm_int == 1)) may cause problems for bpics */
if(((ps_pic_handling->i4_is_first_gop)
&& (ps_pic_handling->i4_pic_disp_order_no
== (i4_max_inter_frm_int - 2))))
// || (i4_intra_frm_int == 1))
/* For the first gop */
if ((ps_pic_handling->i4_is_first_gop)
&& (ps_pic_handling->i4_pic_disp_order_no == 0))
{
ps_pic_handling->i4_coded_pic_no = 0;
ps_pic_handling->i4_stack_count = 0;