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/codec_database.h" | 11 #include "webrtc/modules/video_coding/codec_database.h" |
12 | 12 |
13 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" | 13 #include "webrtc/modules/video_coding/codecs/h264/include/h264.h" |
14 #include "webrtc/modules/video_coding/codecs/i420/include/i420.h" | 14 #include "webrtc/modules/video_coding/codecs/i420/include/i420.h" |
15 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" | 15 #include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h" |
16 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" | 16 #include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h" |
17 #include "webrtc/modules/video_coding/internal_defines.h" | 17 #include "webrtc/modules/video_coding/internal_defines.h" |
18 #include "webrtc/rtc_base/checks.h" | 18 #include "webrtc/rtc_base/checks.h" |
19 #include "webrtc/rtc_base/logging.h" | 19 #include "webrtc/rtc_base/logging.h" |
20 | 20 |
21 namespace { | 21 namespace { |
22 const size_t kDefaultPayloadSize = 1440; | 22 const size_t kDefaultPayloadSize = 1440; |
23 const uint8_t kDefaultPayloadType = 100; | |
24 } | 23 } |
25 | 24 |
26 namespace webrtc { | 25 namespace webrtc { |
27 | 26 |
28 VideoCodecVP8 VideoEncoder::GetDefaultVp8Settings() { | |
29 VideoCodecVP8 vp8_settings; | |
30 memset(&vp8_settings, 0, sizeof(vp8_settings)); | |
31 | |
32 vp8_settings.resilience = kResilientStream; | |
33 vp8_settings.numberOfTemporalLayers = 1; | |
34 vp8_settings.denoisingOn = true; | |
35 vp8_settings.errorConcealmentOn = false; | |
36 vp8_settings.automaticResizeOn = false; | |
37 vp8_settings.frameDroppingOn = true; | |
38 vp8_settings.keyFrameInterval = 3000; | |
39 | |
40 return vp8_settings; | |
41 } | |
42 | |
43 VideoCodecVP9 VideoEncoder::GetDefaultVp9Settings() { | |
44 VideoCodecVP9 vp9_settings; | |
45 memset(&vp9_settings, 0, sizeof(vp9_settings)); | |
46 | |
47 vp9_settings.resilienceOn = true; | |
48 vp9_settings.numberOfTemporalLayers = 1; | |
49 vp9_settings.denoisingOn = true; | |
50 vp9_settings.frameDroppingOn = true; | |
51 vp9_settings.keyFrameInterval = 3000; | |
52 vp9_settings.adaptiveQpMode = true; | |
53 vp9_settings.automaticResizeOn = true; | |
54 vp9_settings.numberOfSpatialLayers = 1; | |
55 vp9_settings.flexibleMode = false; | |
56 return vp9_settings; | |
57 } | |
58 | |
59 VideoCodecH264 VideoEncoder::GetDefaultH264Settings() { | |
60 VideoCodecH264 h264_settings; | |
61 memset(&h264_settings, 0, sizeof(h264_settings)); | |
62 | |
63 h264_settings.frameDroppingOn = true; | |
64 h264_settings.keyFrameInterval = 3000; | |
65 h264_settings.spsData = nullptr; | |
66 h264_settings.spsLen = 0; | |
67 h264_settings.ppsData = nullptr; | |
68 h264_settings.ppsLen = 0; | |
69 h264_settings.profile = H264::kProfileConstrainedBaseline; | |
70 | |
71 return h264_settings; | |
72 } | |
73 | |
74 // Create an internal Decoder given a codec type | 27 // Create an internal Decoder given a codec type |
75 static std::unique_ptr<VCMGenericDecoder> CreateDecoder(VideoCodecType type) { | 28 static std::unique_ptr<VCMGenericDecoder> CreateDecoder(VideoCodecType type) { |
76 switch (type) { | 29 switch (type) { |
77 case kVideoCodecVP8: | 30 case kVideoCodecVP8: |
78 return std::unique_ptr<VCMGenericDecoder>( | 31 return std::unique_ptr<VCMGenericDecoder>( |
79 new VCMGenericDecoder(VP8Decoder::Create())); | 32 new VCMGenericDecoder(VP8Decoder::Create())); |
80 case kVideoCodecVP9: | 33 case kVideoCodecVP9: |
81 return std::unique_ptr<VCMGenericDecoder>( | 34 return std::unique_ptr<VCMGenericDecoder>( |
82 new VCMGenericDecoder(VP9Decoder::Create())); | 35 new VCMGenericDecoder(VP9Decoder::Create())); |
83 case kVideoCodecI420: | 36 case kVideoCodecI420: |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 | 81 |
129 VCMCodecDataBase::~VCMCodecDataBase() { | 82 VCMCodecDataBase::~VCMCodecDataBase() { |
130 DeleteEncoder(); | 83 DeleteEncoder(); |
131 ptr_decoder_.reset(); | 84 ptr_decoder_.reset(); |
132 for (auto& kv : dec_map_) | 85 for (auto& kv : dec_map_) |
133 delete kv.second; | 86 delete kv.second; |
134 for (auto& kv : dec_external_map_) | 87 for (auto& kv : dec_external_map_) |
135 delete kv.second; | 88 delete kv.second; |
136 } | 89 } |
137 | 90 |
138 void VCMCodecDataBase::Codec(VideoCodecType codec_type, VideoCodec* settings) { | |
139 memset(settings, 0, sizeof(VideoCodec)); | |
140 switch (codec_type) { | |
141 case kVideoCodecVP8: | |
142 strncpy(settings->plName, "VP8", 4); | |
143 settings->codecType = kVideoCodecVP8; | |
144 // 96 to 127 dynamic payload types for video codecs. | |
145 settings->plType = kDefaultPayloadType; | |
146 settings->startBitrate = kDefaultStartBitrateKbps; | |
147 settings->minBitrate = VCM_MIN_BITRATE; | |
148 settings->maxBitrate = 0; | |
149 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; | |
150 settings->width = VCM_DEFAULT_CODEC_WIDTH; | |
151 settings->height = VCM_DEFAULT_CODEC_HEIGHT; | |
152 settings->numberOfSimulcastStreams = 0; | |
153 settings->qpMax = 56; | |
154 settings->timing_frame_thresholds = { | |
155 kDefaultTimingFramesDelayMs, kDefaultOutlierFrameSizePercent, | |
156 }; | |
157 *(settings->VP8()) = VideoEncoder::GetDefaultVp8Settings(); | |
158 return; | |
159 case kVideoCodecVP9: | |
160 strncpy(settings->plName, "VP9", 4); | |
161 settings->codecType = kVideoCodecVP9; | |
162 // 96 to 127 dynamic payload types for video codecs. | |
163 settings->plType = kDefaultPayloadType; | |
164 settings->startBitrate = 100; | |
165 settings->minBitrate = VCM_MIN_BITRATE; | |
166 settings->maxBitrate = 0; | |
167 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; | |
168 settings->width = VCM_DEFAULT_CODEC_WIDTH; | |
169 settings->height = VCM_DEFAULT_CODEC_HEIGHT; | |
170 settings->numberOfSimulcastStreams = 0; | |
171 settings->qpMax = 56; | |
172 settings->timing_frame_thresholds = { | |
173 kDefaultTimingFramesDelayMs, kDefaultOutlierFrameSizePercent, | |
174 }; | |
175 *(settings->VP9()) = VideoEncoder::GetDefaultVp9Settings(); | |
176 return; | |
177 case kVideoCodecH264: | |
178 strncpy(settings->plName, "H264", 5); | |
179 settings->codecType = kVideoCodecH264; | |
180 // 96 to 127 dynamic payload types for video codecs. | |
181 settings->plType = kDefaultPayloadType; | |
182 settings->startBitrate = kDefaultStartBitrateKbps; | |
183 settings->minBitrate = VCM_MIN_BITRATE; | |
184 settings->maxBitrate = 0; | |
185 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; | |
186 settings->width = VCM_DEFAULT_CODEC_WIDTH; | |
187 settings->height = VCM_DEFAULT_CODEC_HEIGHT; | |
188 settings->numberOfSimulcastStreams = 0; | |
189 settings->qpMax = 56; | |
190 settings->timing_frame_thresholds = { | |
191 kDefaultTimingFramesDelayMs, kDefaultOutlierFrameSizePercent, | |
192 }; | |
193 *(settings->H264()) = VideoEncoder::GetDefaultH264Settings(); | |
194 return; | |
195 case kVideoCodecI420: | |
196 strncpy(settings->plName, "I420", 5); | |
197 settings->codecType = kVideoCodecI420; | |
198 // 96 to 127 dynamic payload types for video codecs. | |
199 settings->plType = kDefaultPayloadType; | |
200 // Bitrate needed for this size and framerate. | |
201 settings->startBitrate = 3 * VCM_DEFAULT_CODEC_WIDTH * | |
202 VCM_DEFAULT_CODEC_HEIGHT * 8 * | |
203 VCM_DEFAULT_FRAME_RATE / 1000 / 2; | |
204 settings->maxBitrate = settings->startBitrate; | |
205 settings->maxFramerate = VCM_DEFAULT_FRAME_RATE; | |
206 settings->width = VCM_DEFAULT_CODEC_WIDTH; | |
207 settings->height = VCM_DEFAULT_CODEC_HEIGHT; | |
208 settings->minBitrate = VCM_MIN_BITRATE; | |
209 settings->numberOfSimulcastStreams = 0; | |
210 return; | |
211 case kVideoCodecRED: | |
212 case kVideoCodecULPFEC: | |
213 case kVideoCodecFlexfec: | |
214 case kVideoCodecGeneric: | |
215 case kVideoCodecUnknown: | |
216 RTC_NOTREACHED(); | |
217 return; | |
218 } | |
219 } | |
220 | |
221 // Assuming only one registered encoder - since only one used, no need for more. | 91 // Assuming only one registered encoder - since only one used, no need for more. |
222 bool VCMCodecDataBase::SetSendCodec(const VideoCodec* send_codec, | 92 bool VCMCodecDataBase::SetSendCodec(const VideoCodec* send_codec, |
223 int number_of_cores, | 93 int number_of_cores, |
224 size_t max_payload_size) { | 94 size_t max_payload_size) { |
225 RTC_DCHECK(send_codec); | 95 RTC_DCHECK(send_codec); |
226 if (max_payload_size == 0) { | 96 if (max_payload_size == 0) { |
227 max_payload_size = kDefaultPayloadSize; | 97 max_payload_size = kDefaultPayloadSize; |
228 } | 98 } |
229 RTC_DCHECK_GE(number_of_cores, 1); | 99 RTC_DCHECK_GE(number_of_cores, 1); |
230 RTC_DCHECK_GE(send_codec->plType, 1); | 100 RTC_DCHECK_GE(send_codec->plType, 1); |
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 | 453 |
584 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( | 454 const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem( |
585 uint8_t payload_type) const { | 455 uint8_t payload_type) const { |
586 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type); | 456 ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type); |
587 if (it != dec_external_map_.end()) { | 457 if (it != dec_external_map_.end()) { |
588 return (*it).second; | 458 return (*it).second; |
589 } | 459 } |
590 return nullptr; | 460 return nullptr; |
591 } | 461 } |
592 } // namespace webrtc | 462 } // namespace webrtc |
OLD | NEW |