diff options
| author | Andreas Huber <andih@google.com> | 2011-08-18 11:46:18 -0700 | 
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-08-18 11:46:18 -0700 | 
| commit | 7341123ed8fed903c593a38d57ffabad3ad62860 (patch) | |
| tree | 3d14c65ad7b82c0c685ebd2f58d616d38f8d1eff /media | |
| parent | cdef698dae0c6dd89755f6494cc3d4b163f410ef (diff) | |
| parent | 14f95746466fb6abdbbf33ee26d92ebf3fbef98f (diff) | |
| download | frameworks_av-7341123ed8fed903c593a38d57ffabad3ad62860.zip frameworks_av-7341123ed8fed903c593a38d57ffabad3ad62860.tar.gz frameworks_av-7341123ed8fed903c593a38d57ffabad3ad62860.tar.bz2  | |
Merge "Some decoders require more gentle treatment"
Diffstat (limited to 'media')
| -rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 56 | ||||
| -rw-r--r-- | media/libstagefright/include/AwesomePlayer.h | 3 | 
2 files changed, 45 insertions, 14 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 7b28588..8b23da7 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -59,6 +59,7 @@  #include <cutils/properties.h>  #define USE_SURFACE_ALLOC 1 +#define FRAME_DROP_FREQ 0  namespace android { @@ -1523,14 +1524,29 @@ status_t AwesomePlayer::initVideoDecoder(uint32_t flags) {      }      if (mVideoSource != NULL) { -        Mutex::Autolock autoLock(mStatsLock); -        TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex); - -        const char *component; +        const char *componentName;          CHECK(mVideoSource->getFormat() -                ->findCString(kKeyDecoderComponent, &component)); +                ->findCString(kKeyDecoderComponent, &componentName)); -        stat->mDecoderName = component; +        { +            Mutex::Autolock autoLock(mStatsLock); +            TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex); + +            stat->mDecoderName = componentName; +        } + +        static const char *kPrefix = "OMX.Nvidia."; +        static const char *kSuffix = ".decode"; +        static const size_t kSuffixLength = strlen(kSuffix); + +        size_t componentNameLength = strlen(componentName); + +        if (!strncmp(componentName, kPrefix, strlen(kPrefix)) +                && componentNameLength >= kSuffixLength +                && !strcmp(&componentName[ +                    componentNameLength - kSuffixLength], kSuffix)) { +            modifyFlags(SLOW_DECODER_HACK, SET); +        }      }      return mVideoSource != NULL ? OK : UNKNOWN_ERROR; @@ -1710,6 +1726,7 @@ void AwesomePlayer::onVideoEvent() {      if (mFlags & FIRST_FRAME) {          modifyFlags(FIRST_FRAME, CLEAR); +        mSinceLastDropped = 0;          mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs;      } @@ -1756,18 +1773,28 @@ void AwesomePlayer::onVideoEvent() {          if (latenessUs > 40000) {              // We're more than 40ms late. -            LOGV("we're late by %lld us (%.2f secs), dropping frame", +            LOGV("we're late by %lld us (%.2f secs)",                   latenessUs, latenessUs / 1E6); -            mVideoBuffer->release(); -            mVideoBuffer = NULL; +            if (!(mFlags & SLOW_DECODER_HACK) +                    || mSinceLastDropped > FRAME_DROP_FREQ)              { -                Mutex::Autolock autoLock(mStatsLock); -                ++mStats.mNumVideoFramesDropped; -            } +                LOGV("we're late by %lld us (%.2f secs) dropping " +                     "one after %d frames", +                     latenessUs, latenessUs / 1E6, mSinceLastDropped); -            postVideoEvent_l(); -            return; +                mSinceLastDropped = 0; +                mVideoBuffer->release(); +                mVideoBuffer = NULL; + +                { +                    Mutex::Autolock autoLock(mStatsLock); +                    ++mStats.mNumVideoFramesDropped; +                } + +                postVideoEvent_l(); +                return; +            }          }          if (latenessUs < -10000) { @@ -1786,6 +1813,7 @@ void AwesomePlayer::onVideoEvent() {      }      if (mVideoRenderer != NULL) { +        mSinceLastDropped++;          mVideoRenderer->render(mVideoBuffer);      } diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index 95f2ae8..14476d3 100644 --- a/media/libstagefright/include/AwesomePlayer.h +++ b/media/libstagefright/include/AwesomePlayer.h @@ -141,6 +141,8 @@ private:          TEXT_RUNNING        = 0x10000,          TEXTPLAYER_STARTED  = 0x20000, + +        SLOW_DECODER_HACK   = 0x40000,      };      mutable Mutex mLock; @@ -181,6 +183,7 @@ private:      uint32_t mFlags;      uint32_t mExtractorFlags; +    uint32_t mSinceLastDropped;      int64_t mTimeSourceDeltaUs;      int64_t mVideoTimeUs;  | 
