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

Commit bb003add authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Don't rely on GLConsumer frame number in virtual camera" into main

parents 006dd83a 7baca063
Loading
Loading
Loading
Loading
+2 −19
Original line number Diff line number Diff line
@@ -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,
@@ -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());

+23 −3
Original line number Diff line number Diff line
@@ -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)
@@ -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) {
@@ -106,7 +126,7 @@ std::chrono::nanoseconds EglSurfaceTexture::getTimestamp() {
}

bool EglSurfaceTexture::isFirstFrameDrawn() {
  return mGlConsumer->getFrameNumber() > 0;
  return mIsFirstFrameDrawn.load();
}

GLuint EglSurfaceTexture::updateTexture() {
+3 −2
Original line number Diff line number Diff line
@@ -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.
@@ -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