diff options
Diffstat (limited to 'media')
| -rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 3 | ||||
| -rwxr-xr-x | media/libstagefright/OMXCodec.cpp | 2 | ||||
| -rw-r--r-- | media/libstagefright/SurfaceMediaSource.cpp | 28 | ||||
| -rw-r--r-- | media/libstagefright/tests/SurfaceMediaSource_test.cpp | 46 | 
4 files changed, 45 insertions, 34 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 142dda0..f98b0de 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -513,7 +513,8 @@ void AwesomePlayer::reset_l() {      // If we did this later, audio would continue playing while we      // shutdown the video-related resources and the player appear to      // not be as responsive to a reset request. -    if (mAudioPlayer == NULL && mAudioSource != NULL) { +    if ((mAudioPlayer == NULL || !(mFlags & AUDIOPLAYER_STARTED)) +            && mAudioSource != NULL) {          // If we had an audio player, it would have effectively          // taken possession of the audio source and stopped it when          // _it_ is stopped. Otherwise this is still our responsibility. diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 7f09319..d5b013d 100755 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -1990,7 +1990,7 @@ int64_t OMXCodec::retrieveDecodingTimeUs(bool isCodecSpecific) {      CHECK(mIsEncoder);      if (mDecodingTimeList.empty()) { -        CHECK(mNoMoreOutputData); +        CHECK(mSignalledEOS || mNoMoreOutputData);          // No corresponding input frame available.          // This could happen when EOS is reached.          return 0; 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); diff --git a/media/libstagefright/tests/SurfaceMediaSource_test.cpp b/media/libstagefright/tests/SurfaceMediaSource_test.cpp index d643a0b..d663602 100644 --- a/media/libstagefright/tests/SurfaceMediaSource_test.cpp +++ b/media/libstagefright/tests/SurfaceMediaSource_test.cpp @@ -106,13 +106,14 @@ protected:              mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,                      window.get(), NULL);          } else { -            EGLint pbufferAttribs[] = { -                EGL_WIDTH, getSurfaceWidth(), -                EGL_HEIGHT, getSurfaceHeight(), -                EGL_NONE }; +            LOGV("No actual display. Choosing EGLSurface based on SurfaceMediaSource"); +            sp<SurfaceMediaSource> sms = new SurfaceMediaSource( +                    getSurfaceWidth(), getSurfaceHeight()); +            sp<SurfaceTextureClient> stc = new SurfaceTextureClient(sms); +            sp<ANativeWindow> window = stc; -            mEglSurface = eglCreatePbufferSurface(mEglDisplay, mGlConfig, -                    pbufferAttribs); +            mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig, +                    window.get(), NULL);          }          ASSERT_EQ(EGL_SUCCESS, eglGetError());          ASSERT_NE(EGL_NO_SURFACE, mEglSurface); @@ -408,7 +409,6 @@ protected:          mSTC.clear();          mANW.clear();          GLTest::TearDown(); -        eglDestroySurface(mEglDisplay, mSmsEglSurface);      }      void setUpEGLSurfaceFromMediaRecorder(sp<MediaRecorder>& mr); @@ -419,8 +419,6 @@ protected:      sp<SurfaceMediaSource> mSMS;      sp<SurfaceTextureClient> mSTC;      sp<ANativeWindow> mANW; -    EGLConfig  mSMSGlConfig; -    EGLSurface  mSmsEglSurface;  };  ///////////////////////////////////////////////////////////////////// @@ -462,7 +460,7 @@ void SurfaceMediaSourceGLTest::oneBufferPassGL(int num) {      glClear(GL_COLOR_BUFFER_BIT);      // The following call dequeues and queues the buffer -    eglSwapBuffers(mEglDisplay, mSmsEglSurface); +    eglSwapBuffers(mEglDisplay, mEglSurface);      glDisable(GL_SCISSOR_TEST);  } @@ -488,19 +486,12 @@ void SurfaceMediaSourceGLTest::setUpEGLSurfaceFromMediaRecorder(sp<MediaRecorder      mSTC = new SurfaceTextureClient(iST);      mANW = mSTC; -    EGLint numConfigs = 0; -    EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(), &mSMSGlConfig, -            1, &numConfigs)); -    ASSERT_EQ(EGL_SUCCESS, eglGetError()); - -    LOGV("Native Window = %p, mSTC = %p", mANW.get(), mSTC.get()); - -    mSmsEglSurface = eglCreateWindowSurface(mEglDisplay, mSMSGlConfig, +    mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,                                  mANW.get(), NULL);      ASSERT_EQ(EGL_SUCCESS, eglGetError()); -    ASSERT_NE(EGL_NO_SURFACE, mSmsEglSurface) ; +    ASSERT_NE(EGL_NO_SURFACE, mEglSurface) ; -    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mSmsEglSurface, mSmsEglSurface, +    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,              mEglContext));      ASSERT_EQ(EGL_SUCCESS, eglGetError());  } @@ -778,9 +769,9 @@ TEST_F(SurfaceMediaSourceTest, DISABLED_EncodingFromCpuYV12BufferNpotWriteMediaS  // Test to examine whether we can choose the Recordable Android GLConfig  // DummyRecorder used- no real encoding here -TEST_F(SurfaceMediaSourceGLTest, ChooseAndroidRecordableEGLConfigDummyWrite) { +TEST_F(SurfaceMediaSourceGLTest, ChooseAndroidRecordableEGLConfigDummyWriter) {      LOGV("Test # %d", testId++); -    LOGV("Test to verify creating a surface w/ right config *********"); +    LOGV("Verify creating a surface w/ right config + dummy writer*********");      mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);      mSTC = new SurfaceTextureClient(mSMS); @@ -789,17 +780,12 @@ TEST_F(SurfaceMediaSourceGLTest, ChooseAndroidRecordableEGLConfigDummyWrite) {      DummyRecorder writer(mSMS);      writer.start(); -    EGLint numConfigs = 0; -    EXPECT_TRUE(eglChooseConfig(mEglDisplay, getConfigAttribs(), &mSMSGlConfig, -            1, &numConfigs)); -    ASSERT_EQ(EGL_SUCCESS, eglGetError()); - -    mSmsEglSurface = eglCreateWindowSurface(mEglDisplay, mSMSGlConfig, +    mEglSurface = eglCreateWindowSurface(mEglDisplay, mGlConfig,                                  mANW.get(), NULL);      ASSERT_EQ(EGL_SUCCESS, eglGetError()); -    ASSERT_NE(EGL_NO_SURFACE, mSmsEglSurface) ; +    ASSERT_NE(EGL_NO_SURFACE, mEglSurface) ; -    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mSmsEglSurface, mSmsEglSurface, +    EXPECT_TRUE(eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface,              mEglContext));      ASSERT_EQ(EGL_SUCCESS, eglGetError());  | 
