diff --git a/mpp/codec/dec/h265/h265d_parser.c b/mpp/codec/dec/h265/h265d_parser.c index 1b944f84..dc691fad 100644 --- a/mpp/codec/dec/h265/h265d_parser.c +++ b/mpp/codec/dec/h265/h265d_parser.c @@ -286,6 +286,7 @@ RK_S32 h265d_split_reset(void *sc) s->fetch_timestamp = 1; s->buffer = buf; s->buffer_size = size; + s->eos = 0; return MPP_OK; } @@ -1971,7 +1972,6 @@ MPP_RET h265d_init(void *ctx, ParserCfg *parser_cfg) MPP_RET h265d_flush(void *ctx) { RK_S32 ret = 0; - RK_U32 eos = 1; H265dContext_t *h265dctx = (H265dContext_t *)ctx; HEVCContext *s = (HEVCContext *)h265dctx->priv_data; HEVCFrame *frame = NULL; @@ -2001,6 +2001,7 @@ MPP_RET h265d_reset(void *ctx) mpp_hevc_flush_dpb(s); h265d_split_reset(h265dctx->split_cxt); s->max_ra = INT_MAX; + s->eos = 0; return MPP_OK; } diff --git a/mpp/legacy/vpu_api_legacy.cpp b/mpp/legacy/vpu_api_legacy.cpp index 97b79511..fa59e74c 100644 --- a/mpp/legacy/vpu_api_legacy.cpp +++ b/mpp/legacy/vpu_api_legacy.cpp @@ -47,6 +47,7 @@ VpuApi::VpuApi() fp = fopen("/sdcard/rk_mpp_dump.yuv", "wb"); fp_buf = mpp_malloc(RK_U8, (MAX_WRITE_HEIGHT * MAX_WRITE_WIDTH * 2)); } + init_ok = 0; mpp_log_f("ok\n"); } @@ -100,7 +101,7 @@ RK_S32 VpuApi::init(VpuCodecContext *ctx, RK_U8 *extraData, RK_U32 extra_size) mpi->decode_put_packet(mpp_ctx, pkt); mpp_packet_deinit(&pkt); } - + init_ok = 1; mpp_log_f("ok\n"); return ret; } @@ -109,7 +110,7 @@ RK_S32 VpuApi::flush(VpuCodecContext *ctx) { (void)ctx; mpp_log_f("in\n"); - if (mpi && mpi->reset) { + if (mpi && mpi->reset && !init_ok) { mpi->reset(mpp_ctx); } mpp_log_f("ok\n"); @@ -128,9 +129,13 @@ RK_S32 VpuApi::decode(VpuCodecContext *ctx, VideoPacket_t *pkt, DecoderOut_t *aD RK_S32 VpuApi::decode_sendstream(VideoPacket_t *pkt) { - RK_S32 ret; + RK_S32 ret = MPP_OK; MppPacket mpkt = NULL; + if (!init_ok) { + return VPU_API_ERR_VPU_CODEC_INIT; + } + mpp_packet_init(&mpkt, pkt->data, pkt->size); mpp_packet_set_pts(mpkt, pkt->pts); if (pkt->nFlags & OMX_BUFFERFLAG_EOS) { @@ -149,6 +154,9 @@ RK_S32 VpuApi:: decode_getoutframe(DecoderOut_t *aDecOut) RK_S32 ret = 0; VPU_FRAME *vframe = (VPU_FRAME *)aDecOut->data; MppFrame mframe = NULL; + if (!init_ok) { + return VPU_API_ERR_VPU_CODEC_INIT; + } memset(vframe, 0, sizeof(VPU_FRAME)); @@ -335,7 +343,7 @@ RK_S32 VpuApi::control(VpuCodecContext *ctx, VPU_API_CMD cmd, void *param) mpp_log_f("in\n"); (void)ctx; - if (mpi == NULL) { + if (mpi == NULL && !init_ok) { return 0; } diff --git a/mpp/legacy/vpu_api_legacy.h b/mpp/legacy/vpu_api_legacy.h index 1f0ba9e4..17ab9e49 100644 --- a/mpp/legacy/vpu_api_legacy.h +++ b/mpp/legacy/vpu_api_legacy.h @@ -46,6 +46,7 @@ public: private: MppCtx mpp_ctx; MppApi *mpi; + RK_U32 init_ok; RK_U32 frame_count; RK_U32 set_eos; RK_U32 vpu_api_debug;