diff options
| author | 2012-02-23 14:35:13 -0800 | |
|---|---|---|
| committer | 2012-03-13 14:39:28 -0700 | |
| commit | 2e76c992bfa955cb637417005941e3e93810a99d (patch) | |
| tree | f3ef2b68546427a92df9462042150aee889911da | |
| parent | dc19246853332eec414c33fbc1ed0bb57196b765 (diff) | |
SurfaceTexture: Fully refactored from BufferQueue
Cleaning up camera and media interactions as part of SurfaceTexture refactoring
Change-Id: Iea2b10ff80b5f01f83ed0902c725df1d3b4c541a
| -rw-r--r-- | core/jni/android_hardware_Camera.cpp | 16 | ||||
| -rw-r--r-- | core/jni/android_view_Surface.cpp | 12 | ||||
| -rw-r--r-- | media/libstagefright/SurfaceMediaSource.cpp | 3 | ||||
| -rw-r--r-- | media/libstagefright/tests/SurfaceMediaSource_test.cpp | 9 |
4 files changed, 31 insertions, 9 deletions
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 599211e5e9f3..0c66b867c8dc 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -545,12 +545,22 @@ static void android_hardware_Camera_setPreviewTexture(JNIEnv *env, sp<Camera> camera = get_native_camera(env, thiz, NULL); if (camera == 0) return; - sp<SurfaceTexture> surfaceTexture = NULL; + sp<BufferQueue> bufferQueue = NULL; if (jSurfaceTexture != NULL) { - surfaceTexture = reinterpret_cast<SurfaceTexture*>(env->GetIntField( + sp<SurfaceTexture> surfaceTexture = reinterpret_cast<SurfaceTexture*>(env->GetIntField( jSurfaceTexture, fields.surfaceTexture)); + if (surfaceTexture != NULL) { + bufferQueue = surfaceTexture->getBufferQueue(); + } + else { + jniThrowException(env, "java/lang/IllegalArgumentException", + "SurfaceTexture already released in setPreviewTexture"); + return; + } + } - if (camera->setPreviewTexture(surfaceTexture) != NO_ERROR) { + + if (camera->setPreviewTexture(bufferQueue) != NO_ERROR) { jniThrowException(env, "java/io/IOException", "setPreviewTexture failed"); } diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 30d4e20dfd68..ce2cdee7607d 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -251,8 +251,16 @@ static void Surface_init( static void Surface_initFromSurfaceTexture( JNIEnv* env, jobject clazz, jobject jst) { - sp<ISurfaceTexture> st(SurfaceTexture_getSurfaceTexture(env, jst)); - sp<Surface> surface(new Surface(st)); + sp<SurfaceTexture> st(SurfaceTexture_getSurfaceTexture(env, jst)); + + if (st == NULL) { + jniThrowException(env, "java/lang/IllegalArgumentException", + "SurfaceTexture has already been released"); + return; + } + sp<ISurfaceTexture> bq = st->getBufferQueue(); + + sp<Surface> surface(new Surface(bq)); if (surface == NULL) { jniThrowException(env, OutOfResourcesException, NULL); return; diff --git a/media/libstagefright/SurfaceMediaSource.cpp b/media/libstagefright/SurfaceMediaSource.cpp index 602469b0000b..7481e2e467a6 100644 --- a/media/libstagefright/SurfaceMediaSource.cpp +++ b/media/libstagefright/SurfaceMediaSource.cpp @@ -54,6 +54,9 @@ SurfaceMediaSource::SurfaceMediaSource(uint32_t bufW, uint32_t bufH) : ALOGV("SurfaceMediaSource::SurfaceMediaSource"); sp<ISurfaceComposer> composer(ComposerService::getComposerService()); mGraphicBufferAlloc = composer->createGraphicBufferAlloc(); + if (mGraphicBufferAlloc == 0) { + ALOGE("createGraphicBufferAlloc() failed in SurfaceMediaSource()"); + } } SurfaceMediaSource::~SurfaceMediaSource() { diff --git a/media/libstagefright/tests/SurfaceMediaSource_test.cpp b/media/libstagefright/tests/SurfaceMediaSource_test.cpp index 3dcd9fc1e08a..fe77cf7540a0 100644 --- a/media/libstagefright/tests/SurfaceMediaSource_test.cpp +++ b/media/libstagefright/tests/SurfaceMediaSource_test.cpp @@ -107,7 +107,7 @@ protected: window.get(), NULL); } else { ALOGV("No actual display. Choosing EGLSurface based on SurfaceMediaSource"); - sp<SurfaceMediaSource> sms = new SurfaceMediaSource( + sp<ISurfaceTexture> sms = new SurfaceMediaSource( getSurfaceWidth(), getSurfaceHeight()); sp<SurfaceTextureClient> stc = new SurfaceTextureClient(sms); sp<ANativeWindow> window = stc; @@ -360,7 +360,8 @@ protected: android::ProcessState::self()->startThreadPool(); mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight); mSMS->setSynchronousMode(true); - mSTC = new SurfaceTextureClient(mSMS); + // Manual cast is required to avoid constructor ambiguity + mSTC = new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >( mSMS)); mANW = mSTC; } @@ -395,7 +396,7 @@ protected: ALOGV("SMS-GLTest::SetUp()"); android::ProcessState::self()->startThreadPool(); mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight); - mSTC = new SurfaceTextureClient(mSMS); + mSTC = new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >( mSMS)); mANW = mSTC; // Doing the setup related to the GL Side @@ -773,7 +774,7 @@ TEST_F(SurfaceMediaSourceGLTest, ChooseAndroidRecordableEGLConfigDummyWriter) { ALOGV("Verify creating a surface w/ right config + dummy writer*********"); mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight); - mSTC = new SurfaceTextureClient(mSMS); + mSTC = new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >( mSMS)); mANW = mSTC; DummyRecorder writer(mSMS); |