diff --git a/mpp/mpi.cpp b/mpp/mpi.cpp index d857373f..f5f0c9c6 100644 --- a/mpp/mpi.cpp +++ b/mpp/mpi.cpp @@ -89,6 +89,7 @@ static MPP_RET mpi_decode(MppCtx ctx, MppPacket packet, MppFrame *frame) mpi_dbg_func("enter ctx %p packet %p frame %p\n", ctx, packet, frame); do { RK_U32 packet_done = 0; + Mpp *mpp = p->ctx; ret = check_mpp_ctx(p); if (ret) break; @@ -103,11 +104,14 @@ static MPP_RET mpi_decode(MppCtx ctx, MppPacket packet, MppFrame *frame) do { /* - * if there is frame to return get the frame first + * If there is frame to return get the frame first + * But if the output mode is block then we need to send packet first */ - ret = p->ctx->get_frame(frame); - if (ret || *frame) - break; + if (!mpp->mOutputBlock || packet_done) { + ret = mpp->get_frame(frame); + if (ret || *frame) + break; + } /* when packet is send do one more get frame here */ if (packet_done) @@ -116,7 +120,7 @@ static MPP_RET mpi_decode(MppCtx ctx, MppPacket packet, MppFrame *frame) /* * then send input stream with block mode */ - ret = p->ctx->put_packet(packet); + ret = mpp->put_packet(packet); if (MPP_OK == ret) packet_done = 1; } while (1); diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index 0ae026a6..72a2f73d 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -50,6 +50,8 @@ Mpp::Mpp() mOutputPort(NULL), mInputTaskQueue(NULL), mOutputTaskQueue(NULL), + mInputBlock(0), + mOutputBlock(0), mThreadCodec(NULL), mThreadHal(NULL), mDec(NULL), @@ -57,9 +59,6 @@ Mpp::Mpp() mType(MPP_CTX_BUTT), mCoding(MPP_VIDEO_CodingUnused), mInitDone(0), - mPacketBlock(0), - mInputBlock(0), - mOutputBlock(0), mMultiFrame(0), mInputTask(NULL), mStatus(0), diff --git a/mpp/mpp.h b/mpp/mpp.h index fd3bb223..a582e8dc 100644 --- a/mpp/mpp.h +++ b/mpp/mpp.h @@ -109,6 +109,8 @@ public: MppTaskQueue mInputTaskQueue; MppTaskQueue mOutputTaskQueue; + RK_U32 mInputBlock; + RK_U32 mOutputBlock; /* * There are two threads for each decoder/encoder: codec thread and hal thread * @@ -131,9 +133,6 @@ private: MppCodingType mCoding; RK_U32 mInitDone; - RK_U32 mPacketBlock; - RK_U32 mInputBlock; - RK_U32 mOutputBlock; RK_U32 mMultiFrame; // task for put_frame / put_packet