void RemoteDisplayClient::onDisplayConnected( const sp<ISurfaceTexture> &surfaceTexture, uint32_t width, uint32_t height, uint32_t flags) { ALOGI("onDisplayConnected width=%u, height=%u, flags = 0x%08x", width, height, flags); mSurfaceTexture = surfaceTexture; mDisplayBinder = mComposerClient->createDisplay( String8("foo"), false /* secure */); SurfaceComposerClient::openGlobalTransaction(); mComposerClient->setDisplaySurface(mDisplayBinder, mSurfaceTexture); Rect layerStackRect(1280, 720); // XXX fix this. Rect displayRect(1280, 720); mComposerClient->setDisplayProjection( mDisplayBinder, 0 /* 0 degree rotation */, layerStackRect, displayRect); SurfaceComposerClient::closeGlobalTransaction(); }
void RemoteDisplayClient::onDisplayConnected( const sp<IGraphicBufferProducer> &bufferProducer, uint32_t width, uint32_t height, uint32_t flags, uint32_t session) { ALOGI("onDisplayConnected width=%u, height=%u, flags = 0x%08x, session=%d", width, height, flags, session); if (bufferProducer != NULL) { mSurfaceTexture = bufferProducer; mDisplayBinder = mComposerClient->createDisplay( String8("foo"), false /* secure */); SurfaceComposerClient::openGlobalTransaction(); mComposerClient->setDisplaySurface(mDisplayBinder, mSurfaceTexture); Rect layerStackRect(1280, 720); // XXX fix this. Rect displayRect(1280, 720); mComposerClient->setDisplayProjection( mDisplayBinder, 0 /* 0 degree rotation */, layerStackRect, displayRect); SurfaceComposerClient::closeGlobalTransaction(); } }
static void nativeSetDisplayProjection(JNIEnv* env, jclass clazz, jobject tokenObj, jint orientation, jint layerStackRect_left, jint layerStackRect_top, jint layerStackRect_right, jint layerStackRect_bottom, jint displayRect_left, jint displayRect_top, jint displayRect_right, jint displayRect_bottom) { sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); if (token == NULL) return; Rect layerStackRect(layerStackRect_left, layerStackRect_top, layerStackRect_right, layerStackRect_bottom); Rect displayRect(displayRect_left, displayRect_top, displayRect_right, displayRect_bottom); SurfaceComposerClient::setDisplayProjection(token, orientation, layerStackRect, displayRect); }
int createVirtualDisplay() { uint32_t sourceWidth, sourceHeight; uint32_t targetWidth, targetHeight; android::status_t err; switch (mDesiredOrientation) { case Minicap::ORIENTATION_90: sourceWidth = mRealHeight; sourceHeight = mRealWidth; targetWidth = mDesiredHeight; targetHeight = mDesiredWidth; break; case Minicap::ORIENTATION_270: sourceWidth = mRealHeight; sourceHeight = mRealWidth; targetWidth = mDesiredHeight; targetHeight = mDesiredWidth; break; case Minicap::ORIENTATION_180: sourceWidth = mRealWidth; sourceHeight = mRealHeight; targetWidth = mDesiredWidth; targetHeight = mDesiredHeight; break; case Minicap::ORIENTATION_0: default: sourceWidth = mRealWidth; sourceHeight = mRealHeight; targetWidth = mDesiredWidth; targetHeight = mDesiredHeight; break; } // Set up virtual display size. android::Rect layerStackRect(sourceWidth, sourceHeight); android::Rect visibleRect(targetWidth, targetHeight); // Create a Surface for the virtual display to write to. MCINFO("Creating SurfaceComposerClient"); android::sp<android::SurfaceComposerClient> sc = new android::SurfaceComposerClient(); MCINFO("Performing SurfaceComposerClient init check"); if ((err = sc->initCheck()) != android::NO_ERROR) { MCERROR("Unable to initialize SurfaceComposerClient"); return err; } // Create virtual display. MCINFO("Creating virtual display"); mVirtualDisplay = android::SurfaceComposerClient::createDisplay( /* const String8& displayName */ android::String8("minicap"), /* bool secure */ true ); MCINFO("Creating buffer queue"); android::BufferQueue::createBufferQueue(&mBufferProducer, &mBufferConsumer); mBufferConsumer->setDefaultBufferSize(targetWidth, targetHeight); mBufferConsumer->setDefaultBufferFormat(android::PIXEL_FORMAT_RGBA_8888); MCINFO("Creating CPU consumer"); mConsumer = new android::CpuConsumer(mBufferConsumer, 3, false); mConsumer->setName(android::String8("minicap")); MCINFO("Creating frame waiter"); mFrameProxy = new FrameProxy(mUserFrameAvailableListener); mConsumer->setFrameAvailableListener(mFrameProxy); MCINFO("Publishing virtual display"); android::SurfaceComposerClient::openGlobalTransaction(); android::SurfaceComposerClient::setDisplaySurface(mVirtualDisplay, mBufferProducer); android::SurfaceComposerClient::setDisplayProjection(mVirtualDisplay, android::DISPLAY_ORIENTATION_0, layerStackRect, visibleRect); android::SurfaceComposerClient::setDisplayLayerStack(mVirtualDisplay, 0); // default stack android::SurfaceComposerClient::closeGlobalTransaction(); mHaveRunningDisplay = true; return 0; }