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