Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e76c992 authored by Daniel Lam's avatar Daniel Lam
Browse files

SurfaceTexture: Fully refactored from BufferQueue

Cleaning up camera and media interactions as part of SurfaceTexture refactoring

Change-Id: Iea2b10ff80b5f01f83ed0902c725df1d3b4c541a
parent dc192468
Loading
Loading
Loading
Loading
+13 −3
Original line number Original line Diff line number Diff line
@@ -545,12 +545,22 @@ static void android_hardware_Camera_setPreviewTexture(JNIEnv *env,
    sp<Camera> camera = get_native_camera(env, thiz, NULL);
    sp<Camera> camera = get_native_camera(env, thiz, NULL);
    if (camera == 0) return;
    if (camera == 0) return;


    sp<SurfaceTexture> surfaceTexture = NULL;
    sp<BufferQueue> bufferQueue = NULL;
    if (jSurfaceTexture != NULL) {
    if (jSurfaceTexture != NULL) {
        surfaceTexture = reinterpret_cast<SurfaceTexture*>(env->GetIntField(
        sp<SurfaceTexture> surfaceTexture = reinterpret_cast<SurfaceTexture*>(env->GetIntField(
                jSurfaceTexture, fields.surfaceTexture));
                jSurfaceTexture, fields.surfaceTexture));
        if (surfaceTexture != NULL) {
            bufferQueue = surfaceTexture->getBufferQueue();
        }
        }
    if (camera->setPreviewTexture(surfaceTexture) != NO_ERROR) {
        else {
            jniThrowException(env, "java/lang/IllegalArgumentException",
                    "SurfaceTexture already released in setPreviewTexture");
            return;
        }

    }

    if (camera->setPreviewTexture(bufferQueue) != NO_ERROR) {
        jniThrowException(env, "java/io/IOException",
        jniThrowException(env, "java/io/IOException",
                "setPreviewTexture failed");
                "setPreviewTexture failed");
    }
    }
+10 −2
Original line number Original line Diff line number Diff line
@@ -251,8 +251,16 @@ static void Surface_init(
static void Surface_initFromSurfaceTexture(
static void Surface_initFromSurfaceTexture(
        JNIEnv* env, jobject clazz, jobject jst)
        JNIEnv* env, jobject clazz, jobject jst)
{
{
    sp<ISurfaceTexture> st(SurfaceTexture_getSurfaceTexture(env, jst));
    sp<SurfaceTexture> st(SurfaceTexture_getSurfaceTexture(env, jst));
    sp<Surface> surface(new Surface(st));

    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) {
    if (surface == NULL) {
        jniThrowException(env, OutOfResourcesException, NULL);
        jniThrowException(env, OutOfResourcesException, NULL);
        return;
        return;
+3 −0
Original line number Original line Diff line number Diff line
@@ -54,6 +54,9 @@ SurfaceMediaSource::SurfaceMediaSource(uint32_t bufW, uint32_t bufH) :
    ALOGV("SurfaceMediaSource::SurfaceMediaSource");
    ALOGV("SurfaceMediaSource::SurfaceMediaSource");
    sp<ISurfaceComposer> composer(ComposerService::getComposerService());
    sp<ISurfaceComposer> composer(ComposerService::getComposerService());
    mGraphicBufferAlloc = composer->createGraphicBufferAlloc();
    mGraphicBufferAlloc = composer->createGraphicBufferAlloc();
    if (mGraphicBufferAlloc == 0) {
        ALOGE("createGraphicBufferAlloc() failed in SurfaceMediaSource()");
    }
}
}


SurfaceMediaSource::~SurfaceMediaSource() {
SurfaceMediaSource::~SurfaceMediaSource() {
+5 −4
Original line number Original line Diff line number Diff line
@@ -107,7 +107,7 @@ protected:
                    window.get(), NULL);
                    window.get(), NULL);
        } else {
        } else {
            ALOGV("No actual display. Choosing EGLSurface based on SurfaceMediaSource");
            ALOGV("No actual display. Choosing EGLSurface based on SurfaceMediaSource");
            sp<SurfaceMediaSource> sms = new SurfaceMediaSource(
            sp<ISurfaceTexture> sms = new SurfaceMediaSource(
                    getSurfaceWidth(), getSurfaceHeight());
                    getSurfaceWidth(), getSurfaceHeight());
            sp<SurfaceTextureClient> stc = new SurfaceTextureClient(sms);
            sp<SurfaceTextureClient> stc = new SurfaceTextureClient(sms);
            sp<ANativeWindow> window = stc;
            sp<ANativeWindow> window = stc;
@@ -360,7 +360,8 @@ protected:
        android::ProcessState::self()->startThreadPool();
        android::ProcessState::self()->startThreadPool();
        mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
        mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
        mSMS->setSynchronousMode(true);
        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;
        mANW = mSTC;
    }
    }


@@ -395,7 +396,7 @@ protected:
        ALOGV("SMS-GLTest::SetUp()");
        ALOGV("SMS-GLTest::SetUp()");
        android::ProcessState::self()->startThreadPool();
        android::ProcessState::self()->startThreadPool();
        mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
        mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
        mSTC = new SurfaceTextureClient(mSMS);
        mSTC = new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >( mSMS));
        mANW = mSTC;
        mANW = mSTC;


        // Doing the setup related to the GL Side
        // 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*********");
    ALOGV("Verify creating a surface w/ right config + dummy writer*********");


    mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
    mSMS = new SurfaceMediaSource(mYuvTexWidth, mYuvTexHeight);
    mSTC = new SurfaceTextureClient(mSMS);
    mSTC = new SurfaceTextureClient(static_cast<sp<ISurfaceTexture> >( mSMS));
    mANW = mSTC;
    mANW = mSTC;


    DummyRecorder writer(mSMS);
    DummyRecorder writer(mSMS);