diff options
| author | Chong Zhang <chz@google.com> | 2015-07-15 01:31:30 +0000 | 
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-07-15 01:31:30 +0000 | 
| commit | 1bc88814f530bf67e425cfb8cea0f2b8dce3c03f (patch) | |
| tree | 6c642e16897de47cd787ad56485489f87715d2d3 | |
| parent | 7f4e78fedf1dbcd175a52b17d46a658218ed7453 (diff) | |
| parent | fcf044a9c5624395d24eb6181e67163ce169458b (diff) | |
| download | frameworks_av-1bc88814f530bf67e425cfb8cea0f2b8dce3c03f.zip frameworks_av-1bc88814f530bf67e425cfb8cea0f2b8dce3c03f.tar.gz frameworks_av-1bc88814f530bf67e425cfb8cea0f2b8dce3c03f.tar.bz2  | |
Merge "NuPlayer: pull more video buffers in advance in GenericSource" into mnc-dev
| -rw-r--r-- | media/libmediaplayerservice/nuplayer/GenericSource.cpp | 6 | ||||
| -rw-r--r-- | media/libstagefright/mpeg2ts/AnotherPacketSource.cpp | 14 | ||||
| -rw-r--r-- | media/libstagefright/mpeg2ts/AnotherPacketSource.h | 4 | 
3 files changed, 23 insertions, 1 deletions
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp index 64d172e..7dc9be7 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp +++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp @@ -1005,7 +1005,9 @@ status_t NuPlayer::GenericSource::dequeueAccessUnit(      status_t result = track->mPackets->dequeueAccessUnit(accessUnit); -    if (!track->mPackets->hasBufferAvailable(&finalResult)) { +    // start pulling in more buffers if we only have one (or no) buffer left +    // so that decoder has less chance of being starved +    if (track->mPackets->getAvailableBufferCount(&finalResult) < 2) {          postReadBuffer(audio? MEDIA_TRACK_TYPE_AUDIO : MEDIA_TRACK_TYPE_VIDEO);      } @@ -1458,6 +1460,8 @@ void NuPlayer::GenericSource::readBuffer(              track = &mVideoTrack;              if (mIsWidevine) {                  maxBuffers = 2; +            } else { +                maxBuffers = 4;              }              break;          case MEDIA_TRACK_TYPE_AUDIO: diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp index 0878a1b..cabde32 100644 --- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp @@ -394,6 +394,20 @@ bool AnotherPacketSource::hasDataBufferAvailable(status_t *finalResult) {      return false;  } +size_t AnotherPacketSource::getAvailableBufferCount(status_t *finalResult) { +    Mutex::Autolock autoLock(mLock); + +    *finalResult = OK; +    if (!mEnabled) { +        return 0; +    } +    if (!mBuffers.empty()) { +        return mBuffers.size(); +    } +    *finalResult = mEOSResult; +    return 0; +} +  int64_t AnotherPacketSource::getBufferedDurationUs(status_t *finalResult) {      Mutex::Autolock autoLock(mLock);      *finalResult = mEOSResult; diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.h b/media/libstagefright/mpeg2ts/AnotherPacketSource.h index eb9dc9b..28a0e89 100644 --- a/media/libstagefright/mpeg2ts/AnotherPacketSource.h +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.h @@ -49,6 +49,10 @@ struct AnotherPacketSource : public MediaSource {      // Returns true if we have packets that's not discontinuities      bool hasDataBufferAvailable(status_t *finalResult); +    // Returns the number of available buffers. finalResult is always OK +    // if this method returns non-0, or the final result if it returns 0. +    size_t getAvailableBufferCount(status_t *finalResult); +      // Returns the difference between the last and the first queued      // presentation timestamps since the last discontinuity (if any).      int64_t getBufferedDurationUs(status_t *finalResult);  | 
