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

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
« no previous file with comments | « remoting/protocol/webrtc_video_renderer_adapter.h ('k') | remoting/remoting_srcs.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 if (video_tracks.size() > 1U) {
41 LOG(WARNING) << "Received media stream with multiple video tracks.";
42 }
43
44 video_tracks[0]->AddRenderer(this);
45 }
46
47 WebrtcVideoRendererAdapter::~WebrtcVideoRendererAdapter() {
48 DCHECK(task_runner_->BelongsToCurrentThread());
49 }
50
51 void WebrtcVideoRendererAdapter::RenderFrame(const cricket::VideoFrame* frame) {
52 // TODO(sergeyu): WebRTC calls RenderFrame on a separate thread it creates.
53 // FrameConsumer normally expects to be called on the network thread, so we
54 // cannot call FrameConsumer::AllocateFrame() here and instead
55 // BasicDesktopFrame is created directly. This will not work correctly with
56 // all FrameConsumer implementations. Fix this somehow.
57 scoped_ptr<webrtc::DesktopFrame> rgb_frame(new webrtc::BasicDesktopFrame(
58 webrtc::DesktopSize(frame->GetWidth(), frame->GetHeight())));
59
60 frame->ConvertToRgbBuffer(
61 output_format_fourcc_, rgb_frame->data(),
62 std::abs(rgb_frame->stride()) * rgb_frame->size().height(),
63 rgb_frame->stride());
64 rgb_frame->mutable_updated_region()->AddRect(
65 webrtc::DesktopRect::MakeSize(rgb_frame->size()));
66 task_runner_->PostTask(
67 FROM_HERE,
68 base::Bind(&WebrtcVideoRendererAdapter::DrawFrame,
69 weak_factory_.GetWeakPtr(), base::Passed(&rgb_frame)));
70 }
71
72 void WebrtcVideoRendererAdapter::DrawFrame(
73 scoped_ptr<webrtc::DesktopFrame> frame) {
74 DCHECK(task_runner_->BelongsToCurrentThread());
75 frame_consumer_->DrawFrame(std::move(frame), base::Closure());
76 }
77
78 } // namespace remoting
79 } // namespace protocol
OLDNEW
« no previous file with comments | « remoting/protocol/webrtc_video_renderer_adapter.h ('k') | remoting/remoting_srcs.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698