summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorHamsalekha S <hamsalekha.s@ittiam.com>2015-06-09 15:54:31 +0530
committerMarco Nelissen <marcone@google.com>2015-06-25 08:25:44 -0700
commit9f0dcba9b4f792aedf37b6ecdceae46d36b93068 (patch)
tree981bfeb3cc491fede193c67c5f554f1c1ec2ce9d /test
parentb8681a4380ad0c2a98e4867fb33942aa7f7772bf (diff)
downloadandroid_external_libavc-9f0dcba9b4f792aedf37b6ecdceae46d36b93068.tar.gz
android_external_libavc-9f0dcba9b4f792aedf37b6ecdceae46d36b93068.tar.bz2
android_external_libavc-9f0dcba9b4f792aedf37b6ecdceae46d36b93068.zip
Improved error resilience in decoder
Fixed buffer management for error cases Fixed end of picture detection logic for multiple slice error cases Fixed handling of incomplete frame, missing slices. Change-Id: Iae447667e4d88869a8bf992180cacd77870b9877
Diffstat (limited to 'test')
-rw-r--r--test/decoder/main.c142
1 files changed, 70 insertions, 72 deletions
diff --git a/test/decoder/main.c b/test/decoder/main.c
index 921c240..937515e 100644
--- a/test/decoder/main.c
+++ b/test/decoder/main.c
@@ -1827,6 +1827,7 @@ int main(WORD32 argc, CHAR *argv[])
UWORD32 frm_cnt = 0;
WORD32 total_bytes_comsumed;
UWORD32 max_op_frm_ts;
+ UWORD32 u4_num_disp_bufs_with_dec;;
#ifdef PROFILE_ENABLE
UWORD32 u4_tot_cycles = 0;
@@ -2313,6 +2314,7 @@ int main(WORD32 argc, CHAR *argv[])
ivd_ctl_getbufinfo_ip_t s_ctl_ip;
ivd_ctl_getbufinfo_op_t s_ctl_op;
+ WORD32 outlen = 0;
s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETBUFINFO;
@@ -2342,7 +2344,6 @@ int main(WORD32 argc, CHAR *argv[])
/* Or if shared and output is 420P */
if((0 == s_app_ctx.u4_share_disp_buf) || (IV_YUV_420P == s_app_ctx.e_output_chroma_format))
{
- UWORD32 outlen;
ps_out_buf->u4_min_out_buf_size[0] =
s_ctl_op.u4_min_out_buf_size[0];
ps_out_buf->u4_min_out_buf_size[1] =
@@ -2377,6 +2378,56 @@ int main(WORD32 argc, CHAR *argv[])
ps_out_buf->u4_num_bufs = s_ctl_op.u4_min_num_out_bufs;
}
+#ifdef APP_EXTRA_BUFS
+ s_app_ctx.disp_delay = EXTRA_DISP_BUFFERS;
+ s_ctl_op.u4_num_disp_bufs += EXTRA_DISP_BUFFERS;
+#endif
+
+ /*****************************************************************************/
+ /* API Call: Allocate display buffers for display buffer shared case */
+ /*****************************************************************************/
+
+ for(i = 0; i < s_ctl_op.u4_num_disp_bufs; i++)
+ {
+
+ s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[0] =
+ s_ctl_op.u4_min_out_buf_size[0];
+ s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[1] =
+ s_ctl_op.u4_min_out_buf_size[1];
+ s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[2] =
+ s_ctl_op.u4_min_out_buf_size[2];
+
+ outlen = s_ctl_op.u4_min_out_buf_size[0];
+ if(s_ctl_op.u4_min_num_out_bufs > 1)
+ outlen += s_ctl_op.u4_min_out_buf_size[1];
+
+ if(s_ctl_op.u4_min_num_out_bufs > 2)
+ outlen += s_ctl_op.u4_min_out_buf_size[2];
+
+ s_app_ctx.s_disp_buffers[i].pu1_bufs[0] = (UWORD8 *)malloc(outlen);
+
+ if(s_app_ctx.s_disp_buffers[i].pu1_bufs[0] == NULL)
+ {
+ sprintf(ac_error_str,
+ "\nAllocation failure for output buffer of i4_size %d",
+ outlen);
+ codec_exit(ac_error_str);
+ }
+
+ if(s_ctl_op.u4_min_num_out_bufs > 1)
+ s_app_ctx.s_disp_buffers[i].pu1_bufs[1] =
+ s_app_ctx.s_disp_buffers[i].pu1_bufs[0]
+ + (s_ctl_op.u4_min_out_buf_size[0]);
+
+ if(s_ctl_op.u4_min_num_out_bufs > 2)
+ s_app_ctx.s_disp_buffers[i].pu1_bufs[2] =
+ s_app_ctx.s_disp_buffers[i].pu1_bufs[1]
+ + (s_ctl_op.u4_min_out_buf_size[1]);
+
+ s_app_ctx.s_disp_buffers[i].u4_num_bufs =
+ s_ctl_op.u4_min_num_out_bufs;
+ }
+ s_app_ctx.num_disp_buf = s_ctl_op.u4_num_disp_bufs;
}
}
@@ -2556,73 +2607,6 @@ int main(WORD32 argc, CHAR *argv[])
/*************************************************************************/
//if(1 == s_app_ctx.u4_share_disp_buf)
{
- ivd_ctl_getbufinfo_ip_t s_ctl_ip;
- ivd_ctl_getbufinfo_op_t s_ctl_op;
- WORD32 outlen = 0;
-
- s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL;
- s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETBUFINFO;
- s_ctl_ip.u4_size = sizeof(ivd_ctl_getbufinfo_ip_t);
- s_ctl_op.u4_size = sizeof(ivd_ctl_getbufinfo_op_t);
- ret = ivd_api_function((iv_obj_t *)codec_obj, (void *)&s_ctl_ip,
- (void *)&s_ctl_op);
- if(ret != IV_SUCCESS)
- {
- sprintf(ac_error_str, "Error in Get Buf Info %x", s_ctl_op.u4_error_code);
- codec_exit(ac_error_str);
- }
-
-#ifdef APP_EXTRA_BUFS
- s_app_ctx.disp_delay = EXTRA_DISP_BUFFERS;
- s_ctl_op.u4_num_disp_bufs += EXTRA_DISP_BUFFERS;
-#endif
-
- /*****************************************************************************/
- /* API Call: Allocate display buffers for display buffer shared case */
- /*****************************************************************************/
-
- for(i = 0; i < s_ctl_op.u4_num_disp_bufs; i++)
- {
-
- s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[0] =
- s_ctl_op.u4_min_out_buf_size[0];
- s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[1] =
- s_ctl_op.u4_min_out_buf_size[1];
- s_app_ctx.s_disp_buffers[i].u4_min_out_buf_size[2] =
- s_ctl_op.u4_min_out_buf_size[2];
-
- outlen = s_ctl_op.u4_min_out_buf_size[0];
- if(s_ctl_op.u4_min_num_out_bufs > 1)
- outlen += s_ctl_op.u4_min_out_buf_size[1];
-
- if(s_ctl_op.u4_min_num_out_bufs > 2)
- outlen += s_ctl_op.u4_min_out_buf_size[2];
-
- s_app_ctx.s_disp_buffers[i].pu1_bufs[0] = (UWORD8 *)malloc(outlen);
-
- if(s_app_ctx.s_disp_buffers[i].pu1_bufs[0] == NULL)
- {
- sprintf(ac_error_str,
- "\nAllocation failure for output buffer of i4_size %d",
- outlen);
- codec_exit(ac_error_str);
- }
-
- if(s_ctl_op.u4_min_num_out_bufs > 1)
- s_app_ctx.s_disp_buffers[i].pu1_bufs[1] =
- s_app_ctx.s_disp_buffers[i].pu1_bufs[0]
- + (s_ctl_op.u4_min_out_buf_size[0]);
-
- if(s_ctl_op.u4_min_num_out_bufs > 2)
- s_app_ctx.s_disp_buffers[i].pu1_bufs[2] =
- s_app_ctx.s_disp_buffers[i].pu1_bufs[1]
- + (s_ctl_op.u4_min_out_buf_size[1]);
-
- s_app_ctx.s_disp_buffers[i].u4_num_bufs =
- s_ctl_op.u4_min_num_out_bufs;
- }
- s_app_ctx.num_disp_buf = s_ctl_op.u4_num_disp_bufs;
-
/*****************************************************************************/
/* API Call: Send the allocated display buffers to codec */
/*****************************************************************************/
@@ -2638,7 +2622,7 @@ int main(WORD32 argc, CHAR *argv[])
memcpy(&(s_set_display_frame_ip.s_disp_buffer),
&(s_app_ctx.s_disp_buffers),
- s_ctl_op.u4_num_disp_bufs * sizeof(ivd_out_bufdesc_t));
+ s_app_ctx.num_disp_buf * sizeof(ivd_out_bufdesc_t));
ret = ivd_api_function((iv_obj_t *)codec_obj,
(void *)&s_set_display_frame_ip,
@@ -2732,7 +2716,17 @@ int main(WORD32 argc, CHAR *argv[])
#ifndef PRINT_PICSIZE
get_version(codec_obj);
#endif
- max_op_frm_ts = (s_app_ctx.u4_max_frm_ts > 0)? (s_app_ctx.u4_max_frm_ts + s_app_ctx.disp_delay): 0xffffffff;
+
+
+ max_op_frm_ts = s_app_ctx.u4_max_frm_ts + s_app_ctx.disp_delay;
+
+ if(max_op_frm_ts < s_app_ctx.disp_delay)
+ max_op_frm_ts = 0xffffffff;/* clip as overflow has occured*/
+
+ max_op_frm_ts = (s_app_ctx.u4_max_frm_ts > 0)? (max_op_frm_ts): 0xffffffff;
+
+ u4_num_disp_bufs_with_dec = 0;
+
while(u4_op_frm_ts < max_op_frm_ts)
{
@@ -2759,9 +2753,10 @@ int main(WORD32 argc, CHAR *argv[])
}
#endif
- if(u4_ip_frm_ts < s_app_ctx.num_disp_buf)
+ if(u4_num_disp_bufs_with_dec < s_app_ctx.num_disp_buf)
{
- release_disp_frame(codec_obj, u4_ip_frm_ts);
+ release_disp_frame(codec_obj, u4_num_disp_bufs_with_dec);
+ u4_num_disp_bufs_with_dec ++;
}
@@ -2991,6 +2986,9 @@ int main(WORD32 argc, CHAR *argv[])
sprintf(ac_error_str, "Error in Reset");
codec_exit(ac_error_str);
}
+
+ /*when reset all buffers are released by lib*/
+ u4_num_disp_bufs_with_dec = 0;
/*************************************************************************/
/* set num of cores */
/*************************************************************************/