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

Side by Side Diff: content/renderer/media/image_capture_frame_grabber.cc

Issue 1899403002: MediaStream Image Capture (2): Platform::ImageCaptureFrameGrabber and grabFrame() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: reillyg@ comments and made SkBitmap immutable Created 4 years, 7 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/media/image_capture_frame_grabber.h"
6
7 #include "media/base/bind_to_current_loop.h"
8 #include "media/base/video_frame.h"
9 #include "media/base/video_util.h"
10 #include "third_party/WebKit/public/platform/WebCallbacks.h"
11 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
12 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
13 #include "third_party/libyuv/include/libyuv.h"
14 #include "third_party/skia/include/core/SkBitmap.h"
15
16 namespace content {
17
18 using blink::WebImageCaptureGrabFrameCallbacks;
19
20 namespace {
21
22 void OnError(std::unique_ptr<WebImageCaptureGrabFrameCallbacks> callbacks) {
23 callbacks->onError();
24 }
25
26 void OnVideoFrame(const ImageCaptureFrameGrabber::SkBitmapDeliverCB& callback,
27 const scoped_refptr<media::VideoFrame>& video_frame,
28 base::TimeTicks /* current_time */) {
29 DCHECK(video_frame->format() == media::PIXEL_FORMAT_YV12 ||
30 video_frame->format() == media::PIXEL_FORMAT_I420 ||
31 video_frame->format() == media::PIXEL_FORMAT_YV12A);
32
33 scoped_refptr<media::VideoFrame> frame = video_frame;
34 // Drop alpha channel since it's not supported in libyuv conversion to RGBA.
35 if (frame->format() == media::PIXEL_FORMAT_YV12A)
36 frame = media::WrapAsI420VideoFrame(video_frame);
37
38 std::unique_ptr<SkBitmap> bitmap(new SkBitmap());
39 bitmap->allocN32Pixels(frame->visible_rect().width(),
40 frame->visible_rect().height(),
41 true /* isOpaque */);
42
43 libyuv::I420ToARGB(frame->visible_data(media::VideoFrame::kYPlane),
44 frame->stride(media::VideoFrame::kYPlane),
45 frame->visible_data(media::VideoFrame::kUPlane),
46 frame->stride(media::VideoFrame::kUPlane),
47 frame->visible_data(media::VideoFrame::kVPlane),
48 frame->stride(media::VideoFrame::kVPlane),
49 static_cast<uint8*>(bitmap->getPixels()),
50 bitmap->width() * 4, bitmap->width(), bitmap->height());
51 bitmap->setImmutable();
52
53 callback.Run(std::move(bitmap));
54 }
55
56 } // anonymous namespace
57
58 ImageCaptureFrameGrabber::ImageCaptureFrameGrabber() : weak_factory_(this) {}
59
60 ImageCaptureFrameGrabber::~ImageCaptureFrameGrabber() {
61 DCHECK(thread_checker_.CalledOnValidThread());
62 }
63
64 void ImageCaptureFrameGrabber::grabFrame(
65 blink::WebMediaStreamTrack* track,
66 WebImageCaptureGrabFrameCallbacks* callbacks) {
67 DVLOG(1) << __FUNCTION__;
68 DCHECK(thread_checker_.CalledOnValidThread());
69 DCHECK(!!callbacks);
70
71 DCHECK(track && !track->isNull() && track->getExtraData());
72 DCHECK_EQ(blink::WebMediaStreamSource::TypeVideo, track->source().getType());
73
74 ScopedWebCallbacks<WebImageCaptureGrabFrameCallbacks> scoped_callbacks =
75 make_scoped_web_callbacks(callbacks, base::Bind(&OnError));
76
77 // ConnectToTrack() must happen on render's Main Thread, whereas VideoFrames
78 // are delivered on a background thread though, so we Bind the callback to our
79 // current thread.
80 MediaStreamVideoSink::ConnectToTrack(
81 *track,
82 base::Bind(&OnVideoFrame, media::BindToCurrentLoop(base::Bind(
83 &ImageCaptureFrameGrabber::OnSkBitmap,
84 weak_factory_.GetWeakPtr(),
85 base::Passed(&scoped_callbacks)))));
86 }
87
88 void ImageCaptureFrameGrabber::OnSkBitmap(
89 ScopedWebCallbacks<WebImageCaptureGrabFrameCallbacks> callbacks,
90 std::unique_ptr<SkBitmap> bitmap) {
91 DVLOG(1) << __FUNCTION__;
92 DCHECK(thread_checker_.CalledOnValidThread());
93
94 MediaStreamVideoSink::DisconnectFromTrack();
95 callbacks.PassCallbacks()->onSuccess(std::move(bitmap));
96 }
97
98 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698