Move H.264 SPS VUI rewriting to FrameEncodeMetadataWriter.

Bug: webrtc:10559
Change-Id: I956287e71a47856cfb6dd807d9715d6ee2572f55
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/138263
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Mirta Dvornicic <mirtad@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28100}
diff --git a/video/frame_encode_metadata_writer.cc b/video/frame_encode_metadata_writer.cc
index 4b5fabb..999ca74 100644
--- a/video/frame_encode_metadata_writer.cc
+++ b/video/frame_encode_metadata_writer.cc
@@ -12,8 +12,11 @@
 
 #include <algorithm>
 
+#include "absl/memory/memory.h"
+#include "common_video/h264/sps_vui_rewriter.h"
 #include "modules/include/module_common_types_public.h"
 #include "modules/video_coding/include/video_coding_defines.h"
+#include "rtc_base/copy_on_write_buffer.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/time_utils.h"
 
@@ -183,6 +186,35 @@
   }
 }
 
+std::unique_ptr<RTPFragmentationHeader>
+FrameEncodeMetadataWriter::UpdateBitstream(
+    const CodecSpecificInfo* codec_specific_info,
+    const RTPFragmentationHeader* fragmentation,
+    EncodedImage* encoded_image) {
+  if (!codec_specific_info ||
+      codec_specific_info->codecType != kVideoCodecH264 || !fragmentation ||
+      encoded_image->_frameType != VideoFrameType::kVideoFrameKey) {
+    return nullptr;
+  }
+
+  rtc::CopyOnWriteBuffer modified_buffer;
+  std::unique_ptr<RTPFragmentationHeader> modified_fragmentation =
+      absl::make_unique<RTPFragmentationHeader>();
+  modified_fragmentation->CopyFrom(*fragmentation);
+
+  // Make sure that the data is not copied if owned by EncodedImage.
+  const EncodedImage& buffer = *encoded_image;
+  SpsVuiRewriter::ParseOutgoingBitstreamAndRewriteSps(
+      buffer, fragmentation->fragmentationVectorSize,
+      fragmentation->fragmentationOffset, fragmentation->fragmentationLength,
+      &modified_buffer, modified_fragmentation->fragmentationOffset,
+      modified_fragmentation->fragmentationLength);
+
+  encoded_image->SetEncodedData(modified_buffer);
+
+  return modified_fragmentation;
+}
+
 void FrameEncodeMetadataWriter::Reset() {
   rtc::CritScope cs(&lock_);
   timing_frames_info_.clear();