SurfaceTexture: Fully refactored from BufferQueue
Cleaning up camera and media interactions as part of SurfaceTexture refactoring
Change-Id: Iea2b10ff80b5f01f83ed0902c725df1d3b4c541a
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index 599211e..0c66b86 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -545,12 +545,22 @@
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 30d4e20..ce2cdee 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -251,8 +251,16 @@
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 602469b..7481e2e 100644
--- a/media/libstagefright/SurfaceMediaSource.cpp
+++ b/media/libstagefright/SurfaceMediaSource.cpp
@@ -54,6 +54,9 @@
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 3dcd9fc..fe77cf7 100644
--- a/media/libstagefright/tests/SurfaceMediaSource_test.cpp
+++ b/media/libstagefright/tests/SurfaceMediaSource_test.cpp
@@ -107,7 +107,7 @@
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 @@
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 @@
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 @@
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);