Skip to content

Commit 2e76c99

Browse files
author
Daniel Lam
committed
SurfaceTexture: Fully refactored from BufferQueue
Cleaning up camera and media interactions as part of SurfaceTexture refactoring Change-Id: Iea2b10ff80b5f01f83ed0902c725df1d3b4c541a
1 parent dc19246 commit 2e76c99

File tree

4 files changed

+31
-9
lines changed

4 files changed

+31
-9
lines changed

core/jni/android_hardware_Camera.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -545,12 +545,22 @@ static void android_hardware_Camera_setPreviewTexture(JNIEnv *env,
545545
sp<Camera> camera = get_native_camera(env, thiz, NULL);
546546
if (camera == 0) return;
547547

548-
sp<SurfaceTexture> surfaceTexture = NULL;
548+
sp<BufferQueue> bufferQueue = NULL;
549549
if (jSurfaceTexture != NULL) {
550-
surfaceTexture = reinterpret_cast<SurfaceTexture*>(env->GetIntField(
550+
sp<SurfaceTexture> surfaceTexture = reinterpret_cast<SurfaceTexture*>(env->GetIntField(
551551
jSurfaceTexture, fields.surfaceTexture));
552+
if (surfaceTexture != NULL) {
553+
bufferQueue = surfaceTexture->getBufferQueue();
554+
}
555+
else {
556+
jniThrowException(env, "java/lang/IllegalArgumentException",
557+
"SurfaceTexture already released in setPreviewTexture");
558+
return;
559+
}
560+
552561
}
553-
if (camera->setPreviewTexture(surfaceTexture) != NO_ERROR) {
562+
563+
if (camera->setPreviewTexture(bufferQueue) != NO_ERROR) {
554564
jniThrowException(env, "java/io/IOException",
555565
"setPreviewTexture failed");
556566
}

core/jni/android_view_Surface.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,16 @@ static void Surface_init(
251251
static void Surface_initFromSurfaceTexture(
252252
JNIEnv* env, jobject clazz, jobject jst)
253253
{
254-
sp<ISurfaceTexture> st(SurfaceTexture_getSurfaceTexture(env, jst));
255-
sp<Surface> surface(new Surface(st));
254+
sp<SurfaceTexture> st(SurfaceTexture_getSurfaceTexture(env, jst));
255+
256+
if (st == NULL) {
257+
jniThrowException(env, "java/lang/IllegalArgumentException",
258+
"SurfaceTexture has already been released");
259+
return;
260+
}
261+
sp<ISurfaceTexture> bq = st->getBufferQueue();
262+
263+
sp<Surface> surface(new Surface(bq));
256264
if (surface == NULL) {
257265
jniThrowException(env, OutOfResourcesException, NULL);
258266
return;

media/libstagefright/SurfaceMediaSource.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ SurfaceMediaSource::SurfaceMediaSource(uint32_t bufW, uint32_t bufH) :
5454
ALOGV("SurfaceMediaSource::SurfaceMediaSource");
5555
sp<ISurfaceComposer> composer(ComposerService::getComposerService());
5656
mGraphicBufferAlloc = composer->createGraphicBufferAlloc();
57+
if (mGraphicBufferAlloc == 0) {
58+
ALOGE("createGraphicBufferAlloc() failed in SurfaceMediaSource()");
59+
}
5760
}
5861

5962
SurfaceMediaSource::~SurfaceMediaSource() {

media/libstagefright/tests/SurfaceMediaSource_test.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class GLTest : public ::testing::Test {
107107
window.get(), NULL);
108108
} else {
109109
ALOGV("No actual display. Choosing EGLSurface based on SurfaceMediaSource");
110-
sp<SurfaceMediaSource> sms = new SurfaceMediaSource(
110+
sp<ISurfaceTexture> sms = new SurfaceMediaSource(
111111
getSurfaceWidth(), getSurfaceHeight());
112112
sp<SurfaceTextureClient> stc = new SurfaceTextureClient(sms);
113113
sp<ANativeWindow> window = stc;
@@ -360,7 +360,8 @@ class SurfaceMediaSourceTest : public ::testing::Test {
360360
android::ProcessState::self()->startThreadPool();
361361
mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
362362
mSMS->setSynchronousMode(true);
363-
mSTC = new SurfaceTextureClient(mSMS);
363+
// Manual cast is required to avoid constructor ambiguity
364+
mSTC = new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >( mSMS));
364365
mANW = mSTC;
365366
}
366367

@@ -395,7 +396,7 @@ class SurfaceMediaSourceGLTest : public GLTest {
395396
ALOGV("SMS-GLTest::SetUp()");
396397
android::ProcessState::self()->startThreadPool();
397398
mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
398-
mSTC = new SurfaceTextureClient(mSMS);
399+
mSTC = new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >( mSMS));
399400
mANW = mSTC;
400401

401402
// Doing the setup related to the GL Side
@@ -773,7 +774,7 @@ TEST_F(SurfaceMediaSourceGLTest, ChooseAndroidRecordableEGLConfigDummyWriter) {
773774
ALOGV("Verify creating a surface w/ right config + dummy writer*********");
774775

775776
mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
776-
mSTC = new SurfaceTextureClient(mSMS);
777+
mSTC = new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >( mSMS));
777778
mANW = mSTC;
778779

779780
DummyRecorder writer(mSMS);

0 commit comments

Comments
 (0)