Multithreading changes and better error resilience
Fixed the following bugs
Issue 21145276
Issue 21144884
Issue 21181133
Issue 21181134
Decoder now returns error if the level in stream is higher than level at init
Change-Id: I8892c62bd98f7854d046510330c05a1e9ca826b2
diff --git a/decoder/ih264d_format_conv.c b/decoder/ih264d_format_conv.c
index 9a8494e..631bc23 100644
--- a/decoder/ih264d_format_conv.c
+++ b/decoder/ih264d_format_conv.c
@@ -41,6 +41,7 @@
#include <string.h>
/* User include files */
#include "ih264_typedefs.h"
+#include "iv.h"
#include "ih264_macros.h"
#include "ih264_platform_macros.h"
#include "ih264d_structs.h"
@@ -647,7 +648,7 @@
}
/*****************************************************************************/
-/* Function Name : ih264d_format_convert */
+/* Function Name : ih264d_format_convert */
/* */
/* Description : Implements format conversion/frame copy */
/* Inputs : ps_dec - Decoder parameters */
@@ -671,6 +672,8 @@
{
UWORD32 convert_uv_only = 0;
iv_yuv_buf_t *ps_op_frm;
+ UWORD8 *pu1_y_src, *pu1_uv_src;
+ UWORD32 start_uv = u4_start_y >> 1;
if(1 == pv_disp_op->u4_error_code)
return;
@@ -680,25 +683,26 @@
/* Requires u4_start_y and u4_num_rows_y to be even */
if(u4_start_y & 1)
{
- H264_DEC_DEBUG_PRINT(
- "Requires even number of rows and even u4_start_y for format conversion\n");
return;
}
- if((1 == ps_dec->u4_share_disp_buf)
- && ((pv_disp_op->e_output_format == IV_YUV_420SP_UV)))
+ if((1 == ps_dec->u4_share_disp_buf) &&
+ (pv_disp_op->e_output_format == IV_YUV_420SP_UV))
{
return;
}
+
+ pu1_y_src = (UWORD8 *)ps_op_frm->pv_y_buf;
+ pu1_y_src += u4_start_y * ps_op_frm->u4_y_strd,
+
+ pu1_uv_src = (UWORD8 *)ps_op_frm->pv_u_buf;
+ pu1_uv_src += start_uv * ps_op_frm->u4_u_strd;
+
if(pv_disp_op->e_output_format == IV_YUV_420P)
{
- UWORD8 *pu1_src, *pu1_dst;
- UWORD16 i;
- UWORD16 iter;
-
+ UWORD8 *pu1_y_dst, *pu1_u_dst, *pu1_v_dst;
IV_COLOR_FORMAT_T e_output_format = pv_disp_op->e_output_format;
- UWORD32 start_uv = u4_start_y >> 1;
- UWORD32 num_rows_uv = (u4_num_rows_y + 1) >> 1;
+
if(0 == ps_dec->u4_share_disp_buf)
{
convert_uv_only = 0;
@@ -707,118 +711,85 @@
{
convert_uv_only = 1;
}
- {
- UWORD8 *pu1_y_src, *pu1_u_src, *pu1_v_src;
- UWORD8 *pu1_y_dst, *pu1_u_dst, *pu1_v_dst;
- UWORD32 width, height;
- UWORD32 src_luma_stride, src_chroma_stride;
- UWORD32 dst_luma_stride, dst_chroma_stride;
+ pu1_y_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf;
+ pu1_y_dst += u4_start_y * pv_disp_op->s_disp_frm_buf.u4_y_strd;
- pu1_y_src = (UWORD8 *)ps_op_frm->pv_y_buf;
- pu1_y_src += u4_start_y * ps_op_frm->u4_y_strd;
+ pu1_u_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_u_buf;
+ pu1_u_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_u_strd;
- pu1_y_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf;
- pu1_y_dst += u4_start_y * pv_disp_op->s_disp_frm_buf.u4_y_strd;
+ pu1_v_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_v_buf;
+ pu1_v_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_v_strd;
- pu1_u_src = (UWORD8 *)ps_op_frm->pv_u_buf;
- pu1_u_src += start_uv * ps_op_frm->u4_u_strd;
-
- pu1_u_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_u_buf;
- pu1_u_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_u_strd;
-
- pu1_v_src = (UWORD8 *)ps_op_frm->pv_v_buf;
- pu1_v_src += start_uv * ps_op_frm->u4_v_strd;
-
- pu1_v_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_v_buf;
- pu1_v_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_v_strd;
-
- src_luma_stride = ps_op_frm->u4_y_strd;
- src_chroma_stride = ps_op_frm->u4_u_strd;
-
- dst_luma_stride = pv_disp_op->s_disp_frm_buf.u4_y_strd;
- dst_chroma_stride = pv_disp_op->s_disp_frm_buf.u4_u_strd;
-
- width = ps_op_frm->u4_y_wd;
- height = u4_num_rows_y;
- ih264d_fmt_conv_420sp_to_420p(pu1_y_src, pu1_u_src, pu1_y_dst,
- pu1_u_dst, pu1_v_dst, width, height,
- src_luma_stride, src_chroma_stride,
- dst_luma_stride, dst_chroma_stride, 1,
- convert_uv_only);
- }
+ ih264d_fmt_conv_420sp_to_420p(pu1_y_src,
+ pu1_uv_src,
+ pu1_y_dst,
+ pu1_u_dst,
+ pu1_v_dst,
+ ps_op_frm->u4_y_wd,
+ u4_num_rows_y,
+ ps_op_frm->u4_y_strd,
+ ps_op_frm->u4_u_strd,
+ pv_disp_op->s_disp_frm_buf.u4_y_strd,
+ pv_disp_op->s_disp_frm_buf.u4_u_strd,
+ 1,
+ convert_uv_only);
}
-
- else if((pv_disp_op->e_output_format == IV_YUV_420SP_UV)
- || (pv_disp_op->e_output_format == IV_YUV_420SP_VU))
-
+ else if((pv_disp_op->e_output_format == IV_YUV_420SP_UV) ||
+ (pv_disp_op->e_output_format == IV_YUV_420SP_VU))
{
+ UWORD8* pu1_y_dst, *pu1_uv_dst;
- UWORD32 start_uv = u4_start_y >> 1;
- UWORD32 num_rows_uv = (u4_num_rows_y + 1) >> 1;
+ pu1_y_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf;
+ pu1_y_dst += u4_start_y * pv_disp_op->s_disp_frm_buf.u4_y_strd;
+ pu1_uv_dst = (UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_u_buf;
+ pu1_uv_dst += start_uv * pv_disp_op->s_disp_frm_buf.u4_u_strd;
if(pv_disp_op->e_output_format == IV_YUV_420SP_UV)
{
- ih264d_fmt_conv_420sp_to_420sp(
- (UWORD8 *)ps_op_frm->pv_y_buf
- + u4_start_y * ps_op_frm->u4_y_strd,
- ((UWORD8 *)ps_op_frm->pv_u_buf
- + start_uv * ps_op_frm->u4_u_strd),
- ((UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf
- + u4_start_y
- * pv_disp_op->s_disp_frm_buf.u4_y_strd),
- ((UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_u_buf
- + start_uv
- * pv_disp_op->s_disp_frm_buf.u4_u_strd),
- ps_op_frm->u4_y_wd, u4_num_rows_y,
- ps_op_frm->u4_y_strd, ps_op_frm->u4_u_strd,
- pv_disp_op->s_disp_frm_buf.u4_y_strd,
- pv_disp_op->s_disp_frm_buf.u4_u_strd);
+ ih264d_fmt_conv_420sp_to_420sp(pu1_y_src,
+ pu1_uv_src,
+ pu1_y_dst,
+ pu1_uv_dst,
+ ps_op_frm->u4_y_wd,
+ u4_num_rows_y,
+ ps_op_frm->u4_y_strd,
+ ps_op_frm->u4_u_strd,
+ pv_disp_op->s_disp_frm_buf.u4_y_strd,
+ pv_disp_op->s_disp_frm_buf.u4_u_strd);
}
else
{
-
- ih264d_fmt_conv_420sp_to_420sp_swap_uv(
- (UWORD8 *)ps_op_frm->pv_y_buf
- + u4_start_y * ps_op_frm->u4_y_strd,
- ((UWORD8 *)ps_op_frm->pv_u_buf
- + start_uv * ps_op_frm->u4_u_strd),
- ((UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_y_buf
- + u4_start_y
- * pv_disp_op->s_disp_frm_buf.u4_y_strd),
- ((UWORD8 *)pv_disp_op->s_disp_frm_buf.pv_u_buf
- + start_uv
- * pv_disp_op->s_disp_frm_buf.u4_u_strd),
- ps_op_frm->u4_y_wd, u4_num_rows_y,
- ps_op_frm->u4_y_strd, ps_op_frm->u4_u_strd,
- pv_disp_op->s_disp_frm_buf.u4_y_strd,
- pv_disp_op->s_disp_frm_buf.u4_u_strd);
-
+ ih264d_fmt_conv_420sp_to_420sp_swap_uv(pu1_y_src,
+ pu1_uv_src,
+ pu1_y_dst,
+ pu1_uv_dst,
+ ps_op_frm->u4_y_wd,
+ u4_num_rows_y,
+ ps_op_frm->u4_y_strd,
+ ps_op_frm->u4_u_strd,
+ pv_disp_op->s_disp_frm_buf.u4_y_strd,
+ pv_disp_op->s_disp_frm_buf.u4_u_strd);
}
-
}
else if(pv_disp_op->e_output_format == IV_RGB_565)
{
- UWORD32 temp = 0;
- UWORD32 u2_width_rem;
+ UWORD16 *pu2_rgb_dst;
- UWORD32 start_uv = u4_start_y >> 1;
+ pu2_rgb_dst = (UWORD16 *)pv_disp_op->s_disp_frm_buf.pv_y_buf;
+ pu2_rgb_dst += u4_start_y * pv_disp_op->s_disp_frm_buf.u4_y_strd;
- ih264d_fmt_conv_420sp_to_rgb565(
- (UWORD8 *)ps_op_frm->pv_y_buf
- + u4_start_y * ps_op_frm->u4_y_strd,
- ((UWORD8 *)ps_op_frm->pv_u_buf
- + start_uv * ps_op_frm->u4_u_strd),
- ((UWORD16 *)pv_disp_op->s_disp_frm_buf.pv_y_buf
- + u4_start_y
- * pv_disp_op->s_disp_frm_buf.u4_y_strd),
- ps_op_frm->u4_y_wd, u4_num_rows_y, ps_op_frm->u4_y_strd,
- ps_op_frm->u4_u_strd,
- pv_disp_op->s_disp_frm_buf.u4_y_strd, 1);
-
-
+ ih264d_fmt_conv_420sp_to_rgb565(pu1_y_src,
+ pu1_uv_src,
+ pu2_rgb_dst,
+ ps_op_frm->u4_y_wd,
+ u4_num_rows_y,
+ ps_op_frm->u4_y_strd,
+ ps_op_frm->u4_u_strd,
+ pv_disp_op->s_disp_frm_buf.u4_y_strd,
+ 1);
}
if((u4_start_y + u4_num_rows_y) >= ps_dec->s_disp_frame_info.u4_y_ht)
@@ -826,7 +797,8 @@
INSERT_LOGO(pv_disp_op->s_disp_frm_buf.pv_y_buf,
pv_disp_op->s_disp_frm_buf.pv_u_buf,
- pv_disp_op->s_disp_frm_buf.pv_v_buf, pv_disp_op->s_disp_frm_buf.u4_y_strd,
+ pv_disp_op->s_disp_frm_buf.pv_v_buf,
+ pv_disp_op->s_disp_frm_buf.u4_y_strd,
ps_dec->u2_disp_width,
ps_dec->u2_disp_height,
pv_disp_op->e_output_format,