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

Side by Side Diff: webrtc/modules/video_coding/video_receiver.cc

Issue 1428293003: Add VideoCodec::PreferDecodeLate (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebased Created 5 years 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
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 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 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 return VCM_OK; 228 return VCM_OK;
229 } 229 }
230 230
231 int32_t VideoReceiver::RegisterDecoderTimingCallback( 231 int32_t VideoReceiver::RegisterDecoderTimingCallback(
232 VCMDecoderTimingCallback* decoderTiming) { 232 VCMDecoderTimingCallback* decoderTiming) {
233 CriticalSectionScoped cs(process_crit_sect_.get()); 233 CriticalSectionScoped cs(process_crit_sect_.get());
234 _decoderTimingCallback = decoderTiming; 234 _decoderTimingCallback = decoderTiming;
235 return VCM_OK; 235 return VCM_OK;
236 } 236 }
237 237
238 // Register an externally defined decoder/render object. 238 // Register an externally defined decoder object.
239 // Can be a decoder only or a decoder coupled with a renderer.
240 void VideoReceiver::RegisterExternalDecoder(VideoDecoder* externalDecoder, 239 void VideoReceiver::RegisterExternalDecoder(VideoDecoder* externalDecoder,
241 uint8_t payloadType, 240 uint8_t payloadType) {
242 bool internalRenderTiming) {
243 CriticalSectionScoped cs(_receiveCritSect); 241 CriticalSectionScoped cs(_receiveCritSect);
244 if (externalDecoder == NULL) { 242 if (externalDecoder == NULL) {
245 // Make sure the VCM updates the decoder next time it decodes. 243 // Make sure the VCM updates the decoder next time it decodes.
246 _decoder = NULL; 244 _decoder = NULL;
247 RTC_CHECK(_codecDataBase.DeregisterExternalDecoder(payloadType)); 245 RTC_CHECK(_codecDataBase.DeregisterExternalDecoder(payloadType));
248 return; 246 return;
249 } 247 }
250 _codecDataBase.RegisterExternalDecoder(externalDecoder, payloadType, 248 _codecDataBase.RegisterExternalDecoder(externalDecoder, payloadType);
251 internalRenderTiming);
252 } 249 }
253 250
254 // Register a frame type request callback. 251 // Register a frame type request callback.
255 int32_t VideoReceiver::RegisterFrameTypeCallback( 252 int32_t VideoReceiver::RegisterFrameTypeCallback(
256 VCMFrameTypeCallback* frameTypeCallback) { 253 VCMFrameTypeCallback* frameTypeCallback) {
257 CriticalSectionScoped cs(process_crit_sect_.get()); 254 CriticalSectionScoped cs(process_crit_sect_.get());
258 _frameTypeCallback = frameTypeCallback; 255 _frameTypeCallback = frameTypeCallback;
259 return VCM_OK; 256 return VCM_OK;
260 } 257 }
261 258
(...skipping 12 matching lines...) Expand all
274 } 271 }
275 272
276 void VideoReceiver::TriggerDecoderShutdown() { 273 void VideoReceiver::TriggerDecoderShutdown() {
277 _receiver.TriggerDecoderShutdown(); 274 _receiver.TriggerDecoderShutdown();
278 } 275 }
279 276
280 // Decode next frame, blocking. 277 // Decode next frame, blocking.
281 // Should be called as often as possible to get the most out of the decoder. 278 // Should be called as often as possible to get the most out of the decoder.
282 int32_t VideoReceiver::Decode(uint16_t maxWaitTimeMs) { 279 int32_t VideoReceiver::Decode(uint16_t maxWaitTimeMs) {
283 int64_t nextRenderTimeMs; 280 int64_t nextRenderTimeMs;
284 bool supports_render_scheduling; 281 bool prefer_late_decoding = false;
285 { 282 {
286 CriticalSectionScoped cs(_receiveCritSect); 283 CriticalSectionScoped cs(_receiveCritSect);
287 supports_render_scheduling = _codecDataBase.SupportsRenderScheduling(); 284 prefer_late_decoding = _codecDataBase.PrefersLateDecoding();
288 } 285 }
289 286
290 VCMEncodedFrame* frame = _receiver.FrameForDecoding( 287 VCMEncodedFrame* frame = _receiver.FrameForDecoding(
291 maxWaitTimeMs, nextRenderTimeMs, supports_render_scheduling); 288 maxWaitTimeMs, nextRenderTimeMs, prefer_late_decoding);
292 289
293 if (frame == NULL) { 290 if (frame == NULL) {
294 return VCM_FRAME_NOT_READY; 291 return VCM_FRAME_NOT_READY;
295 } else { 292 } else {
296 CriticalSectionScoped cs(_receiveCritSect); 293 CriticalSectionScoped cs(_receiveCritSect);
297 294
298 // If this frame was too late, we should adjust the delay accordingly 295 // If this frame was too late, we should adjust the delay accordingly
299 _timing.UpdateCurrentDelay(frame->RenderTimeMs(), 296 _timing.UpdateCurrentDelay(frame->RenderTimeMs(),
300 clock_->TimeInMilliseconds()); 297 clock_->TimeInMilliseconds());
301 298
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 359
363 // Must be called from inside the receive side critical section. 360 // Must be called from inside the receive side critical section.
364 int32_t VideoReceiver::Decode(const VCMEncodedFrame& frame) { 361 int32_t VideoReceiver::Decode(const VCMEncodedFrame& frame) {
365 TRACE_EVENT_ASYNC_STEP1("webrtc", 362 TRACE_EVENT_ASYNC_STEP1("webrtc",
366 "Video", 363 "Video",
367 frame.TimeStamp(), 364 frame.TimeStamp(),
368 "Decode", 365 "Decode",
369 "type", 366 "type",
370 frame.FrameType()); 367 frame.FrameType());
371 // Change decoder if payload type has changed 368 // Change decoder if payload type has changed
372 const bool renderTimingBefore = _codecDataBase.SupportsRenderScheduling();
373 _decoder = _codecDataBase.GetDecoder(frame, &_decodedFrameCallback); 369 _decoder = _codecDataBase.GetDecoder(frame, &_decodedFrameCallback);
374 if (renderTimingBefore != _codecDataBase.SupportsRenderScheduling()) {
375 // Make sure we reset the decode time estimate since it will
376 // be zero for codecs without render timing.
377 _timing.ResetDecodeTime();
378 }
379 if (_decoder == NULL) { 370 if (_decoder == NULL) {
380 return VCM_NO_CODEC_REGISTERED; 371 return VCM_NO_CODEC_REGISTERED;
381 } 372 }
382 // Decode a frame 373 // Decode a frame
383 int32_t ret = _decoder->Decode(frame, clock_->TimeInMilliseconds()); 374 int32_t ret = _decoder->Decode(frame, clock_->TimeInMilliseconds());
384 375
385 // Check for failed decoding, run frame type request callback if needed. 376 // Check for failed decoding, run frame type request callback if needed.
386 bool request_key_frame = false; 377 bool request_key_frame = false;
387 if (ret < 0) { 378 if (ret < 0) {
388 if (ret == VCM_ERROR_REQUEST_SLI) { 379 if (ret == VCM_ERROR_REQUEST_SLI) {
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 } 558 }
568 559
569 void VideoReceiver::RegisterPreDecodeImageCallback( 560 void VideoReceiver::RegisterPreDecodeImageCallback(
570 EncodedImageCallback* observer) { 561 EncodedImageCallback* observer) {
571 CriticalSectionScoped cs(_receiveCritSect); 562 CriticalSectionScoped cs(_receiveCritSect);
572 pre_decode_image_callback_ = observer; 563 pre_decode_image_callback_ = observer;
573 } 564 }
574 565
575 } // namespace vcm 566 } // namespace vcm
576 } // namespace webrtc 567 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698