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

Side by Side Diff: remoting/protocol/webrtc_video_renderer_adapter.cc

Issue 1580823003: Implement client-side video stream support for WebRTC-based protocol. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@packet_options_rem
Patch Set: Created 4 years, 11 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 2015 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 "remoting/protocol/webrtc_video_renderer_adapter.h"
6
7 #include <utility>
8
9 #include "base/bind.h"
10 #include "base/callback.h"
11 #include "base/location.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/single_thread_task_runner.h"
14 #include "base/thread_task_runner_handle.h"
15 #include "remoting/protocol/frame_consumer.h"
16 #include "third_party/libjingle/source/talk/media/base/videoframe.h"
17 #include "third_party/libyuv/include/libyuv/video_common.h"
18 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
19
20 namespace remoting {
21 namespace protocol {
22
23 WebrtcVideoRendererAdapter::WebrtcVideoRendererAdapter(
24 scoped_refptr<webrtc::MediaStreamInterface> media_stream,
25 FrameConsumer* frame_consumer)
26 : media_stream_(std::move(media_stream)),
27 frame_consumer_(frame_consumer),
28 output_format_fourcc_(frame_consumer_->GetPixelFormat() ==
29 FrameConsumer::FORMAT_BGRA
30 ? libyuv::FOURCC_ARGB
31 : libyuv::FOURCC_ABGR),
32 task_runner_(base::ThreadTaskRunnerHandle::Get()),
33 weak_factory_(this) {
34 webrtc::VideoTrackVector video_tracks = media_stream_->GetVideoTracks();
35 if (video_tracks.empty()) {
36 LOG(ERROR) << "Received media stream with no video tracks.";
37 return;
38 }
39
40 video_tracks[0]->AddRenderer(this);
Jamie 2016/01/12 21:00:04 Also LOG(ERROR) if there's more than 1?
Sergey Ulanov 2016/01/12 22:13:45 Done.
41 }
42
43 WebrtcVideoRendererAdapter::~WebrtcVideoRendererAdapter() {
44 DCHECK(task_runner_->BelongsToCurrentThread());
45 }
46
47 void WebrtcVideoRendererAdapter::RenderFrame(const cricket::VideoFrame* frame) {
48 // TODO(sergeyu): WebRTC calls RenderFrame on a separate thread it creates.
49 // FrameConsumer normally expects to be called on the network thread, so we
50 // cannot call FrameConsumer::AllocateFrame() here and instead
51 // BasicDesktopFrame is created directly. This will not correctly with all
52 // FrameConsumer implementations. Fix this somehow.
Jamie 2016/01/12 21:00:04 It doesn't need to be this CL, but why not just bo
Sergey Ulanov 2016/01/12 22:13:45 Because we don't get ownership of the |frame| here
53 scoped_ptr<webrtc::DesktopFrame> rgb_frame(new webrtc::BasicDesktopFrame(
54 webrtc::DesktopSize(frame->GetWidth(), frame->GetHeight())));
55
56 frame->ConvertToRgbBuffer(
57 output_format_fourcc_, rgb_frame->data(),
58 std::abs(rgb_frame->stride()) * rgb_frame->size().height(),
59 rgb_frame->stride());
60 rgb_frame->mutable_updated_region()->AddRect(
61 webrtc::DesktopRect::MakeSize(rgb_frame->size()));
62 task_runner_->PostTask(
63 FROM_HERE,
64 base::Bind(&WebrtcVideoRendererAdapter::DrawFrame,
65 weak_factory_.GetWeakPtr(), base::Passed(&rgb_frame)));
66 }
67
68 void WebrtcVideoRendererAdapter::DrawFrame(
69 scoped_ptr<webrtc::DesktopFrame> frame) {
70 DCHECK(task_runner_->BelongsToCurrentThread());
71 frame_consumer_->DrawFrame(std::move(frame), base::Closure());
72 }
73
74 } // namespace remoting
75 } // namespace protocol
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698