Loading services/camera/virtualcamera/VirtualCameraRenderThread.cc +2 −19 Original line number Diff line number Diff line Loading @@ -223,21 +223,6 @@ std::chrono::nanoseconds getMaxFrameDuration( static_cast<uint64_t>(1e9 / VirtualCameraDevice::kMinFps)); } class FrameAvailableListenerProxy : public ConsumerBase::FrameAvailableListener { public: FrameAvailableListenerProxy(std::function<void()> callback) : mOnFrameAvailableCallback(callback) { } virtual void onFrameAvailable(const BufferItem&) override { ALOGV("%s: onFrameAvailable", __func__); mOnFrameAvailableCallback(); } private: std::function<void()> mOnFrameAvailableCallback; }; } // namespace CaptureRequestBuffer::CaptureRequestBuffer(int streamId, int bufferId, Loading Loading @@ -383,10 +368,8 @@ void VirtualCameraRenderThread::threadLoop() { EglTextureProgram::TextureFormat::RGBA); mEglSurfaceTexture = std::make_unique<EglSurfaceTexture>( mInputSurfaceSize.width, mInputSurfaceSize.height); sp<FrameAvailableListenerProxy> frameAvailableListener = sp<FrameAvailableListenerProxy>::make( mEglSurfaceTexture->setFrameAvailableListener( [this]() { requestTextureUpdate(); }); mEglSurfaceTexture->setFrameAvailableListener(frameAvailableListener); mInputSurfacePromise.set_value(mEglSurfaceTexture->getSurface()); Loading services/camera/virtualcamera/util/EglSurfaceTexture.cc +23 −3 Original line number Diff line number Diff line Loading @@ -40,6 +40,21 @@ namespace { // Maximal number of buffers producer can dequeue without blocking. constexpr int kBufferProducerMaxDequeueBufferCount = 64; class FrameAvailableListenerProxy : public ConsumerBase::FrameAvailableListener { public: FrameAvailableListenerProxy(const std::function<void()>& callback) : mOnFrameAvailableCallback(callback) { } virtual void onFrameAvailable(const BufferItem&) override { ALOGV("%s: onFrameAvailable", __func__); mOnFrameAvailableCallback(); } private: std::function<void()> mOnFrameAvailableCallback; }; } // namespace EglSurfaceTexture::EglSurfaceTexture(const uint32_t width, const uint32_t height) Loading Loading @@ -92,8 +107,13 @@ sp<GraphicBuffer> EglSurfaceTexture::getCurrentBuffer() { } void EglSurfaceTexture::setFrameAvailableListener( const wp<ConsumerBase::FrameAvailableListener>& listener) { mGlConsumer->setFrameAvailableListener(listener); const std::function<void()>& listener) { mFrameAvailableListener = sp<FrameAvailableListenerProxy>::make([this, listener]() { mIsFirstFrameDrawn.store(true); listener(); }); mGlConsumer->setFrameAvailableListener(mFrameAvailableListener); } bool EglSurfaceTexture::waitForNextFrame(const std::chrono::nanoseconds timeout) { Loading @@ -106,7 +126,7 @@ std::chrono::nanoseconds EglSurfaceTexture::getTimestamp() { } bool EglSurfaceTexture::isFirstFrameDrawn() { return mGlConsumer->getFrameNumber() > 0; return mIsFirstFrameDrawn.load(); } GLuint EglSurfaceTexture::updateTexture() { Loading services/camera/virtualcamera/util/EglSurfaceTexture.h +3 −2 Original line number Diff line number Diff line Loading @@ -62,8 +62,7 @@ class EglSurfaceTexture { // Returns false on timeout, true if new frame was received before timeout. bool waitForNextFrame(std::chrono::nanoseconds timeout); void setFrameAvailableListener( const wp<ConsumerBase::FrameAvailableListener>& listener); void setFrameAvailableListener(const std::function<void()>& listener); // Update the texture with the most recent submitted buffer. // Most be called on thread with EGL context. Loading Loading @@ -99,6 +98,8 @@ class EglSurfaceTexture { GLuint mTextureId; const uint32_t mWidth; const uint32_t mHeight; std::atomic_bool mIsFirstFrameDrawn = false; sp<ConsumerBase::FrameAvailableListener> mFrameAvailableListener; }; } // namespace virtualcamera Loading Loading
services/camera/virtualcamera/VirtualCameraRenderThread.cc +2 −19 Original line number Diff line number Diff line Loading @@ -223,21 +223,6 @@ std::chrono::nanoseconds getMaxFrameDuration( static_cast<uint64_t>(1e9 / VirtualCameraDevice::kMinFps)); } class FrameAvailableListenerProxy : public ConsumerBase::FrameAvailableListener { public: FrameAvailableListenerProxy(std::function<void()> callback) : mOnFrameAvailableCallback(callback) { } virtual void onFrameAvailable(const BufferItem&) override { ALOGV("%s: onFrameAvailable", __func__); mOnFrameAvailableCallback(); } private: std::function<void()> mOnFrameAvailableCallback; }; } // namespace CaptureRequestBuffer::CaptureRequestBuffer(int streamId, int bufferId, Loading Loading @@ -383,10 +368,8 @@ void VirtualCameraRenderThread::threadLoop() { EglTextureProgram::TextureFormat::RGBA); mEglSurfaceTexture = std::make_unique<EglSurfaceTexture>( mInputSurfaceSize.width, mInputSurfaceSize.height); sp<FrameAvailableListenerProxy> frameAvailableListener = sp<FrameAvailableListenerProxy>::make( mEglSurfaceTexture->setFrameAvailableListener( [this]() { requestTextureUpdate(); }); mEglSurfaceTexture->setFrameAvailableListener(frameAvailableListener); mInputSurfacePromise.set_value(mEglSurfaceTexture->getSurface()); Loading
services/camera/virtualcamera/util/EglSurfaceTexture.cc +23 −3 Original line number Diff line number Diff line Loading @@ -40,6 +40,21 @@ namespace { // Maximal number of buffers producer can dequeue without blocking. constexpr int kBufferProducerMaxDequeueBufferCount = 64; class FrameAvailableListenerProxy : public ConsumerBase::FrameAvailableListener { public: FrameAvailableListenerProxy(const std::function<void()>& callback) : mOnFrameAvailableCallback(callback) { } virtual void onFrameAvailable(const BufferItem&) override { ALOGV("%s: onFrameAvailable", __func__); mOnFrameAvailableCallback(); } private: std::function<void()> mOnFrameAvailableCallback; }; } // namespace EglSurfaceTexture::EglSurfaceTexture(const uint32_t width, const uint32_t height) Loading Loading @@ -92,8 +107,13 @@ sp<GraphicBuffer> EglSurfaceTexture::getCurrentBuffer() { } void EglSurfaceTexture::setFrameAvailableListener( const wp<ConsumerBase::FrameAvailableListener>& listener) { mGlConsumer->setFrameAvailableListener(listener); const std::function<void()>& listener) { mFrameAvailableListener = sp<FrameAvailableListenerProxy>::make([this, listener]() { mIsFirstFrameDrawn.store(true); listener(); }); mGlConsumer->setFrameAvailableListener(mFrameAvailableListener); } bool EglSurfaceTexture::waitForNextFrame(const std::chrono::nanoseconds timeout) { Loading @@ -106,7 +126,7 @@ std::chrono::nanoseconds EglSurfaceTexture::getTimestamp() { } bool EglSurfaceTexture::isFirstFrameDrawn() { return mGlConsumer->getFrameNumber() > 0; return mIsFirstFrameDrawn.load(); } GLuint EglSurfaceTexture::updateTexture() { Loading
services/camera/virtualcamera/util/EglSurfaceTexture.h +3 −2 Original line number Diff line number Diff line Loading @@ -62,8 +62,7 @@ class EglSurfaceTexture { // Returns false on timeout, true if new frame was received before timeout. bool waitForNextFrame(std::chrono::nanoseconds timeout); void setFrameAvailableListener( const wp<ConsumerBase::FrameAvailableListener>& listener); void setFrameAvailableListener(const std::function<void()>& listener); // Update the texture with the most recent submitted buffer. // Most be called on thread with EGL context. Loading Loading @@ -99,6 +98,8 @@ class EglSurfaceTexture { GLuint mTextureId; const uint32_t mWidth; const uint32_t mHeight; std::atomic_bool mIsFirstFrameDrawn = false; sp<ConsumerBase::FrameAvailableListener> mFrameAvailableListener; }; } // namespace virtualcamera Loading