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

Side by Side Diff: webrtc/logging/rtc_event_log/rtc_event_log_parser.cc

Issue 2912113002: Ensure the RtcEventLog parser is backwards compatible (Closed)
Patch Set: Created 3 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
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/logging/rtc_event_log/rtc_event_log_parser.h ('k') | webrtc/logging/rtc_event_log/rtc_event_log_unittest_helper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698