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-24 20:39:37 +0000
commit1f2d0129ef50caf4aca2d9e042cff9ecfa2e0668 (patch)
tree823cc8ecdc00dc94684abffc7926d6e8a456d157 /test
parent202a538fdbbec8982a85ebf705f12c2acfe18ea3 (diff)
downloadandroid_external_libavc-1f2d0129ef50caf4aca2d9e042cff9ecfa2e0668.tar.gz
android_external_libavc-1f2d0129ef50caf4aca2d9e042cff9ecfa2e0668.tar.bz2
android_external_libavc-1f2d0129ef50caf4aca2d9e042cff9ecfa2e0668.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 */
/*************************************************************************/