Allow printing full packets in rtc_eventlog2text.

Add command line option to print packet contents as hex in rtc_eventlog2text.

Bug: None
Change-Id: I690706cfba883ca2248332622f2c9133b7ddaf6a
Reviewed-on: https://webrtc-review.googlesource.com/20863
Commit-Queue: Björn Terelius <terelius@webrtc.org>
Reviewed-by: Elad Alon <eladalon@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20590}
diff --git a/logging/rtc_event_log/rtc_event_log2text.cc b/logging/rtc_event_log/rtc_event_log2text.cc
index 91f7b18..9292fd3 100644
--- a/logging/rtc_event_log/rtc_event_log2text.cc
+++ b/logging/rtc_event_log/rtc_event_log2text.cc
@@ -10,6 +10,7 @@
 
 #include <string.h>
 
+#include <iomanip>  // setfill, setw
 #include <iostream>
 #include <map>
 #include <sstream>
@@ -60,6 +61,10 @@
 DEFINE_bool(ana, true, "Use --noana to exclude ANA events.");
 DEFINE_bool(probe, true, "Use --noprobe to exclude probe events.");
 
+DEFINE_bool(print_full_packets,
+            false,
+            "Print the full RTP headers and RTCP packets in hex.");
+
 // TODO(terelius): Allow a list of SSRCs.
 DEFINE_string(ssrc,
               "",
@@ -301,7 +306,9 @@
         return;
       std::cout << log_timestamp << "\t"
                 << "RTCP_NEWFB" << StreamInfo(direction, media_type)
-                << "\tssrc=" << transport_feedback.sender_ssrc() << std::endl;
+                << "\tsender_ssrc=" << transport_feedback.sender_ssrc()
+                << "\tmedia_ssrc=" << transport_feedback.media_ssrc()
+                << std::endl;
       break;
     }
     default:
@@ -489,6 +496,18 @@
                 static_cast<int>(parsed_header.extension.audioLevel);
           }
           std::cout << std::endl;
+          if (FLAG_print_full_packets) {
+            // TODO(terelius): Rewrite this file to use printf instead of cout.
+            std::cout << "\t\t" << std::hex;
+            char prev_fill = std::cout.fill('0');
+            for (size_t i = 0; i < header_length; i++) {
+              std::cout << std::setw(2) << static_cast<unsigned>(header[i]);
+              if (i % 4 == 3)
+                std::cout << " ";  // Separator between 32-bit words.
+            }
+            std::cout.fill(prev_fill);
+            std::cout << std::dec << std::endl;
+          }
         }
         event_recognized = true;
         break;
@@ -508,6 +527,7 @@
             ptrdiff_t remaining_blocks_size = packet_end - next_block;
             RTC_DCHECK_GT(remaining_blocks_size, 0);
             if (!rtcp_block.Parse(next_block, remaining_blocks_size)) {
+              RTC_LOG(LS_WARNING) << "Failed to parse RTCP";
               break;
             }
 
@@ -541,6 +561,19 @@
               default:
                 break;
             }
+            if (FLAG_print_full_packets) {
+              std::cout << "\t\t" << std::hex;
+              char prev_fill = std::cout.fill('0');
+              for (const uint8_t* p = next_block; p < rtcp_block.NextPacket();
+                   p++) {
+                std::cout << std::setw(2) << static_cast<unsigned>(*p);
+                ptrdiff_t chars_printed = p - next_block;
+                if (chars_printed % 4 == 3)
+                  std::cout << " ";  // Separator between 32-bit words.
+              }
+              std::cout.fill(prev_fill);
+              std::cout << std::dec << std::endl;
+            }
           }
         }
         event_recognized = true;
@@ -566,8 +599,8 @@
           parsed_stream.GetLossBasedBweUpdate(i, &bitrate_bps, &fraction_loss,
                                               &total_packets);
           std::cout << parsed_stream.GetTimestamp(i) << "\tBWE(LOSS_BASED)"
-                    << "\tbitrate_bps=" << bitrate_bps
-                    << "\tfraction_loss=" << fraction_loss
+                    << "\tbitrate_bps=" << bitrate_bps << "\tfraction_loss="
+                    << static_cast<unsigned>(fraction_loss)
                     << "\ttotal_packets=" << total_packets << std::endl;
         }
         event_recognized = true;