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

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

Issue 2744013002: Updates to VCMDecodedFrameCallback, VideoReceiver and a few related classes/tests. (Closed)
Patch Set: Update DCHECKs Created 3 years, 9 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 | « no previous file | webrtc/modules/video_coding/generic_decoder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
11 #include "webrtc/modules/video_coding/codec_database.h" 11 #include "webrtc/modules/video_coding/codec_database.h"
12 12
13 #include <assert.h>
14
15 #include "webrtc/base/checks.h" 13 #include "webrtc/base/checks.h"
16 #include "webrtc/base/logging.h" 14 #include "webrtc/base/logging.h"
17 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" 15 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
18 #include "webrtc/modules/video_coding/codecs/i420/include/i420.h" 16 #include "webrtc/modules/video_coding/codecs/i420/include/i420.h"
19 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" 17 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
20 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" 18 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
21 #include "webrtc/modules/video_coding/internal_defines.h" 19 #include "webrtc/modules/video_coding/internal_defines.h"
22 20
23 namespace { 21 namespace {
24 const size_t kDefaultPayloadSize = 1440; 22 const size_t kDefaultPayloadSize = 1440;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 70
73 return h264_settings; 71 return h264_settings;
74 } 72 }
75 73
76 VCMDecoderMapItem::VCMDecoderMapItem(VideoCodec* settings, 74 VCMDecoderMapItem::VCMDecoderMapItem(VideoCodec* settings,
77 int number_of_cores, 75 int number_of_cores,
78 bool require_key_frame) 76 bool require_key_frame)
79 : settings(settings), 77 : settings(settings),
80 number_of_cores(number_of_cores), 78 number_of_cores(number_of_cores),
81 require_key_frame(require_key_frame) { 79 require_key_frame(require_key_frame) {
82 assert(number_of_cores >= 0); 80 RTC_DCHECK_GE(number_of_cores, 0);
83 } 81 }
84 82
85 VCMExtDecoderMapItem::VCMExtDecoderMapItem( 83 VCMExtDecoderMapItem::VCMExtDecoderMapItem(
86 VideoDecoder* external_decoder_instance, 84 VideoDecoder* external_decoder_instance,
87 uint8_t payload_type) 85 uint8_t payload_type)
88 : payload_type(payload_type), 86 : payload_type(payload_type),
89 external_decoder_instance(external_decoder_instance) {} 87 external_decoder_instance(external_decoder_instance) {}
90 88
91 VCMCodecDataBase::VCMCodecDataBase( 89 VCMCodecDataBase::VCMCodecDataBase(
92 VCMEncodedFrameCallback* encoded_frame_callback) 90 VCMEncodedFrameCallback* encoded_frame_callback)
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 271
274 VideoCodecType VCMCodecDataBase::SendCodec() const { 272 VideoCodecType VCMCodecDataBase::SendCodec() const {
275 if (!ptr_encoder_) { 273 if (!ptr_encoder_) {
276 return kVideoCodecUnknown; 274 return kVideoCodecUnknown;
277 } 275 }
278 return send_codec_.codecType; 276 return send_codec_.codecType;
279 } 277 }
280 278
281 bool VCMCodecDataBase::DeregisterExternalEncoder(uint8_t payload_type, 279 bool VCMCodecDataBase::DeregisterExternalEncoder(uint8_t payload_type,
282 bool* was_send_codec) { 280 bool* was_send_codec) {
283 assert(was_send_codec); 281 RTC_DCHECK(was_send_codec);
284 *was_send_codec = false; 282 *was_send_codec = false;
285 if (encoder_payload_type_ != payload_type) { 283 if (encoder_payload_type_ != payload_type) {
286 return false; 284 return false;
287 } 285 }
288 if (send_codec_.plType == payload_type) { 286 if (send_codec_.plType == payload_type) {
289 // De-register as send codec if needed. 287 // De-register as send codec if needed.
290 DeleteEncoder(); 288 DeleteEncoder();
291 memset(&send_codec_, 0, sizeof(VideoCodec)); 289 memset(&send_codec_, 0, sizeof(VideoCodec));
292 *was_send_codec = true; 290 *was_send_codec = true;
293 } 291 }
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 delete it->second; 443 delete it->second;
446 dec_map_.erase(it); 444 dec_map_.erase(it);
447 if (receive_codec_.plType == payload_type) { 445 if (receive_codec_.plType == payload_type) {
448 // This codec is currently in use. 446 // This codec is currently in use.
449 memset(&receive_codec_, 0, sizeof(VideoCodec)); 447 memset(&receive_codec_, 0, sizeof(VideoCodec));
450 } 448 }
451 return true; 449 return true;
452 } 450 }
453 451
454 bool VCMCodecDataBase::ReceiveCodec(VideoCodec* current_receive_codec) const { 452 bool VCMCodecDataBase::ReceiveCodec(VideoCodec* current_receive_codec) const {
455 assert(current_receive_codec); 453 RTC_DCHECK(current_receive_codec);
456 if (!ptr_decoder_) { 454 if (!ptr_decoder_) {
457 return false; 455 return false;
458 } 456 }
459 memcpy(current_receive_codec, &receive_codec_, sizeof(VideoCodec)); 457 memcpy(current_receive_codec, &receive_codec_, sizeof(VideoCodec));
460 return true; 458 return true;
461 } 459 }
462 460
463 VideoCodecType VCMCodecDataBase::ReceiveCodec() const { 461 VideoCodecType VCMCodecDataBase::ReceiveCodec() const {
464 if (!ptr_decoder_) { 462 if (!ptr_decoder_) {
465 return kVideoCodecUnknown; 463 return kVideoCodecUnknown;
466 } 464 }
467 return receive_codec_.codecType; 465 return receive_codec_.codecType;
468 } 466 }
469 467
470 VCMGenericDecoder* VCMCodecDataBase::GetDecoder( 468 VCMGenericDecoder* VCMCodecDataBase::GetDecoder(
471 const VCMEncodedFrame& frame, 469 const VCMEncodedFrame& frame,
472 VCMDecodedFrameCallback* decoded_frame_callback) { 470 VCMDecodedFrameCallback* decoded_frame_callback) {
471 RTC_DCHECK(decoded_frame_callback->UserReceiveCallback());
473 uint8_t payload_type = frame.PayloadType(); 472 uint8_t payload_type = frame.PayloadType();
474 if (payload_type == receive_codec_.plType || payload_type == 0) { 473 if (payload_type == receive_codec_.plType || payload_type == 0) {
475 return ptr_decoder_; 474 return ptr_decoder_;
476 } 475 }
477 // Check for exisitng decoder, if exists - delete. 476 // Check for exisitng decoder, if exists - delete.
478 if (ptr_decoder_) { 477 if (ptr_decoder_) {
479 ReleaseDecoder(ptr_decoder_); 478 ReleaseDecoder(ptr_decoder_);
480 ptr_decoder_ = nullptr; 479 ptr_decoder_ = nullptr;
481 memset(&receive_codec_, 0, sizeof(VideoCodec)); 480 memset(&receive_codec_, 0, sizeof(VideoCodec));
482 } 481 }
483 ptr_decoder_ = CreateAndInitDecoder(frame, &receive_codec_); 482 ptr_decoder_ = CreateAndInitDecoder(frame, &receive_codec_);
484 if (!ptr_decoder_) { 483 if (!ptr_decoder_) {
485 return nullptr; 484 return nullptr;
486 } 485 }
487 VCMReceiveCallback* callback = decoded_frame_callback->UserReceiveCallback(); 486 VCMReceiveCallback* callback = decoded_frame_callback->UserReceiveCallback();
488 if (callback) 487 callback->OnIncomingPayloadType(receive_codec_.plType);
489 callback->OnIncomingPayloadType(receive_codec_.plType);
490 if (ptr_decoder_->RegisterDecodeCompleteCallback(decoded_frame_callback) < 488 if (ptr_decoder_->RegisterDecodeCompleteCallback(decoded_frame_callback) <
491 0) { 489 0) {
492 ReleaseDecoder(ptr_decoder_); 490 ReleaseDecoder(ptr_decoder_);
493 ptr_decoder_ = nullptr; 491 ptr_decoder_ = nullptr;
494 memset(&receive_codec_, 0, sizeof(VideoCodec)); 492 memset(&receive_codec_, 0, sizeof(VideoCodec));
495 return nullptr; 493 return nullptr;
496 } 494 }
497 return ptr_decoder_; 495 return ptr_decoder_;
498 } 496 }
499 497
500 void VCMCodecDataBase::ReleaseDecoder(VCMGenericDecoder* decoder) const { 498 void VCMCodecDataBase::ReleaseDecoder(VCMGenericDecoder* decoder) const {
501 if (decoder) { 499 if (decoder) {
502 assert(decoder->_decoder); 500 RTC_DCHECK(decoder->_decoder);
503 decoder->Release(); 501 decoder->Release();
504 if (!decoder->External()) { 502 if (!decoder->External()) {
505 delete decoder->_decoder; 503 delete decoder->_decoder;
506 } 504 }
507 delete decoder; 505 delete decoder;
508 } 506 }
509 } 507 }
510 508
511 bool VCMCodecDataBase::PrefersLateDecoding() const { 509 bool VCMCodecDataBase::PrefersLateDecoding() const {
512 if (!ptr_decoder_) 510 if (!ptr_decoder_)
513 return true; 511 return true;
514 return ptr_decoder_->PrefersLateDecoding(); 512 return ptr_decoder_->PrefersLateDecoding();
515 } 513 }
516 514
517 bool VCMCodecDataBase::MatchesCurrentResolution(int width, int height) const { 515 bool VCMCodecDataBase::MatchesCurrentResolution(int width, int height) const {
518 return send_codec_.width == width && send_codec_.height == height; 516 return send_codec_.width == width && send_codec_.height == height;
519 } 517 }
520 518
521 VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder( 519 VCMGenericDecoder* VCMCodecDataBase::CreateAndInitDecoder(
522 const VCMEncodedFrame& frame, 520 const VCMEncodedFrame& frame,
523 VideoCodec* new_codec) const { 521 VideoCodec* new_codec) const {
524 uint8_t payload_type = frame.PayloadType(); 522 uint8_t payload_type = frame.PayloadType();
525 LOG(LS_INFO) << "Initializing decoder with payload type '" 523 LOG(LS_INFO) << "Initializing decoder with payload type '"
526 << static_cast<int>(payload_type) << "'."; 524 << static_cast<int>(payload_type) << "'.";
527 assert(new_codec); 525 RTC_DCHECK(new_codec);
528 const VCMDecoderMapItem* decoder_item = FindDecoderItem(payload_type); 526 const VCMDecoderMapItem* decoder_item = FindDecoderItem(payload_type);
529 if (!decoder_item) { 527 if (!decoder_item) {
530 LOG(LS_ERROR) << "Can't find a decoder associated with payload type: " 528 LOG(LS_ERROR) << "Can't find a decoder associated with payload type: "
531 << static_cast<int>(payload_type); 529 << static_cast<int>(payload_type);
532 return nullptr; 530 return nullptr;
533 } 531 }
534 VCMGenericDecoder* ptr_decoder = nullptr; 532 VCMGenericDecoder* ptr_decoder = nullptr;
535 const VCMExtDecoderMapItem* external_dec_item = 533 const VCMExtDecoderMapItem* external_dec_item =
536 FindExternalDecoderItem(payload_type); 534 FindExternalDecoderItem(payload_type);
537 if (external_dec_item) { 535 if (external_dec_item) {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 599
602 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( 600 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem(
603 uint8_t payload_type) const { 601 uint8_t payload_type) const {
604 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type); 602 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type);
605 if (it != dec_external_map_.end()) { 603 if (it != dec_external_map_.end()) {
606 return (*it).second; 604 return (*it).second;
607 } 605 }
608 return nullptr; 606 return nullptr;
609 } 607 }
610 } // namespace webrtc 608 } // namespace webrtc
OLDNEW
« no previous file with comments | « no previous file | webrtc/modules/video_coding/generic_decoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698