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 17 matching lines...) Expand all Loading... |
28 #include "webrtc/modules/video_coding/receiver.h" | 28 #include "webrtc/modules/video_coding/receiver.h" |
29 #include "webrtc/modules/video_coding/timing.h" | 29 #include "webrtc/modules/video_coding/timing.h" |
30 #include "webrtc/rtc_base/onetimeevent.h" | 30 #include "webrtc/rtc_base/onetimeevent.h" |
31 #include "webrtc/rtc_base/sequenced_task_checker.h" | 31 #include "webrtc/rtc_base/sequenced_task_checker.h" |
32 #include "webrtc/rtc_base/thread_annotations.h" | 32 #include "webrtc/rtc_base/thread_annotations.h" |
33 #include "webrtc/rtc_base/thread_checker.h" | 33 #include "webrtc/rtc_base/thread_checker.h" |
34 #include "webrtc/system_wrappers/include/clock.h" | 34 #include "webrtc/system_wrappers/include/clock.h" |
35 | 35 |
36 namespace webrtc { | 36 namespace webrtc { |
37 | 37 |
| 38 class ProcessThread; |
38 class VideoBitrateAllocator; | 39 class VideoBitrateAllocator; |
39 class VideoBitrateAllocationObserver; | 40 class VideoBitrateAllocationObserver; |
40 | 41 |
41 namespace vcm { | 42 namespace vcm { |
42 | 43 |
43 class VCMProcessTimer { | 44 class VCMProcessTimer { |
44 public: | 45 public: |
45 static const int64_t kDefaultProcessIntervalMs = 1000; | 46 static const int64_t kDefaultProcessIntervalMs = 1000; |
46 | 47 |
47 VCMProcessTimer(int64_t periodMs, Clock* clock) | 48 VCMProcessTimer(int64_t periodMs, Clock* clock) |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 }; | 144 }; |
144 | 145 |
145 class VideoReceiver : public Module { | 146 class VideoReceiver : public Module { |
146 public: | 147 public: |
147 VideoReceiver(Clock* clock, | 148 VideoReceiver(Clock* clock, |
148 EventFactory* event_factory, | 149 EventFactory* event_factory, |
149 EncodedImageCallback* pre_decode_image_callback, | 150 EncodedImageCallback* pre_decode_image_callback, |
150 VCMTiming* timing, | 151 VCMTiming* timing, |
151 NackSender* nack_sender = nullptr, | 152 NackSender* nack_sender = nullptr, |
152 KeyFrameRequestSender* keyframe_request_sender = nullptr); | 153 KeyFrameRequestSender* keyframe_request_sender = nullptr); |
153 ~VideoReceiver(); | 154 ~VideoReceiver() override; |
154 | 155 |
155 int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec, | 156 int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec, |
156 int32_t numberOfCores, | 157 int32_t numberOfCores, |
157 bool requireKeyFrame); | 158 bool requireKeyFrame); |
158 | 159 |
159 void RegisterExternalDecoder(VideoDecoder* externalDecoder, | 160 void RegisterExternalDecoder(VideoDecoder* externalDecoder, |
160 uint8_t payloadType); | 161 uint8_t payloadType); |
161 int32_t RegisterReceiveCallback(VCMReceiveCallback* receiveCallback); | 162 int32_t RegisterReceiveCallback(VCMReceiveCallback* receiveCallback); |
162 int32_t RegisterReceiveStatisticsCallback( | 163 int32_t RegisterReceiveStatisticsCallback( |
163 VCMReceiveStatisticsCallback* receiveStats); | 164 VCMReceiveStatisticsCallback* receiveStats); |
164 int32_t RegisterFrameTypeCallback(VCMFrameTypeCallback* frameTypeCallback); | 165 int32_t RegisterFrameTypeCallback(VCMFrameTypeCallback* frameTypeCallback); |
165 int32_t RegisterPacketRequestCallback(VCMPacketRequestCallback* callback); | 166 int32_t RegisterPacketRequestCallback(VCMPacketRequestCallback* callback); |
166 | 167 |
167 int32_t Decode(uint16_t maxWaitTimeMs); | 168 int32_t Decode(uint16_t maxWaitTimeMs); |
168 | 169 |
169 int32_t Decode(const webrtc::VCMEncodedFrame* frame); | 170 int32_t Decode(const webrtc::VCMEncodedFrame* frame); |
170 | 171 |
171 // Called on the decoder thread when thread is exiting. | 172 #if defined(WEBRTC_ANDROID) |
172 void DecodingStopped(); | 173 // See https://bugs.chromium.org/p/webrtc/issues/detail?id=7361 |
| 174 void PollDecodedFrames(); |
| 175 #endif |
173 | 176 |
174 int32_t IncomingPacket(const uint8_t* incomingPayload, | 177 int32_t IncomingPacket(const uint8_t* incomingPayload, |
175 size_t payloadLength, | 178 size_t payloadLength, |
176 const WebRtcRTPHeader& rtpInfo); | 179 const WebRtcRTPHeader& rtpInfo); |
177 int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs); | 180 int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs); |
178 int32_t SetRenderDelay(uint32_t timeMS); | 181 int32_t SetRenderDelay(uint32_t timeMS); |
179 int32_t Delay() const; | 182 int32_t Delay() const; |
180 | 183 |
181 // DEPRECATED. | 184 // DEPRECATED. |
182 int SetReceiverRobustnessMode( | 185 int SetReceiverRobustnessMode( |
183 VideoCodingModule::ReceiverRobustness robustnessMode, | 186 VideoCodingModule::ReceiverRobustness robustnessMode, |
184 VCMDecodeErrorMode errorMode); | 187 VCMDecodeErrorMode errorMode); |
185 | 188 |
186 void SetNackSettings(size_t max_nack_list_size, | 189 void SetNackSettings(size_t max_nack_list_size, |
187 int max_packet_age_to_nack, | 190 int max_packet_age_to_nack, |
188 int max_incomplete_time_ms); | 191 int max_incomplete_time_ms); |
189 | 192 |
190 void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode); | 193 void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode); |
191 int SetMinReceiverDelay(int desired_delay_ms); | 194 int SetMinReceiverDelay(int desired_delay_ms); |
192 | 195 |
193 int32_t SetReceiveChannelParameters(int64_t rtt); | 196 int32_t SetReceiveChannelParameters(int64_t rtt); |
194 int32_t SetVideoProtection(VCMVideoProtection videoProtection, bool enable); | 197 int32_t SetVideoProtection(VCMVideoProtection videoProtection, bool enable); |
195 | 198 |
196 int64_t TimeUntilNextProcess() override; | 199 int64_t TimeUntilNextProcess() override; |
197 void Process() override; | 200 void Process() override; |
| 201 void ProcessThreadAttached(ProcessThread* process_thread) override; |
198 | 202 |
199 void TriggerDecoderShutdown(); | 203 void TriggerDecoderShutdown(); |
| 204 void DecoderThreadStarting(); |
| 205 void DecoderThreadStopped(); |
200 | 206 |
201 protected: | 207 protected: |
202 int32_t Decode(const webrtc::VCMEncodedFrame& frame) | 208 int32_t Decode(const webrtc::VCMEncodedFrame& frame); |
203 EXCLUSIVE_LOCKS_REQUIRED(receive_crit_); | |
204 int32_t RequestKeyFrame(); | 209 int32_t RequestKeyFrame(); |
205 | 210 |
206 private: | 211 private: |
| 212 // Used for DCHECKing thread correctness. |
| 213 // In build where DCHECKs are enabled, will return false before |
| 214 // DecoderThreadStarting is called, then true until DecoderThreadStopped |
| 215 // is called. |
| 216 // In builds where DCHECKs aren't enabled, it will return true. |
| 217 bool IsDecoderThreadRunning(); |
| 218 |
207 rtc::ThreadChecker construction_thread_; | 219 rtc::ThreadChecker construction_thread_; |
| 220 rtc::ThreadChecker decoder_thread_; |
| 221 rtc::ThreadChecker module_thread_; |
208 Clock* const clock_; | 222 Clock* const clock_; |
209 rtc::CriticalSection process_crit_; | 223 rtc::CriticalSection process_crit_; |
210 rtc::CriticalSection receive_crit_; | |
211 VCMTiming* _timing; | 224 VCMTiming* _timing; |
212 VCMReceiver _receiver; | 225 VCMReceiver _receiver; |
213 VCMDecodedFrameCallback _decodedFrameCallback; | 226 VCMDecodedFrameCallback _decodedFrameCallback; |
214 VCMFrameTypeCallback* _frameTypeCallback GUARDED_BY(process_crit_); | |
215 VCMReceiveStatisticsCallback* _receiveStatsCallback GUARDED_BY(process_crit_); | |
216 VCMPacketRequestCallback* _packetRequestCallback GUARDED_BY(process_crit_); | |
217 | 227 |
218 VCMFrameBuffer _frameFromFile; | 228 // These callbacks are set on the construction thread before being attached |
| 229 // to the module thread or decoding started, so a lock is not required. |
| 230 VCMFrameTypeCallback* _frameTypeCallback; |
| 231 VCMReceiveStatisticsCallback* _receiveStatsCallback; |
| 232 VCMPacketRequestCallback* _packetRequestCallback; |
| 233 |
| 234 // Used on both the module and decoder thread. |
219 bool _scheduleKeyRequest GUARDED_BY(process_crit_); | 235 bool _scheduleKeyRequest GUARDED_BY(process_crit_); |
220 bool drop_frames_until_keyframe_ GUARDED_BY(process_crit_); | 236 bool drop_frames_until_keyframe_ GUARDED_BY(process_crit_); |
221 size_t max_nack_list_size_ GUARDED_BY(process_crit_); | |
222 | 237 |
223 VCMCodecDataBase _codecDataBase GUARDED_BY(receive_crit_); | 238 // Modified on the construction thread while not attached to the process |
224 EncodedImageCallback* pre_decode_image_callback_; | 239 // thread. Once attached to the process thread, its value is only read |
| 240 // so a lock is not required. |
| 241 size_t max_nack_list_size_; |
225 | 242 |
226 VCMProcessTimer _receiveStatsTimer; | 243 // Callbacks are set before the decoder thread starts. |
227 VCMProcessTimer _retransmissionTimer; | 244 // Once the decoder thread has been started, usage of |_codecDataBase| moves |
228 VCMProcessTimer _keyRequestTimer; | 245 // over to the decoder thread. |
229 QpParser qp_parser_; | 246 VCMCodecDataBase _codecDataBase; |
230 ThreadUnsafeOneTimeEvent first_frame_received_; | 247 EncodedImageCallback* const pre_decode_image_callback_; |
| 248 |
| 249 VCMProcessTimer _receiveStatsTimer ACCESS_ON(module_thread_); |
| 250 VCMProcessTimer _retransmissionTimer ACCESS_ON(module_thread_); |
| 251 VCMProcessTimer _keyRequestTimer ACCESS_ON(module_thread_); |
| 252 QpParser qp_parser_ ACCESS_ON(decoder_thread_); |
| 253 ThreadUnsafeOneTimeEvent first_frame_received_ ACCESS_ON(decoder_thread_); |
| 254 // Modified on the construction thread. Can be read without a lock and assumed |
| 255 // to be non-null on the module and decoder threads. |
| 256 ProcessThread* process_thread_ = nullptr; |
| 257 bool is_attached_to_process_thread_ ACCESS_ON(construction_thread_) = false; |
| 258 #if RTC_DCHECK_IS_ON |
| 259 bool decoder_thread_is_running_ = false; |
| 260 #endif |
231 }; | 261 }; |
232 | 262 |
233 } // namespace vcm | 263 } // namespace vcm |
234 } // namespace webrtc | 264 } // namespace webrtc |
235 #endif // WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_ | 265 #endif // WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_ |
OLD | NEW |