Bug 1293422 - Add PacketizeMode0 to RtpPacketizerH264; r?jesup draft
authorDan Minor <dminor@mozilla.com>
Tue, 09 Aug 2016 15:59:48 -0400
changeset 399095 70f0dd1539ad142951e954f878d3bb85f57b6709
parent 398604 6cf0089510fad8deb866136f5b92bbced9498447
child 527844 beeef581a11821f72ba2126d87b20a7290e8a21e
push id25737
push userdminor@mozilla.com
push dateWed, 10 Aug 2016 12:53:04 +0000
reviewersjesup
bugs1293422
milestone51.0a1
Bug 1293422 - Add PacketizeMode0 to RtpPacketizerH264; r?jesup We were previously using PacketizeFuA which stripped the NAL header. Since the fragment fit in a single packet it would then be sent without any header causing difficulties on the receiving side. This adds a PacketizeMode0 which leaves the header intact. MozReview-Commit-ID: 91rbveSuXtT
media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc
media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_h264.h
--- a/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc
+++ b/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc
@@ -151,25 +151,40 @@ void RtpPacketizerH264::SetPayloadData(
   fragmentation_.CopyFrom(*fragmentation);
   GeneratePackets();
 }
 
 void RtpPacketizerH264::GeneratePackets() {
   for (size_t i = 0; i < fragmentation_.fragmentationVectorSize;) {
     size_t fragment_offset = fragmentation_.fragmentationOffset[i];
     size_t fragment_length = fragmentation_.fragmentationLength[i];
-    if (fragment_length > max_payload_len_ || packetization_mode_ == 0) {
+    if (packetization_mode_ == 0) {
+      PacketizeMode0(fragment_offset, fragment_length);
+      ++i;
+    } else if (fragment_length > max_payload_len_) {
       PacketizeFuA(fragment_offset, fragment_length);
       ++i;
     } else {
       i = PacketizeStapA(i, fragment_offset, fragment_length);
     }
   }
 }
 
+void RtpPacketizerH264::PacketizeMode0(size_t fragment_offset,
+                                       size_t fragment_length) {
+
+  uint8_t header = payload_data_[fragment_offset];
+  packets_.push(Packet(fragment_offset,
+                       fragment_length,
+                       true,
+                       true,
+                       false,
+                       header));
+}
+
 void RtpPacketizerH264::PacketizeFuA(size_t fragment_offset,
                                      size_t fragment_length) {
   // Fragment payload into packets (FU-A).
   // Strip out the original header and leave room for the FU-A header.
   fragment_length -= kNalHeaderSize;
   size_t offset = fragment_offset + kNalHeaderSize;
   size_t bytes_available = max_payload_len_ - kFuAHeaderSize;
   size_t fragments =
--- a/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_h264.h
+++ b/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_format_h264.h
@@ -69,16 +69,17 @@ class RtpPacketizerH264 : public RtpPack
     bool first_fragment;
     bool last_fragment;
     bool aggregated;
     uint8_t header;
   };
   typedef std::queue<Packet> PacketQueue;
 
   void GeneratePackets();
+  void PacketizeMode0(size_t fragment_offset, size_t fragment_length);
   void PacketizeFuA(size_t fragment_offset, size_t fragment_length);
   int PacketizeStapA(size_t fragment_index,
                      size_t fragment_offset,
                      size_t fragment_length);
   void NextAggregatePacket(uint8_t* buffer, size_t* bytes_to_send);
   void NextFragmentPacket(uint8_t* buffer, size_t* bytes_to_send);
 
   const uint8_t* payload_data_;