OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 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 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 // Parse the protobuf event from the buffer. | 195 // Parse the protobuf event from the buffer. |
196 rtclog::Event event; | 196 rtclog::Event event; |
197 if (!event.ParseFromArray(tmp_buffer.data(), message_length)) { | 197 if (!event.ParseFromArray(tmp_buffer.data(), message_length)) { |
198 LOG(LS_WARNING) << "Failed to parse protobuf message."; | 198 LOG(LS_WARNING) << "Failed to parse protobuf message."; |
199 return false; | 199 return false; |
200 } | 200 } |
201 | 201 |
202 EventType type = GetRuntimeEventType(event.type()); | 202 EventType type = GetRuntimeEventType(event.type()); |
203 switch (type) { | 203 switch (type) { |
204 case VIDEO_RECEIVER_CONFIG_EVENT: { | 204 case VIDEO_RECEIVER_CONFIG_EVENT: { |
205 rtclog::StreamConfig config; | 205 rtclog::StreamConfig config = GetVideoReceiveConfig(event); |
206 GetVideoReceiveConfig(event, &config); | |
207 streams_.emplace_back(config.remote_ssrc, MediaType::VIDEO, | 206 streams_.emplace_back(config.remote_ssrc, MediaType::VIDEO, |
208 kIncomingPacket); | 207 kIncomingPacket); |
209 streams_.emplace_back(config.local_ssrc, MediaType::VIDEO, | 208 streams_.emplace_back(config.local_ssrc, MediaType::VIDEO, |
210 kOutgoingPacket); | 209 kOutgoingPacket); |
211 break; | 210 break; |
212 } | 211 } |
213 case VIDEO_SENDER_CONFIG_EVENT: { | 212 case VIDEO_SENDER_CONFIG_EVENT: { |
214 rtclog::StreamConfig config; | 213 std::vector<rtclog::StreamConfig> configs = GetVideoSendConfig(event); |
215 GetVideoSendConfig(event, &config); | 214 for (size_t i = 0; i < configs.size(); i++) { |
216 streams_.emplace_back(config.local_ssrc, MediaType::VIDEO, | 215 streams_.emplace_back(configs[i].local_ssrc, MediaType::VIDEO, |
217 kOutgoingPacket); | 216 kOutgoingPacket); |
218 | 217 |
219 streams_.emplace_back(config.rtx_ssrc, MediaType::VIDEO, | 218 streams_.emplace_back(configs[i].rtx_ssrc, MediaType::VIDEO, |
220 kOutgoingPacket); | 219 kOutgoingPacket); |
| 220 } |
221 break; | 221 break; |
222 } | 222 } |
223 case AUDIO_RECEIVER_CONFIG_EVENT: { | 223 case AUDIO_RECEIVER_CONFIG_EVENT: { |
224 rtclog::StreamConfig config; | 224 rtclog::StreamConfig config = GetAudioReceiveConfig(event); |
225 GetAudioReceiveConfig(event, &config); | |
226 streams_.emplace_back(config.remote_ssrc, MediaType::AUDIO, | 225 streams_.emplace_back(config.remote_ssrc, MediaType::AUDIO, |
227 kIncomingPacket); | 226 kIncomingPacket); |
228 streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, | 227 streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, |
229 kOutgoingPacket); | 228 kOutgoingPacket); |
230 break; | 229 break; |
231 } | 230 } |
232 case AUDIO_SENDER_CONFIG_EVENT: { | 231 case AUDIO_SENDER_CONFIG_EVENT: { |
233 rtclog::StreamConfig config; | 232 rtclog::StreamConfig config = GetAudioSendConfig(event); |
234 GetAudioSendConfig(event, &config); | |
235 streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, | 233 streams_.emplace_back(config.local_ssrc, MediaType::AUDIO, |
236 kOutgoingPacket); | 234 kOutgoingPacket); |
237 break; | 235 break; |
238 } | 236 } |
239 default: | 237 default: |
240 break; | 238 break; |
241 } | 239 } |
242 | 240 |
243 events_.push_back(event); | 241 events_.push_back(event); |
244 } | 242 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 } | 321 } |
324 // Get packet contents. | 322 // Get packet contents. |
325 if (packet != nullptr) { | 323 if (packet != nullptr) { |
326 RTC_CHECK_LE(rtcp_packet.packet_data().size(), | 324 RTC_CHECK_LE(rtcp_packet.packet_data().size(), |
327 static_cast<unsigned>(IP_PACKET_SIZE)); | 325 static_cast<unsigned>(IP_PACKET_SIZE)); |
328 memcpy(packet, rtcp_packet.packet_data().data(), | 326 memcpy(packet, rtcp_packet.packet_data().data(), |
329 rtcp_packet.packet_data().size()); | 327 rtcp_packet.packet_data().size()); |
330 } | 328 } |
331 } | 329 } |
332 | 330 |
333 void ParsedRtcEventLog::GetVideoReceiveConfig( | 331 rtclog::StreamConfig ParsedRtcEventLog::GetVideoReceiveConfig( |
334 size_t index, | 332 size_t index) const { |
335 rtclog::StreamConfig* config) const { | |
336 RTC_CHECK_LT(index, GetNumberOfEvents()); | 333 RTC_CHECK_LT(index, GetNumberOfEvents()); |
337 GetVideoReceiveConfig(events_[index], config); | 334 return GetVideoReceiveConfig(events_[index]); |
338 } | 335 } |
339 | 336 |
340 void ParsedRtcEventLog::GetVideoReceiveConfig( | 337 rtclog::StreamConfig ParsedRtcEventLog::GetVideoReceiveConfig( |
341 const rtclog::Event& event, | 338 const rtclog::Event& event) const { |
342 rtclog::StreamConfig* config) const { | 339 rtclog::StreamConfig config; |
343 RTC_CHECK(config != nullptr); | |
344 RTC_CHECK(event.has_type()); | 340 RTC_CHECK(event.has_type()); |
345 RTC_CHECK_EQ(event.type(), rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT); | 341 RTC_CHECK_EQ(event.type(), rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT); |
346 RTC_CHECK(event.has_video_receiver_config()); | 342 RTC_CHECK(event.has_video_receiver_config()); |
347 const rtclog::VideoReceiveConfig& receiver_config = | 343 const rtclog::VideoReceiveConfig& receiver_config = |
348 event.video_receiver_config(); | 344 event.video_receiver_config(); |
349 // Get SSRCs. | 345 // Get SSRCs. |
350 RTC_CHECK(receiver_config.has_remote_ssrc()); | 346 RTC_CHECK(receiver_config.has_remote_ssrc()); |
351 config->remote_ssrc = receiver_config.remote_ssrc(); | 347 config.remote_ssrc = receiver_config.remote_ssrc(); |
352 RTC_CHECK(receiver_config.has_local_ssrc()); | 348 RTC_CHECK(receiver_config.has_local_ssrc()); |
353 config->local_ssrc = receiver_config.local_ssrc(); | 349 config.local_ssrc = receiver_config.local_ssrc(); |
354 config->rtx_ssrc = 0; | 350 config.rtx_ssrc = 0; |
355 // Get RTCP settings. | 351 // Get RTCP settings. |
356 RTC_CHECK(receiver_config.has_rtcp_mode()); | 352 RTC_CHECK(receiver_config.has_rtcp_mode()); |
357 config->rtcp_mode = GetRuntimeRtcpMode(receiver_config.rtcp_mode()); | 353 config.rtcp_mode = GetRuntimeRtcpMode(receiver_config.rtcp_mode()); |
358 RTC_CHECK(receiver_config.has_remb()); | 354 RTC_CHECK(receiver_config.has_remb()); |
359 config->remb = receiver_config.remb(); | 355 config.remb = receiver_config.remb(); |
360 | 356 |
361 // Get RTX map. | 357 // Get RTX map. |
362 std::map<uint32_t, const rtclog::RtxConfig> rtx_map; | 358 std::map<uint32_t, const rtclog::RtxConfig> rtx_map; |
363 for (int i = 0; i < receiver_config.rtx_map_size(); i++) { | 359 for (int i = 0; i < receiver_config.rtx_map_size(); i++) { |
364 const rtclog::RtxMap& map = receiver_config.rtx_map(i); | 360 const rtclog::RtxMap& map = receiver_config.rtx_map(i); |
365 RTC_CHECK(map.has_payload_type()); | 361 RTC_CHECK(map.has_payload_type()); |
366 RTC_CHECK(map.has_config()); | 362 RTC_CHECK(map.has_config()); |
367 RTC_CHECK(map.config().has_rtx_ssrc()); | 363 RTC_CHECK(map.config().has_rtx_ssrc()); |
368 RTC_CHECK(map.config().has_rtx_payload_type()); | 364 RTC_CHECK(map.config().has_rtx_payload_type()); |
369 rtx_map.insert(std::make_pair(map.payload_type(), map.config())); | 365 rtx_map.insert(std::make_pair(map.payload_type(), map.config())); |
370 } | 366 } |
371 | 367 |
372 // Get header extensions. | 368 // Get header extensions. |
373 GetHeaderExtensions(&config->rtp_extensions, | 369 GetHeaderExtensions(&config.rtp_extensions, |
374 receiver_config.header_extensions()); | 370 receiver_config.header_extensions()); |
375 // Get decoders. | 371 // Get decoders. |
376 config->codecs.clear(); | 372 config.codecs.clear(); |
377 for (int i = 0; i < receiver_config.decoders_size(); i++) { | 373 for (int i = 0; i < receiver_config.decoders_size(); i++) { |
378 RTC_CHECK(receiver_config.decoders(i).has_name()); | 374 RTC_CHECK(receiver_config.decoders(i).has_name()); |
379 RTC_CHECK(receiver_config.decoders(i).has_payload_type()); | 375 RTC_CHECK(receiver_config.decoders(i).has_payload_type()); |
380 int rtx_payload_type = 0; | 376 int rtx_payload_type = 0; |
381 auto rtx_it = rtx_map.find(receiver_config.decoders(i).payload_type()); | 377 auto rtx_it = rtx_map.find(receiver_config.decoders(i).payload_type()); |
382 if (rtx_it != rtx_map.end()) { | 378 if (rtx_it != rtx_map.end()) { |
383 rtx_payload_type = rtx_it->second.rtx_payload_type(); | 379 rtx_payload_type = rtx_it->second.rtx_payload_type(); |
384 if (config->rtx_ssrc != 0 && | 380 if (config.rtx_ssrc != 0 && |
385 config->rtx_ssrc != rtx_it->second.rtx_ssrc()) { | 381 config.rtx_ssrc != rtx_it->second.rtx_ssrc()) { |
386 LOG(LS_WARNING) | 382 LOG(LS_WARNING) |
387 << "RtcEventLog protobuf contained different SSRCs for " | 383 << "RtcEventLog protobuf contained different SSRCs for " |
388 "different received RTX payload types. Will only use " | 384 "different received RTX payload types. Will only use " |
389 "rtx_ssrc = " | 385 "rtx_ssrc = " |
390 << config->rtx_ssrc << "."; | 386 << config.rtx_ssrc << "."; |
391 } else { | 387 } else { |
392 config->rtx_ssrc = rtx_it->second.rtx_ssrc(); | 388 config.rtx_ssrc = rtx_it->second.rtx_ssrc(); |
393 } | 389 } |
394 } | 390 } |
395 config->codecs.emplace_back(receiver_config.decoders(i).name(), | 391 config.codecs.emplace_back(receiver_config.decoders(i).name(), |
396 receiver_config.decoders(i).payload_type(), | 392 receiver_config.decoders(i).payload_type(), |
397 rtx_payload_type); | 393 rtx_payload_type); |
398 } | 394 } |
| 395 return config; |
399 } | 396 } |
400 | 397 |
401 void ParsedRtcEventLog::GetVideoSendConfig(size_t index, | 398 std::vector<rtclog::StreamConfig> ParsedRtcEventLog::GetVideoSendConfig( |
402 rtclog::StreamConfig* config) const { | 399 size_t index) const { |
403 RTC_CHECK_LT(index, GetNumberOfEvents()); | 400 RTC_CHECK_LT(index, GetNumberOfEvents()); |
404 GetVideoSendConfig(events_[index], config); | 401 return GetVideoSendConfig(events_[index]); |
405 } | 402 } |
406 void ParsedRtcEventLog::GetVideoSendConfig(const rtclog::Event& event, | 403 |
407 rtclog::StreamConfig* config) const { | 404 std::vector<rtclog::StreamConfig> ParsedRtcEventLog::GetVideoSendConfig( |
408 RTC_CHECK(config != nullptr); | 405 const rtclog::Event& event) const { |
| 406 std::vector<rtclog::StreamConfig> configs; |
409 RTC_CHECK(event.has_type()); | 407 RTC_CHECK(event.has_type()); |
410 RTC_CHECK_EQ(event.type(), rtclog::Event::VIDEO_SENDER_CONFIG_EVENT); | 408 RTC_CHECK_EQ(event.type(), rtclog::Event::VIDEO_SENDER_CONFIG_EVENT); |
411 RTC_CHECK(event.has_video_sender_config()); | 409 RTC_CHECK(event.has_video_sender_config()); |
412 const rtclog::VideoSendConfig& sender_config = event.video_sender_config(); | 410 const rtclog::VideoSendConfig& sender_config = event.video_sender_config(); |
413 // Get SSRCs. | 411 if (sender_config.rtx_ssrcs_size() > 0 && |
414 if (sender_config.ssrcs_size() > 0) { | 412 sender_config.ssrcs_size() != sender_config.rtx_ssrcs_size()) { |
415 config->local_ssrc = sender_config.ssrcs(0); | 413 LOG(WARNING) << "VideoSendConfig is configured for RTX but the number of " |
416 if (sender_config.ssrcs().size() > 1) { | 414 "SSRCs doesn't match the number of RTX SSRCs."; |
417 LOG(WARNING) << "VideoSendConfig contains multiple ssrcs."; | 415 } |
| 416 configs.resize(sender_config.ssrcs_size()); |
| 417 for (int i = 0; i < sender_config.ssrcs_size(); i++) { |
| 418 // Get SSRCs. |
| 419 configs[i].local_ssrc = sender_config.ssrcs(i); |
| 420 if (sender_config.rtx_ssrcs_size() > 0 && |
| 421 i < sender_config.rtx_ssrcs_size()) { |
| 422 RTC_CHECK(sender_config.has_rtx_payload_type()); |
| 423 configs[i].rtx_ssrc = sender_config.rtx_ssrcs(i); |
418 } | 424 } |
| 425 // Get header extensions. |
| 426 GetHeaderExtensions(&configs[i].rtp_extensions, |
| 427 sender_config.header_extensions()); |
| 428 |
| 429 // Get the codec. |
| 430 RTC_CHECK(sender_config.has_encoder()); |
| 431 RTC_CHECK(sender_config.encoder().has_name()); |
| 432 RTC_CHECK(sender_config.encoder().has_payload_type()); |
| 433 configs[i].codecs.emplace_back( |
| 434 sender_config.encoder().name(), sender_config.encoder().payload_type(), |
| 435 sender_config.has_rtx_payload_type() ? sender_config.rtx_payload_type() |
| 436 : 0); |
419 } | 437 } |
420 if (sender_config.rtx_ssrcs_size() > 0) { | 438 return configs; |
421 RTC_CHECK(sender_config.has_rtx_payload_type()); | |
422 config->rtx_ssrc = sender_config.rtx_ssrcs(0); | |
423 if (sender_config.rtx_ssrcs_size() > 1) { | |
424 LOG(WARNING) << "VideoSendConfig contains multiple rtx ssrcs."; | |
425 } | |
426 } | |
427 // Get header extensions. | |
428 GetHeaderExtensions(&config->rtp_extensions, | |
429 sender_config.header_extensions()); | |
430 | |
431 // Get the codec. | |
432 RTC_CHECK(sender_config.has_encoder()); | |
433 RTC_CHECK(sender_config.encoder().has_name()); | |
434 RTC_CHECK(sender_config.encoder().has_payload_type()); | |
435 config->codecs.emplace_back( | |
436 sender_config.encoder().name(), sender_config.encoder().payload_type(), | |
437 sender_config.has_rtx_payload_type() ? sender_config.rtx_payload_type() | |
438 : 0); | |
439 } | 439 } |
440 | 440 |
441 void ParsedRtcEventLog::GetAudioReceiveConfig( | 441 rtclog::StreamConfig ParsedRtcEventLog::GetAudioReceiveConfig( |
442 size_t index, | 442 size_t index) const { |
443 rtclog::StreamConfig* config) const { | |
444 RTC_CHECK_LT(index, GetNumberOfEvents()); | 443 RTC_CHECK_LT(index, GetNumberOfEvents()); |
445 GetAudioReceiveConfig(events_[index], config); | 444 return GetAudioReceiveConfig(events_[index]); |
446 } | 445 } |
447 | 446 |
448 void ParsedRtcEventLog::GetAudioReceiveConfig( | 447 rtclog::StreamConfig ParsedRtcEventLog::GetAudioReceiveConfig( |
449 const rtclog::Event& event, | 448 const rtclog::Event& event) const { |
450 rtclog::StreamConfig* config) const { | 449 rtclog::StreamConfig config; |
451 RTC_CHECK(config != nullptr); | |
452 RTC_CHECK(event.has_type()); | 450 RTC_CHECK(event.has_type()); |
453 RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT); | 451 RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT); |
454 RTC_CHECK(event.has_audio_receiver_config()); | 452 RTC_CHECK(event.has_audio_receiver_config()); |
455 const rtclog::AudioReceiveConfig& receiver_config = | 453 const rtclog::AudioReceiveConfig& receiver_config = |
456 event.audio_receiver_config(); | 454 event.audio_receiver_config(); |
457 // Get SSRCs. | 455 // Get SSRCs. |
458 RTC_CHECK(receiver_config.has_remote_ssrc()); | 456 RTC_CHECK(receiver_config.has_remote_ssrc()); |
459 config->remote_ssrc = receiver_config.remote_ssrc(); | 457 config.remote_ssrc = receiver_config.remote_ssrc(); |
460 RTC_CHECK(receiver_config.has_local_ssrc()); | 458 RTC_CHECK(receiver_config.has_local_ssrc()); |
461 config->local_ssrc = receiver_config.local_ssrc(); | 459 config.local_ssrc = receiver_config.local_ssrc(); |
462 // Get header extensions. | 460 // Get header extensions. |
463 GetHeaderExtensions(&config->rtp_extensions, | 461 GetHeaderExtensions(&config.rtp_extensions, |
464 receiver_config.header_extensions()); | 462 receiver_config.header_extensions()); |
| 463 return config; |
465 } | 464 } |
466 | 465 |
467 void ParsedRtcEventLog::GetAudioSendConfig(size_t index, | 466 rtclog::StreamConfig ParsedRtcEventLog::GetAudioSendConfig(size_t index) const { |
468 rtclog::StreamConfig* config) const { | |
469 RTC_CHECK_LT(index, GetNumberOfEvents()); | 467 RTC_CHECK_LT(index, GetNumberOfEvents()); |
470 GetAudioSendConfig(events_[index], config); | 468 return GetAudioSendConfig(events_[index]); |
471 } | 469 } |
472 | 470 |
473 void ParsedRtcEventLog::GetAudioSendConfig(const rtclog::Event& event, | 471 rtclog::StreamConfig ParsedRtcEventLog::GetAudioSendConfig( |
474 rtclog::StreamConfig* config) const { | 472 const rtclog::Event& event) const { |
475 RTC_CHECK(config != nullptr); | 473 rtclog::StreamConfig config; |
476 RTC_CHECK(event.has_type()); | 474 RTC_CHECK(event.has_type()); |
477 RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_SENDER_CONFIG_EVENT); | 475 RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_SENDER_CONFIG_EVENT); |
478 RTC_CHECK(event.has_audio_sender_config()); | 476 RTC_CHECK(event.has_audio_sender_config()); |
479 const rtclog::AudioSendConfig& sender_config = event.audio_sender_config(); | 477 const rtclog::AudioSendConfig& sender_config = event.audio_sender_config(); |
480 // Get SSRCs. | 478 // Get SSRCs. |
481 RTC_CHECK(sender_config.has_ssrc()); | 479 RTC_CHECK(sender_config.has_ssrc()); |
482 config->local_ssrc = sender_config.ssrc(); | 480 config.local_ssrc = sender_config.ssrc(); |
483 // Get header extensions. | 481 // Get header extensions. |
484 GetHeaderExtensions(&config->rtp_extensions, | 482 GetHeaderExtensions(&config.rtp_extensions, |
485 sender_config.header_extensions()); | 483 sender_config.header_extensions()); |
| 484 return config; |
486 } | 485 } |
487 | 486 |
488 void ParsedRtcEventLog::GetAudioPlayout(size_t index, uint32_t* ssrc) const { | 487 void ParsedRtcEventLog::GetAudioPlayout(size_t index, uint32_t* ssrc) const { |
489 RTC_CHECK_LT(index, GetNumberOfEvents()); | 488 RTC_CHECK_LT(index, GetNumberOfEvents()); |
490 const rtclog::Event& event = events_[index]; | 489 const rtclog::Event& event = events_[index]; |
491 RTC_CHECK(event.has_type()); | 490 RTC_CHECK(event.has_type()); |
492 RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_PLAYOUT_EVENT); | 491 RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_PLAYOUT_EVENT); |
493 RTC_CHECK(event.has_audio_playout_event()); | 492 RTC_CHECK(event.has_audio_playout_event()); |
494 const rtclog::AudioPlayoutEvent& loss_event = event.audio_playout_event(); | 493 const rtclog::AudioPlayoutEvent& loss_event = event.audio_playout_event(); |
495 RTC_CHECK(loss_event.has_local_ssrc()); | 494 RTC_CHECK(loss_event.has_local_ssrc()); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 ParsedRtcEventLog::MediaType ParsedRtcEventLog::GetMediaType( | 625 ParsedRtcEventLog::MediaType ParsedRtcEventLog::GetMediaType( |
627 uint32_t ssrc, | 626 uint32_t ssrc, |
628 PacketDirection direction) const { | 627 PacketDirection direction) const { |
629 for (auto rit = streams_.rbegin(); rit != streams_.rend(); ++rit) { | 628 for (auto rit = streams_.rbegin(); rit != streams_.rend(); ++rit) { |
630 if (rit->ssrc == ssrc && rit->direction == direction) | 629 if (rit->ssrc == ssrc && rit->direction == direction) |
631 return rit->media_type; | 630 return rit->media_type; |
632 } | 631 } |
633 return MediaType::ANY; | 632 return MediaType::ANY; |
634 } | 633 } |
635 } // namespace webrtc | 634 } // namespace webrtc |
OLD | NEW |