diff options
| author | Eino-Ville Talvala <etalvala@google.com> | 2011-08-31 13:41:06 -0700 | 
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-08-31 13:41:06 -0700 | 
| commit | af6764da53c022768290e735bbcc3088bec333d8 (patch) | |
| tree | 9b98de8360b386d35e90f14fb256875aac963361 | |
| parent | e31f4f78729f66b3a90f51671ad557b551ed0bea (diff) | |
| parent | df4a59c61103e7e0e9332e167a0be67da5d82ff3 (diff) | |
| download | frameworks_av-af6764da53c022768290e735bbcc3088bec333d8.zip frameworks_av-af6764da53c022768290e735bbcc3088bec333d8.tar.gz frameworks_av-af6764da53c022768290e735bbcc3088bec333d8.tar.bz2  | |
Merge "Fix SurfaceMediaSource timestamp handling."
| -rw-r--r-- | include/media/stagefright/SurfaceMediaSource.h | 7 | ||||
| -rw-r--r-- | media/libstagefright/SurfaceMediaSource.cpp | 28 | 
2 files changed, 33 insertions, 2 deletions
diff --git a/include/media/stagefright/SurfaceMediaSource.h b/include/media/stagefright/SurfaceMediaSource.h index 74d54d1..f7f0ed7 100644 --- a/include/media/stagefright/SurfaceMediaSource.h +++ b/include/media/stagefright/SurfaceMediaSource.h @@ -347,6 +347,13 @@ private:      // encoder      int mNumFramesEncoded; +    // mFirstFrameTimestamp is the timestamp of the first received frame. +    // It is used to offset the output timestamps so recording starts at time 0. +    int64_t mFirstFrameTimestamp; +    // mStartTimeNs is the start time passed into the source at start, used to +    // offset timestamps. +    int64_t mStartTimeNs; +      // mFrameAvailableCondition condition used to indicate whether there      // is a frame available for dequeuing      Condition mFrameAvailableCondition; diff --git a/media/libstagefright/SurfaceMediaSource.cpp b/media/libstagefright/SurfaceMediaSource.cpp index 91b81c2..50dd804 100644 --- a/media/libstagefright/SurfaceMediaSource.cpp +++ b/media/libstagefright/SurfaceMediaSource.cpp @@ -46,9 +46,10 @@ SurfaceMediaSource::SurfaceMediaSource(uint32_t bufW, uint32_t bufH) :                  mSynchronousMode(true),                  mConnectedApi(NO_CONNECTED_API),                  mFrameRate(30), +                mStopped(false),                  mNumFramesReceived(0),                  mNumFramesEncoded(0), -                mStopped(false) { +                mFirstFrameTimestamp(0) {      LOGV("SurfaceMediaSource::SurfaceMediaSource");      sp<ISurfaceComposer> composer(ComposerService::getComposerService());      mGraphicBufferAlloc = composer->createGraphicBufferAlloc(); @@ -471,10 +472,25 @@ status_t SurfaceMediaSource::queueBuffer(int bufIndex, int64_t timestamp,          return -EINVAL;      } +    if (mNumFramesReceived == 0) { +        mFirstFrameTimestamp = timestamp; +        // Initial delay +        if (mStartTimeNs > 0) { +            if (timestamp < mStartTimeNs) { +                // This frame predates start of record, discard +                mSlots[bufIndex].mBufferState = BufferSlot::FREE; +                mDequeueCondition.signal(); +                return OK; +            } +            mStartTimeNs = timestamp - mStartTimeNs; +        } +    } +    timestamp = mStartTimeNs + (timestamp - mFirstFrameTimestamp); + +    mNumFramesReceived++;      if (mSynchronousMode) {          // in synchronous mode we queue all buffers in a FIFO          mQueue.push_back(bufIndex); -        mNumFramesReceived++;          LOGV("Client queued buf# %d @slot: %d, Q size = %d, handle = %p, timestamp = %lld",              mNumFramesReceived, bufIndex, mQueue.size(),              mSlots[bufIndex].mGraphicBuffer->handle, timestamp); @@ -684,6 +700,13 @@ int32_t SurfaceMediaSource::getFrameRate( ) const {  status_t SurfaceMediaSource::start(MetaData *params)  {      LOGV("started!"); + +    mStartTimeNs = 0; +    int64_t startTimeUs; +    if (params && params->findInt64(kKeyTime, &startTimeUs)) { +        mStartTimeNs = startTimeUs * 1000; +    } +      return OK;  } @@ -753,6 +776,7 @@ status_t SurfaceMediaSource::read( MediaBuffer **buffer,      mCurrentBuf = mSlots[mCurrentSlot].mGraphicBuffer;      int64_t prevTimeStamp = mCurrentTimestamp;      mCurrentTimestamp = mSlots[mCurrentSlot].mTimestamp; +      mNumFramesEncoded++;      // Pass the data to the MediaBuffer. Pass in only the metadata      passMetadataBufferLocked(buffer);  | 
