From a9d9dd2425c32f6868c35f49a3e8f29aafba931a Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Fri, 8 Oct 2010 09:04:25 -0700 Subject: Disable the access unit timeout temporarily while a seek operation is in progress. Change-Id: I116cb76342aae4168f34ebae49ecb2301702a0ea related-to-bug: 3073955 --- media/libstagefright/rtsp/MyHandler.h | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) (limited to 'media') diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h index a31b2b2..2c9cfd3 100644 --- a/media/libstagefright/rtsp/MyHandler.h +++ b/media/libstagefright/rtsp/MyHandler.h @@ -86,6 +86,7 @@ struct MyHandler : public AHandler { mFirstAccessUnitNTP(0), mNumAccessUnitsReceived(0), mCheckPending(false), + mCheckGeneration(0), mTryTCPInterleaving(false), mReceivedFirstRTCPPacket(false) { mNetLooper->setName("rtsp net"); @@ -434,6 +435,13 @@ struct MyHandler : public AHandler { case 'chek': { + int32_t generation; + CHECK(msg->findInt32("generation", &generation)); + if (generation != mCheckGeneration) { + // This is an outdated message. Ignore. + break; + } + if (mNumAccessUnitsReceived == 0) { LOGI("stream ended? aborting."); (new AMessage('abor', id()))->post(); @@ -454,12 +462,7 @@ struct MyHandler : public AHandler { } ++mNumAccessUnitsReceived; - - if (!mCheckPending) { - mCheckPending = true; - sp check = new AMessage('chek', id()); - check->post(kAccessUnitTimeoutUs); - } + postAccessUnitTimeoutCheck(); size_t trackIndex; CHECK(msg->findSize("track-index", &trackIndex)); @@ -557,6 +560,11 @@ struct MyHandler : public AHandler { mSeekPending = true; + // Disable the access unit timeout until we resumed + // playback again. + mCheckPending = true; + ++mCheckGeneration; + AString request = "PAUSE "; request.append(mSessionURL); request.append(" RTSP/1.0\r\n"); @@ -612,6 +620,9 @@ struct MyHandler : public AHandler { LOGI("PLAY completed with result %d (%s)", result, strerror(-result)); + mCheckPending = false; + postAccessUnitTimeoutCheck(); + if (result == OK) { sp obj; CHECK(msg->findObject("response", &obj)); @@ -674,6 +685,17 @@ struct MyHandler : public AHandler { } } + void postAccessUnitTimeoutCheck() { + if (mCheckPending) { + return; + } + + mCheckPending = true; + sp check = new AMessage('chek', id()); + check->setInt32("generation", mCheckGeneration); + check->post(kAccessUnitTimeoutUs); + } + static void SplitString( const AString &s, const char *separator, List *items) { items->clear(); @@ -783,6 +805,7 @@ private: uint64_t mFirstAccessUnitNTP; int64_t mNumAccessUnitsReceived; bool mCheckPending; + int32_t mCheckGeneration; bool mTryTCPInterleaving; bool mReceivedFirstRTCPPacket; -- cgit v1.1