encoder: fix invalid free of raw buffers

Return current input buffer as buffer to be freed in case
of errors that are seen before picking up the input buffer
to be from the input queue.
Once a buffer is picked up from the queue, that is returned
as the buffer to be freed.

There is no need to return a buffer from ps_proc context

Bug: 180643802

Test: poc in the bug description
Test: atest CtsMediaV2TestCases:CodecEncoderTest
Test: atest VtsHalMediaC2V1_0TargetVideoEncTest

Change-Id: I1671ca1e82f522004d1f070df89b256b856f75b8
This commit is contained in:
Neelkamal Semwal 2021-03-12 10:15:49 +05:30 committed by Ray Essick
parent 19020d35b5
commit 954f023c74

View file

@ -228,6 +228,9 @@ WORD32 ih264e_encode(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op)
ps_video_encode_op->s_ive_op.output_present = 0;
ps_video_encode_op->s_ive_op.dump_recon = 0;
ps_video_encode_op->s_ive_op.u4_encoded_frame_type = IV_NA_FRAME;
/* By default set the current input buffer as the buffer to be freed */
/* This will later be updated to the actual input that gets encoded */
ps_video_encode_op->s_ive_op.s_inp_buf = ps_video_encode_ip->s_ive_ip.s_inp_buf;
/* Check for output memory allocation size */
if (ps_video_encode_ip->s_ive_ip.s_out_buf.u4_bufsize < MIN_STREAM_SIZE)
@ -474,6 +477,9 @@ WORD32 ih264e_encode(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op)
s_out_buf.u4_is_last = s_inp_buf.u4_is_last;
ps_video_encode_op->s_ive_op.u4_is_last = s_inp_buf.u4_is_last;
/* Send the input to application so that it can free it */
ps_video_encode_op->s_ive_op.s_inp_buf = s_inp_buf.s_raw_buf;
/* Only encode if the current frame is not pre-encode skip */
if (!i4_rc_pre_enc_skip && s_inp_buf.s_raw_buf.apv_bufs[0])
{
@ -774,12 +780,6 @@ WORD32 ih264e_encode(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op)
}
else
{
/* proc ctxt base idx */
WORD32 proc_ctxt_select = ctxt_sel * MAX_PROCESS_THREADS;
/* proc ctxt */
process_ctxt_t *ps_proc = &ps_codec->as_process[proc_ctxt_select];
/* receive output back from codec */
s_out_buf = ps_codec->as_out_buf[ctxt_sel];
@ -790,18 +790,11 @@ WORD32 ih264e_encode(iv_obj_t *ps_codec_obj, void *pv_api_ip, void *pv_api_op)
ps_video_encode_op->s_ive_op.u4_timestamp_low = 0;
ps_video_encode_op->s_ive_op.u4_timestamp_high = 0;
/* receive input back from codec and send it to app */
s_inp_buf = ps_proc->s_inp_buf;
ps_video_encode_op->s_ive_op.s_inp_buf = s_inp_buf.s_raw_buf;
ps_video_encode_op->s_ive_op.u4_encoded_frame_type = IV_NA_FRAME;
}
/* Send the input to encoder so that it can free it if possible */
ps_video_encode_op->s_ive_op.s_out_buf = s_out_buf.s_bits_buf;
ps_video_encode_op->s_ive_op.s_inp_buf = s_inp_buf.s_raw_buf;
if (1 == s_inp_buf.u4_is_last)
{