From cd1928dca16d263e47c61625f3f2c55a3a48d57f Mon Sep 17 00:00:00 2001 From: Harish Mahendrakar Date: Wed, 3 Feb 2016 10:56:25 +0530 Subject: [PATCH] Encoder: Fix in returning recon buffers with smaller IDR interval For every IDR generated after the first one, one recon buffer was not released from the buffer manager, when recon was enabled. This resulted in encoder returning with an error after couple of IDRs when recon was enabled. This is fixed by calling recon buffer release based on pic_cnt instead of frm_num. frm_num is reset to 0 for every IDR where as pic_cnt is not. Bug: 173150684 Test: avcenc -i qcif.yuv -w 176 -h 144 -o out.h264 \ --bframes 2 --idr_interval 4 --recon_enable 1 \ --recon recon.yuv Change-Id: I8b72e5aedc6a460292388e4e46f56c07486db4a6 --- encoder/ih264e_encode.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/encoder/ih264e_encode.c b/encoder/ih264e_encode.c index fb37765..9210b3e 100644 --- a/encoder/ih264e_encode.c +++ b/encoder/ih264e_encode.c @@ -545,16 +545,16 @@ WORD32 ih264e_encode(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op) * We need to return a recon when ever we consume an input buffer. This * comsumption include a pre or post enc skip. Thus dump recon is set for * all cases except when - * 1) We are waiting -> ps_codec->i4_frame_num > 1 - * 2) When the input buffer is null [ ie we are not consuming any inp] + * 1) We are waiting -> ps_codec->i4_pic_cnt > ps_codec->s_cfg.u4_num_bframe * An exception need to be made for the case when we have the last buffer * since we need to flush out the on remainig recon. ****************************************************************************/ ps_video_encode_op->s_ive_op.dump_recon = 0; - if (ps_codec->s_cfg.u4_enable_recon && (ps_codec->i4_frame_num > 1 || s_inp_buf.u4_is_last) - && (s_inp_buf.s_raw_buf.apv_bufs[0] || s_inp_buf.u4_is_last)) + if (ps_codec->s_cfg.u4_enable_recon + && (ps_codec->i4_pic_cnt > (WORD32)ps_codec->s_cfg.u4_num_bframes || + s_inp_buf.u4_is_last)) { /* error status */ IH264_ERROR_T ret = IH264_SUCCESS;