diff --git a/mpp/codec/mpp_dec.cpp b/mpp/codec/mpp_dec.cpp index eddc10f7..a74826a7 100644 --- a/mpp/codec/mpp_dec.cpp +++ b/mpp/codec/mpp_dec.cpp @@ -55,7 +55,7 @@ void *mpp_dec_parser_thread(void *data) MppDec *dec = mpp->mDec; MppBufSlots slots = dec->slots; HalTaskGroup tasks = dec->tasks; - MppPacketImpl packet; + MppPacket packet = NULL; /* * parser thread need to wait at cases below: @@ -96,14 +96,7 @@ void *mpp_dec_parser_thread(void *data) * 2. get packet to parse */ if (!packet_ready) { - mpp_list *packets = mpp->mPackets; - Mutex::Autolock autoLock(packets->mutex()); - if (packets->list_size()) { - /* - * packet will be destroyed outside, here just copy the content - */ - packets->del_at_head(&packet, sizeof(packet)); - mpp->mPacketGetCount++; + if (MPP_OK == mpp->get_packet(&packet)) { packet_ready = 1; wait_on_packet = 0; } else { @@ -127,9 +120,9 @@ void *mpp_dec_parser_thread(void *data) * */ if (!task_ready) { - mpp_dec_parse(dec, (MppPacket)&packet, task_dec); - if (0 == packet.size) { - mpp_packet_reset(&packet); + mpp_dec_parse(dec, packet, task_dec); + if (0 == mpp_packet_get_size(packet)) { + mpp_packet_deinit(&packet); packet_ready = 0; } } @@ -365,7 +358,10 @@ MPP_RET mpp_dec_flush(MppDec *dec) return MPP_ERR_NULL_PTR; } - return dec->parser_api->flush(dec->parser_ctx); + dec->parser_api->flush(dec->parser_ctx); + mpp_hal_flush(dec->hal_ctx); + + return MPP_OK; } MPP_RET mpp_dec_control(MppDec *dec, RK_S32 cmd, void *param) diff --git a/mpp/codec/mpp_enc.cpp b/mpp/codec/mpp_enc.cpp index 66ab68c8..7c00acef 100644 --- a/mpp/codec/mpp_enc.cpp +++ b/mpp/codec/mpp_enc.cpp @@ -44,9 +44,8 @@ void *mpp_enc_control_thread(void *data) frames->del_at_head(&frame, sizeof(frame)); mpp_packet_init(&packet, buf, size); - packets->lock(); - packets->add_at_tail(&packet, sizeof(packet)); - packets->unlock(); + mpp->put_packet(packet); + mpp_packet_deinit(&packet); } } mpp_free(buf); diff --git a/mpp/mpp.cpp b/mpp/mpp.cpp index a5cb0e98..8ed8dd73 100644 --- a/mpp/mpp.cpp +++ b/mpp/mpp.cpp @@ -208,10 +208,16 @@ MPP_RET Mpp::put_frame(MppFrame frame) MPP_RET Mpp::get_packet(MppPacket *packet) { Mutex::Autolock autoLock(mPackets->mutex()); - if (mPackets->list_size()) { - mPackets->del_at_tail(packet, sizeof(packet)); - mPacketGetCount++; + if (!mPackets->list_size()) { + *packet = NULL; + return MPP_NOK; } + + MppPacket pkt; + mpp_packet_new(&pkt); + mPackets->del_at_tail(pkt, sizeof(MppPacketImpl)); + mPacketGetCount++; + *packet = pkt; return MPP_OK; } diff --git a/mpp/mpp.h b/mpp/mpp.h index 07c487c9..50252660 100644 --- a/mpp/mpp.h +++ b/mpp/mpp.h @@ -67,6 +67,9 @@ public: MPP_RET put_frame(MppFrame frame); MPP_RET get_packet(MppPacket *packet); + MPP_RET reset(); + MPP_RET flush(); + mpp_list *mPackets; mpp_list *mFrames; diff --git a/mpp/mpp_packet.cpp b/mpp/mpp_packet.cpp index 16b6a17c..76fba87a 100644 --- a/mpp/mpp_packet.cpp +++ b/mpp/mpp_packet.cpp @@ -30,6 +30,21 @@ MPP_PACKET_ACCESSORS(RK_S64, pts) MPP_PACKET_ACCESSORS(RK_S64, dts) MPP_PACKET_ACCESSORS(RK_U32, flag) +MPP_RET mpp_packet_new(MppPacket *packet) +{ + if (NULL == packet) { + mpp_err_f("found NULL input\n"); + return MPP_ERR_NULL_PTR; + } + + MppPacketImpl *p = mpp_calloc(MppPacketImpl, 1); + if (NULL == p) + mpp_err_f("malloc failed\n"); + + *packet = p; + return (p) ? (MPP_OK) : (MPP_NOK); +} + MPP_RET mpp_packet_init(MppPacket *packet, void *data, size_t size) { if (NULL == packet || NULL == data || 0 == size) {