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 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |