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 |
deleted file mode 100644 |
index 863e5aee303d192b63d1cb1f03d61bae07aa4503..0000000000000000000000000000000000000000 |
--- a/content/renderer/media/image_capture_frame_grabber.cc |
+++ /dev/null |
@@ -1,164 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/renderer/media/image_capture_frame_grabber.h" |
- |
-#include "cc/paint/paint_canvas.h" |
-#include "cc/paint/paint_surface.h" |
-#include "media/base/bind_to_current_loop.h" |
-#include "media/base/video_frame.h" |
-#include "media/base/video_util.h" |
-#include "skia/ext/platform_canvas.h" |
-#include "third_party/WebKit/public/platform/WebCallbacks.h" |
-#include "third_party/WebKit/public/platform/WebMediaStreamSource.h" |
-#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" |
-#include "third_party/libyuv/include/libyuv.h" |
-#include "third_party/skia/include/core/SkImage.h" |
- |
-namespace content { |
- |
-using blink::WebImageCaptureGrabFrameCallbacks; |
- |
-namespace { |
- |
-void OnError(std::unique_ptr<WebImageCaptureGrabFrameCallbacks> callbacks) { |
- callbacks->onError(); |
-} |
- |
-} // anonymous namespace |
- |
-// Ref-counted class to receive a single VideoFrame on IO thread, convert it and |
-// send it to |main_task_runner_|, where this class is created and destroyed. |
-class ImageCaptureFrameGrabber::SingleShotFrameHandler |
- : public base::RefCountedThreadSafe<SingleShotFrameHandler> { |
- public: |
- SingleShotFrameHandler() : first_frame_received_(false) {} |
- |
- // Receives a |frame| and converts its pixels into a SkImage via an internal |
- // PaintSurface and SkPixmap. Alpha channel, if any, is copied. |
- void OnVideoFrameOnIOThread(SkImageDeliverCB callback, |
- const scoped_refptr<media::VideoFrame>& frame, |
- base::TimeTicks current_time); |
- |
- private: |
- friend class base::RefCountedThreadSafe<SingleShotFrameHandler>; |
- virtual ~SingleShotFrameHandler() {} |
- |
- // Flag to indicate that the first frames has been processed, and subsequent |
- // ones can be safely discarded. |
- bool first_frame_received_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SingleShotFrameHandler); |
-}; |
- |
-void ImageCaptureFrameGrabber::SingleShotFrameHandler::OnVideoFrameOnIOThread( |
- SkImageDeliverCB callback, |
- const scoped_refptr<media::VideoFrame>& frame, |
- base::TimeTicks /* current_time */) { |
- DCHECK(frame->format() == media::PIXEL_FORMAT_YV12 || |
- frame->format() == media::PIXEL_FORMAT_I420 || |
- frame->format() == media::PIXEL_FORMAT_YV12A); |
- |
- if (first_frame_received_) |
- return; |
- first_frame_received_ = true; |
- |
- const SkAlphaType alpha = media::IsOpaque(frame->format()) |
- ? kOpaque_SkAlphaType |
- : kPremul_SkAlphaType; |
- const SkImageInfo info = SkImageInfo::MakeN32( |
- frame->visible_rect().width(), frame->visible_rect().height(), alpha); |
- |
- sk_sp<SkSurface> surface = SkSurface::MakeRaster(info); |
- DCHECK(surface); |
- |
- SkPixmap pixmap; |
- if (!skia::GetWritablePixels(surface->getCanvas(), &pixmap)) { |
- DLOG(ERROR) << "Error trying to map SkSurface's pixels"; |
- callback.Run(sk_sp<SkImage>()); |
- return; |
- } |
- |
- const uint32 destination_pixel_format = |
- (kN32_SkColorType == kRGBA_8888_SkColorType) ? libyuv::FOURCC_ABGR |
- : libyuv::FOURCC_ARGB; |
- |
- libyuv::ConvertFromI420(frame->visible_data(media::VideoFrame::kYPlane), |
- frame->stride(media::VideoFrame::kYPlane), |
- frame->visible_data(media::VideoFrame::kUPlane), |
- frame->stride(media::VideoFrame::kUPlane), |
- frame->visible_data(media::VideoFrame::kVPlane), |
- frame->stride(media::VideoFrame::kVPlane), |
- static_cast<uint8*>(pixmap.writable_addr()), |
- pixmap.width() * 4, pixmap.width(), pixmap.height(), |
- destination_pixel_format); |
- |
- if (frame->format() == media::PIXEL_FORMAT_YV12A) { |
- DCHECK(!info.isOpaque()); |
- // This function copies any plane into the alpha channel of an ARGB image. |
- libyuv::ARGBCopyYToAlpha(frame->visible_data(media::VideoFrame::kAPlane), |
- frame->stride(media::VideoFrame::kAPlane), |
- static_cast<uint8*>(pixmap.writable_addr()), |
- pixmap.width() * 4, pixmap.width(), |
- pixmap.height()); |
- } |
- |
- callback.Run(surface->makeImageSnapshot()); |
-} |
- |
-ImageCaptureFrameGrabber::ImageCaptureFrameGrabber() |
- : frame_grab_in_progress_(false), weak_factory_(this) {} |
- |
-ImageCaptureFrameGrabber::~ImageCaptureFrameGrabber() { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
-} |
- |
-void ImageCaptureFrameGrabber::grabFrame( |
- blink::WebMediaStreamTrack* track, |
- WebImageCaptureGrabFrameCallbacks* callbacks) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(!!callbacks); |
- |
- 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)); |
- |
- // A SingleShotFrameHandler is bound and given to the Track to guarantee that |
- // only one VideoFrame is converted and delivered to OnSkImage(), otherwise |
- // 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), |
- media::BindToCurrentLoop( |
- base::Bind(&ImageCaptureFrameGrabber::OnSkImage, |
- weak_factory_.GetWeakPtr(), |
- base::Passed(&scoped_callbacks)))), |
- false); |
-} |
- |
-void ImageCaptureFrameGrabber::OnSkImage( |
- ScopedWebCallbacks<blink::WebImageCaptureGrabFrameCallbacks> callbacks, |
- sk_sp<SkImage> image) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- |
- MediaStreamVideoSink::DisconnectFromTrack(); |
- frame_grab_in_progress_ = false; |
- if (image) |
- callbacks.PassCallbacks()->onSuccess(image); |
- else |
- callbacks.PassCallbacks()->onError(); |
-} |
- |
-} // namespace content |