summaryrefslogtreecommitdiff
authorshipeng.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)
commit2b1c40cf94ba7d3d2fa901fc909faf9f3d503ca8 (patch)
tree88d4eebf5aaab50f5b4d72dfa748b4dc35fed5f1
parentd2a5bfeb8e42535717bf71eedec7f0b3208d0549 (diff)
downloadav-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>
Diffstat
-rw-r--r--libstagefright/wifi-display/sink/RTPSink.cpp15
-rw-r--r--libstagefright/wifi-display/sink/TunnelRenderer.cpp56
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;