OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 25 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" |
26 #include "webrtc/common_video/video_render_frames.h" | 26 #include "webrtc/common_video/video_render_frames.h" |
27 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 27 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
28 #include "webrtc/system_wrappers/include/event_wrapper.h" | 28 #include "webrtc/system_wrappers/include/event_wrapper.h" |
29 #include "webrtc/system_wrappers/include/tick_util.h" | 29 #include "webrtc/system_wrappers/include/tick_util.h" |
30 #include "webrtc/system_wrappers/include/trace.h" | 30 #include "webrtc/system_wrappers/include/trace.h" |
31 #include "webrtc/video_renderer.h" | 31 #include "webrtc/video_renderer.h" |
32 | 32 |
33 namespace webrtc { | 33 namespace webrtc { |
34 | 34 |
35 IncomingVideoStream::IncomingVideoStream(uint32_t stream_id, | 35 IncomingVideoStream::IncomingVideoStream(bool disable_prerenderer_smoothing) |
36 bool disable_prerenderer_smoothing) | 36 : disable_prerenderer_smoothing_(disable_prerenderer_smoothing), |
37 : stream_id_(stream_id), | |
38 disable_prerenderer_smoothing_(disable_prerenderer_smoothing), | |
39 incoming_render_thread_(), | 37 incoming_render_thread_(), |
40 deliver_buffer_event_(EventTimerWrapper::Create()), | 38 deliver_buffer_event_(EventTimerWrapper::Create()), |
41 running_(false), | 39 running_(false), |
42 external_callback_(nullptr), | 40 external_callback_(nullptr), |
43 render_callback_(nullptr), | 41 render_callback_(nullptr), |
44 render_buffers_(new VideoRenderFrames()), | 42 render_buffers_(new VideoRenderFrames()), |
45 incoming_rate_(0), | 43 incoming_rate_(0), |
46 last_rate_calculation_time_ms_(0), | 44 last_rate_calculation_time_ms_(0), |
47 num_frames_since_last_calculation_(0), | 45 num_frames_since_last_calculation_(0), |
48 last_render_time_ms_(0), | 46 last_render_time_ms_(0), |
49 temp_frame_(), | 47 temp_frame_(), |
50 start_image_(), | 48 start_image_(), |
51 timeout_image_(), | 49 timeout_image_(), |
52 timeout_time_() {} | 50 timeout_time_() {} |
53 | 51 |
54 IncomingVideoStream::~IncomingVideoStream() { | 52 IncomingVideoStream::~IncomingVideoStream() { |
55 Stop(); | 53 Stop(); |
56 } | 54 } |
57 | 55 |
58 VideoRenderCallback* IncomingVideoStream::ModuleCallback() { | 56 rtc::VideoSinkInterface<VideoFrame>* IncomingVideoStream::ModuleCallback() { |
59 return this; | 57 return this; |
60 } | 58 } |
61 | 59 |
62 int32_t IncomingVideoStream::RenderFrame(const uint32_t stream_id, | 60 void IncomingVideoStream::OnFrame(const VideoFrame& video_frame) { |
63 const VideoFrame& video_frame) { | |
64 rtc::CritScope csS(&stream_critsect_); | 61 rtc::CritScope csS(&stream_critsect_); |
65 | 62 |
66 if (!running_) { | 63 if (!running_) { |
67 return -1; | 64 return; |
68 } | 65 } |
69 | 66 |
70 // Rate statistics. | 67 // Rate statistics. |
71 num_frames_since_last_calculation_++; | 68 num_frames_since_last_calculation_++; |
72 int64_t now_ms = TickTime::MillisecondTimestamp(); | 69 int64_t now_ms = TickTime::MillisecondTimestamp(); |
73 if (now_ms >= last_rate_calculation_time_ms_ + kFrameRatePeriodMs) { | 70 if (now_ms >= last_rate_calculation_time_ms_ + kFrameRatePeriodMs) { |
74 incoming_rate_ = | 71 incoming_rate_ = |
75 static_cast<uint32_t>(1000 * num_frames_since_last_calculation_ / | 72 static_cast<uint32_t>(1000 * num_frames_since_last_calculation_ / |
76 (now_ms - last_rate_calculation_time_ms_)); | 73 (now_ms - last_rate_calculation_time_ms_)); |
77 num_frames_since_last_calculation_ = 0; | 74 num_frames_since_last_calculation_ = 0; |
78 last_rate_calculation_time_ms_ = now_ms; | 75 last_rate_calculation_time_ms_ = now_ms; |
79 } | 76 } |
80 | 77 |
81 // Hand over or insert frame. | 78 // Hand over or insert frame. |
82 if (disable_prerenderer_smoothing_) { | 79 if (disable_prerenderer_smoothing_) { |
83 DeliverFrame(video_frame); | 80 DeliverFrame(video_frame); |
84 } else { | 81 } else { |
85 rtc::CritScope csB(&buffer_critsect_); | 82 rtc::CritScope csB(&buffer_critsect_); |
86 if (render_buffers_->AddFrame(video_frame) == 1) { | 83 if (render_buffers_->AddFrame(video_frame) == 1) { |
87 deliver_buffer_event_->Set(); | 84 deliver_buffer_event_->Set(); |
88 } | 85 } |
89 } | 86 } |
90 return 0; | |
91 } | 87 } |
92 | 88 |
93 void IncomingVideoStream::SetStartImage(const VideoFrame& video_frame) { | 89 void IncomingVideoStream::SetStartImage(const VideoFrame& video_frame) { |
94 rtc::CritScope csS(&thread_critsect_); | 90 rtc::CritScope csS(&thread_critsect_); |
95 start_image_.CopyFrame(video_frame); | 91 start_image_.CopyFrame(video_frame); |
96 } | 92 } |
97 | 93 |
98 void IncomingVideoStream::SetTimeoutImage(const VideoFrame& video_frame, | 94 void IncomingVideoStream::SetTimeoutImage(const VideoFrame& video_frame, |
99 const uint32_t timeout) { | 95 const uint32_t timeout) { |
100 rtc::CritScope csS(&thread_critsect_); | 96 rtc::CritScope csS(&thread_critsect_); |
101 timeout_time_ = timeout; | 97 timeout_time_ = timeout; |
102 timeout_image_.CopyFrame(video_frame); | 98 timeout_image_.CopyFrame(video_frame); |
103 } | 99 } |
104 | 100 |
105 void IncomingVideoStream::SetRenderCallback( | 101 void IncomingVideoStream::SetRenderCallback( |
106 VideoRenderCallback* render_callback) { | 102 rtc::VideoSinkInterface<VideoFrame>* render_callback) { |
107 rtc::CritScope cs(&thread_critsect_); | 103 rtc::CritScope cs(&thread_critsect_); |
108 render_callback_ = render_callback; | 104 render_callback_ = render_callback; |
109 } | 105 } |
110 | 106 |
111 int32_t IncomingVideoStream::SetExpectedRenderDelay( | 107 int32_t IncomingVideoStream::SetExpectedRenderDelay( |
112 int32_t delay_ms) { | 108 int32_t delay_ms) { |
113 rtc::CritScope csS(&stream_critsect_); | 109 rtc::CritScope csS(&stream_critsect_); |
114 if (running_) { | 110 if (running_) { |
115 return -1; | 111 return -1; |
116 } | 112 } |
117 rtc::CritScope cs(&buffer_critsect_); | 113 rtc::CritScope cs(&buffer_critsect_); |
118 return render_buffers_->SetRenderDelay(delay_ms); | 114 return render_buffers_->SetRenderDelay(delay_ms); |
119 } | 115 } |
120 | 116 |
121 void IncomingVideoStream::SetExternalCallback( | 117 void IncomingVideoStream::SetExternalCallback( |
122 VideoRenderCallback* external_callback) { | 118 rtc::VideoSinkInterface<VideoFrame>* external_callback) { |
123 rtc::CritScope cs(&thread_critsect_); | 119 rtc::CritScope cs(&thread_critsect_); |
124 external_callback_ = external_callback; | 120 external_callback_ = external_callback; |
125 } | 121 } |
126 | 122 |
127 int32_t IncomingVideoStream::Start() { | 123 int32_t IncomingVideoStream::Start() { |
128 rtc::CritScope csS(&stream_critsect_); | 124 rtc::CritScope csS(&stream_critsect_); |
129 if (running_) { | 125 if (running_) { |
130 return 0; | 126 return 0; |
131 } | 127 } |
132 | 128 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 running_ = false; | 172 running_ = false; |
177 return 0; | 173 return 0; |
178 } | 174 } |
179 | 175 |
180 int32_t IncomingVideoStream::Reset() { | 176 int32_t IncomingVideoStream::Reset() { |
181 rtc::CritScope cs_buffer(&buffer_critsect_); | 177 rtc::CritScope cs_buffer(&buffer_critsect_); |
182 render_buffers_->ReleaseAllFrames(); | 178 render_buffers_->ReleaseAllFrames(); |
183 return 0; | 179 return 0; |
184 } | 180 } |
185 | 181 |
186 uint32_t IncomingVideoStream::StreamId() const { | |
187 return stream_id_; | |
188 } | |
189 | |
190 uint32_t IncomingVideoStream::IncomingRate() const { | 182 uint32_t IncomingVideoStream::IncomingRate() const { |
191 rtc::CritScope cs(&stream_critsect_); | 183 rtc::CritScope cs(&stream_critsect_); |
192 return incoming_rate_; | 184 return incoming_rate_; |
193 } | 185 } |
194 | 186 |
195 bool IncomingVideoStream::IncomingVideoStreamThreadFun(void* obj) { | 187 bool IncomingVideoStream::IncomingVideoStreamThreadFun(void* obj) { |
196 return static_cast<IncomingVideoStream*>(obj)->IncomingVideoStreamProcess(); | 188 return static_cast<IncomingVideoStream*>(obj)->IncomingVideoStreamProcess(); |
197 } | 189 } |
198 | 190 |
199 bool IncomingVideoStream::IncomingVideoStreamProcess() { | 191 bool IncomingVideoStream::IncomingVideoStreamProcess() { |
(...skipping 24 matching lines...) Expand all Loading... |
224 return true; | 216 return true; |
225 } | 217 } |
226 | 218 |
227 void IncomingVideoStream::DeliverFrame(const VideoFrame& video_frame) { | 219 void IncomingVideoStream::DeliverFrame(const VideoFrame& video_frame) { |
228 rtc::CritScope cs(&thread_critsect_); | 220 rtc::CritScope cs(&thread_critsect_); |
229 if (video_frame.IsZeroSize()) { | 221 if (video_frame.IsZeroSize()) { |
230 if (render_callback_) { | 222 if (render_callback_) { |
231 if (last_render_time_ms_ == 0 && !start_image_.IsZeroSize()) { | 223 if (last_render_time_ms_ == 0 && !start_image_.IsZeroSize()) { |
232 // We have not rendered anything and have a start image. | 224 // We have not rendered anything and have a start image. |
233 temp_frame_.CopyFrame(start_image_); | 225 temp_frame_.CopyFrame(start_image_); |
234 render_callback_->RenderFrame(stream_id_, temp_frame_); | 226 render_callback_->OnFrame(temp_frame_); |
235 } else if (!timeout_image_.IsZeroSize() && | 227 } else if (!timeout_image_.IsZeroSize() && |
236 last_render_time_ms_ + timeout_time_ < | 228 last_render_time_ms_ + timeout_time_ < |
237 TickTime::MillisecondTimestamp()) { | 229 TickTime::MillisecondTimestamp()) { |
238 // Render a timeout image. | 230 // Render a timeout image. |
239 temp_frame_.CopyFrame(timeout_image_); | 231 temp_frame_.CopyFrame(timeout_image_); |
240 render_callback_->RenderFrame(stream_id_, temp_frame_); | 232 render_callback_->OnFrame(temp_frame_); |
241 } | 233 } |
242 } | 234 } |
243 | 235 |
244 // No frame. | 236 // No frame. |
245 return; | 237 return; |
246 } | 238 } |
247 | 239 |
248 // Send frame for rendering. | 240 // Send frame for rendering. |
249 if (external_callback_) { | 241 if (external_callback_) { |
250 external_callback_->RenderFrame(stream_id_, video_frame); | 242 external_callback_->OnFrame(video_frame); |
251 } else if (render_callback_) { | 243 } else if (render_callback_) { |
252 render_callback_->RenderFrame(stream_id_, video_frame); | 244 render_callback_->OnFrame(video_frame); |
253 } | 245 } |
254 | 246 |
255 // We're done with this frame. | 247 // We're done with this frame. |
256 last_render_time_ms_ = video_frame.render_time_ms(); | 248 last_render_time_ms_ = video_frame.render_time_ms(); |
257 } | 249 } |
258 | 250 |
259 } // namespace webrtc | 251 } // namespace webrtc |
OLD | NEW |