Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Unified Diff: content/renderer/media/image_capture_frame_grabber.cc

Issue 2418923003: ImageCapture: avoid several grabFrame()s in flight, beef up content_browsertests (Closed)
Patch Set: xianglu@ comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/media/image_capture_frame_grabber.cc
diff --git a/content/renderer/media/image_capture_frame_grabber.cc b/content/renderer/media/image_capture_frame_grabber.cc
index 87f2afe7d18bd9e34082db1676dd60954cb8d2f4..165d3e1b9a2187fe3574051d20d5eb73a56710bd 100644
--- a/content/renderer/media/image_capture_frame_grabber.cc
+++ b/content/renderer/media/image_capture_frame_grabber.cc
@@ -106,7 +106,8 @@ void ImageCaptureFrameGrabber::SingleShotFrameHandler::OnVideoFrameOnIOThread(
callback.Run(surface->makeImageSnapshot());
}
-ImageCaptureFrameGrabber::ImageCaptureFrameGrabber() : weak_factory_(this) {}
+ImageCaptureFrameGrabber::ImageCaptureFrameGrabber()
+ : frame_grab_in_progress_(false), weak_factory_(this) {}
ImageCaptureFrameGrabber::~ImageCaptureFrameGrabber() {
DCHECK(thread_checker_.CalledOnValidThread());
@@ -121,6 +122,12 @@ void ImageCaptureFrameGrabber::grabFrame(
DCHECK(track && !track->isNull() && track->getTrackData());
DCHECK_EQ(blink::WebMediaStreamSource::TypeVideo, track->source().getType());
+ if (frame_grab_in_progress_) {
+ // Reject grabFrame()s too close back to back.
+ callbacks->onError();
+ return;
+ }
+
ScopedWebCallbacks<WebImageCaptureGrabFrameCallbacks> scoped_callbacks =
make_scoped_web_callbacks(callbacks, base::Bind(&OnError));
@@ -129,6 +136,7 @@ void ImageCaptureFrameGrabber::grabFrame(
// SKImages might be sent to resolved |callbacks| while DisconnectFromTrack()
// is being processed, which might be further held up if UI is busy, see
// https://crbug.com/623042.
+ frame_grab_in_progress_ = true;
MediaStreamVideoSink::ConnectToTrack(
*track, base::Bind(&SingleShotFrameHandler::OnVideoFrameOnIOThread,
make_scoped_refptr(new SingleShotFrameHandler),
@@ -145,6 +153,7 @@ void ImageCaptureFrameGrabber::OnSkImage(
DCHECK(thread_checker_.CalledOnValidThread());
MediaStreamVideoSink::DisconnectFromTrack();
+ frame_grab_in_progress_ = false;
if (image)
callbacks.PassCallbacks()->onSuccess(image);
else
« no previous file with comments | « content/renderer/media/image_capture_frame_grabber.h ('k') | content/test/data/media/image_capture_test.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698