summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/impeg2_buf_mgr.c33
-rw-r--r--common/impeg2_buf_mgr.h4
-rw-r--r--decoder/impeg2d_api_main.c38
3 files changed, 43 insertions, 32 deletions
diff --git a/common/impeg2_buf_mgr.c b/common/impeg2_buf_mgr.c
index c4aca4a..498259f 100644
--- a/common/impeg2_buf_mgr.c
+++ b/common/impeg2_buf_mgr.c
@@ -88,6 +88,39 @@ void impeg2_buf_mgr_init(
}
}
+/**
+*******************************************************************************
+*
+* @brief
+* Buffer manager reset function.
+*
+* @par Description:
+* Resets the buffer manager structure
+*
+* @param[in] ps_buf_mgr
+* Pointer to the buffer manager
+*
+* @returns
+*
+* @remarks
+* None
+*
+*******************************************************************************
+*/
+
+void impeg2_buf_mgr_reset(
+ buf_mgr_t *ps_buf_mgr)
+{
+ WORD32 id;
+
+ ps_buf_mgr->u4_max_buf_cnt = BUF_MGR_MAX_CNT;
+ ps_buf_mgr->u4_active_buf_cnt = 0;
+
+ for(id = 0; id < BUF_MGR_MAX_CNT; id++)
+ {
+ ps_buf_mgr->au4_status[id] = 0;
+ }
+}
/**
*******************************************************************************
diff --git a/common/impeg2_buf_mgr.h b/common/impeg2_buf_mgr.h
index 6b1cbef..aed157a 100644
--- a/common/impeg2_buf_mgr.h
+++ b/common/impeg2_buf_mgr.h
@@ -69,6 +69,10 @@ typedef struct
void impeg2_buf_mgr_init(
buf_mgr_t *ps_buf_mgr);
+// resets the buffer API structure
+void impeg2_buf_mgr_reset(
+ buf_mgr_t *ps_buf_mgr);
+
// Add buffer to buffer manager. 0: success, -1: fail (u4_active_buf_cnt has reached u4_max_buf_cnt)
WORD32 impeg2_buf_mgr_add(
buf_mgr_t *ps_buf_mgr,
diff --git a/decoder/impeg2d_api_main.c b/decoder/impeg2d_api_main.c
index d9bc644..33a7281 100644
--- a/decoder/impeg2d_api_main.c
+++ b/decoder/impeg2d_api_main.c
@@ -992,26 +992,11 @@ 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);
-
- }
-
- if((ps_dec_state->u4_deinterlace) && (NULL != ps_dec_state->ps_deint_pic))
- {
- impeg2_buf_mgr_release(ps_dec_state->pv_pic_buf_mg,
- ps_dec_state->ps_deint_pic->i4_buf_id,
- MPEG2_BUF_MGR_DEINT);
- }
+ impeg2_buf_mgr_reset(ps_dec_state->pv_pic_buf_mg);
+ /* Display buffer manager init behaves like a reset
+ * as it doesn't need to preserve picture buffer addresses
+ * like buffer manager */
+ impeg2_disp_mgr_init(&ps_dec_state->s_disp_mgr);
for(i4_num_threads = 0; i4_num_threads < MAX_THREADS; i4_num_threads++)
{
@@ -1102,18 +1087,7 @@ IV_API_CALL_STATUS_T impeg2d_api_set_params(iv_obj_t *ps_dechdl,void *pv_api_ip,
if(ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd != 0)
{
- if(ps_dec_state->u2_header_done == 1)
- {
- if (ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd > ps_dec_state->u2_frame_width)
- {
- ps_dec_state->u4_frm_buf_stride = ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd;
- }
- }
- else
- {
- ps_dec_state->u4_frm_buf_stride = ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd;
- }
-
+ ps_dec_state->u4_frm_buf_stride = ps_ctl_dec_ip->s_ivd_ctl_set_config_ip_t.u4_disp_wd;
}
else
{