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();