Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(255)

Side by Side Diff: webrtc/pc/mediasession.cc

Issue 2013053002: Support for two audio codec lists down into WebRtcVoiceEngine. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@asymmetric-audio-codec-support
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« webrtc/pc/channelmanager.h ('K') | « webrtc/pc/channelmanager.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 func(&crypto_suites); 43 func(&crypto_suites);
44 for (const auto crypto : crypto_suites) { 44 for (const auto crypto : crypto_suites) {
45 names->push_back(rtc::SrtpCryptoSuiteToName(crypto)); 45 names->push_back(rtc::SrtpCryptoSuiteToName(crypto));
46 } 46 }
47 #endif 47 #endif
48 } 48 }
49 } // namespace 49 } // namespace
50 50
51 namespace cricket { 51 namespace cricket {
52 52
53 namespace {
54 std::vector<AudioCodec> MergeAudioCodecLists(
55 const std::vector<AudioCodec>& send_codecs,
56 const std::vector<AudioCodec>& recv_codecs);
57 }
53 58
54 // RTP Profile names 59 // RTP Profile names
55 // http://www.iana.org/assignments/rtp-parameters/rtp-parameters.xml 60 // http://www.iana.org/assignments/rtp-parameters/rtp-parameters.xml
56 // RFC4585 61 // RFC4585
57 const char kMediaProtocolAvpf[] = "RTP/AVPF"; 62 const char kMediaProtocolAvpf[] = "RTP/AVPF";
58 // RFC5124 63 // RFC5124
59 const char kMediaProtocolDtlsSavpf[] = "UDP/TLS/RTP/SAVPF"; 64 const char kMediaProtocolDtlsSavpf[] = "UDP/TLS/RTP/SAVPF";
60 65
61 // We always generate offers with "UDP/TLS/RTP/SAVPF" when using DTLS-SRTP, 66 // We always generate offers with "UDP/TLS/RTP/SAVPF" when using DTLS-SRTP,
62 // but we tolerate "RTP/SAVPF" in offers we receive, for compatibility. 67 // but we tolerate "RTP/SAVPF" in offers we receive, for compatibility.
(...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1245 add_legacy_(true), 1250 add_legacy_(true),
1246 transport_desc_factory_(transport_desc_factory) { 1251 transport_desc_factory_(transport_desc_factory) {
1247 } 1252 }
1248 1253
1249 MediaSessionDescriptionFactory::MediaSessionDescriptionFactory( 1254 MediaSessionDescriptionFactory::MediaSessionDescriptionFactory(
1250 ChannelManager* channel_manager, 1255 ChannelManager* channel_manager,
1251 const TransportDescriptionFactory* transport_desc_factory) 1256 const TransportDescriptionFactory* transport_desc_factory)
1252 : secure_(SEC_DISABLED), 1257 : secure_(SEC_DISABLED),
1253 add_legacy_(true), 1258 add_legacy_(true),
1254 transport_desc_factory_(transport_desc_factory) { 1259 transport_desc_factory_(transport_desc_factory) {
1255 channel_manager->GetSupportedAudioCodecs(&audio_sendrecv_codecs_); 1260 channel_manager->GetSupportedAudioSendCodecs(&audio_send_codecs_);
1261 channel_manager->GetSupportedAudioReceiveCodecs(&audio_recv_codecs_);
1262 channel_manager->GetSupportedAudioSendCodecs(&audio_send_codecs_);
1256 channel_manager->GetSupportedAudioRtpHeaderExtensions(&audio_rtp_extensions_); 1263 channel_manager->GetSupportedAudioRtpHeaderExtensions(&audio_rtp_extensions_);
1257 channel_manager->GetSupportedVideoCodecs(&video_codecs_); 1264 channel_manager->GetSupportedVideoCodecs(&video_codecs_);
1258 channel_manager->GetSupportedVideoRtpHeaderExtensions(&video_rtp_extensions_); 1265 channel_manager->GetSupportedVideoRtpHeaderExtensions(&video_rtp_extensions_);
1259 channel_manager->GetSupportedDataCodecs(&data_codecs_); 1266 channel_manager->GetSupportedDataCodecs(&data_codecs_);
1260 audio_send_codecs_ = audio_sendrecv_codecs_; 1267 audio_sendrecv_codecs_ =
1261 audio_recv_codecs_ = audio_sendrecv_codecs_; 1268 MergeAudioCodecLists(audio_send_codecs_, audio_recv_codecs_);
1262 } 1269 }
1263 1270
1264 const AudioCodecs& MediaSessionDescriptionFactory::audio_codecs() const { 1271 const AudioCodecs& MediaSessionDescriptionFactory::audio_codecs() const {
pthatcher1 2016/05/31 18:26:48 I don't think this is called by anything except on
ossu 2016/06/01 08:34:12 Good call! Will do that.
1265 return audio_sendrecv_codecs_; 1272 return audio_sendrecv_codecs_;
1266 } 1273 }
1267 1274
1268 const AudioCodecs& MediaSessionDescriptionFactory::audio_send_codecs() const { 1275 const AudioCodecs& MediaSessionDescriptionFactory::audio_send_codecs() const {
1269 return audio_send_codecs_; 1276 return audio_send_codecs_;
1270 } 1277 }
1271 1278
1272 const AudioCodecs& MediaSessionDescriptionFactory::audio_recv_codecs() const { 1279 const AudioCodecs& MediaSessionDescriptionFactory::audio_recv_codecs() const {
1273 return audio_recv_codecs_; 1280 return audio_recv_codecs_;
1274 } 1281 }
1275 1282
1276 void MediaSessionDescriptionFactory::set_audio_codecs( 1283 void MediaSessionDescriptionFactory::set_audio_codecs(
1277 const AudioCodecs& send_and_recv_codecs) { 1284 const AudioCodecs& send_and_recv_codecs) {
1278 audio_send_codecs_ = send_and_recv_codecs; 1285 audio_send_codecs_ = send_and_recv_codecs;
1279 audio_recv_codecs_ = send_and_recv_codecs; 1286 audio_recv_codecs_ = send_and_recv_codecs;
1280 audio_sendrecv_codecs_ = send_and_recv_codecs; 1287 audio_sendrecv_codecs_ = send_and_recv_codecs;
1281 } 1288 }
1282 1289
1283 void MediaSessionDescriptionFactory::set_audio_codecs( 1290 void MediaSessionDescriptionFactory::set_audio_codecs(
1284 const AudioCodecs& send_codecs, const AudioCodecs& recv_codecs) { 1291 const AudioCodecs& send_codecs, const AudioCodecs& recv_codecs) {
1285 audio_send_codecs_ = send_codecs; 1292 audio_send_codecs_ = send_codecs;
1286 audio_recv_codecs_ = recv_codecs; 1293 audio_recv_codecs_ = recv_codecs;
1287 audio_sendrecv_codecs_.clear(); 1294 audio_sendrecv_codecs_ =
1288 1295 MergeAudioCodecLists(audio_send_codecs_, audio_recv_codecs_);
1289 // Intersect the two lists of codecs, preserving the order of the send codecs.
1290 // If there's any difference in priorities, chances are encoding is more
1291 // expensive than decoding, and high-priority send codecs are likely handled
1292 // better (e.g. through hardware encoder support) than low-priority ones.
1293 // TODO(ossu): This is O(n^2). However, each list should generally be small
1294 // enough for this to not be a problem. They are also nicely local in memory
1295 // like this.
1296 for (const auto& sc : audio_send_codecs_) {
1297 for (const auto& rc : audio_recv_codecs_) {
1298 const size_t send_channels = (sc.channels == 0) ? 1 : sc.channels;
1299 const size_t recv_channels = (rc.channels == 0) ? 1 : rc.channels;
1300 if (sc.clockrate == rc.clockrate &&
1301 sc.bitrate == rc.bitrate &&
1302 send_channels == recv_channels &&
1303 (_stricmp(sc.name.c_str(), rc.name.c_str()) == 0) &&
1304 sc.params == rc.params &&
1305 sc.feedback_params == rc.feedback_params) {
1306 AudioCodec out_codec = sc;
1307 out_codec.channels = send_channels;
1308 audio_sendrecv_codecs_.push_back(out_codec);
1309 break;
1310 }
1311 }
1312 }
1313 } 1296 }
1314 1297
1315 SessionDescription* MediaSessionDescriptionFactory::CreateOffer( 1298 SessionDescription* MediaSessionDescriptionFactory::CreateOffer(
1316 const MediaSessionOptions& options, 1299 const MediaSessionOptions& options,
1317 const SessionDescription* current_description) const { 1300 const SessionDescription* current_description) const {
1318 std::unique_ptr<SessionDescription> offer(new SessionDescription()); 1301 std::unique_ptr<SessionDescription> offer(new SessionDescription());
1319 1302
1320 StreamParamsVec current_streams; 1303 StreamParamsVec current_streams;
1321 GetCurrentStreamParams(current_description, &current_streams); 1304 GetCurrentStreamParams(current_description, &current_streams);
1322 1305
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
2108 return static_cast<const VideoContentDescription*>( 2091 return static_cast<const VideoContentDescription*>(
2109 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO)); 2092 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO));
2110 } 2093 }
2111 2094
2112 const DataContentDescription* GetFirstDataContentDescription( 2095 const DataContentDescription* GetFirstDataContentDescription(
2113 const SessionDescription* sdesc) { 2096 const SessionDescription* sdesc) {
2114 return static_cast<const DataContentDescription*>( 2097 return static_cast<const DataContentDescription*>(
2115 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA)); 2098 GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA));
2116 } 2099 }
2117 2100
2101 namespace {
2102 std::vector<AudioCodec> MergeAudioCodecLists(
pthatcher1 2016/05/31 18:26:48 Can you call this MergeSendRecvCodecs?
ossu 2016/06/01 08:34:12 Sure thing!
2103 const std::vector<AudioCodec>& send_codecs,
2104 const std::vector<AudioCodec>& recv_codecs) {
2105 std::vector<AudioCodec> merged;
2106 // Intersect the two lists of codecs, preserving the order of the send codecs.
2107 // If there's any difference in priorities, chances are encoding is more
2108 // expensive than decoding, and high-priority send codecs are likely handled
2109 // better (e.g. through hardware encoder support) than low-priority ones.
2110 // TODO(ossu): This is O(n^2). However, each list should generally be small
2111 // enough for this to not be a problem. They are also nicely local in memory
2112 // like this.
2113 for (const auto& sc : send_codecs) {
2114 for (const auto& rc : recv_codecs) {
2115 const size_t send_channels = (sc.channels == 0) ? 1 : sc.channels;
2116 const size_t recv_channels = (rc.channels == 0) ? 1 : rc.channels;
2117 if (sc.clockrate == rc.clockrate && sc.bitrate == rc.bitrate &&
ossu 2016/05/26 14:18:50 This got clang-formatted. I'll put it back to one
2118 send_channels == recv_channels &&
2119 (_stricmp(sc.name.c_str(), rc.name.c_str()) == 0) &&
2120 sc.params == rc.params && sc.feedback_params == rc.feedback_params) {
2121 AudioCodec out_codec = sc;
2122 out_codec.channels = send_channels;
2123 merged.push_back(out_codec);
2124 break;
2125 }
2126 }
2127 }
2128
2129 return merged;
2130 }
2131 }
2132
2118 } // namespace cricket 2133 } // namespace cricket
OLDNEW
« webrtc/pc/channelmanager.h ('K') | « webrtc/pc/channelmanager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698