author | shipeng.sun <shipeng.sun@amlogic.com> | 2019-08-21 12:11:37 (GMT) |
---|---|---|
committer | Zhi Zhou <zhi.zhou@amlogic.com> | 2019-09-02 11:39:58 (GMT) |
commit | 2b1c40cf94ba7d3d2fa901fc909faf9f3d503ca8 (patch) | |
tree | 88d4eebf5aaab50f5b4d72dfa748b4dc35fed5f1 | |
parent | d2a5bfeb8e42535717bf71eedec7f0b3208d0549 (diff) | |
download | av-2b1c40cf94ba7d3d2fa901fc909faf9f3d503ca8.zip av-2b1c40cf94ba7d3d2fa901fc909faf9f3d503ca8.tar.gz av-2b1c40cf94ba7d3d2fa901fc909faf9f3d503ca8.tar.bz2 |
wifi-display: Miracast disconnect for a long time [1/3]
PD#TV-9040
Problem:
Miracast connects to the phone and will automatically
disconnect if it is tested for a long time.
Solution:
1. Found sometimes rtp package seq is jump two big, so
add a flag in buffer->meta() notify reset the sequence.
2. Modify TunnelRenderer::StreamSource::flags() return
kFlagAlignedVideoData direct, no matter for hdcp or not.
3. Remove request idr when drop packet, maybe lead the
souce timeout
Verify:
x301
Change-Id: Id3b03605ef49f06073b54d7d1ea0f2231bd4d4cc
Signed-off-by: shipeng.sun <shipeng.sun@amlogic.com>
-rw-r--r-- | libstagefright/wifi-display/sink/RTPSink.cpp | 15 | ||||
-rw-r--r-- | libstagefright/wifi-display/sink/TunnelRenderer.cpp | 56 |
2 files changed, 48 insertions, 23 deletions
diff --git a/libstagefright/wifi-display/sink/RTPSink.cpp b/libstagefright/wifi-display/sink/RTPSink.cpp index 652a23a..c10d377 100644 --- a/libstagefright/wifi-display/sink/RTPSink.cpp +++ b/libstagefright/wifi-display/sink/RTPSink.cpp @@ -155,11 +155,11 @@ namespace android { // Sequence number wrapped - count another 64K cycle mCycles += kRTPSeqMod; + ALOGE("mCycles now set to mCycles %d", mCycles); } mMaxSeq = seq; } -#if 0 else if (udelta <= kRTPSeqMod - kMaxMisorder) { // The sequence number made a very large jump @@ -169,26 +169,29 @@ namespace android // Two sequential packets -- assume that the other side // restarted without telling us so just re-sync // (i.e. pretend this was the first packet) - initSeq(seq); + ALOGE("very large jump seq is %d udelta is %d", seq, udelta); + buffer->setInt32Data(mCycles | seq); + buffer->meta()->setInt32("seq_reset", 1); + ++mReceived; + queuePacket(buffer); + return true; } else { mBadSeq = (seq + 1) & (kRTPSeqMod - 1); - return false; } } else { // Duplicate or reordered packet. + ALOGE("We may receive a duplicatr or reordered seq is %d udelta is %d", seq, udelta); + buffer->meta()->setInt32("seq_reordered", 1); } -#endif ++mReceived; - buffer->setInt32Data(mCycles | seq); queuePacket(buffer); - return true; } diff --git a/libstagefright/wifi-display/sink/TunnelRenderer.cpp b/libstagefright/wifi-display/sink/TunnelRenderer.cpp index a9faf94..d613bda 100644 --- a/libstagefright/wifi-display/sink/TunnelRenderer.cpp +++ b/libstagefright/wifi-display/sink/TunnelRenderer.cpp @@ -48,7 +48,7 @@ namespace android virtual void notify(int msg, int ext1, int ext2, const Parcel *obj) { - ALOGI("notify %d, %d, %d, %p", msg, ext1, ext2, obj); + //ALOGI("notify %d, %d, %d, %p", msg, ext1, ext2, obj); switch (msg) { case MEDIA_PREPARED: mPrepared = true; @@ -147,11 +147,16 @@ namespace android uint32_t TunnelRenderer::StreamSource::flags() const { +#if 0 if (mOwner->getIsHDCP()) { return kFlagAlignedVideoData; } else { return 0; } +#else + //No matter is hdcp protect or not we assume one pes is one frame + return kFlagAlignedVideoData; +#endif } void TunnelRenderer::StreamSource::doSomeWork() @@ -250,7 +255,8 @@ namespace android void TunnelRenderer::queueBuffer(const sp<ABuffer> &buffer) { Mutex::Autolock autoLock(mLock); - + int32_t value = 0; + int32_t newExtendedSeqNo = buffer->int32Data(); mTotalBytesQueued += buffer->size(); mBytesQueued += buffer->size(); mMaxBytesQueued = mMaxBytesQueued > mTotalBytesQueued ? mMaxBytesQueued : mTotalBytesQueued; @@ -260,7 +266,13 @@ namespace android return; } - int32_t newExtendedSeqNo = buffer->int32Data(); + if (buffer->meta()->findInt32("seq_reset", &value)) { + if (value) { + ALOGE("Recieve seq_reset value is 0x%x 0x%x", value, newExtendedSeqNo); + mPackets.push_back(buffer); + return; + } + } List<sp<ABuffer> >::iterator firstIt = mPackets.begin(); List<sp<ABuffer> >::iterator it = --mPackets.end(); @@ -299,15 +311,25 @@ namespace android Mutex::Autolock autoLock(mLock); sp<ABuffer> buffer; - uint32_t extSeqNo; - char pkg_info[128]; - int64_t curUs; + uint32_t extSeqNo = 0; + char pkg_info[128] = { 0 }; + int64_t curUs = 0; + int32_t value = 0; while (!mPackets.empty()) { + value = 0; buffer = *mPackets.begin(); extSeqNo = buffer->int32Data(); - + if (buffer->meta()->findInt32("seq_reset", &value)) { + if (value) { + ALOGE("Handle seq_reset valuse is 0x%x 0x%x", value, extSeqNo); + mLastDequeuedExtSeqNo = -1; + mRequestedRetransmission = false; + mRequestedRetry = false; + mFirstFailedAttemptUs = -1ll; + } + } if (mLastDequeuedExtSeqNo < 0 || extSeqNo > mLastDequeuedExtSeqNo) { break; @@ -334,11 +356,9 @@ namespace android else { float noPacketTime = (ALooper::GetNowUs() - mFirstFailedAttemptUs) / 1E6; - ALOGE("no packets available for %.2f secs",noPacketTime); + //ALOGE("no packets available for %.2f secs",noPacketTime); if (noPacketTime > 12.0) //beyond 12S { -#if 1 - int ret = -1; char value[PROPERTY_VALUE_MAX]; ret = getPropertyInt("sys.wfd.state", 0); @@ -356,7 +376,6 @@ namespace android mFirstFailedAttemptUs = ALooper::GetNowUs(); setProperty("sys.wfd.state", "0"); } -#endif } } return NULL; @@ -415,11 +434,6 @@ namespace android sp<AMessage> notify = mNotifyLost->dup(); notify->setInt32("seqNo", (mLastDequeuedExtSeqNo + 1) & 0xffff); notify->post(); - //For miracast, we shuold send request IDR to request a I Frame asap - sp<AMessage> msgNotify = mMsgNotify->dup(); - msgNotify->setInt32("msg", kWahtLostPacketMsg); - msgNotify->setInt32("isLoop", 0); - msgNotify->post(); mRequestedRetry = true; mRequestedRetransmission = true; mRetryTimes++; @@ -430,7 +444,15 @@ namespace android ALOGI("dropping packet. extSeqNo %d didn't arrive in time", mLastDequeuedExtSeqNo + 1); // Permanent failure, we never received the packet. mPackageFailed++; - mLastDequeuedExtSeqNo = extSeqNo; + if (buffer->meta()->findInt32("seq_reordered", &value)) { + if (value) { + ALOGE("Handle seq_reordered extSeqNo %d %d mLastDequeuedExtSeqNo is %d %d", + extSeqNo, extSeqNo & 0xFFFF, mLastDequeuedExtSeqNo, mLastDequeuedExtSeqNo & 0xFFFF); + mLastDequeuedExtSeqNo++; + } + } else { + mLastDequeuedExtSeqNo = extSeqNo; + } mFirstFailedAttemptUs = -1ll; mRequestedRetransmission = false; mRequestedRetry = false; |