status_t BnRemoteDisplayClient::onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) { switch (code) { case ON_DISPLAY_CONNECTED: { CHECK_INTERFACE(IRemoteDisplayClient, data, reply); sp<IGraphicBufferProducer> surfaceTexture( interface_cast<IGraphicBufferProducer>(data.readStrongBinder())); uint32_t width = data.readInt32(); uint32_t height = data.readInt32(); uint32_t flags = data.readInt32(); uint32_t session = data.readInt32(); onDisplayConnected(surfaceTexture, width, height, flags, session); return NO_ERROR; } case ON_DISPLAY_DISCONNECTED: { CHECK_INTERFACE(IRemoteDisplayClient, data, reply); onDisplayDisconnected(); return NO_ERROR; } case ON_DISPLAY_ERROR: { CHECK_INTERFACE(IRemoteDisplayClient, data, reply); int32_t error = data.readInt32(); onDisplayError(error); return NO_ERROR; } default: return BBinder::onTransact(code, data, reply, flags); } }
static jint jni_eglCreateWindowSurfaceTexture(JNIEnv *_env, jobject _this, jobject display, jobject config, jobject native_window, jintArray attrib_list) { if (display == NULL || config == NULL || !validAttribList(_env, attrib_list)) { jniThrowException(_env, "java/lang/IllegalArgumentException", NULL); return JNI_FALSE; } EGLDisplay dpy = getDisplay(_env, display); EGLContext cnf = getConfig(_env, config); sp<ANativeWindow> window; if (native_window == 0) { not_valid_surface: jniThrowException(_env, "java/lang/IllegalArgumentException", "Make sure the SurfaceTexture is valid"); return 0; } sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(_env, native_window)); window = new SurfaceTextureClient(surfaceTexture); if (window == NULL) goto not_valid_surface; jint* base = beginNativeAttribList(_env, attrib_list); EGLSurface sur = eglCreateWindowSurface(dpy, cnf, window.get(), base); endNativeAttributeList(_env, attrib_list, base); return (jint)sur; }
void CSurfaceTexture::NativeGetTransformMatrix( /* [in] */ ArrayOf<Float>* mtxArray) { android::sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(this)); float* mtx = mtxArray->GetPayload(); surfaceTexture->getTransformMatrix(mtx); }
void CSurfaceTexture::NativeSetDefaultBufferSize( /* [in] */ Int32 width, /* [in] */ Int32 height) { android::sp<android::SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(this)); surfaceTexture->setDefaultBufferSize(width, height); }
void CSurfaceTexture::NativeFinalize() { android::sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(this)); surfaceTexture->setFrameAvailableListener(0); SurfaceTexture_setFrameAvailableListener(this, 0); SurfaceTexture_setSurfaceTexture(this, 0); SurfaceTexture_setProducer(this, 0); }
sp<ANativeWindow> android_SurfaceTexture_getNativeWindow( JNIEnv* env, jobject thiz) { sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? new SurfaceTextureClient(surfaceTexture) : NULL); return surfaceTextureClient; }
static void SurfaceTexture_getTransformMatrix(JNIEnv* env, jobject thiz, jfloatArray jmtx) { sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); float* mtx = env->GetFloatArrayElements(jmtx, NULL); surfaceTexture->getTransformMatrix(mtx); env->ReleaseFloatArrayElements(jmtx, mtx, 0); }
static void SurfaceTexture_finalize(JNIEnv* env, jobject thiz) { sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); surfaceTexture->setFrameAvailableListener(0); SurfaceTexture_setFrameAvailableListener(env, thiz, 0); SurfaceTexture_setSurfaceTexture(env, thiz, 0); SurfaceTexture_setProducer(env, thiz, 0); }
static void SurfaceTexture_releaseTexImage(JNIEnv* env, jobject thiz) { sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); status_t err = surfaceTexture->releaseTexImage(); if (err == INVALID_OPERATION) { jniThrowException(env, IllegalStateException, "Unable to release texture contents (see " "logcat for details)"); } else if (err < 0) { jniThrowRuntimeException(env, "Error during releaseTexImage (see logcat for details)"); } }
ECode CSurfaceTexture::NativeUpdateTexImage() { android::sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(this)); android::status_t err = surfaceTexture->updateTexImage(); if (err == android::INVALID_OPERATION) { // jniThrowException(env, IllegalStateException, "Unable to update texture contents (see " // "logcat for details)"); return E_ILLEGAL_STATE_EXCEPTION; } else if (err < 0) { // jniThrowRuntimeException(env, "Error during updateTexImage (see logcat for details)"); return E_RUNTIME_EXCEPTION; } return NOERROR; }
ECode CSurfaceTexture::NativeInit( /* [in] */ Int32 texName, /* [in] */ Boolean allowSynchronousMode) { android::sp<android::SurfaceTexture> surfaceTexture(new android::SurfaceTexture(texName, allowSynchronousMode)); if (surfaceTexture == 0) { // jniThrowException(env, OutOfResourcesException, // "Unable to create native SurfaceTexture"); return E_OUT_OF_RESOURCES_EXCEPTION; } SurfaceTexture_setSurfaceTexture(this, surfaceTexture); android::sp<DroidSurfaceTextureContext> ctx(new DroidSurfaceTextureContext(this)); surfaceTexture->setFrameAvailableListener(ctx); return NOERROR; }
static void SurfaceTexture_init(JNIEnv* env, jobject thiz, jint texName, jobject weakThiz, jboolean allowSynchronous) { sp<SurfaceTexture> surfaceTexture(new SurfaceTexture(texName, allowSynchronous)); if (surfaceTexture == 0) { jniThrowException(env, OutOfResourcesException, "Unable to create native SurfaceTexture"); return; } SurfaceTexture_setSurfaceTexture(env, thiz, surfaceTexture); jclass clazz = env->GetObjectClass(thiz); if (clazz == NULL) { jniThrowRuntimeException(env, "Can't find android/graphics/SurfaceTexture"); return; } sp<JNISurfaceTextureContext> ctx(new JNISurfaceTextureContext(env, weakThiz, clazz)); surfaceTexture->setFrameAvailableListener(ctx); }
static void SurfaceTexture_release(JNIEnv* env, jobject thiz) { sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); surfaceTexture->abandon(); }
sp<SurfaceTexture> SurfaceTexture_getSurfaceTexture(JNIEnv* env, jobject thiz) { sp<SurfaceTexture> surfaceTexture( (SurfaceTexture*)env->GetIntField(thiz, fields.surfaceTexture)); return surfaceTexture; }
static jlong SurfaceTexture_getTimestamp(JNIEnv* env, jobject thiz) { sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); return surfaceTexture->getTimestamp(); }
static jint SurfaceTexture_detachFromGLContext(JNIEnv* env, jobject thiz) { sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); return surfaceTexture->detachFromContext(); }
static jint SurfaceTexture_attachToGLContext(JNIEnv* env, jobject thiz, jint tex) { sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); return surfaceTexture->attachToContext((GLuint)tex); }
static void SurfaceTexture_setDefaultBufferSize( JNIEnv* env, jobject thiz, jint width, jint height) { sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); surfaceTexture->setDefaultBufferSize(width, height); }
android::sp<android::SurfaceTexture> SurfaceTexture_getSurfaceTexture( /* [in] */ CSurfaceTexture* thiz) { android::sp<android::SurfaceTexture> surfaceTexture((android::SurfaceTexture*)thiz->mSurfaceTexture); return surfaceTexture; }
sp<ANativeWindow> android_SurfaceTexture_getNativeWindow(JNIEnv* env, jobject thiz) { sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); sp<IGraphicBufferProducer> producer(SurfaceTexture_getProducer(env, thiz)); sp<Surface> surfaceTextureClient(surfaceTexture != NULL ? new Surface(producer) : NULL); return surfaceTextureClient; }
void CSurfaceTexture::NativeFinalize() { android::sp<android::SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(this)); surfaceTexture->setFrameAvailableListener(0); SurfaceTexture_setSurfaceTexture(this, 0); }
void CSurfaceTexture::NativeRelease() { android::sp<android::SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(this)); surfaceTexture->abandon(); }
static jboolean SurfaceTexture_isReleased(JNIEnv* env, jobject thiz) { sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); return surfaceTexture->isAbandoned(); }
Int32 CSurfaceTexture::NativeAttachToGLContext( /* [in] */ Int32 texName) { android::sp<android::SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(this)); return surfaceTexture->attachToContext((GLuint)texName); }
Int32 CSurfaceTexture::NativeDetachFromGLContext() { android::sp<android::SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(this)); return surfaceTexture->detachFromContext(); }
static jint SurfaceTexture_updateTexImage(JNIEnv* env, jobject thiz) { sp<SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, thiz)); return surfaceTexture->updateTexImage(); }
Int64 CSurfaceTexture::NativeGetTimestamp() { android::sp<android::SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(this)); return surfaceTexture->getTimestamp(); }
void CSurfaceTexture::NativeGetTransformMatrix( /* [in] */ const ArrayOf<Float>& mtx) { android::sp<android::SurfaceTexture> surfaceTexture(SurfaceTexture_getSurfaceTexture(this)); surfaceTexture->getTransformMatrix(mtx.GetPayload()); }