Strip AUD NALUs from H.264 bitstream
Bug: webrtc:11919 Change-Id: I33085faa3378f6a4059af32bab9988b640c968a3 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/181180 Commit-Queue: Stefan Holmer <stefan@webrtc.org> Reviewed-by: Stefan Holmer <stefan@webrtc.org> Reviewed-by: Sergey Silkin <ssilkin@webrtc.org> Cr-Commit-Position: refs/heads/master@{#32160}
This commit is contained in:
parent
8d049c0d3d
commit
9345dcfeea
@ -210,7 +210,7 @@ SpsVuiRewriter::ParseResult SpsVuiRewriter::ParseAndRewriteSps(
|
||||
return result;
|
||||
}
|
||||
|
||||
rtc::Buffer SpsVuiRewriter::ParseOutgoingBitstreamAndRewriteSps(
|
||||
rtc::Buffer SpsVuiRewriter::ParseOutgoingBitstreamAndRewrite(
|
||||
rtc::ArrayView<const uint8_t> buffer,
|
||||
const webrtc::ColorSpace* color_space) {
|
||||
std::vector<H264::NaluIndex> nalus =
|
||||
@ -225,8 +225,6 @@ rtc::Buffer SpsVuiRewriter::ParseOutgoingBitstreamAndRewriteSps(
|
||||
const uint8_t* start_code_ptr = buffer.data() + nalu.start_offset;
|
||||
const size_t start_code_length =
|
||||
nalu.payload_start_offset - nalu.start_offset;
|
||||
output_buffer.AppendData(start_code_ptr, start_code_length);
|
||||
|
||||
const uint8_t* nalu_ptr = buffer.data() + nalu.payload_start_offset;
|
||||
const size_t nalu_length = nalu.payload_size;
|
||||
|
||||
@ -253,12 +251,17 @@ rtc::Buffer SpsVuiRewriter::ParseOutgoingBitstreamAndRewriteSps(
|
||||
nalu_ptr + H264::kNaluTypeSize, nalu_length - H264::kNaluTypeSize,
|
||||
&sps, color_space, &output_nalu, Direction::kOutgoing);
|
||||
if (result == ParseResult::kVuiRewritten) {
|
||||
output_buffer.AppendData(start_code_ptr, start_code_length);
|
||||
output_buffer.AppendData(output_nalu.data(), output_nalu.size());
|
||||
continue;
|
||||
}
|
||||
} else if (H264::ParseNaluType(nalu_ptr[0]) == H264::NaluType::kAud) {
|
||||
// Skip the access unit delimiter copy.
|
||||
continue;
|
||||
}
|
||||
|
||||
// vui wasn't rewritten, copy the nal unit as is.
|
||||
// vui wasn't rewritten and it is not aud, copy the nal unit as is.
|
||||
output_buffer.AppendData(start_code_ptr, start_code_length);
|
||||
output_buffer.AppendData(nalu_ptr, nalu_length);
|
||||
}
|
||||
return output_buffer;
|
||||
|
||||
@ -50,8 +50,9 @@ class SpsVuiRewriter : private SpsParser {
|
||||
rtc::Buffer* destination,
|
||||
Direction Direction);
|
||||
|
||||
// Parses NAL units from |buffer| and rewrites VUI in SPS blocks if necessary.
|
||||
static rtc::Buffer ParseOutgoingBitstreamAndRewriteSps(
|
||||
// Parses NAL units from |buffer|, strips AUD blocks and rewrites VUI in SPS
|
||||
// blocks if necessary.
|
||||
static rtc::Buffer ParseOutgoingBitstreamAndRewrite(
|
||||
rtc::ArrayView<const uint8_t> buffer,
|
||||
const ColorSpace* color_space);
|
||||
|
||||
|
||||
@ -36,6 +36,7 @@ static const size_t kWidth = 640;
|
||||
static const size_t kHeight = 480;
|
||||
|
||||
static const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01};
|
||||
static const uint8_t kAud[] = {H264::NaluType::kAud, 0x09, 0x10};
|
||||
static const uint8_t kSpsNaluType[] = {H264::NaluType::kSps};
|
||||
static const uint8_t kIdr1[] = {H264::NaluType::kIdr, 0xFF, 0x00, 0x00, 0x04};
|
||||
static const uint8_t kIdr2[] = {H264::NaluType::kIdr, 0xFF, 0x00, 0x11};
|
||||
@ -401,9 +402,8 @@ TEST(SpsVuiRewriterOutgoingVuiTest, ParseOutgoingBitstreamOptimalVui) {
|
||||
buffer.AppendData(kStartSequence);
|
||||
buffer.AppendData(kIdr1);
|
||||
|
||||
EXPECT_THAT(
|
||||
SpsVuiRewriter::ParseOutgoingBitstreamAndRewriteSps(buffer, nullptr),
|
||||
::testing::ElementsAreArray(buffer));
|
||||
EXPECT_THAT(SpsVuiRewriter::ParseOutgoingBitstreamAndRewrite(buffer, nullptr),
|
||||
::testing::ElementsAreArray(buffer));
|
||||
}
|
||||
|
||||
TEST(SpsVuiRewriterOutgoingVuiTest, ParseOutgoingBitstreamNoVui) {
|
||||
@ -433,8 +433,31 @@ TEST(SpsVuiRewriterOutgoingVuiTest, ParseOutgoingBitstreamNoVui) {
|
||||
expected_buffer.AppendData(kStartSequence);
|
||||
expected_buffer.AppendData(kIdr2);
|
||||
|
||||
EXPECT_THAT(
|
||||
SpsVuiRewriter::ParseOutgoingBitstreamAndRewriteSps(buffer, nullptr),
|
||||
::testing::ElementsAreArray(expected_buffer));
|
||||
EXPECT_THAT(SpsVuiRewriter::ParseOutgoingBitstreamAndRewrite(buffer, nullptr),
|
||||
::testing::ElementsAreArray(expected_buffer));
|
||||
}
|
||||
|
||||
TEST(SpsVuiRewriterOutgoingAudTest, ParseOutgoingBitstreamWithAud) {
|
||||
rtc::LogMessage::LogToDebug(rtc::LS_VERBOSE);
|
||||
|
||||
rtc::Buffer optimal_sps;
|
||||
GenerateFakeSps(kVuiNoFrameBuffering, &optimal_sps);
|
||||
|
||||
rtc::Buffer buffer;
|
||||
buffer.AppendData(kStartSequence);
|
||||
buffer.AppendData(kAud);
|
||||
buffer.AppendData(kStartSequence);
|
||||
buffer.AppendData(optimal_sps);
|
||||
buffer.AppendData(kStartSequence);
|
||||
buffer.AppendData(kIdr1);
|
||||
|
||||
rtc::Buffer expected_buffer;
|
||||
expected_buffer.AppendData(kStartSequence);
|
||||
expected_buffer.AppendData(optimal_sps);
|
||||
expected_buffer.AppendData(kStartSequence);
|
||||
expected_buffer.AppendData(kIdr1);
|
||||
|
||||
EXPECT_THAT(SpsVuiRewriter::ParseOutgoingBitstreamAndRewrite(buffer, nullptr),
|
||||
::testing::ElementsAreArray(expected_buffer));
|
||||
}
|
||||
} // namespace webrtc
|
||||
|
||||
@ -213,7 +213,7 @@ void FrameEncodeMetadataWriter::UpdateBitstream(
|
||||
// Make sure that the data is not copied if owned by EncodedImage.
|
||||
const EncodedImage& buffer = *encoded_image;
|
||||
rtc::Buffer modified_buffer =
|
||||
SpsVuiRewriter::ParseOutgoingBitstreamAndRewriteSps(
|
||||
SpsVuiRewriter::ParseOutgoingBitstreamAndRewrite(
|
||||
buffer, encoded_image->ColorSpace());
|
||||
|
||||
encoded_image->SetEncodedData(
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user