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

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

Issue 1394823002: Remove internal encoders from VCMCodecDatabase. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: scoped_ptr Created 5 years, 2 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
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
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 external_decoder_instance(external_decoder_instance), 99 external_decoder_instance(external_decoder_instance),
100 internal_render_timing(internal_render_timing) { 100 internal_render_timing(internal_render_timing) {
101 } 101 }
102 102
103 VCMCodecDataBase::VCMCodecDataBase( 103 VCMCodecDataBase::VCMCodecDataBase(
104 VideoEncoderRateObserver* encoder_rate_observer) 104 VideoEncoderRateObserver* encoder_rate_observer)
105 : number_of_cores_(0), 105 : number_of_cores_(0),
106 max_payload_size_(kDefaultPayloadSize), 106 max_payload_size_(kDefaultPayloadSize),
107 periodic_key_frames_(false), 107 periodic_key_frames_(false),
108 pending_encoder_reset_(true), 108 pending_encoder_reset_(true),
109 current_enc_is_external_(false),
110 send_codec_(), 109 send_codec_(),
111 receive_codec_(), 110 receive_codec_(),
112 external_payload_type_(0), 111 encoder_payload_type_(0),
113 external_encoder_(NULL), 112 external_encoder_(NULL),
114 internal_source_(false), 113 internal_source_(false),
115 encoder_rate_observer_(encoder_rate_observer), 114 encoder_rate_observer_(encoder_rate_observer),
116 ptr_encoder_(NULL),
117 ptr_decoder_(NULL), 115 ptr_decoder_(NULL),
118 dec_map_(), 116 dec_map_(),
119 dec_external_map_() { 117 dec_external_map_() {
120 } 118 }
121 119
122 VCMCodecDataBase::~VCMCodecDataBase() { 120 VCMCodecDataBase::~VCMCodecDataBase() {
123 ResetSender(); 121 ResetSender();
124 ResetReceiver(); 122 ResetReceiver();
125 } 123 }
126 124
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 encoded_frame_callback->SetPayloadType(send_codec_.plType); 287 encoded_frame_callback->SetPayloadType(send_codec_.plType);
290 if (ptr_encoder_->RegisterEncodeCallback(encoded_frame_callback) < 0) { 288 if (ptr_encoder_->RegisterEncodeCallback(encoded_frame_callback) < 0) {
291 LOG(LS_ERROR) << "Failed to register encoded-frame callback."; 289 LOG(LS_ERROR) << "Failed to register encoded-frame callback.";
292 return false; 290 return false;
293 } 291 }
294 return true; 292 return true;
295 } 293 }
296 294
297 // If encoder exists, will destroy it and create new one. 295 // If encoder exists, will destroy it and create new one.
298 DeleteEncoder(); 296 DeleteEncoder();
299 if (send_codec_.plType == external_payload_type_) { 297 RTC_DCHECK_EQ(encoder_payload_type_, send_codec_.plType)
300 // External encoder. 298 << "Encoder not registered for payload type " << send_codec_.plType;
301 ptr_encoder_ = new VCMGenericEncoder( 299 ptr_encoder_.reset(new VCMGenericEncoder(
302 external_encoder_, encoder_rate_observer_, internal_source_); 300 external_encoder_, encoder_rate_observer_, internal_source_));
303 current_enc_is_external_ = true;
304 } else {
305 ptr_encoder_ = CreateEncoder(send_codec_.codecType);
306 current_enc_is_external_ = false;
307 if (!ptr_encoder_)
308 return false;
309 }
310 encoded_frame_callback->SetPayloadType(send_codec_.plType); 301 encoded_frame_callback->SetPayloadType(send_codec_.plType);
311 if (ptr_encoder_->InitEncode(&send_codec_, number_of_cores_, 302 if (ptr_encoder_->InitEncode(&send_codec_, number_of_cores_,
312 max_payload_size_) < 0) { 303 max_payload_size_) < 0) {
313 LOG(LS_ERROR) << "Failed to initialize video encoder."; 304 LOG(LS_ERROR) << "Failed to initialize video encoder.";
314 DeleteEncoder(); 305 DeleteEncoder();
315 return false; 306 return false;
316 } else if (ptr_encoder_->RegisterEncodeCallback(encoded_frame_callback) < 0) { 307 } else if (ptr_encoder_->RegisterEncodeCallback(encoded_frame_callback) < 0) {
317 LOG(LS_ERROR) << "Failed to register encoded-frame callback."; 308 LOG(LS_ERROR) << "Failed to register encoded-frame callback.";
318 DeleteEncoder(); 309 DeleteEncoder();
319 return false; 310 return false;
(...skipping 21 matching lines...) Expand all
341 if (!ptr_encoder_) { 332 if (!ptr_encoder_) {
342 return kVideoCodecUnknown; 333 return kVideoCodecUnknown;
343 } 334 }
344 return send_codec_.codecType; 335 return send_codec_.codecType;
345 } 336 }
346 337
347 bool VCMCodecDataBase::DeregisterExternalEncoder( 338 bool VCMCodecDataBase::DeregisterExternalEncoder(
348 uint8_t payload_type, bool* was_send_codec) { 339 uint8_t payload_type, bool* was_send_codec) {
349 assert(was_send_codec); 340 assert(was_send_codec);
350 *was_send_codec = false; 341 *was_send_codec = false;
351 if (external_payload_type_ != payload_type) { 342 if (encoder_payload_type_ != payload_type) {
352 return false; 343 return false;
353 } 344 }
354 if (send_codec_.plType == payload_type) { 345 if (send_codec_.plType == payload_type) {
355 // De-register as send codec if needed. 346 // De-register as send codec if needed.
356 DeleteEncoder(); 347 DeleteEncoder();
357 memset(&send_codec_, 0, sizeof(VideoCodec)); 348 memset(&send_codec_, 0, sizeof(VideoCodec));
358 current_enc_is_external_ = false;
359 *was_send_codec = true; 349 *was_send_codec = true;
360 } 350 }
361 external_payload_type_ = 0; 351 encoder_payload_type_ = 0;
362 external_encoder_ = NULL; 352 external_encoder_ = NULL;
363 internal_source_ = false; 353 internal_source_ = false;
364 return true; 354 return true;
365 } 355 }
366 356
367 void VCMCodecDataBase::RegisterExternalEncoder( 357 void VCMCodecDataBase::RegisterExternalEncoder(
368 VideoEncoder* external_encoder, 358 VideoEncoder* external_encoder,
369 uint8_t payload_type, 359 uint8_t payload_type,
370 bool internal_source) { 360 bool internal_source) {
371 // Since only one encoder can be used at a given time, only one external 361 // Since only one encoder can be used at a given time, only one external
372 // encoder can be registered/used. 362 // encoder can be registered/used.
373 external_encoder_ = external_encoder; 363 external_encoder_ = external_encoder;
374 external_payload_type_ = payload_type; 364 encoder_payload_type_ = payload_type;
375 internal_source_ = internal_source; 365 internal_source_ = internal_source;
376 pending_encoder_reset_ = true; 366 pending_encoder_reset_ = true;
377 } 367 }
378 368
379 bool VCMCodecDataBase::RequiresEncoderReset(const VideoCodec& new_send_codec) { 369 bool VCMCodecDataBase::RequiresEncoderReset(const VideoCodec& new_send_codec) {
380 if (ptr_encoder_ == NULL) { 370 if (ptr_encoder_ == NULL) {
381 return true; 371 return true;
382 } 372 }
383 373
384 // Does not check startBitrate or maxFramerate 374 // Does not check startBitrate or maxFramerate
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 sizeof(new_send_codec.simulcastStream[i])) != 429 sizeof(new_send_codec.simulcastStream[i])) !=
440 0) { 430 0) {
441 return true; 431 return true;
442 } 432 }
443 } 433 }
444 } 434 }
445 return false; 435 return false;
446 } 436 }
447 437
448 VCMGenericEncoder* VCMCodecDataBase::GetEncoder() { 438 VCMGenericEncoder* VCMCodecDataBase::GetEncoder() {
449 return ptr_encoder_; 439 return ptr_encoder_.get();
450 } 440 }
451 441
452 bool VCMCodecDataBase::SetPeriodicKeyFrames(bool enable) { 442 bool VCMCodecDataBase::SetPeriodicKeyFrames(bool enable) {
453 periodic_key_frames_ = enable; 443 periodic_key_frames_ = enable;
454 if (ptr_encoder_) { 444 if (ptr_encoder_) {
455 return (ptr_encoder_->SetPeriodicKeyFrames(periodic_key_frames_) == 0); 445 return (ptr_encoder_->SetPeriodicKeyFrames(periodic_key_frames_) == 0);
456 } 446 }
457 return true; 447 return true;
458 } 448 }
459 449
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 632
643 if (ptr_decoder->InitDecode(decoder_item->settings.get(), 633 if (ptr_decoder->InitDecode(decoder_item->settings.get(),
644 decoder_item->number_of_cores) < 0) { 634 decoder_item->number_of_cores) < 0) {
645 ReleaseDecoder(ptr_decoder); 635 ReleaseDecoder(ptr_decoder);
646 return NULL; 636 return NULL;
647 } 637 }
648 memcpy(new_codec, decoder_item->settings.get(), sizeof(VideoCodec)); 638 memcpy(new_codec, decoder_item->settings.get(), sizeof(VideoCodec));
649 return ptr_decoder; 639 return ptr_decoder;
650 } 640 }
651 641
652 VCMGenericEncoder* VCMCodecDataBase::CreateEncoder(
653 const VideoCodecType type) const {
654 switch (type) {
655 #ifdef VIDEOCODEC_VP8
656 case kVideoCodecVP8:
657 return new VCMGenericEncoder(VP8Encoder::Create(), encoder_rate_observer_,
658 false);
659 #endif
660 #ifdef VIDEOCODEC_VP9
661 case kVideoCodecVP9:
662 return new VCMGenericEncoder(VP9Encoder::Create(), encoder_rate_observer_,
663 false);
664 #endif
665 #ifdef VIDEOCODEC_I420
666 case kVideoCodecI420:
667 return new VCMGenericEncoder(new I420Encoder(), encoder_rate_observer_,
668 false);
669 #endif
670 #ifdef VIDEOCODEC_H264
671 case kVideoCodecH264:
672 if (H264Encoder::IsSupported()) {
673 return new VCMGenericEncoder(H264Encoder::Create(),
674 encoder_rate_observer_,
675 false);
676 }
677 break;
678 #endif
679 default:
680 break;
681 }
682 LOG(LS_WARNING) << "No internal encoder of this type exists.";
683 return NULL;
684 }
685
686 void VCMCodecDataBase::DeleteEncoder() { 642 void VCMCodecDataBase::DeleteEncoder() {
687 if (ptr_encoder_) { 643 if (!ptr_encoder_)
688 ptr_encoder_->Release(); 644 return;
689 if (!current_enc_is_external_) 645 ptr_encoder_->Release();
690 delete ptr_encoder_->encoder_; 646 ptr_encoder_.reset();
691 delete ptr_encoder_;
692 ptr_encoder_ = NULL;
693 }
694 } 647 }
695 648
696 VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const { 649 VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const {
697 switch (type) { 650 switch (type) {
698 #ifdef VIDEOCODEC_VP8 651 #ifdef VIDEOCODEC_VP8
699 case kVideoCodecVP8: 652 case kVideoCodecVP8:
700 return new VCMGenericDecoder(*(VP8Decoder::Create())); 653 return new VCMGenericDecoder(*(VP8Decoder::Create()));
701 #endif 654 #endif
702 #ifdef VIDEOCODEC_VP9 655 #ifdef VIDEOCODEC_VP9
703 case kVideoCodecVP9: 656 case kVideoCodecVP9:
(...skipping 28 matching lines...) Expand all
732 685
733 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( 686 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem(
734 uint8_t payload_type) const { 687 uint8_t payload_type) const {
735 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type); 688 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type);
736 if (it != dec_external_map_.end()) { 689 if (it != dec_external_map_.end()) {
737 return (*it).second; 690 return (*it).second;
738 } 691 }
739 return NULL; 692 return NULL;
740 } 693 }
741 } // namespace webrtc 694 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698