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

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: 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), 115 ptr_encoder_(NULL),
117 ptr_decoder_(NULL), 116 ptr_decoder_(NULL),
118 dec_map_(), 117 dec_map_(),
119 dec_external_map_() { 118 dec_external_map_() {
120 } 119 }
121 120
122 VCMCodecDataBase::~VCMCodecDataBase() { 121 VCMCodecDataBase::~VCMCodecDataBase() {
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 encoded_frame_callback->SetPayloadType(send_codec_.plType); 288 encoded_frame_callback->SetPayloadType(send_codec_.plType);
290 if (ptr_encoder_->RegisterEncodeCallback(encoded_frame_callback) < 0) { 289 if (ptr_encoder_->RegisterEncodeCallback(encoded_frame_callback) < 0) {
291 LOG(LS_ERROR) << "Failed to register encoded-frame callback."; 290 LOG(LS_ERROR) << "Failed to register encoded-frame callback.";
292 return false; 291 return false;
293 } 292 }
294 return true; 293 return true;
295 } 294 }
296 295
297 // If encoder exists, will destroy it and create new one. 296 // If encoder exists, will destroy it and create new one.
298 DeleteEncoder(); 297 DeleteEncoder();
299 if (send_codec_.plType == external_payload_type_) { 298 RTC_DCHECK_EQ(encoder_payload_type_, send_codec_.plType)
300 // External encoder. 299 << "Encoder not registered for payload type " << send_codec_.plType;
301 ptr_encoder_ = new VCMGenericEncoder( 300 ptr_encoder_ = new VCMGenericEncoder(
302 external_encoder_, encoder_rate_observer_, internal_source_); 301 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); 302 encoded_frame_callback->SetPayloadType(send_codec_.plType);
311 if (ptr_encoder_->InitEncode(&send_codec_, number_of_cores_, 303 if (ptr_encoder_->InitEncode(&send_codec_, number_of_cores_,
312 max_payload_size_) < 0) { 304 max_payload_size_) < 0) {
313 LOG(LS_ERROR) << "Failed to initialize video encoder."; 305 LOG(LS_ERROR) << "Failed to initialize video encoder.";
314 DeleteEncoder(); 306 DeleteEncoder();
315 return false; 307 return false;
316 } else if (ptr_encoder_->RegisterEncodeCallback(encoded_frame_callback) < 0) { 308 } else if (ptr_encoder_->RegisterEncodeCallback(encoded_frame_callback) < 0) {
317 LOG(LS_ERROR) << "Failed to register encoded-frame callback."; 309 LOG(LS_ERROR) << "Failed to register encoded-frame callback.";
318 DeleteEncoder(); 310 DeleteEncoder();
319 return false; 311 return false;
(...skipping 21 matching lines...) Expand all
341 if (!ptr_encoder_) { 333 if (!ptr_encoder_) {
342 return kVideoCodecUnknown; 334 return kVideoCodecUnknown;
343 } 335 }
344 return send_codec_.codecType; 336 return send_codec_.codecType;
345 } 337 }
346 338
347 bool VCMCodecDataBase::DeregisterExternalEncoder( 339 bool VCMCodecDataBase::DeregisterExternalEncoder(
348 uint8_t payload_type, bool* was_send_codec) { 340 uint8_t payload_type, bool* was_send_codec) {
349 assert(was_send_codec); 341 assert(was_send_codec);
350 *was_send_codec = false; 342 *was_send_codec = false;
351 if (external_payload_type_ != payload_type) { 343 if (encoder_payload_type_ != payload_type) {
352 return false; 344 return false;
353 } 345 }
354 if (send_codec_.plType == payload_type) { 346 if (send_codec_.plType == payload_type) {
355 // De-register as send codec if needed. 347 // De-register as send codec if needed.
356 DeleteEncoder(); 348 DeleteEncoder();
357 memset(&send_codec_, 0, sizeof(VideoCodec)); 349 memset(&send_codec_, 0, sizeof(VideoCodec));
358 current_enc_is_external_ = false;
359 *was_send_codec = true; 350 *was_send_codec = true;
360 } 351 }
361 external_payload_type_ = 0; 352 encoder_payload_type_ = 0;
362 external_encoder_ = NULL; 353 external_encoder_ = NULL;
363 internal_source_ = false; 354 internal_source_ = false;
364 return true; 355 return true;
365 } 356 }
366 357
367 void VCMCodecDataBase::RegisterExternalEncoder( 358 void VCMCodecDataBase::RegisterExternalEncoder(
368 VideoEncoder* external_encoder, 359 VideoEncoder* external_encoder,
369 uint8_t payload_type, 360 uint8_t payload_type,
370 bool internal_source) { 361 bool internal_source) {
371 // Since only one encoder can be used at a given time, only one external 362 // Since only one encoder can be used at a given time, only one external
372 // encoder can be registered/used. 363 // encoder can be registered/used.
373 external_encoder_ = external_encoder; 364 external_encoder_ = external_encoder;
374 external_payload_type_ = payload_type; 365 encoder_payload_type_ = payload_type;
375 internal_source_ = internal_source; 366 internal_source_ = internal_source;
376 pending_encoder_reset_ = true; 367 pending_encoder_reset_ = true;
377 } 368 }
378 369
379 bool VCMCodecDataBase::RequiresEncoderReset(const VideoCodec& new_send_codec) { 370 bool VCMCodecDataBase::RequiresEncoderReset(const VideoCodec& new_send_codec) {
380 if (ptr_encoder_ == NULL) { 371 if (ptr_encoder_ == NULL) {
381 return true; 372 return true;
382 } 373 }
383 374
384 // Does not check startBitrate or maxFramerate 375 // Does not check startBitrate or maxFramerate
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 633
643 if (ptr_decoder->InitDecode(decoder_item->settings.get(), 634 if (ptr_decoder->InitDecode(decoder_item->settings.get(),
644 decoder_item->number_of_cores) < 0) { 635 decoder_item->number_of_cores) < 0) {
645 ReleaseDecoder(ptr_decoder); 636 ReleaseDecoder(ptr_decoder);
646 return NULL; 637 return NULL;
647 } 638 }
648 memcpy(new_codec, decoder_item->settings.get(), sizeof(VideoCodec)); 639 memcpy(new_codec, decoder_item->settings.get(), sizeof(VideoCodec));
649 return ptr_decoder; 640 return ptr_decoder;
650 } 641 }
651 642
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() { 643 void VCMCodecDataBase::DeleteEncoder() {
687 if (ptr_encoder_) { 644 if (!ptr_encoder_)
688 ptr_encoder_->Release(); 645 return;
689 if (!current_enc_is_external_) 646 ptr_encoder_->Release();
690 delete ptr_encoder_->encoder_; 647 delete ptr_encoder_;
stefan-webrtc 2015/10/15 07:43:36 Could you make this scoped?
691 delete ptr_encoder_; 648 ptr_encoder_ = NULL;
692 ptr_encoder_ = NULL;
693 }
694 } 649 }
695 650
696 VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const { 651 VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const {
697 switch (type) { 652 switch (type) {
698 #ifdef VIDEOCODEC_VP8 653 #ifdef VIDEOCODEC_VP8
699 case kVideoCodecVP8: 654 case kVideoCodecVP8:
700 return new VCMGenericDecoder(*(VP8Decoder::Create())); 655 return new VCMGenericDecoder(*(VP8Decoder::Create()));
701 #endif 656 #endif
702 #ifdef VIDEOCODEC_VP9 657 #ifdef VIDEOCODEC_VP9
703 case kVideoCodecVP9: 658 case kVideoCodecVP9:
(...skipping 28 matching lines...) Expand all
732 687
733 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( 688 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem(
734 uint8_t payload_type) const { 689 uint8_t payload_type) const {
735 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type); 690 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type);
736 if (it != dec_external_map_.end()) { 691 if (it != dec_external_map_.end()) {
737 return (*it).second; 692 return (*it).second;
738 } 693 }
739 return NULL; 694 return NULL;
740 } 695 }
741 } // namespace webrtc 696 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698