OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2004 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 1148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 // Only generate CN payload types for these clockrates: | 1159 // Only generate CN payload types for these clockrates: |
1160 std::map<int, bool, std::greater<int>> generate_cn = {{ 8000, false }, | 1160 std::map<int, bool, std::greater<int>> generate_cn = {{ 8000, false }, |
1161 { 16000, false }, | 1161 { 16000, false }, |
1162 { 32000, false }}; | 1162 { 32000, false }}; |
1163 // Only generate telephone-event payload types for these clockrates: | 1163 // Only generate telephone-event payload types for these clockrates: |
1164 std::map<int, bool, std::greater<int>> generate_dtmf = {{ 8000, false }, | 1164 std::map<int, bool, std::greater<int>> generate_dtmf = {{ 8000, false }, |
1165 { 16000, false }, | 1165 { 16000, false }, |
1166 { 32000, false }, | 1166 { 32000, false }, |
1167 { 48000, false }}; | 1167 { 48000, false }}; |
1168 | 1168 |
1169 auto map_format = [&mapper, &out] (const webrtc::SdpAudioFormat& format) { | 1169 auto map_format = [&mapper](const webrtc::SdpAudioFormat& format, |
| 1170 AudioCodecs* out) { |
1170 rtc::Optional<AudioCodec> opt_codec = mapper.ToAudioCodec(format); | 1171 rtc::Optional<AudioCodec> opt_codec = mapper.ToAudioCodec(format); |
1171 if (!opt_codec) { | 1172 if (opt_codec) { |
| 1173 if (out) { |
| 1174 out->push_back(*opt_codec); |
| 1175 } |
| 1176 } else { |
1172 LOG(LS_ERROR) << "Unable to assign payload type to format: " << format; | 1177 LOG(LS_ERROR) << "Unable to assign payload type to format: " << format; |
1173 return false; | |
1174 } | 1178 } |
1175 | 1179 |
1176 auto& codec = *opt_codec; | 1180 return opt_codec; |
1177 if (IsCodec(codec, kOpusCodecName)) { | |
1178 // TODO(ossu): Set this specifically for Opus for now, until we have a | |
1179 // better way of dealing with rtcp-fb parameters. | |
1180 codec.AddFeedbackParam( | |
1181 FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty)); | |
1182 } | |
1183 out.push_back(codec); | |
1184 return true; | |
1185 }; | 1181 }; |
1186 | 1182 |
1187 for (const auto& spec : specs) { | 1183 for (const auto& spec : specs) { |
1188 if (map_format(spec.format)) { | 1184 // We need to do some extra stuff before adding the main codecs to out. |
| 1185 rtc::Optional<AudioCodec> opt_codec = map_format(spec.format, nullptr); |
| 1186 if (opt_codec) { |
| 1187 AudioCodec& codec = *opt_codec; |
| 1188 if (spec.supports_network_adaption) { |
| 1189 codec.AddFeedbackParam( |
| 1190 FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty)); |
| 1191 } |
| 1192 |
1189 if (spec.allow_comfort_noise) { | 1193 if (spec.allow_comfort_noise) { |
1190 // Generate a CN entry if the decoder allows it and we support the | 1194 // Generate a CN entry if the decoder allows it and we support the |
1191 // clockrate. | 1195 // clockrate. |
1192 auto cn = generate_cn.find(spec.format.clockrate_hz); | 1196 auto cn = generate_cn.find(spec.format.clockrate_hz); |
1193 if (cn != generate_cn.end()) { | 1197 if (cn != generate_cn.end()) { |
1194 cn->second = true; | 1198 cn->second = true; |
1195 } | 1199 } |
1196 } | 1200 } |
1197 | 1201 |
1198 // Generate a telephone-event entry if we support the clockrate. | 1202 // Generate a telephone-event entry if we support the clockrate. |
1199 auto dtmf = generate_dtmf.find(spec.format.clockrate_hz); | 1203 auto dtmf = generate_dtmf.find(spec.format.clockrate_hz); |
1200 if (dtmf != generate_dtmf.end()) { | 1204 if (dtmf != generate_dtmf.end()) { |
1201 dtmf->second = true; | 1205 dtmf->second = true; |
1202 } | 1206 } |
| 1207 |
| 1208 out.push_back(codec); |
1203 } | 1209 } |
1204 } | 1210 } |
1205 | 1211 |
1206 // Add CN codecs after "proper" audio codecs. | 1212 // Add CN codecs after "proper" audio codecs. |
1207 for (const auto& cn : generate_cn) { | 1213 for (const auto& cn : generate_cn) { |
1208 if (cn.second) { | 1214 if (cn.second) { |
1209 map_format({kCnCodecName, cn.first, 1}); | 1215 map_format({kCnCodecName, cn.first, 1}, &out); |
1210 } | 1216 } |
1211 } | 1217 } |
1212 | 1218 |
1213 // Add telephone-event codecs last. | 1219 // Add telephone-event codecs last. |
1214 for (const auto& dtmf : generate_dtmf) { | 1220 for (const auto& dtmf : generate_dtmf) { |
1215 if (dtmf.second) { | 1221 if (dtmf.second) { |
1216 map_format({kDtmfCodecName, dtmf.first, 1}); | 1222 map_format({kDtmfCodecName, dtmf.first, 1}, &out); |
1217 } | 1223 } |
1218 } | 1224 } |
1219 | 1225 |
1220 return out; | 1226 return out; |
1221 } | 1227 } |
1222 | 1228 |
1223 class WebRtcVoiceMediaChannel::WebRtcAudioSendStream | 1229 class WebRtcVoiceMediaChannel::WebRtcAudioSendStream |
1224 : public AudioSource::Sink { | 1230 : public AudioSource::Sink { |
1225 public: | 1231 public: |
1226 WebRtcAudioSendStream( | 1232 WebRtcAudioSendStream( |
(...skipping 1492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2719 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 2725 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
2720 const auto it = send_streams_.find(ssrc); | 2726 const auto it = send_streams_.find(ssrc); |
2721 if (it != send_streams_.end()) { | 2727 if (it != send_streams_.end()) { |
2722 return it->second->channel(); | 2728 return it->second->channel(); |
2723 } | 2729 } |
2724 return -1; | 2730 return -1; |
2725 } | 2731 } |
2726 } // namespace cricket | 2732 } // namespace cricket |
2727 | 2733 |
2728 #endif // HAVE_WEBRTC_VOICE | 2734 #endif // HAVE_WEBRTC_VOICE |
OLD | NEW |