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

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

Issue 2096643003: Rework PerformanceTracker to make it usable with WebRTC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address feedback Created 4 years, 5 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
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/protocol/webrtc_video_renderer_adapter.h" 5 #include "remoting/protocol/webrtc_video_renderer_adapter.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/location.h" 12 #include "base/location.h"
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
15 #include "base/task_runner_util.h" 15 #include "base/task_runner_util.h"
16 #include "base/threading/thread_task_runner_handle.h" 16 #include "base/threading/thread_task_runner_handle.h"
17 #include "base/threading/worker_pool.h" 17 #include "base/threading/worker_pool.h"
18 #include "remoting/protocol/frame_consumer.h" 18 #include "remoting/protocol/frame_consumer.h"
19 #include "remoting/protocol/frame_stats.h"
19 #include "third_party/libyuv/include/libyuv/convert_argb.h" 20 #include "third_party/libyuv/include/libyuv/convert_argb.h"
20 #include "third_party/libyuv/include/libyuv/video_common.h" 21 #include "third_party/libyuv/include/libyuv/video_common.h"
21 #include "third_party/webrtc/media/base/videoframe.h" 22 #include "third_party/webrtc/media/base/videoframe.h"
22 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" 23 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
23 24
24 namespace remoting { 25 namespace remoting {
25 namespace protocol { 26 namespace protocol {
26 27
27 namespace { 28 namespace {
28 29
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 video_tracks[0]->RemoveSink(this); 78 video_tracks[0]->RemoveSink(this);
78 } 79 }
79 80
80 void WebrtcVideoRendererAdapter::OnFrame(const cricket::VideoFrame& frame) { 81 void WebrtcVideoRendererAdapter::OnFrame(const cricket::VideoFrame& frame) {
81 if (static_cast<uint64_t>(frame.timestamp_us()) >= rtc::TimeMicros()) { 82 if (static_cast<uint64_t>(frame.timestamp_us()) >= rtc::TimeMicros()) {
82 // The host sets playout delay to 0, so all incoming frames are expected to 83 // The host sets playout delay to 0, so all incoming frames are expected to
83 // be rendered as so as they are received. 84 // be rendered as so as they are received.
84 LOG(WARNING) << "Received frame with playout delay greater than 0."; 85 LOG(WARNING) << "Received frame with playout delay greater than 0.";
85 } 86 }
86 87
88 std::unique_ptr<FrameStats> stats(new FrameStats());
89 // TODO(sergeyu): |time_received| is not reported correctly here because the
90 // frame is already decoded at this point.
91 stats->time_received = base::TimeTicks::Now();
92
87 task_runner_->PostTask( 93 task_runner_->PostTask(
88 FROM_HERE, 94 FROM_HERE,
89 base::Bind(&WebrtcVideoRendererAdapter::HandleFrameOnMainThread, 95 base::Bind(&WebrtcVideoRendererAdapter::HandleFrameOnMainThread,
90 weak_factory_.GetWeakPtr(), 96 weak_factory_.GetWeakPtr(), base::Passed(&stats),
91 scoped_refptr<webrtc::VideoFrameBuffer>( 97 scoped_refptr<webrtc::VideoFrameBuffer>(
92 frame.video_frame_buffer().get()))); 98 frame.video_frame_buffer().get())));
93 } 99 }
94 100
95 void WebrtcVideoRendererAdapter::HandleFrameOnMainThread( 101 void WebrtcVideoRendererAdapter::HandleFrameOnMainThread(
102 std::unique_ptr<FrameStats> stats,
96 scoped_refptr<webrtc::VideoFrameBuffer> frame) { 103 scoped_refptr<webrtc::VideoFrameBuffer> frame) {
97 DCHECK(task_runner_->BelongsToCurrentThread()); 104 DCHECK(task_runner_->BelongsToCurrentThread());
98 105
99 std::unique_ptr<webrtc::DesktopFrame> rgb_frame = 106 std::unique_ptr<webrtc::DesktopFrame> rgb_frame =
100 frame_consumer_->AllocateFrame( 107 frame_consumer_->AllocateFrame(
101 webrtc::DesktopSize(frame->width(), frame->height())); 108 webrtc::DesktopSize(frame->width(), frame->height()));
102 109
103 base::PostTaskAndReplyWithResult( 110 base::PostTaskAndReplyWithResult(
104 base::WorkerPool::GetTaskRunner(false).get(), FROM_HERE, 111 base::WorkerPool::GetTaskRunner(false).get(), FROM_HERE,
105 base::Bind(&ConvertYuvToRgb, base::Passed(&frame), 112 base::Bind(&ConvertYuvToRgb, base::Passed(&frame),
106 base::Passed(&rgb_frame), output_format_fourcc_), 113 base::Passed(&rgb_frame), output_format_fourcc_),
107 base::Bind(&WebrtcVideoRendererAdapter::DrawFrame, 114 base::Bind(&WebrtcVideoRendererAdapter::DrawFrame,
108 weak_factory_.GetWeakPtr())); 115 weak_factory_.GetWeakPtr(), base::Passed(&stats)));
109 } 116 }
110 117
111 void WebrtcVideoRendererAdapter::DrawFrame( 118 void WebrtcVideoRendererAdapter::DrawFrame(
119 std::unique_ptr<FrameStats> stats,
112 std::unique_ptr<webrtc::DesktopFrame> frame) { 120 std::unique_ptr<webrtc::DesktopFrame> frame) {
113 DCHECK(task_runner_->BelongsToCurrentThread()); 121 DCHECK(task_runner_->BelongsToCurrentThread());
114 frame_consumer_->DrawFrame(std::move(frame), base::Closure()); 122 stats->time_decoded = base::TimeTicks::Now();
123 frame_consumer_->DrawFrame(
124 std::move(frame),
125 base::Bind(&WebrtcVideoRendererAdapter::FrameRendered,
126 weak_factory_.GetWeakPtr(), base::Passed(&stats)));
127 }
128
129 void WebrtcVideoRendererAdapter::FrameRendered(
130 std::unique_ptr<FrameStats> stats) {
131 // TODO(sergeyu): Report stats here
115 } 132 }
116 133
117 } // namespace protocol 134 } // namespace protocol
118 } // namespace remoting 135 } // namespace remoting
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