mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-12 20:40:07 +08:00
[osal]: Fix mpp queue deadlock on exit
On mp4 case, we back-up extra data into mPackets at the end of reset, then MppQueue#mFlushFlag will be reset, and may be blocked on MppQueue#pull. Change-Id: I99864ac4b3fbc053107bb35dd47d2f21fb3b6a73 Signed-off-by: Xingwen Fang <fxw@rock-chips.com>
This commit is contained in:

committed by
Herman Chen

parent
25271e9ad0
commit
aa277519d3
3
mpp/inc/mpp.h
Normal file → Executable file
3
mpp/inc/mpp.h
Normal file → Executable file
@@ -144,6 +144,9 @@ private:
|
||||
RK_U32 mParserNeedSplit;
|
||||
RK_U32 mParserInternalPts; /* for MPEG2/MPEG4 */
|
||||
|
||||
/* backup extra packet for seek */
|
||||
MppPacket mExtraPacket;
|
||||
|
||||
MPP_RET control_mpp(MpiCmd cmd, MppParam param);
|
||||
MPP_RET control_osal(MpiCmd cmd, MppParam param);
|
||||
MPP_RET control_codec(MpiCmd cmd, MppParam param);
|
||||
|
39
mpp/mpp.cpp
Normal file → Executable file
39
mpp/mpp.cpp
Normal file → Executable file
@@ -65,7 +65,8 @@ Mpp::Mpp()
|
||||
mStatus(0),
|
||||
mParserFastMode(0),
|
||||
mParserNeedSplit(0),
|
||||
mParserInternalPts(0)
|
||||
mParserInternalPts(0),
|
||||
mExtraPacket(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -228,6 +229,12 @@ void Mpp::clear()
|
||||
mEnc = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (mExtraPacket) {
|
||||
mpp_packet_deinit(&mExtraPacket);
|
||||
mExtraPacket = NULL;
|
||||
}
|
||||
|
||||
if (mPackets) {
|
||||
delete mPackets;
|
||||
mPackets = NULL;
|
||||
@@ -256,8 +263,12 @@ MPP_RET Mpp::put_packet(MppPacket packet)
|
||||
return MPP_ERR_INIT;
|
||||
|
||||
AutoMutex autoLock(mPackets->mutex());
|
||||
RK_U32 eos = mpp_packet_get_eos(packet);
|
||||
if (mExtraPacket) {
|
||||
mPackets->push(&mExtraPacket, sizeof(mExtraPacket));
|
||||
mExtraPacket = NULL;
|
||||
}
|
||||
|
||||
RK_U32 eos = mpp_packet_get_eos(packet);
|
||||
if (mPackets->list_size() < 4 || eos) {
|
||||
MppPacket pkt;
|
||||
if (MPP_OK != mpp_packet_copy_init(&pkt, packet))
|
||||
@@ -588,8 +599,6 @@ MPP_RET Mpp::reset()
|
||||
if (!mInitDone)
|
||||
return MPP_ERR_INIT;
|
||||
|
||||
MppPacket pkt = NULL;
|
||||
|
||||
/*
|
||||
* On mp4 case extra data of sps/pps will be put at the beginning
|
||||
* If these packet was reset before they are send to decoder then
|
||||
@@ -599,7 +608,18 @@ MPP_RET Mpp::reset()
|
||||
*/
|
||||
mPackets->lock();
|
||||
if (mPackets->list_size()) {
|
||||
MppPacket pkt = NULL;
|
||||
mPackets->del_at_head(&pkt, sizeof(pkt));
|
||||
|
||||
RK_U32 flags = mpp_packet_get_flag(pkt);
|
||||
if (flags & MPP_PACKET_FLAG_EXTRA_DATA) {
|
||||
if (mExtraPacket) {
|
||||
mpp_packet_deinit(&mExtraPacket);
|
||||
}
|
||||
mExtraPacket = pkt;
|
||||
} else {
|
||||
mpp_packet_deinit(&pkt);
|
||||
}
|
||||
}
|
||||
mPackets->flush();
|
||||
mPackets->unlock();
|
||||
@@ -623,17 +643,6 @@ MPP_RET Mpp::reset()
|
||||
mpp_enc_reset(mEnc);
|
||||
}
|
||||
mThreadCodec->unlock(THREAD_RESET);
|
||||
|
||||
if (pkt != NULL) {
|
||||
RK_U32 flags = mpp_packet_get_flag(pkt);
|
||||
|
||||
if (flags & MPP_PACKET_FLAG_EXTRA_DATA) {
|
||||
put_packet(pkt);
|
||||
}
|
||||
mpp_packet_deinit(&pkt);
|
||||
pkt = NULL;
|
||||
}
|
||||
|
||||
return MPP_OK;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user