diff --git a/inc/rk_mpi_cmd.h b/inc/rk_mpi_cmd.h index 7ec58e2c..fb4ade57 100644 --- a/inc/rk_mpi_cmd.h +++ b/inc/rk_mpi_cmd.h @@ -97,6 +97,7 @@ typedef enum { MPP_DEC_SET_VC1_EXTRA_DATA, MPP_DEC_SET_OUTPUT_FORMAT, MPP_DEC_SET_DISABLE_ERROR, /* When set it will disable sw/hw error (H.264 / H.265) */ + MPP_DEC_SET_IMMEDIATE_OUT, MPP_DEC_CMD_END, MPP_ENC_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_ENC, diff --git a/inc/vpu_api.h b/inc/vpu_api.h index 0a6a2d2a..c29199c4 100644 --- a/inc/vpu_api.h +++ b/inc/vpu_api.h @@ -92,6 +92,7 @@ typedef enum VPU_API_CMD { VPU_API_GET_FRAME_INFO, VPU_API_SET_OUTPUT_BLOCK, VPU_API_GET_EOS_STATUS, + VPU_API_SET_IMMEDIATE_OUT = 0x1000, } VPU_API_CMD; typedef struct { diff --git a/mpp/codec/dec/h264/h264d_api.c b/mpp/codec/dec/h264/h264d_api.c index da8ec8a3..9b7a477e 100644 --- a/mpp/codec/dec/h264/h264d_api.c +++ b/mpp/codec/dec/h264/h264d_api.c @@ -476,7 +476,10 @@ MPP_RET h264d_control(void *decoder, RK_S32 cmd_type, void *param) switch (cmd_type) { case MPP_DEC_SET_DISABLE_ERROR: { dec->disable_error = *((RK_U32 *)param); - } + } break; + case MPP_DEC_SET_IMMEDIATE_OUT: { + dec->immediate_out = *((RK_U32 *)param); + } break; default : { } break; } diff --git a/mpp/codec/dec/h264/h264d_dpb.c b/mpp/codec/dec/h264/h264d_dpb.c index 0cdec3c7..22e151bc 100644 --- a/mpp/codec/dec/h264/h264d_dpb.c +++ b/mpp/codec/dec/h264/h264d_dpb.c @@ -1339,7 +1339,9 @@ MPP_RET store_picture_in_dpb(H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p) p_Dpb->poc_interval = 1; } - if (p->idr_flag || (p->poc == 0) || (p_Dpb->last_output_poc == INT_MIN)) { + if (p->idr_flag || (p->poc == 0) + || (p_Dpb->last_output_poc == INT_MIN) + || p_Vid->p_Dec->immediate_out) { FUN_CHECK(ret = write_stored_frame(p_Vid, p_Dpb, fs)); } while ((p_Dpb->last_output_poc > INT_MIN) diff --git a/mpp/codec/dec/h264/h264d_global.h b/mpp/codec/dec/h264/h264d_global.h index 1510457a..e959c997 100644 --- a/mpp/codec/dec/h264/h264d_global.h +++ b/mpp/codec/dec/h264/h264d_global.h @@ -1148,6 +1148,7 @@ typedef struct h264_dec_ctx_t { HalDecTask *in_task; RK_S32 last_frame_slot_idx; RK_U32 disable_error; + RK_U32 immediate_out; struct h264_err_ctx_t errctx; } H264_DecCtx_t; diff --git a/mpp/legacy/vpu_api_legacy.cpp b/mpp/legacy/vpu_api_legacy.cpp index d0e3ef40..0dd42dc2 100644 --- a/mpp/legacy/vpu_api_legacy.cpp +++ b/mpp/legacy/vpu_api_legacy.cpp @@ -1428,6 +1428,9 @@ RK_S32 VpuApiLegacy::control(VpuCodecContext *ctx, VPU_API_CMD cmd, void *param) *((VPU_GENERIC *)param) = vpug; mpicmd = MPI_CMD_BUTT; } break; + case VPU_API_SET_IMMEDIATE_OUT: { + mpicmd = MPP_DEC_SET_IMMEDIATE_OUT; + } break; default: { } break; } diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index 96c1553b..4c9a7abb 100755 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -769,7 +769,8 @@ MPP_RET Mpp::control_dec(MpiCmd cmd, MppParam param) case MPP_DEC_GET_VPUMEM_USED_COUNT: case MPP_DEC_SET_OUTPUT_FORMAT: case MPP_DEC_SET_DISABLE_ERROR: - case MPP_DEC_SET_PRESENT_TIME_ORDER: { + case MPP_DEC_SET_PRESENT_TIME_ORDER: + case MPP_DEC_SET_IMMEDIATE_OUT: { ret = mpp_dec_control(mDec, cmd, param); } default : {