diff options
-rw-r--r--[-rwxr-xr-x] | common/arm/impeg2_mem_func.s | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | common/impeg2_globals.h | 0 | ||||
-rw-r--r-- | common/impeg2_inter_pred.h | 3 | ||||
-rw-r--r--[-rwxr-xr-x] | common/x86/impeg2_idct_recon_sse42_intr.c | 0 | ||||
-rw-r--r-- | decoder/arm/impeg2d_function_selector.c | 7 | ||||
-rw-r--r--[-rwxr-xr-x] | decoder/impeg2d_api_main.c | 66 | ||||
-rw-r--r-- | decoder/impeg2d_d_pic.c | 2 | ||||
-rw-r--r-- | decoder/impeg2d_dec_hdr.c | 6 | ||||
-rw-r--r--[-rwxr-xr-x] | decoder/impeg2d_decoder.c | 1 | ||||
-rw-r--r-- | decoder/impeg2d_function_selector.h | 75 | ||||
-rw-r--r-- | decoder/impeg2d_i_pic.c | 2 | ||||
-rw-r--r-- | decoder/impeg2d_mc.c | 4 | ||||
-rw-r--r--[-rwxr-xr-x] | decoder/impeg2d_pic_proc.c | 2 | ||||
-rw-r--r-- | decoder/impeg2d_pnb_pic.c | 2 | ||||
-rw-r--r--[-rwxr-xr-x] | decoder/impeg2d_structs.h | 0 | ||||
-rw-r--r-- | decoder/mips/impeg2d_function_selector.c | 3 | ||||
-rw-r--r--[-rwxr-xr-x] | decoder/x86/impeg2d_function_selector.c | 6 |
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) { |