summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVenkatarama Avadhani <venkatarama.avadhani@ittiam.com>2015-04-16 17:39:55 +0530
committerRachad Alao <rachad@google.com>2015-07-31 01:59:05 +0000
commitb34913857dacd4b7f82715c48ae1de9c56ede9e0 (patch)
treee6dd2b63fdd4f8ea621f4569cebbeefa963d549e
parent8a947018e3e721c99b0f548d28a922471d94365b (diff)
downloadandroid_external_libmpeg2-b34913857dacd4b7f82715c48ae1de9c56ede9e0.tar.gz
android_external_libmpeg2-b34913857dacd4b7f82715c48ae1de9c56ede9e0.tar.bz2
android_external_libmpeg2-b34913857dacd4b7f82715c48ae1de9c56ede9e0.zip
Fixed few issues seen in CTS tests
Buffer managers are reset to init state in reset() Return picture type of picture being output instead of picture decoded Read start code only if input bitstream has enough bytes Bug: 22860270 Change-Id: Ic158d9dbff6d6b5295173b6ff2a4c6d6da66115f
-rw-r--r--[-rwxr-xr-x]common/arm/impeg2_mem_func.s0
-rw-r--r--[-rwxr-xr-x]common/impeg2_globals.h0
-rw-r--r--common/impeg2_inter_pred.h3
-rw-r--r--[-rwxr-xr-x]common/x86/impeg2_idct_recon_sse42_intr.c0
-rw-r--r--decoder/arm/impeg2d_function_selector.c7
-rw-r--r--[-rwxr-xr-x]decoder/impeg2d_api_main.c66
-rw-r--r--decoder/impeg2d_d_pic.c2
-rw-r--r--decoder/impeg2d_dec_hdr.c6
-rw-r--r--[-rwxr-xr-x]decoder/impeg2d_decoder.c1
-rw-r--r--decoder/impeg2d_function_selector.h75
-rw-r--r--decoder/impeg2d_i_pic.c2
-rw-r--r--decoder/impeg2d_mc.c4
-rw-r--r--[-rwxr-xr-x]decoder/impeg2d_pic_proc.c2
-rw-r--r--decoder/impeg2d_pnb_pic.c2
-rw-r--r--[-rwxr-xr-x]decoder/impeg2d_structs.h0
-rw-r--r--decoder/mips/impeg2d_function_selector.c3
-rw-r--r--[-rwxr-xr-x]decoder/x86/impeg2d_function_selector.c6
17 files changed, 137 insertions, 42 deletions
diff --git a/common/arm/impeg2_mem_func.s b/common/arm/impeg2_mem_func.s
index 869b7d7..869b7d7 100755..100644
--- a/common/arm/impeg2_mem_func.s
+++ b/common/arm/impeg2_mem_func.s
diff --git a/common/impeg2_globals.h b/common/impeg2_globals.h
index e8c6865..e8c6865 100755..100644
--- a/common/impeg2_globals.h
+++ b/common/impeg2_globals.h
diff --git a/common/impeg2_inter_pred.h b/common/impeg2_inter_pred.h
index be3b0e5..ddd6928 100644
--- a/common/impeg2_inter_pred.h
+++ b/common/impeg2_inter_pred.h
@@ -53,6 +53,9 @@ typedef struct
*/
WORD32 i4_buf_id;
+ /* To store the buffer's picture type */
+ e_pic_type_t e_pic_type;
+
}pic_buf_t;
typedef void pf_copy_mb_t (yuv_buf_t *src_buf,
diff --git a/common/x86/impeg2_idct_recon_sse42_intr.c b/common/x86/impeg2_idct_recon_sse42_intr.c
index 4142032..4142032 100755..100644
--- a/common/x86/impeg2_idct_recon_sse42_intr.c
+++ b/common/x86/impeg2_idct_recon_sse42_intr.c
diff --git a/decoder/arm/impeg2d_function_selector.c b/decoder/arm/impeg2d_function_selector.c
index bc6a688..a344e59 100644
--- a/decoder/arm/impeg2d_function_selector.c
+++ b/decoder/arm/impeg2d_function_selector.c
@@ -65,12 +65,7 @@
#include "impeg2d_pic_proc.h"
#include "impeg2d_debug.h"
#include "impeg2d_mc.h"
-
-void impeg2d_init_function_ptr_generic(void *pv_codec);
-void impeg2d_init_function_ptr_a9q(void *pv_codec);
-#ifdef ARMV8
-void impeg2d_init_function_ptr_av8(void *pv_codec);
-#endif /* ARMV8 */
+#include "impeg2d_function_selector.h"
void impeg2d_init_function_ptr(void *pv_codec)
{
diff --git a/decoder/impeg2d_api_main.c b/decoder/impeg2d_api_main.c
index 451eb93..a96afd5 100755..100644
--- a/decoder/impeg2d_api_main.c
+++ b/decoder/impeg2d_api_main.c
@@ -896,6 +896,20 @@ IV_API_CALL_STATUS_T impeg2d_api_reset(iv_obj_t *ps_dechdl,
if(ps_dec_state_multi_core != NULL)
{
+ if(ps_dec_state->aps_ref_pics[1] != NULL)
+ impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[1]->i4_buf_id, BUF_MGR_REF);
+ if(ps_dec_state->aps_ref_pics[0] != NULL)
+ impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_dec_state->aps_ref_pics[0]->i4_buf_id, BUF_MGR_REF);
+ while(1)
+ {
+ pic_buf_t *ps_disp_pic = impeg2_disp_mgr_get(&ps_dec_state->s_disp_mgr, &ps_dec_state->i4_disp_buf_id);
+ if(NULL == ps_disp_pic)
+ break;
+ if(0 == ps_dec_state->u4_share_disp_buf)
+ impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg, ps_disp_pic->i4_buf_id, BUF_MGR_DISP);
+
+ }
+
for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++)
{
@@ -908,6 +922,8 @@ IV_API_CALL_STATUS_T impeg2d_api_reset(iv_obj_t *ps_dechdl,
ps_dec_state->u2_header_done = 0; /* Header decoding not done */
ps_dec_state->u4_frm_buf_stride = 0;
ps_dec_state->u2_is_mpeg2 = 0;
+ ps_dec_state->aps_ref_pics[0] = NULL;
+ ps_dec_state->aps_ref_pics[1] = NULL;
}
}
else
@@ -3138,6 +3154,11 @@ IV_API_CALL_STATUS_T impeg2d_api_entity(iv_obj_t *ps_dechdl,
ps_dec_op->s_ivd_video_decode_op_t.u4_progressive_frame_flag = IV_PROGRESSIVE;
+ if (0 == ps_dec_state->u4_frm_buf_stride)
+ {
+ ps_dec_state->u4_frm_buf_stride = ALIGN16(ps_dec_state->u2_horizontal_size);
+ }
+
ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_wd = ps_dec_state->u2_horizontal_size;
ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_strd = ps_dec_state->u4_frm_buf_stride;
ps_dec_op->s_ivd_video_decode_op_t.s_disp_frm_buf.u4_y_ht = ps_dec_state->u2_vertical_size;
@@ -3181,36 +3202,41 @@ IV_API_CALL_STATUS_T impeg2d_api_entity(iv_obj_t *ps_dechdl,
if (IVD_ERROR_NONE ==
ps_dec_op->s_ivd_video_decode_op_t.u4_error_code)
{
- if(ps_dec_state->ps_disp_pic)
- ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 1;
- else
- ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 0;
if(ps_dec_state->u1_first_frame_done == 0)
{
ps_dec_state->u1_first_frame_done = 1;
}
- switch(ps_dec_state->e_pic_type)
+ if(ps_dec_state->ps_disp_pic)
{
- case I_PIC :
- ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME;
- break;
+ ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 1;
+ switch(ps_dec_state->ps_disp_pic->e_pic_type)
+ {
+ case I_PIC :
+ ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME;
+ break;
- case P_PIC:
- ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_P_FRAME;
- break;
+ case P_PIC:
+ ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_P_FRAME;
+ break;
- case B_PIC:
- ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_B_FRAME;
- break;
+ case B_PIC:
+ ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_B_FRAME;
+ break;
- case D_PIC:
- ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME;
- break;
+ case D_PIC:
+ ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_I_FRAME;
+ break;
- default :
- ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_FRAMETYPE_DEFAULT;
- break;
+ default :
+ ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_FRAMETYPE_DEFAULT;
+ break;
+ }
+ }
+ else
+ {
+ ps_dec_op->s_ivd_video_decode_op_t.u4_output_present = 0;
+ ps_dec_op->s_ivd_video_decode_op_t.e_pic_type = IV_NA_FRAME;
}
ps_dec_state->u4_num_frames_decoded++;
diff --git a/decoder/impeg2d_d_pic.c b/decoder/impeg2d_d_pic.c
index a90e16d..6fcf1f4 100644
--- a/decoder/impeg2d_d_pic.c
+++ b/decoder/impeg2d_d_pic.c
@@ -236,7 +236,7 @@ IMPEG2D_ERROR_CODES_T impeg2d_dec_d_slice(dec_state_t *ps_dec)
{
return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
}
- else if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset))
+ else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
{
ps_dec->u2_mb_x = 0;
ps_dec->u2_mb_y++;
diff --git a/decoder/impeg2d_dec_hdr.c b/decoder/impeg2d_dec_hdr.c
index 15e61fb..061bf04 100644
--- a/decoder/impeg2d_dec_hdr.c
+++ b/decoder/impeg2d_dec_hdr.c
@@ -1129,12 +1129,12 @@ WORD32 impeg2d_get_slice_pos(dec_state_multi_core_t *ps_dec_state_multi_core)
while(1)
{
WORD32 i4_is_slice;
- u4_bits = impeg2d_bit_stream_nxt(&s_bitstrm,START_CODE_LEN);
- if(s_bitstrm.u4_offset >= s_bitstrm.u4_max_offset)
+
+ if(s_bitstrm.u4_offset + START_CODE_LEN >= s_bitstrm.u4_max_offset)
{
break;
}
-
+ u4_bits = impeg2d_bit_stream_nxt(&s_bitstrm,START_CODE_LEN);
i4_row = u4_bits & 0xFF;
diff --git a/decoder/impeg2d_decoder.c b/decoder/impeg2d_decoder.c
index ae58675..7bc3253 100755..100644
--- a/decoder/impeg2d_decoder.c
+++ b/decoder/impeg2d_decoder.c
@@ -143,7 +143,6 @@ void impeg2d_dec_hdr(void *pv_dec,impeg2d_video_decode_ip_t *ps_ip,
ps_op->s_ivd_video_decode_op_t.u4_frame_decoded_flag = 0;
/* MOD */
ps_dec->u2_header_done = 1;
- ps_dec->u2_decode_header = 0;
}
}
diff --git a/decoder/impeg2d_function_selector.h b/decoder/impeg2d_function_selector.h
new file mode 100644
index 0000000..19915b3
--- /dev/null
+++ b/decoder/impeg2d_function_selector.h
@@ -0,0 +1,75 @@
+/******************************************************************************
+ *
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *****************************************************************************
+ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
+*/
+
+/**
+ *******************************************************************************
+ * @file
+ * impeg2d_function_selector.h
+ *
+ * @brief
+ * Structure definitions used in the decoder
+ *
+ * @author
+ * Harish
+ *
+ * @par List of Functions:
+ *
+ * @remarks
+ * None
+ *
+ *******************************************************************************
+ */
+
+#ifndef _IMPEG2D_FUNCTION_SELECTOR_H_
+#define _IMPEG2D_FUNCTION_SELECTOR_H_
+
+#define D_ARCH_NA 1
+#define D_ARCH_ARM_NONEON 2
+#define D_ARCH_ARM_A9Q 3
+#define D_ARCH_ARM_A9A 4
+#define D_ARCH_ARM_A9 5
+#define D_ARCH_ARM_A7 6
+#define D_ARCH_ARM_A5 7
+#define D_ARCH_ARM_A15 8
+#define D_ARCH_ARM_NEONINTR 9
+#define D_ARCH_ARMV8_GENERIC 10
+#define D_ARCH_X86_GENERIC 11
+#define D_ARCH_X86_SSSE3 12
+#define D_ARCH_X86_SSE42 13
+#define D_ARCH_X86_AVX2 14
+#define D_ARCH_MIPS_GENERIC 15
+#define D_ARCH_MIPS_32 16
+
+void impeg2d_init_arch(void *ps_codec);
+
+void impeg2d_init_function_ptr(void *ps_codec);
+
+void impeg2d_init_function_ptr_generic(void *ps_codec);
+void impeg2d_init_function_ptr_ssse3(void *ps_codec);
+void impeg2d_init_function_ptr_sse42(void *ps_codec);
+
+#ifndef DISABLE_AVX2
+void impeg2d_init_function_ptr_avx2(void *ps_codec);
+#endif
+
+void impeg2d_init_function_ptr_a9q(void *ps_codec);
+void impeg2d_init_function_ptr_av8(void *ps_codec);
+
+#endif /* _IMPEG2D_FUNCTION_SELECTOR_H_ */
diff --git a/decoder/impeg2d_i_pic.c b/decoder/impeg2d_i_pic.c
index 1b45350..2e20983 100644
--- a/decoder/impeg2d_i_pic.c
+++ b/decoder/impeg2d_i_pic.c
@@ -316,7 +316,7 @@ IMPEG2D_ERROR_CODES_T impeg2d_dec_i_slice(dec_state_t *ps_dec)
{
return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
}
- else if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset))
+ else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
{
ps_dec->u2_mb_x = 0;
ps_dec->u2_mb_y++;
diff --git a/decoder/impeg2d_mc.c b/decoder/impeg2d_mc.c
index da13a8c..79c5ef6 100644
--- a/decoder/impeg2d_mc.c
+++ b/decoder/impeg2d_mc.c
@@ -591,7 +591,7 @@ void impeg2d_dec_skip_p_mb(dec_state_t *ps_dec, WORD32 u4_num_of_mbs)
ps_dec->u2_mb_x++;
ps_dec->u2_num_mbs_left--;
- if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset))
+ if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
{
ps_dec->u2_mb_x = 0;
ps_dec->u2_mb_y++;
@@ -704,7 +704,7 @@ void impeg2d_dec_skip_b_mb(dec_state_t *ps_dec, WORD32 u4_num_of_mbs)
ps_dec->u2_mb_x++;
ps_dec->u2_num_mbs_left--;
- if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset))
+ if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
{
ps_dec->u2_mb_x = 0;
ps_dec->u2_mb_y++;
diff --git a/decoder/impeg2d_pic_proc.c b/decoder/impeg2d_pic_proc.c
index 3dececb..e79e87a 100755..100644
--- a/decoder/impeg2d_pic_proc.c
+++ b/decoder/impeg2d_pic_proc.c
@@ -367,6 +367,7 @@ IMPEG2D_ERROR_CODES_T impeg2d_pre_pic_dec_proc(dec_state_t *ps_dec)
impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_REF);
ps_pic_buf->u4_ts = ps_dec->u4_inp_ts;
+ ps_pic_buf->e_pic_type = ps_dec->e_pic_type;
ps_dec->ps_cur_pic = ps_pic_buf;
ps_dec->s_cur_frm_buf.pu1_y = ps_pic_buf->pu1_y;
ps_dec->s_cur_frm_buf.pu1_u = ps_pic_buf->pu1_u;
@@ -407,6 +408,7 @@ IMPEG2D_ERROR_CODES_T impeg2d_pre_pic_dec_proc(dec_state_t *ps_dec)
impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_REF);
ps_pic_buf->u4_ts = ps_dec->u4_inp_ts;
+ ps_pic_buf->e_pic_type = ps_dec->e_pic_type;
ps_dec->ps_cur_pic = ps_pic_buf;
ps_dec->s_cur_frm_buf.pu1_y = ps_pic_buf->pu1_y;
ps_dec->s_cur_frm_buf.pu1_u = ps_pic_buf->pu1_u;
diff --git a/decoder/impeg2d_pnb_pic.c b/decoder/impeg2d_pnb_pic.c
index 036c7d1..0960c24 100644
--- a/decoder/impeg2d_pnb_pic.c
+++ b/decoder/impeg2d_pnb_pic.c
@@ -686,7 +686,7 @@ IMPEG2D_ERROR_CODES_T impeg2d_dec_p_b_slice(dec_state_t *ps_dec)
{
return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
}
- else if ((ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb) && ((ps_dec->s_bit_stream.u4_offset + START_CODE_PREFIX_LEN) < ps_dec->s_bit_stream.u4_max_offset))
+ else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
{
ps_dec->u2_mb_x = 0;
ps_dec->u2_mb_y++;
diff --git a/decoder/impeg2d_structs.h b/decoder/impeg2d_structs.h
index 63a0b03..63a0b03 100755..100644
--- a/decoder/impeg2d_structs.h
+++ b/decoder/impeg2d_structs.h
diff --git a/decoder/mips/impeg2d_function_selector.c b/decoder/mips/impeg2d_function_selector.c
index a72c1f9..3b2677a 100644
--- a/decoder/mips/impeg2d_function_selector.c
+++ b/decoder/mips/impeg2d_function_selector.c
@@ -65,8 +65,7 @@
#include "impeg2d_pic_proc.h"
#include "impeg2d_debug.h"
#include "impeg2d_mc.h"
-
-void impeg2d_init_function_ptr_generic(void *pv_codec);
+#include "impeg2d_function_selector.h"
void impeg2d_init_function_ptr(void *pv_codec)
{
diff --git a/decoder/x86/impeg2d_function_selector.c b/decoder/x86/impeg2d_function_selector.c
index ddadb02..9596aef 100755..100644
--- a/decoder/x86/impeg2d_function_selector.c
+++ b/decoder/x86/impeg2d_function_selector.c
@@ -62,11 +62,7 @@
#include "impeg2d_bitstream.h"
#include "impeg2d_debug.h"
#include "impeg2d_structs.h"
-
-void impeg2d_init_function_ptr_generic(void *pv_codec);
-void impeg2d_init_function_ptr_ssse3(void *pv_codec);
-void impeg2d_init_function_ptr_sse42(void *pv_codec);
-void impeg2d_init_function_ptr_avx2(void *pv_codec);
+#include "impeg2d_function_selector.h"
void impeg2d_init_function_ptr(void *pv_codec)
{