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

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

Issue 2739253003: Image Capture: Move files out of content/renderer/media to replicate WebKit's structure (Closed)
Patch Set: DEPS Created 3 years, 9 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
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

Powered by Google App Engine
This is Rietveld 408576698