OSDN Git Service

avoid kWhatReadBuffer message spam in GenericSource
authorLajos Molnar <lajos@google.com>
Thu, 11 Sep 2014 17:01:55 +0000 (10:01 -0700)
committerLajos Molnar <lajos@google.com>
Thu, 11 Sep 2014 21:02:11 +0000 (14:02 -0700)
When playig WVM video, an extra readBuffer is posted for each
dequeueAccessUnit, resulting in an unbounded number of messages.

Bug: 17472979
Change-Id: Ice92ccf2454bf7a70856a4a8b535cefffc9e61ac

media/libmediaplayerservice/nuplayer/GenericSource.cpp
media/libmediaplayerservice/nuplayer/GenericSource.h

index 8e1987a..ec1a9a0 100644 (file)
@@ -54,7 +54,8 @@ NuPlayer::GenericSource::GenericSource(
       mDrmManagerClient(NULL),
       mMetaDataSize(-1ll),
       mBitrate(-1ll),
-      mPollBufferingGeneration(0) {
+      mPollBufferingGeneration(0),
+      mPendingReadBufferTypes(0) {
     resetDataSource();
     DataSource::RegisterDefaultSniffers();
 }
@@ -1148,15 +1149,27 @@ sp<ABuffer> NuPlayer::GenericSource::mediaBufferToABuffer(
 }
 
 void NuPlayer::GenericSource::postReadBuffer(media_track_type trackType) {
-    sp<AMessage> msg = new AMessage(kWhatReadBuffer, id());
-    msg->setInt32("trackType", trackType);
-    msg->post();
+    Mutex::Autolock _l(mReadBufferLock);
+
+    if ((mPendingReadBufferTypes & (1 << trackType)) == 0) {
+        mPendingReadBufferTypes |= (1 << trackType);
+        sp<AMessage> msg = new AMessage(kWhatReadBuffer, id());
+        msg->setInt32("trackType", trackType);
+        msg->post();
+    }
 }
 
 void NuPlayer::GenericSource::onReadBuffer(sp<AMessage> msg) {
     int32_t tmpType;
     CHECK(msg->findInt32("trackType", &tmpType));
     media_track_type trackType = (media_track_type)tmpType;
+    {
+        // only protect the variable change, as readBuffer may
+        // take considerable time.  This may result in one extra
+        // read being processed, but that is benign.
+        Mutex::Autolock _l(mReadBufferLock);
+        mPendingReadBufferTypes &= ~(1 << trackType);
+    }
     readBuffer(trackType);
 }
 
index 50ff98a..c70c48e 100644 (file)
@@ -131,6 +131,8 @@ private:
     off64_t mMetaDataSize;
     int64_t mBitrate;
     int32_t mPollBufferingGeneration;
+    uint32_t mPendingReadBufferTypes;
+    mutable Mutex mReadBufferLock;
 
     sp<ALooper> mLooper;