Commit 1c762fa1 authored by Patrick Brosset's avatar Patrick Brosset Committed by Commit Bot

Actually throttle frame rate with Page.screencastFrameAck

The implementation Page.screencastFrameAck method is supposedly here to
throttle the frame rate when doing a screencast over CDP.
It's supposed to be used like this:

on('Page.screencastFrame', frame => {
  Page.screencastFrameAck({sessionId: frame.sessionId});
});
Page.startScreencast();

But in reality, calling screencastFrameAck or not does not make any
difference. The frames are still sent by the backend at the same rate,
without waiting.

This change fixes the video_consumer code path in PageHandler so it does
wait for Page.screencastFrameAck to be called after it has reached the
maximum number of inflight frames.

Bug: 1126915
Change-Id: I8bc1bc37e48689262b250376879fb9ae726a6700
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2404113
Commit-Queue: Patrick Brosset <patrick.brosset@microsoft.com>
Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#808277}
parent 8bc85606
......@@ -957,14 +957,16 @@ void PageHandler::NotifyScreencastVisibility(bool visible) {
frontend_->ScreencastVisibilityChanged(visible);
}
bool PageHandler::ShouldCaptureNextScreencastFrame() {
return frames_in_flight_ <= kMaxScreencastFramesInFlight &&
!(++frame_counter_ % capture_every_nth_frame_);
}
void PageHandler::InnerSwapCompositorFrame() {
if (!host_)
return;
if (frames_in_flight_ > kMaxScreencastFramesInFlight)
return;
if (++frame_counter_ % capture_every_nth_frame_)
if (!ShouldCaptureNextScreencastFrame())
return;
RenderWidgetHostViewBase* const view =
......@@ -1007,6 +1009,9 @@ void PageHandler::OnFrameFromVideoConsumer(
if (!host_)
return;
if (!ShouldCaptureNextScreencastFrame())
return;
RenderWidgetHostViewBase* const view =
static_cast<RenderWidgetHostViewBase*>(host_->GetView());
if (!view)
......@@ -1038,6 +1043,7 @@ void PageHandler::OnFrameFromVideoConsumer(
if (!page_metadata)
return;
frames_in_flight_++;
ScreencastFrameCaptured(std::move(page_metadata),
DevToolsVideoConsumer::GetSkBitmapFromFrame(frame));
}
......
......@@ -176,6 +176,7 @@ class PageHandler : public DevToolsDomainHandler,
private:
enum EncodingFormat { PNG, JPEG };
bool ShouldCaptureNextScreencastFrame();
void NotifyScreencastVisibility(bool visible);
void InnerSwapCompositorFrame();
void OnFrameFromVideoConsumer(scoped_refptr<media::VideoFrame> frame);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment