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 |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |