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()); |