// This is called on the UI thread only. // The video layers are composited on the webkit thread and then copied over // to the UI thread with the same ID. For rendering, we are only using the // video layers on the UI thread. Therefore, on the UI thread, we have to use // the videoLayerId from Java side to find the exact video layer in the tree // to set the surface texture. // Every time a play call into Java side, the videoLayerId will be sent and // saved in Java side. Then every time setBaseLayer call, the saved // videoLayerId will be passed to this function to find the Video Layer. // Return value: true when the video layer is found. static bool SendSurfaceTexture(JNIEnv* env, jobject obj, jobject surfTex, int baseLayer, int videoLayerId, int textureName, int playerState) { if (!surfTex) return false; sp<SurfaceTexture> texture = android::SurfaceTexture_getSurfaceTexture(env, surfTex); if (!texture.get()) return false; BaseLayerAndroid* layerImpl = reinterpret_cast<BaseLayerAndroid*>(baseLayer); if (!layerImpl) return false; if (!layerImpl->countChildren()) return false; LayerAndroid* compositedRoot = static_cast<LayerAndroid*>(layerImpl->getChild(0)); if (!compositedRoot) return false; VideoLayerAndroid* videoLayer = static_cast<VideoLayerAndroid*>(compositedRoot->findById(videoLayerId)); if (!videoLayer) return false; // Set the SurfaceTexture to the layer we found videoLayer->setSurfaceTexture(texture, textureName, static_cast<PlayerState>(playerState)); return true; }