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 |
11 #include "webrtc/modules/video_coding/main/source/codec_database.h" | 11 #include "webrtc/modules/video_coding/main/source/codec_database.h" |
12 | 12 |
13 #include <assert.h> | 13 #include <assert.h> |
14 | 14 |
15 #include "webrtc/base/checks.h" | 15 #include "webrtc/base/checks.h" |
16 #include "webrtc/engine_configurations.h" | 16 #include "webrtc/engine_configurations.h" |
17 #ifdef VIDEOCODEC_H264 | |
18 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" | 17 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" |
19 #endif | |
20 #ifdef VIDEOCODEC_I420 | |
21 #include "webrtc/modules/video_coding/codecs/i420/include/i420.h" | 18 #include "webrtc/modules/video_coding/codecs/i420/include/i420.h" |
22 #endif | |
23 #ifdef VIDEOCODEC_VP8 | |
24 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" | 19 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" |
25 #endif | |
26 #ifdef VIDEOCODEC_VP9 | |
27 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" | 20 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" |
28 #endif | |
29 #include "webrtc/modules/video_coding/main/source/internal_defines.h" | 21 #include "webrtc/modules/video_coding/main/source/internal_defines.h" |
30 #include "webrtc/system_wrappers/include/logging.h" | 22 #include "webrtc/system_wrappers/include/logging.h" |
31 | 23 |
32 namespace { | 24 namespace { |
33 const size_t kDefaultPayloadSize = 1440; | 25 const size_t kDefaultPayloadSize = 1440; |
34 const uint8_t kDefaultPayloadType = 100; | 26 const uint8_t kDefaultPayloadType = 100; |
35 } | 27 } |
36 | 28 |
37 namespace webrtc { | 29 namespace webrtc { |
38 | 30 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 encoded_frame_callback_(encoded_frame_callback), | 108 encoded_frame_callback_(encoded_frame_callback), |
117 ptr_decoder_(NULL), | 109 ptr_decoder_(NULL), |
118 dec_map_(), | 110 dec_map_(), |
119 dec_external_map_() {} | 111 dec_external_map_() {} |
120 | 112 |
121 VCMCodecDataBase::~VCMCodecDataBase() { | 113 VCMCodecDataBase::~VCMCodecDataBase() { |
122 ResetSender(); | 114 ResetSender(); |
123 ResetReceiver(); | 115 ResetReceiver(); |
124 } | 116 } |
125 | 117 |
126 int VCMCodecDataBase::NumberOfCodecs() { | 118 void VCMCodecDataBase::Codec(VideoCodecType codec_type, VideoCodec* settings) { |
127 return VCM_NUM_VIDEO_CODECS_AVAILABLE; | |
128 } | |
129 | |
130 bool VCMCodecDataBase::Codec(int list_id, | |
131 VideoCodec* settings) { | |
132 if (!settings) { | |
133 return false; | |
134 } | |
135 if (list_id >= VCM_NUM_VIDEO_CODECS_AVAILABLE) { | |
136 return false; | |
137 } | |
138 memset(settings, 0, sizeof(VideoCodec)); | 119 memset(settings, 0, sizeof(VideoCodec)); |
139 switch (list_id) { | 120 switch (codec_type) { |
140 #ifdef VIDEOCODEC_VP8 | 121 case kVideoCodecVP8: |
141 case VCM_VP8_IDX: { | |
142 strncpy(settings->plName, "VP8", 4); | 122 strncpy(settings->plName, "VP8", 4); |
143 settings->codecType = kVideoCodecVP8; | 123 settings->codecType = kVideoCodecVP8; |
144 // 96 to 127 dynamic payload types for video codecs. | 124 // 96 to 127 dynamic payload types for video codecs. |
145 settings->plType = kDefaultPayloadType; | 125 settings->plType = kDefaultPayloadType; |
146 settings->startBitrate = kDefaultStartBitrateKbps; | 126 settings->startBitrate = kDefaultStartBitrateKbps; |
147 settings->minBitrate = VCM_MIN_BITRATE; | 127 settings->minBitrate = VCM_MIN_BITRATE; |
148 settings->maxBitrate = 0; | 128 settings->maxBitrate = 0; |
149 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; | 129 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; |
150 settings->width = VCM_DEFAULT_CODEC_WIDTH; | 130 settings->width = VCM_DEFAULT_CODEC_WIDTH; |
151 settings->height = VCM_DEFAULT_CODEC_HEIGHT; | 131 settings->height = VCM_DEFAULT_CODEC_HEIGHT; |
152 settings->numberOfSimulcastStreams = 0; | 132 settings->numberOfSimulcastStreams = 0; |
153 settings->qpMax = 56; | 133 settings->qpMax = 56; |
154 settings->codecSpecific.VP8 = VideoEncoder::GetDefaultVp8Settings(); | 134 settings->codecSpecific.VP8 = VideoEncoder::GetDefaultVp8Settings(); |
155 return true; | 135 return; |
156 } | 136 case kVideoCodecVP9: |
157 #endif | |
158 #ifdef VIDEOCODEC_VP9 | |
159 case VCM_VP9_IDX: { | |
160 strncpy(settings->plName, "VP9", 4); | 137 strncpy(settings->plName, "VP9", 4); |
161 settings->codecType = kVideoCodecVP9; | 138 settings->codecType = kVideoCodecVP9; |
162 // 96 to 127 dynamic payload types for video codecs. | 139 // 96 to 127 dynamic payload types for video codecs. |
163 settings->plType = kDefaultPayloadType; | 140 settings->plType = kDefaultPayloadType; |
164 settings->startBitrate = 100; | 141 settings->startBitrate = 100; |
165 settings->minBitrate = VCM_MIN_BITRATE; | 142 settings->minBitrate = VCM_MIN_BITRATE; |
166 settings->maxBitrate = 0; | 143 settings->maxBitrate = 0; |
167 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; | 144 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; |
168 settings->width = VCM_DEFAULT_CODEC_WIDTH; | 145 settings->width = VCM_DEFAULT_CODEC_WIDTH; |
169 settings->height = VCM_DEFAULT_CODEC_HEIGHT; | 146 settings->height = VCM_DEFAULT_CODEC_HEIGHT; |
170 settings->numberOfSimulcastStreams = 0; | 147 settings->numberOfSimulcastStreams = 0; |
171 settings->qpMax = 56; | 148 settings->qpMax = 56; |
172 settings->codecSpecific.VP9 = VideoEncoder::GetDefaultVp9Settings(); | 149 settings->codecSpecific.VP9 = VideoEncoder::GetDefaultVp9Settings(); |
173 return true; | 150 return; |
174 } | 151 case kVideoCodecH264: |
175 #endif | |
176 #ifdef VIDEOCODEC_H264 | |
177 case VCM_H264_IDX: { | |
178 strncpy(settings->plName, "H264", 5); | 152 strncpy(settings->plName, "H264", 5); |
179 settings->codecType = kVideoCodecH264; | 153 settings->codecType = kVideoCodecH264; |
180 // 96 to 127 dynamic payload types for video codecs. | 154 // 96 to 127 dynamic payload types for video codecs. |
181 settings->plType = kDefaultPayloadType; | 155 settings->plType = kDefaultPayloadType; |
182 settings->startBitrate = kDefaultStartBitrateKbps; | 156 settings->startBitrate = kDefaultStartBitrateKbps; |
183 settings->minBitrate = VCM_MIN_BITRATE; | 157 settings->minBitrate = VCM_MIN_BITRATE; |
184 settings->maxBitrate = 0; | 158 settings->maxBitrate = 0; |
185 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; | 159 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; |
186 settings->width = VCM_DEFAULT_CODEC_WIDTH; | 160 settings->width = VCM_DEFAULT_CODEC_WIDTH; |
187 settings->height = VCM_DEFAULT_CODEC_HEIGHT; | 161 settings->height = VCM_DEFAULT_CODEC_HEIGHT; |
188 settings->numberOfSimulcastStreams = 0; | 162 settings->numberOfSimulcastStreams = 0; |
189 settings->qpMax = 56; | 163 settings->qpMax = 56; |
190 settings->codecSpecific.H264 = VideoEncoder::GetDefaultH264Settings(); | 164 settings->codecSpecific.H264 = VideoEncoder::GetDefaultH264Settings(); |
191 return true; | 165 return; |
192 } | 166 case kVideoCodecI420: |
193 #endif | |
194 #ifdef VIDEOCODEC_I420 | |
195 case VCM_I420_IDX: { | |
196 strncpy(settings->plName, "I420", 5); | 167 strncpy(settings->plName, "I420", 5); |
197 settings->codecType = kVideoCodecI420; | 168 settings->codecType = kVideoCodecI420; |
198 // 96 to 127 dynamic payload types for video codecs. | 169 // 96 to 127 dynamic payload types for video codecs. |
199 settings->plType = kDefaultPayloadType; | 170 settings->plType = kDefaultPayloadType; |
200 // Bitrate needed for this size and framerate. | 171 // Bitrate needed for this size and framerate. |
201 settings->startBitrate = 3 * VCM_DEFAULT_CODEC_WIDTH * | 172 settings->startBitrate = 3 * VCM_DEFAULT_CODEC_WIDTH * |
202 VCM_DEFAULT_CODEC_HEIGHT * 8 * | 173 VCM_DEFAULT_CODEC_HEIGHT * 8 * |
203 VCM_DEFAULT_FRAME_RATE / 1000 / 2; | 174 VCM_DEFAULT_FRAME_RATE / 1000 / 2; |
204 settings->maxBitrate = settings->startBitrate; | 175 settings->maxBitrate = settings->startBitrate; |
205 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; | 176 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; |
206 settings->width = VCM_DEFAULT_CODEC_WIDTH; | 177 settings->width = VCM_DEFAULT_CODEC_WIDTH; |
207 settings->height = VCM_DEFAULT_CODEC_HEIGHT; | 178 settings->height = VCM_DEFAULT_CODEC_HEIGHT; |
208 settings->minBitrate = VCM_MIN_BITRATE; | 179 settings->minBitrate = VCM_MIN_BITRATE; |
209 settings->numberOfSimulcastStreams = 0; | 180 settings->numberOfSimulcastStreams = 0; |
210 return true; | 181 return; |
211 } | 182 case kVideoCodecRED: |
212 #endif | 183 case kVideoCodecULPFEC: |
213 default: { | 184 case kVideoCodecGeneric: |
214 return false; | 185 case kVideoCodecUnknown: |
215 } | 186 RTC_NOTREACHED(); |
| 187 return; |
216 } | 188 } |
217 } | 189 } |
218 | 190 |
219 bool VCMCodecDataBase::Codec(VideoCodecType codec_type, | |
220 VideoCodec* settings) { | |
221 for (int i = 0; i < VCMCodecDataBase::NumberOfCodecs(); i++) { | |
222 const bool ret = VCMCodecDataBase::Codec(i, settings); | |
223 if (!ret) { | |
224 return false; | |
225 } | |
226 if (codec_type == settings->codecType) { | |
227 return true; | |
228 } | |
229 } | |
230 return false; | |
231 } | |
232 | |
233 void VCMCodecDataBase::ResetSender() { | 191 void VCMCodecDataBase::ResetSender() { |
234 DeleteEncoder(); | 192 DeleteEncoder(); |
235 periodic_key_frames_ = false; | 193 periodic_key_frames_ = false; |
236 } | 194 } |
237 | 195 |
238 // Assuming only one registered encoder - since only one used, no need for more. | 196 // Assuming only one registered encoder - since only one used, no need for more. |
239 bool VCMCodecDataBase::SetSendCodec(const VideoCodec* send_codec, | 197 bool VCMCodecDataBase::SetSendCodec(const VideoCodec* send_codec, |
240 int number_of_cores, | 198 int number_of_cores, |
241 size_t max_payload_size) { | 199 size_t max_payload_size) { |
242 RTC_DCHECK(send_codec); | 200 RTC_DCHECK(send_codec); |
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 | 592 |
635 void VCMCodecDataBase::DeleteEncoder() { | 593 void VCMCodecDataBase::DeleteEncoder() { |
636 if (!ptr_encoder_) | 594 if (!ptr_encoder_) |
637 return; | 595 return; |
638 ptr_encoder_->Release(); | 596 ptr_encoder_->Release(); |
639 ptr_encoder_.reset(); | 597 ptr_encoder_.reset(); |
640 } | 598 } |
641 | 599 |
642 VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const { | 600 VCMGenericDecoder* VCMCodecDataBase::CreateDecoder(VideoCodecType type) const { |
643 switch (type) { | 601 switch (type) { |
644 #ifdef VIDEOCODEC_VP8 | |
645 case kVideoCodecVP8: | 602 case kVideoCodecVP8: |
646 return new VCMGenericDecoder(*(VP8Decoder::Create())); | 603 return new VCMGenericDecoder(*(VP8Decoder::Create())); |
647 #endif | |
648 #ifdef VIDEOCODEC_VP9 | |
649 case kVideoCodecVP9: | 604 case kVideoCodecVP9: |
650 return new VCMGenericDecoder(*(VP9Decoder::Create())); | 605 return new VCMGenericDecoder(*(VP9Decoder::Create())); |
651 #endif | |
652 #ifdef VIDEOCODEC_I420 | |
653 case kVideoCodecI420: | 606 case kVideoCodecI420: |
654 return new VCMGenericDecoder(*(new I420Decoder)); | 607 return new VCMGenericDecoder(*(new I420Decoder)); |
655 #endif | |
656 #ifdef VIDEOCODEC_H264 | |
657 case kVideoCodecH264: | 608 case kVideoCodecH264: |
658 if (H264Decoder::IsSupported()) { | 609 if (H264Decoder::IsSupported()) { |
659 return new VCMGenericDecoder(*(H264Decoder::Create())); | 610 return new VCMGenericDecoder(*(H264Decoder::Create())); |
660 } | 611 } |
661 break; | 612 break; |
662 #endif | |
663 default: | 613 default: |
664 break; | 614 break; |
665 } | 615 } |
666 LOG(LS_WARNING) << "No internal decoder of this type exists."; | 616 LOG(LS_WARNING) << "No internal decoder of this type exists."; |
667 return NULL; | 617 return NULL; |
668 } | 618 } |
669 | 619 |
670 const VCMDecoderMapItem* VCMCodecDataBase::FindDecoderItem( | 620 const VCMDecoderMapItem* VCMCodecDataBase::FindDecoderItem( |
671 uint8_t payload_type) const { | 621 uint8_t payload_type) const { |
672 DecoderMap::const_iterator it = dec_map_.find(payload_type); | 622 DecoderMap::const_iterator it = dec_map_.find(payload_type); |
673 if (it != dec_map_.end()) { | 623 if (it != dec_map_.end()) { |
674 return (*it).second; | 624 return (*it).second; |
675 } | 625 } |
676 return NULL; | 626 return NULL; |
677 } | 627 } |
678 | 628 |
679 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( | 629 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( |
680 uint8_t payload_type) const { | 630 uint8_t payload_type) const { |
681 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type); | 631 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type); |
682 if (it != dec_external_map_.end()) { | 632 if (it != dec_external_map_.end()) { |
683 return (*it).second; | 633 return (*it).second; |
684 } | 634 } |
685 return NULL; | 635 return NULL; |
686 } | 636 } |
687 } // namespace webrtc | 637 } // namespace webrtc |
OLD | NEW |