Cleanup RtpPacketizer interface

merge construction and call to SetPayloadData
Add NumPackets instead of SetPayloadData
Remove virtual ToString() as unused
move CHECK(rtp_video_header) from RtpPacketizer::Create to RtpSenderVideo::SendVideo

Bug: webrtc:9680
Change-Id: I074644e048c797eb836f79979df363fe1ea0075e
Reviewed-on: https://webrtc-review.googlesource.com/96543
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24474}
diff --git a/modules/rtp_rtcp/source/rtp_format.cc b/modules/rtp_rtcp/source/rtp_format.cc
index 293181e..e79f174 100644
--- a/modules/rtp_rtcp/source/rtp_format.cc
+++ b/modules/rtp_rtcp/source/rtp_format.cc
@@ -12,40 +12,56 @@
 
 #include <utility>
 
+#include "absl/memory/memory.h"
 #include "modules/rtp_rtcp/source/rtp_format_h264.h"
 #include "modules/rtp_rtcp/source/rtp_format_video_generic.h"
 #include "modules/rtp_rtcp/source/rtp_format_vp8.h"
 #include "modules/rtp_rtcp/source/rtp_format_vp9.h"
 
 namespace webrtc {
-RtpPacketizer* RtpPacketizer::Create(VideoCodecType type,
-                                     size_t max_payload_len,
-                                     size_t last_packet_reduction_len,
-                                     const RTPVideoHeader* rtp_video_header,
-                                     FrameType frame_type) {
-  RTC_CHECK(rtp_video_header);
+
+std::unique_ptr<RtpPacketizer> RtpPacketizer::Create(
+    VideoCodecType type,
+    rtc::ArrayView<const uint8_t> payload,
+    PayloadSizeLimits limits,
+    // Codec-specific details.
+    const RTPVideoHeader& rtp_video_header,
+    FrameType frame_type,
+    const RTPFragmentationHeader* fragmentation) {
   switch (type) {
     case kVideoCodecH264: {
       const auto& h264 =
-          absl::get<RTPVideoHeaderH264>(rtp_video_header->video_type_header);
-      return new RtpPacketizerH264(max_payload_len, last_packet_reduction_len,
-                                   h264.packetization_mode);
+          absl::get<RTPVideoHeaderH264>(rtp_video_header.video_type_header);
+      auto packetizer = absl::make_unique<RtpPacketizerH264>(
+          limits.max_payload_len, limits.last_packet_reduction_len,
+          h264.packetization_mode);
+      packetizer->SetPayloadData(payload.data(), payload.size(), fragmentation);
+      return std::move(packetizer);
     }
-    case kVideoCodecVP8:
-      return new RtpPacketizerVp8(rtp_video_header->vp8(), max_payload_len,
-                                  last_packet_reduction_len);
+    case kVideoCodecVP8: {
+      const auto& vp8 =
+          absl::get<RTPVideoHeaderVP8>(rtp_video_header.video_type_header);
+      auto packetizer = absl::make_unique<RtpPacketizerVp8>(
+          vp8, limits.max_payload_len, limits.last_packet_reduction_len);
+      packetizer->SetPayloadData(payload.data(), payload.size(), nullptr);
+      return std::move(packetizer);
+    }
     case kVideoCodecVP9: {
       const auto& vp9 =
-          absl::get<RTPVideoHeaderVP9>(rtp_video_header->video_type_header);
-      return new RtpPacketizerVp9(vp9, max_payload_len,
-                                  last_packet_reduction_len);
+          absl::get<RTPVideoHeaderVP9>(rtp_video_header.video_type_header);
+      auto packetizer = absl::make_unique<RtpPacketizerVp9>(
+          vp9, limits.max_payload_len, limits.last_packet_reduction_len);
+      packetizer->SetPayloadData(payload.data(), payload.size(), nullptr);
+      return std::move(packetizer);
     }
-    default:
-      return new RtpPacketizerGeneric(*rtp_video_header, frame_type,
-                                      max_payload_len,
-                                      last_packet_reduction_len);
+    default: {
+      auto packetizer = absl::make_unique<RtpPacketizerGeneric>(
+          rtp_video_header, frame_type, limits.max_payload_len,
+          limits.last_packet_reduction_len);
+      packetizer->SetPayloadData(payload.data(), payload.size(), nullptr);
+      return std::move(packetizer);
+    }
   }
-  return nullptr;
 }
 
 RtpDepacketizer* RtpDepacketizer::Create(VideoCodecType type) {
diff --git a/modules/rtp_rtcp/source/rtp_format.h b/modules/rtp_rtcp/source/rtp_format.h
index 76d7f47..007ddbc 100644
--- a/modules/rtp_rtcp/source/rtp_format.h
+++ b/modules/rtp_rtcp/source/rtp_format.h
@@ -11,8 +11,10 @@
 #ifndef MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_H_
 #define MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_H_
 
+#include <memory>
 #include <string>
 
+#include "api/array_view.h"
 #include "common_types.h"  // NOLINT(build/include)
 #include "modules/include/module_common_types.h"
 #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
@@ -23,26 +25,28 @@
 
 class RtpPacketizer {
  public:
-  static RtpPacketizer* Create(VideoCodecType type,
-                               size_t max_payload_len,
-                               size_t last_packet_reduction_len,
-                               const RTPVideoHeader* rtp_video_header,
-                               FrameType frame_type);
+  struct PayloadSizeLimits {
+    size_t max_payload_len = 1200;
+    size_t last_packet_reduction_len = 0;
+  };
+  static std::unique_ptr<RtpPacketizer> Create(
+      VideoCodecType type,
+      rtc::ArrayView<const uint8_t> payload,
+      PayloadSizeLimits limits,
+      // Codec-specific details.
+      const RTPVideoHeader& rtp_video_header,
+      FrameType frame_type,
+      const RTPFragmentationHeader* fragmentation);
 
-  virtual ~RtpPacketizer() {}
+  virtual ~RtpPacketizer() = default;
 
-  // Returns total number of packets which would be produced by the packetizer.
-  virtual size_t SetPayloadData(
-      const uint8_t* payload_data,
-      size_t payload_size,
-      const RTPFragmentationHeader* fragmentation) = 0;
+  // Returns number of remaining packets to produce by the packetizer.
+  virtual size_t NumPackets() const = 0;
 
   // Get the next payload with payload header.
   // Write payload and set marker bit of the |packet|.
   // Returns true on success, false otherwise.
   virtual bool NextPacket(RtpPacketToSend* packet) = 0;
-
-  virtual std::string ToString() = 0;
 };
 
 // TODO(sprang): Update the depacketizer to return a std::unqie_ptr with a copy
diff --git a/modules/rtp_rtcp/source/rtp_format_h264.cc b/modules/rtp_rtcp/source/rtp_format_h264.cc
index 45e8d11..373cce9 100644
--- a/modules/rtp_rtcp/source/rtp_format_h264.cc
+++ b/modules/rtp_rtcp/source/rtp_format_h264.cc
@@ -182,6 +182,10 @@
   return num_packets_left_;
 }
 
+size_t RtpPacketizerH264::NumPackets() const {
+  return num_packets_left_;
+}
+
 bool RtpPacketizerH264::GeneratePackets() {
   for (size_t i = 0; i < input_fragments_.size();) {
     switch (packetization_mode_) {
@@ -408,10 +412,6 @@
   packets_.pop();
 }
 
-std::string RtpPacketizerH264::ToString() {
-  return "RtpPacketizerH264";
-}
-
 RtpDepacketizerH264::RtpDepacketizerH264() : offset_(0), length_(0) {}
 RtpDepacketizerH264::~RtpDepacketizerH264() {}
 
diff --git a/modules/rtp_rtcp/source/rtp_format_h264.h b/modules/rtp_rtcp/source/rtp_format_h264.h
index 99b080b..1f6702a 100644
--- a/modules/rtp_rtcp/source/rtp_format_h264.h
+++ b/modules/rtp_rtcp/source/rtp_format_h264.h
@@ -34,15 +34,15 @@
 
   size_t SetPayloadData(const uint8_t* payload_data,
                         size_t payload_size,
-                        const RTPFragmentationHeader* fragmentation) override;
+                        const RTPFragmentationHeader* fragmentation);
+
+  size_t NumPackets() const override;
 
   // Get the next payload with H264 payload header.
   // Write payload and set marker bit of the |packet|.
   // Returns true on success, false otherwise.
   bool NextPacket(RtpPacketToSend* rtp_packet) override;
 
-  std::string ToString() override;
-
  private:
   // Input fragments (NAL units), with an optionally owned temporary buffer,
   // used in case the fragment gets modified.
diff --git a/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc b/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc
index 1f69fcb..0183a6a 100644
--- a/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc
+++ b/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc
@@ -16,7 +16,7 @@
 #include "modules/include/module_common_types.h"
 #include "modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
 #include "modules/rtp_rtcp/source/byte_io.h"
-#include "modules/rtp_rtcp/source/rtp_format.h"
+#include "modules/rtp_rtcp/source/rtp_format_h264.h"
 #include "modules/rtp_rtcp/source/rtp_packet_to_send.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -68,14 +68,12 @@
       kNalHeaderSize + frameSize - payloadOffset;
 }
 
-RtpPacketizer* CreateH264Packetizer(H264PacketizationMode mode,
-                                    size_t max_payload_size,
-                                    size_t last_packet_reduction) {
-  RTPVideoHeader header;
-  header.video_type_header.emplace<RTPVideoHeaderH264>().packetization_mode =
-      mode;
-  return RtpPacketizer::Create(kVideoCodecH264, max_payload_size,
-                               last_packet_reduction, &header, kEmptyFrame);
+std::unique_ptr<RtpPacketizerH264> CreateH264Packetizer(
+    H264PacketizationMode mode,
+    size_t max_payload_size,
+    size_t last_packet_reduction) {
+  return absl::make_unique<RtpPacketizerH264>(max_payload_size,
+                                              last_packet_reduction, mode);
 }
 
 void VerifyFua(size_t fua_index,
@@ -118,7 +116,7 @@
   fragmentation.VerifyAndAllocateFragmentationHeader(1);
   fragmentation.fragmentationOffset[0] = 0;
   fragmentation.fragmentationLength[0] = frame_size;
-  std::unique_ptr<RtpPacketizer> packetizer(
+  std::unique_ptr<RtpPacketizerH264> packetizer(
       CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
                            max_payload_size, last_packet_reduction));
   EXPECT_EQ(
@@ -191,7 +189,7 @@
   fragmentation.VerifyAndAllocateFragmentationHeader(1);
   fragmentation.fragmentationOffset[0] = 0;
   fragmentation.fragmentationLength[0] = sizeof(frame);
-  std::unique_ptr<RtpPacketizer> packetizer(
+  std::unique_ptr<RtpPacketizerH264> packetizer(
       CreateH264Packetizer(GetParam(), kMaxPayloadSize, 0));
   ASSERT_EQ(1u,
             packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation));
@@ -218,7 +216,7 @@
   frame[fragmentation.fragmentationOffset[0]] = 0x01;
   frame[fragmentation.fragmentationOffset[1]] = 0x01;
 
-  std::unique_ptr<RtpPacketizer> packetizer(
+  std::unique_ptr<RtpPacketizerH264> packetizer(
       CreateH264Packetizer(GetParam(), kMaxPayloadSize, 0));
   ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
 
@@ -251,7 +249,7 @@
     frame[i + kPayloadOffset] = i;
   RTPFragmentationHeader fragmentation;
   CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
-  std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
+  std::unique_ptr<RtpPacketizerH264> packetizer(CreateH264Packetizer(
       H264PacketizationMode::NonInterleaved, kMaxPayloadSize, 0));
   ASSERT_EQ(1u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
 
@@ -286,7 +284,7 @@
   fragmentation.fragmentationOffset[2] = 4;
   fragmentation.fragmentationLength[2] =
       kNalHeaderSize + kFrameSize - kPayloadOffset;
-  std::unique_ptr<RtpPacketizer> packetizer(
+  std::unique_ptr<RtpPacketizerH264> packetizer(
       CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
                            kMaxPayloadSize, kLastPacketReduction));
   ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
@@ -323,7 +321,7 @@
     frame[i + kPayloadOffset] = i;
   RTPFragmentationHeader fragmentation;
   CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
-  std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
+  std::unique_ptr<RtpPacketizerH264> packetizer(CreateH264Packetizer(
       H264PacketizationMode::SingleNalUnit, kMaxPayloadSize, 0));
   packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
 
@@ -352,7 +350,7 @@
   fragmentation.fragmentationOffset[2] = 4;
   fragmentation.fragmentationLength[2] =
       kNalHeaderSize + kFrameSize - kPayloadOffset;
-  std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
+  std::unique_ptr<RtpPacketizerH264> packetizer(CreateH264Packetizer(
       H264PacketizationMode::NonInterleaved, kMaxPayloadSize, 0));
   ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
 
@@ -397,7 +395,7 @@
       frame[nalu_offset + j] = i + j;
     }
   }
-  std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
+  std::unique_ptr<RtpPacketizerH264> packetizer(CreateH264Packetizer(
       H264PacketizationMode::NonInterleaved, kMaxPayloadSize, 0));
   ASSERT_EQ(3u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
 
@@ -486,7 +484,7 @@
   // Set NAL headers.
   frame[fragmentation.fragmentationOffset[0]] = 0x01;
 
-  std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
+  std::unique_ptr<RtpPacketizerH264> packetizer(CreateH264Packetizer(
       H264PacketizationMode::SingleNalUnit, kMaxPayloadSize, 0));
   EXPECT_EQ(0u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
 }
@@ -524,16 +522,16 @@
  protected:
   rtc::Buffer in_buffer_;
   RTPFragmentationHeader fragmentation_header_;
-  std::unique_ptr<RtpPacketizer> packetizer_;
+  std::unique_ptr<RtpPacketizerH264> packetizer_;
 };
 
 TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) {
   const size_t kHeaderOverhead = kFuAHeaderSize + 1;
 
   // Set size to fragment SPS into two FU-A packets.
-  packetizer_.reset(
+  packetizer_ =
       CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
-                           sizeof(kOriginalSps) - 2 + kHeaderOverhead, 0));
+                           sizeof(kOriginalSps) - 2 + kHeaderOverhead, 0);
 
   packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
                               &fragmentation_header_);
@@ -564,9 +562,8 @@
                                     sizeof(kIdrTwo) + (kLengthFieldLength * 3);
 
   // Set size to include SPS and the rest of the packets in a Stap-A package.
-  packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
-                                         kExpectedTotalSize + kHeaderOverhead,
-                                         0));
+  packetizer_ = CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
+                                     kExpectedTotalSize + kHeaderOverhead, 0);
 
   packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
                               &fragmentation_header_);
diff --git a/modules/rtp_rtcp/source/rtp_format_video_generic.cc b/modules/rtp_rtcp/source/rtp_format_video_generic.cc
index 081a3bf..1731237 100644
--- a/modules/rtp_rtcp/source/rtp_format_video_generic.cc
+++ b/modules/rtp_rtcp/source/rtp_format_video_generic.cc
@@ -77,6 +77,10 @@
   return num_packets_left_;
 }
 
+size_t RtpPacketizerGeneric::NumPackets() const {
+  return num_packets_left_;
+}
+
 bool RtpPacketizerGeneric::NextPacket(RtpPacketToSend* packet) {
   RTC_DCHECK(packet);
   if (num_packets_left_ == 0)
@@ -127,10 +131,6 @@
   return true;
 }
 
-std::string RtpPacketizerGeneric::ToString() {
-  return "RtpPacketizerGeneric";
-}
-
 void RtpPacketizerGeneric::WriteExtendedHeader(uint8_t* out_ptr) {
   // Store bottom 15 bits of the the sequence number. Only 15 bits are used for
   // compatibility with other packetizer implemenetations that also use 15 bits.
diff --git a/modules/rtp_rtcp/source/rtp_format_video_generic.h b/modules/rtp_rtcp/source/rtp_format_video_generic.h
index e608db5..293b6e9 100644
--- a/modules/rtp_rtcp/source/rtp_format_video_generic.h
+++ b/modules/rtp_rtcp/source/rtp_format_video_generic.h
@@ -39,15 +39,15 @@
   // Returns total number of packets to be generated.
   size_t SetPayloadData(const uint8_t* payload_data,
                         size_t payload_size,
-                        const RTPFragmentationHeader* fragmentation) override;
+                        const RTPFragmentationHeader* fragmentation);
+
+  size_t NumPackets() const override;
 
   // Get the next payload with generic payload header.
   // Write payload and set marker bit of the |packet|.
   // Returns true on success, false otherwise.
   bool NextPacket(RtpPacketToSend* packet) override;
 
-  std::string ToString() override;
-
  private:
   const absl::optional<uint16_t> picture_id_;
   const uint8_t* payload_data_;
diff --git a/modules/rtp_rtcp/source/rtp_format_vp8.cc b/modules/rtp_rtcp/source/rtp_format_vp8.cc
index 48c7351..2996ce2 100644
--- a/modules/rtp_rtcp/source/rtp_format_vp8.cc
+++ b/modules/rtp_rtcp/source/rtp_format_vp8.cc
@@ -184,6 +184,10 @@
   return packets_.size();
 }
 
+size_t RtpPacketizerVp8::NumPackets() const {
+  return packets_.size();
+}
+
 bool RtpPacketizerVp8::NextPacket(RtpPacketToSend* packet) {
   RTC_DCHECK(packet);
   if (packets_.empty()) {
@@ -204,10 +208,6 @@
   return true;
 }
 
-std::string RtpPacketizerVp8::ToString() {
-  return "RtpPacketizerVp8";
-}
-
 int RtpPacketizerVp8::GeneratePackets() {
   if (max_payload_len_ < vp8_fixed_payload_descriptor_bytes_ +
                              PayloadDescriptorExtraLength() + 1 +
diff --git a/modules/rtp_rtcp/source/rtp_format_vp8.h b/modules/rtp_rtcp/source/rtp_format_vp8.h
index 2b4468a..e557934 100644
--- a/modules/rtp_rtcp/source/rtp_format_vp8.h
+++ b/modules/rtp_rtcp/source/rtp_format_vp8.h
@@ -48,15 +48,15 @@
 
   size_t SetPayloadData(const uint8_t* payload_data,
                         size_t payload_size,
-                        const RTPFragmentationHeader* fragmentation) override;
+                        const RTPFragmentationHeader* fragmentation);
+
+  size_t NumPackets() const override;
 
   // Get the next payload with VP8 payload header.
   // Write payload and set marker bit of the |packet|.
   // Returns true on success, false otherwise.
   bool NextPacket(RtpPacketToSend* packet) override;
 
-  std::string ToString() override;
-
  private:
   typedef struct {
     size_t payload_start_pos;
diff --git a/modules/rtp_rtcp/source/rtp_format_vp9.cc b/modules/rtp_rtcp/source/rtp_format_vp9.cc
index 974df8f..f800ff8 100644
--- a/modules/rtp_rtcp/source/rtp_format_vp9.cc
+++ b/modules/rtp_rtcp/source/rtp_format_vp9.cc
@@ -471,10 +471,6 @@
 
 RtpPacketizerVp9::~RtpPacketizerVp9() {}
 
-std::string RtpPacketizerVp9::ToString() {
-  return "RtpPacketizerVp9";
-}
-
 size_t RtpPacketizerVp9::SetPayloadData(
     const uint8_t* payload,
     size_t payload_size,
@@ -485,6 +481,10 @@
   return packets_.size();
 }
 
+size_t RtpPacketizerVp9::NumPackets() const {
+  return packets_.size();
+}
+
 // Splits payload in minimal number of roughly equal in size packets.
 void RtpPacketizerVp9::GeneratePackets() {
   if (max_payload_length_ < PayloadDescriptorLength(hdr_) + 1) {
diff --git a/modules/rtp_rtcp/source/rtp_format_vp9.h b/modules/rtp_rtcp/source/rtp_format_vp9.h
index 9052c21..61f04d4 100644
--- a/modules/rtp_rtcp/source/rtp_format_vp9.h
+++ b/modules/rtp_rtcp/source/rtp_format_vp9.h
@@ -38,12 +38,12 @@
 
   ~RtpPacketizerVp9() override;
 
-  std::string ToString() override;
-
   // The payload data must be one encoded VP9 layer frame.
   size_t SetPayloadData(const uint8_t* payload,
                         size_t payload_size,
-                        const RTPFragmentationHeader* fragmentation) override;
+                        const RTPFragmentationHeader* fragmentation);
+
+  size_t NumPackets() const override;
 
   // Gets the next payload with VP9 payload header.
   // Write payload and set marker bit of the |packet|.
diff --git a/modules/rtp_rtcp/source/rtp_sender_video.cc b/modules/rtp_rtcp/source/rtp_sender_video.cc
index 43450dc..bf8150d 100644
--- a/modules/rtp_rtcp/source/rtp_sender_video.cc
+++ b/modules/rtp_rtcp/source/rtp_sender_video.cc
@@ -280,6 +280,7 @@
                                int64_t expected_retransmission_time_ms) {
   if (payload_size == 0)
     return false;
+  RTC_CHECK(video_header);
 
   // Create header that will be reused in all packets.
   std::unique_ptr<RtpPacketToSend> rtp_header = rtp_sender_->AllocatePacket();
@@ -303,24 +304,22 @@
     // packet in each group of packets which make up another type of frame
     // (e.g. a P-Frame) only if the current value is different from the previous
     // value sent.
-    if (video_header) {
-      // Set rotation when key frame or when changed (to follow standard).
-      // Or when different from 0 (to follow current receiver implementation).
-      VideoRotation current_rotation = video_header->rotation;
-      if (frame_type == kVideoFrameKey || current_rotation != last_rotation_ ||
-          current_rotation != kVideoRotation_0)
-        last_packet->SetExtension<VideoOrientation>(current_rotation);
-      last_rotation_ = current_rotation;
-      // Report content type only for key frames.
-      if (frame_type == kVideoFrameKey &&
-          video_header->content_type != VideoContentType::UNSPECIFIED) {
-        last_packet->SetExtension<VideoContentTypeExtension>(
-            video_header->content_type);
-      }
-      if (video_header->video_timing.flags != VideoSendTiming::kInvalid) {
-        last_packet->SetExtension<VideoTimingExtension>(
-            video_header->video_timing);
-      }
+    // Set rotation when key frame or when changed (to follow standard).
+    // Or when different from 0 (to follow current receiver implementation).
+    VideoRotation current_rotation = video_header->rotation;
+    if (frame_type == kVideoFrameKey || current_rotation != last_rotation_ ||
+        current_rotation != kVideoRotation_0)
+      last_packet->SetExtension<VideoOrientation>(current_rotation);
+    last_rotation_ = current_rotation;
+    // Report content type only for key frames.
+    if (frame_type == kVideoFrameKey &&
+        video_header->content_type != VideoContentType::UNSPECIFIED) {
+      last_packet->SetExtension<VideoContentTypeExtension>(
+          video_header->content_type);
+    }
+    if (video_header->video_timing.flags != VideoSendTiming::kInvalid) {
+      last_packet->SetExtension<VideoTimingExtension>(
+          video_header->video_timing);
     }
 
     // FEC settings.
@@ -347,16 +346,17 @@
   size_t last_packet_reduction_len =
       last_packet->headers_size() - rtp_header->headers_size();
 
-  std::unique_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create(
-      video_type, max_data_payload_length, last_packet_reduction_len,
-      video_header, frame_type));
+  RtpPacketizer::PayloadSizeLimits limits;
+  limits.max_payload_len = max_data_payload_length;
+  limits.last_packet_reduction_len = last_packet_reduction_len;
+  std::unique_ptr<RtpPacketizer> packetizer = RtpPacketizer::Create(
+      video_type, rtc::MakeArrayView(payload_data, payload_size), limits,
+      *video_header, frame_type, fragmentation);
 
-  const uint8_t temporal_id =
-      video_header ? GetTemporalId(*video_header) : kNoTemporalIdx;
+  const uint8_t temporal_id = GetTemporalId(*video_header);
   StorageType storage = GetStorageType(temporal_id, retransmission_settings,
                                        expected_retransmission_time_ms);
-  size_t num_packets =
-      packetizer->SetPayloadData(payload_data, payload_size, fragmentation);
+  size_t num_packets = packetizer->NumPackets();
 
   if (num_packets == 0)
     return false;