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

Side by Side Diff: talk/app/webrtc/peerconnectioninterface_unittest.cc

Issue 1403173002: Don't create remote streams if m-line direction doesn't include "send". (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 5 years, 2 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
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2012 Google Inc. 3 * Copyright 2012 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 static const char kTurnIceServerUri[] = "turn:user@turn.example.org"; 64 static const char kTurnIceServerUri[] = "turn:user@turn.example.org";
65 static const char kTurnUsername[] = "user"; 65 static const char kTurnUsername[] = "user";
66 static const char kTurnPassword[] = "password"; 66 static const char kTurnPassword[] = "password";
67 static const char kTurnHostname[] = "turn.example.org"; 67 static const char kTurnHostname[] = "turn.example.org";
68 static const uint32_t kTimeout = 10000U; 68 static const uint32_t kTimeout = 10000U;
69 69
70 static const char kStreams[][8] = {"stream1", "stream2"}; 70 static const char kStreams[][8] = {"stream1", "stream2"};
71 static const char kAudioTracks[][32] = {"audiotrack0", "audiotrack1"}; 71 static const char kAudioTracks[][32] = {"audiotrack0", "audiotrack1"};
72 static const char kVideoTracks[][32] = {"videotrack0", "videotrack1"}; 72 static const char kVideoTracks[][32] = {"videotrack0", "videotrack1"};
73 73
74 static const char kRecvonly[] = "recvonly";
75 static const char kSendrecv[] = "sendrecv";
76
74 // Reference SDP with a MediaStream with label "stream1" and audio track with 77 // Reference SDP with a MediaStream with label "stream1" and audio track with
75 // id "audio_1" and a video track with id "video_1; 78 // id "audio_1" and a video track with id "video_1;
76 static const char kSdpStringWithStream1[] = 79 static const char kSdpStringWithStream1[] =
77 "v=0\r\n" 80 "v=0\r\n"
78 "o=- 0 0 IN IP4 127.0.0.1\r\n" 81 "o=- 0 0 IN IP4 127.0.0.1\r\n"
79 "s=-\r\n" 82 "s=-\r\n"
80 "t=0 0\r\n" 83 "t=0 0\r\n"
81 "a=ice-ufrag:e5785931\r\n" 84 "a=ice-ufrag:e5785931\r\n"
82 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 85 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
83 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 86 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
84 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 87 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
85 "m=audio 1 RTP/AVPF 103\r\n" 88 "m=audio 1 RTP/AVPF 103\r\n"
86 "a=mid:audio\r\n" 89 "a=mid:audio\r\n"
90 "a=sendrecv\r\n"
87 "a=rtpmap:103 ISAC/16000\r\n" 91 "a=rtpmap:103 ISAC/16000\r\n"
88 "a=ssrc:1 cname:stream1\r\n" 92 "a=ssrc:1 cname:stream1\r\n"
89 "a=ssrc:1 mslabel:stream1\r\n" 93 "a=ssrc:1 mslabel:stream1\r\n"
90 "a=ssrc:1 label:audiotrack0\r\n" 94 "a=ssrc:1 label:audiotrack0\r\n"
91 "m=video 1 RTP/AVPF 120\r\n" 95 "m=video 1 RTP/AVPF 120\r\n"
92 "a=mid:video\r\n" 96 "a=mid:video\r\n"
97 "a=sendrecv\r\n"
93 "a=rtpmap:120 VP8/90000\r\n" 98 "a=rtpmap:120 VP8/90000\r\n"
94 "a=ssrc:2 cname:stream1\r\n" 99 "a=ssrc:2 cname:stream1\r\n"
95 "a=ssrc:2 mslabel:stream1\r\n" 100 "a=ssrc:2 mslabel:stream1\r\n"
96 "a=ssrc:2 label:videotrack0\r\n"; 101 "a=ssrc:2 label:videotrack0\r\n";
97 102
98 // Reference SDP with two MediaStreams with label "stream1" and "stream2. Each 103 // Reference SDP with two MediaStreams with label "stream1" and "stream2. Each
99 // MediaStreams have one audio track and one video track. 104 // MediaStreams have one audio track and one video track.
100 // This uses MSID. 105 // This uses MSID.
101 static const char kSdpStringWithStream1And2[] = 106 static const char kSdpStringWithStream1And2[] =
102 "v=0\r\n" 107 "v=0\r\n"
103 "o=- 0 0 IN IP4 127.0.0.1\r\n" 108 "o=- 0 0 IN IP4 127.0.0.1\r\n"
104 "s=-\r\n" 109 "s=-\r\n"
105 "t=0 0\r\n" 110 "t=0 0\r\n"
106 "a=ice-ufrag:e5785931\r\n" 111 "a=ice-ufrag:e5785931\r\n"
107 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 112 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
108 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 113 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
109 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 114 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
110 "a=msid-semantic: WMS stream1 stream2\r\n" 115 "a=msid-semantic: WMS stream1 stream2\r\n"
111 "m=audio 1 RTP/AVPF 103\r\n" 116 "m=audio 1 RTP/AVPF 103\r\n"
112 "a=mid:audio\r\n" 117 "a=mid:audio\r\n"
118 "a=sendrecv\r\n"
113 "a=rtpmap:103 ISAC/16000\r\n" 119 "a=rtpmap:103 ISAC/16000\r\n"
114 "a=ssrc:1 cname:stream1\r\n" 120 "a=ssrc:1 cname:stream1\r\n"
115 "a=ssrc:1 msid:stream1 audiotrack0\r\n" 121 "a=ssrc:1 msid:stream1 audiotrack0\r\n"
116 "a=ssrc:3 cname:stream2\r\n" 122 "a=ssrc:3 cname:stream2\r\n"
117 "a=ssrc:3 msid:stream2 audiotrack1\r\n" 123 "a=ssrc:3 msid:stream2 audiotrack1\r\n"
118 "m=video 1 RTP/AVPF 120\r\n" 124 "m=video 1 RTP/AVPF 120\r\n"
119 "a=mid:video\r\n" 125 "a=mid:video\r\n"
126 "a=sendrecv\r\n"
120 "a=rtpmap:120 VP8/0\r\n" 127 "a=rtpmap:120 VP8/0\r\n"
121 "a=ssrc:2 cname:stream1\r\n" 128 "a=ssrc:2 cname:stream1\r\n"
122 "a=ssrc:2 msid:stream1 videotrack0\r\n" 129 "a=ssrc:2 msid:stream1 videotrack0\r\n"
123 "a=ssrc:4 cname:stream2\r\n" 130 "a=ssrc:4 cname:stream2\r\n"
124 "a=ssrc:4 msid:stream2 videotrack1\r\n"; 131 "a=ssrc:4 msid:stream2 videotrack1\r\n";
125 132
126 // Reference SDP without MediaStreams. Msid is not supported. 133 // Reference SDP without MediaStreams. Msid is not supported.
127 static const char kSdpStringWithoutStreams[] = 134 static const char kSdpStringWithoutStreams[] =
128 "v=0\r\n" 135 "v=0\r\n"
129 "o=- 0 0 IN IP4 127.0.0.1\r\n" 136 "o=- 0 0 IN IP4 127.0.0.1\r\n"
130 "s=-\r\n" 137 "s=-\r\n"
131 "t=0 0\r\n" 138 "t=0 0\r\n"
132 "a=ice-ufrag:e5785931\r\n" 139 "a=ice-ufrag:e5785931\r\n"
133 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 140 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
134 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 141 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
135 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 142 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
136 "m=audio 1 RTP/AVPF 103\r\n" 143 "m=audio 1 RTP/AVPF 103\r\n"
137 "a=mid:audio\r\n" 144 "a=mid:audio\r\n"
145 "a=sendrecv\r\n"
138 "a=rtpmap:103 ISAC/16000\r\n" 146 "a=rtpmap:103 ISAC/16000\r\n"
139 "m=video 1 RTP/AVPF 120\r\n" 147 "m=video 1 RTP/AVPF 120\r\n"
140 "a=mid:video\r\n" 148 "a=mid:video\r\n"
149 "a=sendrecv\r\n"
141 "a=rtpmap:120 VP8/90000\r\n"; 150 "a=rtpmap:120 VP8/90000\r\n";
142 151
143 // Reference SDP without MediaStreams. Msid is supported. 152 // Reference SDP without MediaStreams. Msid is supported.
144 static const char kSdpStringWithMsidWithoutStreams[] = 153 static const char kSdpStringWithMsidWithoutStreams[] =
145 "v=0\r\n" 154 "v=0\r\n"
146 "o=- 0 0 IN IP4 127.0.0.1\r\n" 155 "o=- 0 0 IN IP4 127.0.0.1\r\n"
147 "s=-\r\n" 156 "s=-\r\n"
148 "t=0 0\r\n" 157 "t=0 0\r\n"
149 "a=ice-ufrag:e5785931\r\n" 158 "a=ice-ufrag:e5785931\r\n"
150 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 159 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
151 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 160 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
152 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 161 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
153 "a=msid-semantic: WMS\r\n" 162 "a=msid-semantic: WMS\r\n"
154 "m=audio 1 RTP/AVPF 103\r\n" 163 "m=audio 1 RTP/AVPF 103\r\n"
155 "a=mid:audio\r\n" 164 "a=mid:audio\r\n"
165 "a=sendrecv\r\n"
156 "a=rtpmap:103 ISAC/16000\r\n" 166 "a=rtpmap:103 ISAC/16000\r\n"
157 "m=video 1 RTP/AVPF 120\r\n" 167 "m=video 1 RTP/AVPF 120\r\n"
158 "a=mid:video\r\n" 168 "a=mid:video\r\n"
169 "a=sendrecv\r\n"
159 "a=rtpmap:120 VP8/90000\r\n"; 170 "a=rtpmap:120 VP8/90000\r\n";
160 171
161 // Reference SDP without MediaStreams and audio only. 172 // Reference SDP without MediaStreams and audio only.
162 static const char kSdpStringWithoutStreamsAudioOnly[] = 173 static const char kSdpStringWithoutStreamsAudioOnly[] =
163 "v=0\r\n" 174 "v=0\r\n"
164 "o=- 0 0 IN IP4 127.0.0.1\r\n" 175 "o=- 0 0 IN IP4 127.0.0.1\r\n"
165 "s=-\r\n" 176 "s=-\r\n"
166 "t=0 0\r\n" 177 "t=0 0\r\n"
167 "a=ice-ufrag:e5785931\r\n" 178 "a=ice-ufrag:e5785931\r\n"
168 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 179 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
169 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 180 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
170 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 181 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
171 "m=audio 1 RTP/AVPF 103\r\n" 182 "m=audio 1 RTP/AVPF 103\r\n"
172 "a=mid:audio\r\n" 183 "a=mid:audio\r\n"
184 "a=sendrecv\r\n"
173 "a=rtpmap:103 ISAC/16000\r\n"; 185 "a=rtpmap:103 ISAC/16000\r\n";
174 186
175 // Reference SENDONLY SDP without MediaStreams. Msid is not supported. 187 // Reference SENDONLY SDP without MediaStreams. Msid is not supported.
176 static const char kSdpStringSendOnlyWithoutStreams[] = 188 static const char kSdpStringSendOnlyWithoutStreams[] =
177 "v=0\r\n" 189 "v=0\r\n"
178 "o=- 0 0 IN IP4 127.0.0.1\r\n" 190 "o=- 0 0 IN IP4 127.0.0.1\r\n"
179 "s=-\r\n" 191 "s=-\r\n"
180 "t=0 0\r\n" 192 "t=0 0\r\n"
181 "a=ice-ufrag:e5785931\r\n" 193 "a=ice-ufrag:e5785931\r\n"
182 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 194 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
183 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 195 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
184 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 196 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
185 "m=audio 1 RTP/AVPF 103\r\n" 197 "m=audio 1 RTP/AVPF 103\r\n"
186 "a=mid:audio\r\n" 198 "a=mid:audio\r\n"
199 "a=sendrecv\r\n"
187 "a=sendonly\r\n" 200 "a=sendonly\r\n"
188 "a=rtpmap:103 ISAC/16000\r\n" 201 "a=rtpmap:103 ISAC/16000\r\n"
189 "m=video 1 RTP/AVPF 120\r\n" 202 "m=video 1 RTP/AVPF 120\r\n"
190 "a=mid:video\r\n" 203 "a=mid:video\r\n"
204 "a=sendrecv\r\n"
191 "a=sendonly\r\n" 205 "a=sendonly\r\n"
192 "a=rtpmap:120 VP8/90000\r\n"; 206 "a=rtpmap:120 VP8/90000\r\n";
193 207
194 static const char kSdpStringInit[] = 208 static const char kSdpStringInit[] =
195 "v=0\r\n" 209 "v=0\r\n"
196 "o=- 0 0 IN IP4 127.0.0.1\r\n" 210 "o=- 0 0 IN IP4 127.0.0.1\r\n"
197 "s=-\r\n" 211 "s=-\r\n"
198 "t=0 0\r\n" 212 "t=0 0\r\n"
199 "a=ice-ufrag:e5785931\r\n" 213 "a=ice-ufrag:e5785931\r\n"
200 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n" 214 "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
201 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:" 215 "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
202 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n" 216 "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
203 "a=msid-semantic: WMS\r\n"; 217 "a=msid-semantic: WMS\r\n";
204 218
205 static const char kSdpStringAudio[] = 219 static const char kSdpStringAudio[] =
206 "m=audio 1 RTP/AVPF 103\r\n" 220 "m=audio 1 RTP/AVPF 103\r\n"
207 "a=mid:audio\r\n" 221 "a=mid:audio\r\n"
222 "a=sendrecv\r\n"
208 "a=rtpmap:103 ISAC/16000\r\n"; 223 "a=rtpmap:103 ISAC/16000\r\n";
209 224
210 static const char kSdpStringVideo[] = 225 static const char kSdpStringVideo[] =
211 "m=video 1 RTP/AVPF 120\r\n" 226 "m=video 1 RTP/AVPF 120\r\n"
212 "a=mid:video\r\n" 227 "a=mid:video\r\n"
228 "a=sendrecv\r\n"
213 "a=rtpmap:120 VP8/90000\r\n"; 229 "a=rtpmap:120 VP8/90000\r\n";
214 230
215 static const char kSdpStringMs1Audio0[] = 231 static const char kSdpStringMs1Audio0[] =
216 "a=ssrc:1 cname:stream1\r\n" 232 "a=ssrc:1 cname:stream1\r\n"
217 "a=ssrc:1 msid:stream1 audiotrack0\r\n"; 233 "a=ssrc:1 msid:stream1 audiotrack0\r\n";
218 234
219 static const char kSdpStringMs1Video0[] = 235 static const char kSdpStringMs1Video0[] =
220 "a=ssrc:2 cname:stream1\r\n" 236 "a=ssrc:2 cname:stream1\r\n"
221 "a=ssrc:2 msid:stream1 videotrack0\r\n"; 237 "a=ssrc:2 msid:stream1 videotrack0\r\n";
222 238
(...skipping 1553 matching lines...) Expand 10 before | Expand all | Expand 10 after
1776 local_answer->description()->GetContentByName("video"); 1792 local_answer->description()->GetContentByName("video");
1777 video_info->rejected = true; 1793 video_info->rejected = true;
1778 cricket::ContentInfo* audio_info = 1794 cricket::ContentInfo* audio_info =
1779 local_answer->description()->GetContentByName("audio"); 1795 local_answer->description()->GetContentByName("audio");
1780 audio_info->rejected = true; 1796 audio_info->rejected = true;
1781 EXPECT_TRUE(DoSetLocalDescription(local_answer.release())); 1797 EXPECT_TRUE(DoSetLocalDescription(local_answer.release()));
1782 1798
1783 // No crash is a pass. 1799 // No crash is a pass.
1784 } 1800 }
1785 1801
1802 // This tests that if a recvonly remote description is set, no remote streams
1803 // will be created, even if the description contains SSRCs/MSIDs.
1804 // See: https://code.google.com/p/webrtc/issues/detail?id=5054
1805 TEST_F(PeerConnectionInterfaceTest, RecvonlyDescriptionDoesntCreateStream) {
1806 FakeConstraints constraints;
1807 constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
1808 true);
1809 CreatePeerConnection(&constraints);
1810
1811 std::string recvonly_offer = kSdpStringWithStream1;
1812 rtc::replace_substrs(kSendrecv, strlen(kSendrecv), kRecvonly,
1813 strlen(kRecvonly), &recvonly_offer);
1814 CreateAndSetRemoteOffer(recvonly_offer);
1815
1816 EXPECT_EQ(0u, observer_.remote_streams()->count());
1817 }
1818
1786 // This tests that a default MediaStream is created if a remote session 1819 // This tests that a default MediaStream is created if a remote session
1787 // description doesn't contain any streams and no MSID support. 1820 // description doesn't contain any streams and no MSID support.
1788 // It also tests that the default stream is updated if a video m-line is added 1821 // It also tests that the default stream is updated if a video m-line is added
1789 // in a subsequent session description. 1822 // in a subsequent session description.
1790 TEST_F(PeerConnectionInterfaceTest, SdpWithoutMsidCreatesDefaultStream) { 1823 TEST_F(PeerConnectionInterfaceTest, SdpWithoutMsidCreatesDefaultStream) {
1791 FakeConstraints constraints; 1824 FakeConstraints constraints;
1792 constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, 1825 constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
1793 true); 1826 true);
1794 CreatePeerConnection(&constraints); 1827 CreatePeerConnection(&constraints);
1795 CreateAndSetRemoteOffer(kSdpStringWithoutStreamsAudioOnly); 1828 CreateAndSetRemoteOffer(kSdpStringWithoutStreamsAudioOnly);
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
2209 EXPECT_TRUE(updated_answer_options.has_video()); 2242 EXPECT_TRUE(updated_answer_options.has_video());
2210 2243
2211 RTCOfferAnswerOptions default_rtc_options; 2244 RTCOfferAnswerOptions default_rtc_options;
2212 EXPECT_TRUE( 2245 EXPECT_TRUE(
2213 ConvertRtcOptionsForOffer(default_rtc_options, &updated_offer_options)); 2246 ConvertRtcOptionsForOffer(default_rtc_options, &updated_offer_options));
2214 // By default, |has_audio| or |has_video| are false if there is no media 2247 // By default, |has_audio| or |has_video| are false if there is no media
2215 // track. 2248 // track.
2216 EXPECT_FALSE(updated_offer_options.has_audio()); 2249 EXPECT_FALSE(updated_offer_options.has_audio());
2217 EXPECT_FALSE(updated_offer_options.has_video()); 2250 EXPECT_FALSE(updated_offer_options.has_video());
2218 } 2251 }
OLDNEW
« talk/app/webrtc/peerconnection.cc ('K') | « talk/app/webrtc/peerconnection.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698