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 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 VCMExtDecoderMapItem::VCMExtDecoderMapItem( | 94 VCMExtDecoderMapItem::VCMExtDecoderMapItem( |
95 VideoDecoder* external_decoder_instance, | 95 VideoDecoder* external_decoder_instance, |
96 uint8_t payload_type, | 96 uint8_t payload_type, |
97 bool internal_render_timing) | 97 bool internal_render_timing) |
98 : payload_type(payload_type), | 98 : payload_type(payload_type), |
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 VCMEncodedFrameCallback* encoded_frame_callback) |
105 : number_of_cores_(0), | 106 : number_of_cores_(0), |
106 max_payload_size_(kDefaultPayloadSize), | 107 max_payload_size_(kDefaultPayloadSize), |
107 periodic_key_frames_(false), | 108 periodic_key_frames_(false), |
108 pending_encoder_reset_(true), | 109 pending_encoder_reset_(true), |
109 send_codec_(), | 110 send_codec_(), |
110 receive_codec_(), | 111 receive_codec_(), |
111 encoder_payload_type_(0), | 112 encoder_payload_type_(0), |
112 external_encoder_(NULL), | 113 external_encoder_(NULL), |
113 internal_source_(false), | 114 internal_source_(false), |
114 encoder_rate_observer_(encoder_rate_observer), | 115 encoder_rate_observer_(encoder_rate_observer), |
| 116 encoded_frame_callback_(encoded_frame_callback), |
115 ptr_decoder_(NULL), | 117 ptr_decoder_(NULL), |
116 dec_map_(), | 118 dec_map_(), |
117 dec_external_map_() { | 119 dec_external_map_() {} |
118 } | |
119 | 120 |
120 VCMCodecDataBase::~VCMCodecDataBase() { | 121 VCMCodecDataBase::~VCMCodecDataBase() { |
121 ResetSender(); | 122 ResetSender(); |
122 ResetReceiver(); | 123 ResetReceiver(); |
123 } | 124 } |
124 | 125 |
125 int VCMCodecDataBase::NumberOfCodecs() { | 126 int VCMCodecDataBase::NumberOfCodecs() { |
126 return VCM_NUM_VIDEO_CODECS_AVAILABLE; | 127 return VCM_NUM_VIDEO_CODECS_AVAILABLE; |
127 } | 128 } |
128 | 129 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 } | 229 } |
229 return false; | 230 return false; |
230 } | 231 } |
231 | 232 |
232 void VCMCodecDataBase::ResetSender() { | 233 void VCMCodecDataBase::ResetSender() { |
233 DeleteEncoder(); | 234 DeleteEncoder(); |
234 periodic_key_frames_ = false; | 235 periodic_key_frames_ = false; |
235 } | 236 } |
236 | 237 |
237 // Assuming only one registered encoder - since only one used, no need for more. | 238 // Assuming only one registered encoder - since only one used, no need for more. |
238 bool VCMCodecDataBase::SetSendCodec( | 239 bool VCMCodecDataBase::SetSendCodec(const VideoCodec* send_codec, |
239 const VideoCodec* send_codec, | 240 int number_of_cores, |
240 int number_of_cores, | 241 size_t max_payload_size) { |
241 size_t max_payload_size, | |
242 VCMEncodedFrameCallback* encoded_frame_callback) { | |
243 RTC_DCHECK(send_codec); | 242 RTC_DCHECK(send_codec); |
244 if (max_payload_size == 0) { | 243 if (max_payload_size == 0) { |
245 max_payload_size = kDefaultPayloadSize; | 244 max_payload_size = kDefaultPayloadSize; |
246 } | 245 } |
247 RTC_DCHECK_GE(number_of_cores, 1); | 246 RTC_DCHECK_GE(number_of_cores, 1); |
248 RTC_DCHECK_GE(send_codec->plType, 1); | 247 RTC_DCHECK_GE(send_codec->plType, 1); |
249 // Make sure the start bit rate is sane... | 248 // Make sure the start bit rate is sane... |
250 RTC_DCHECK_LE(send_codec->startBitrate, 1000000u); | 249 RTC_DCHECK_LE(send_codec->startBitrate, 1000000u); |
251 RTC_DCHECK(send_codec->codecType != kVideoCodecUnknown); | 250 RTC_DCHECK(send_codec->codecType != kVideoCodecUnknown); |
252 bool reset_required = pending_encoder_reset_; | 251 bool reset_required = pending_encoder_reset_; |
(...skipping 24 matching lines...) Expand all Loading... |
277 if (new_send_codec.startBitrate > new_send_codec.maxBitrate) | 276 if (new_send_codec.startBitrate > new_send_codec.maxBitrate) |
278 new_send_codec.startBitrate = new_send_codec.maxBitrate; | 277 new_send_codec.startBitrate = new_send_codec.maxBitrate; |
279 | 278 |
280 if (!reset_required) { | 279 if (!reset_required) { |
281 reset_required = RequiresEncoderReset(new_send_codec); | 280 reset_required = RequiresEncoderReset(new_send_codec); |
282 } | 281 } |
283 | 282 |
284 memcpy(&send_codec_, &new_send_codec, sizeof(send_codec_)); | 283 memcpy(&send_codec_, &new_send_codec, sizeof(send_codec_)); |
285 | 284 |
286 if (!reset_required) { | 285 if (!reset_required) { |
287 encoded_frame_callback->SetPayloadType(send_codec_.plType); | 286 encoded_frame_callback_->SetPayloadType(send_codec_.plType); |
288 if (ptr_encoder_->RegisterEncodeCallback(encoded_frame_callback) < 0) { | |
289 LOG(LS_ERROR) << "Failed to register encoded-frame callback."; | |
290 return false; | |
291 } | |
292 return true; | 287 return true; |
293 } | 288 } |
294 | 289 |
295 // If encoder exists, will destroy it and create new one. | 290 // If encoder exists, will destroy it and create new one. |
296 DeleteEncoder(); | 291 DeleteEncoder(); |
297 RTC_DCHECK_EQ(encoder_payload_type_, send_codec_.plType) | 292 RTC_DCHECK_EQ(encoder_payload_type_, send_codec_.plType) |
298 << "Encoder not registered for payload type " << send_codec_.plType; | 293 << "Encoder not registered for payload type " << send_codec_.plType; |
299 ptr_encoder_.reset(new VCMGenericEncoder( | 294 ptr_encoder_.reset( |
300 external_encoder_, encoder_rate_observer_, internal_source_)); | 295 new VCMGenericEncoder(external_encoder_, encoder_rate_observer_, |
301 encoded_frame_callback->SetPayloadType(send_codec_.plType); | 296 encoded_frame_callback_, internal_source_)); |
| 297 encoded_frame_callback_->SetPayloadType(send_codec_.plType); |
| 298 encoded_frame_callback_->SetInternalSource(internal_source_); |
302 if (ptr_encoder_->InitEncode(&send_codec_, number_of_cores_, | 299 if (ptr_encoder_->InitEncode(&send_codec_, number_of_cores_, |
303 max_payload_size_) < 0) { | 300 max_payload_size_) < 0) { |
304 LOG(LS_ERROR) << "Failed to initialize video encoder."; | 301 LOG(LS_ERROR) << "Failed to initialize video encoder."; |
305 DeleteEncoder(); | 302 DeleteEncoder(); |
306 return false; | 303 return false; |
307 } else if (ptr_encoder_->RegisterEncodeCallback(encoded_frame_callback) < 0) { | |
308 LOG(LS_ERROR) << "Failed to register encoded-frame callback."; | |
309 DeleteEncoder(); | |
310 return false; | |
311 } | 304 } |
312 | 305 |
313 // Intentionally don't check return value since the encoder registration | 306 // Intentionally don't check return value since the encoder registration |
314 // shouldn't fail because the codec doesn't support changing the periodic key | 307 // shouldn't fail because the codec doesn't support changing the periodic key |
315 // frame setting. | 308 // frame setting. |
316 ptr_encoder_->SetPeriodicKeyFrames(periodic_key_frames_); | 309 ptr_encoder_->SetPeriodicKeyFrames(periodic_key_frames_); |
317 | 310 |
318 pending_encoder_reset_ = false; | 311 pending_encoder_reset_ = false; |
319 | 312 |
320 return true; | 313 return true; |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
685 | 678 |
686 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( | 679 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( |
687 uint8_t payload_type) const { | 680 uint8_t payload_type) const { |
688 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type); | 681 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type); |
689 if (it != dec_external_map_.end()) { | 682 if (it != dec_external_map_.end()) { |
690 return (*it).second; | 683 return (*it).second; |
691 } | 684 } |
692 return NULL; | 685 return NULL; |
693 } | 686 } |
694 } // namespace webrtc | 687 } // namespace webrtc |
OLD | NEW |