diff --git a/mpp/codec/dec/h264/h264d_api.c b/mpp/codec/dec/h264/h264d_api.c index 74259a7d..fa5e1682 100644 --- a/mpp/codec/dec/h264/h264d_api.c +++ b/mpp/codec/dec/h264/h264d_api.c @@ -556,16 +556,12 @@ MPP_RET h264d_flush(void *decoder) } goto __RETURN; } - FUN_CHECK(ret = flush_dpb(p_Dec->p_Vid->p_Dpb_layer[0], 1)); - FUN_CHECK(ret = init_dpb(p_Dec->p_Vid, p_Dec->p_Vid->p_Dpb_layer[0], 1)); - //free_dpb(p_Dec->p_Vid->p_Dpb_layer[0]); + + FUN_CHECK(ret = output_dpb(p_Dec, p_Dec->p_Vid->p_Dpb_layer[0])); if (p_Dec->mvc_valid) { - // layer_id == 1 - FUN_CHECK(ret = flush_dpb(p_Dec->p_Vid->p_Dpb_layer[1], 2)); - FUN_CHECK(ret = init_dpb(p_Dec->p_Vid, p_Dec->p_Vid->p_Dpb_layer[1], 2)); - //free_dpb(p_Dec->p_Vid->p_Dpb_layer[1]); + FUN_CHECK(ret = output_dpb(p_Dec, p_Dec->p_Vid->p_Dpb_layer[1])); } - flush_dpb_buf_slot(p_Dec); + if (p_Dec->last_frame_slot_idx >= 0) { mpp_buf_slot_set_prop(p_Dec->frame_slots, p_Dec->last_frame_slot_idx, SLOT_EOS, &p_Dec->p_Inp->has_get_eos); diff --git a/mpp/codec/dec/h264/h264d_dpb.c b/mpp/codec/dec/h264/h264d_dpb.c index 88c82072..f7335529 100644 --- a/mpp/codec/dec/h264/h264d_dpb.c +++ b/mpp/codec/dec/h264/h264d_dpb.c @@ -1321,6 +1321,8 @@ MPP_RET store_picture_in_dpb(H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p) p_Dpb->used_size++; H264D_DBG(H264D_DBG_DPB_INFO, "[DPB_size] p_Dpb->used_size=%d", p_Dpb->used_size); } + + #endif #if 1 { @@ -1796,7 +1798,31 @@ __RETURN: __FAILED: return ret; } +/*! +*********************************************************************** +* \brief +* write out all frames +*********************************************************************** +*/ +//extern "C" +MPP_RET output_dpb(H264_DecCtx_t *p_Dec, H264_DpbBuf_t *p_Dpb) +{ + RK_S32 poc = 0, pos = 0; + MPP_RET ret = MPP_ERR_UNKNOW; + INP_CHECK(ret, !p_Dpb); + while (get_smallest_poc(p_Dpb, &poc, &pos)) { + p_Dpb->last_output_poc = poc; + FUN_CHECK(ret = write_stored_frame(p_Dpb->p_Vid, p_Dpb->fs[pos])); + if (!is_used_for_reference(p_Dpb->fs[pos])) { + FUN_CHECK(ret = remove_frame_from_dpb(p_Dpb, pos)); + } + } +__RETURN: + return ret = MPP_OK; +__FAILED: + return ret; +} /*! *********************************************************************** * \brief diff --git a/mpp/codec/dec/h264/h264d_dpb.h b/mpp/codec/dec/h264/h264d_dpb.h index 89695d24..96146b2b 100644 --- a/mpp/codec/dec/h264/h264d_dpb.h +++ b/mpp/codec/dec/h264/h264d_dpb.h @@ -39,6 +39,7 @@ MPP_RET store_picture_in_dpb (H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p); MPP_RET init_dpb (H264dVideoCtx_t *p_Vid, H264_DpbBuf_t *p_Dpb, RK_S32 type); MPP_RET flush_dpb (H264_DpbBuf_t *p_Dpb, RK_S32 type); +MPP_RET output_dpb (H264_DecCtx_t *p_Dec, H264_DpbBuf_t *p_Dpb); void free_dpb (H264_DpbBuf_t *p_Dpb); MPP_RET exit_picture(H264dVideoCtx_t *p_Vid, H264_StorePic_t **dec_pic);