summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)
{