Always add/rewrite VUI and set max_num_reorder_frames to 0.
Bug: webrtc:10256
Change-Id: I5c28e69973cc5666deba4a1d7d660dc91f82c9f6
Reviewed-on: https://webrtc-review.googlesource.com/c/120349
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26521}
diff --git a/common_video/h264/sps_vui_rewriter.cc b/common_video/h264/sps_vui_rewriter.cc
index 946604d..2e8fcb2 100644
--- a/common_video/h264/sps_vui_rewriter.cc
+++ b/common_video/h264/sps_vui_rewriter.cc
@@ -84,11 +84,6 @@
*sps = sps_state;
- if (sps_state->pic_order_cnt_type >= 2) {
- // No need to rewrite VUI in this case.
- return ParseResult::kPocOk;
- }
-
// We're going to completely muck up alignment, so we need a BitBuffer to
// write with.
rtc::Buffer out_buffer(length + kMaxVuiSpsIncrease);
diff --git a/common_video/h264/sps_vui_rewriter.h b/common_video/h264/sps_vui_rewriter.h
index 20d1dd0..f9b856f 100644
--- a/common_video/h264/sps_vui_rewriter.h
+++ b/common_video/h264/sps_vui_rewriter.h
@@ -31,7 +31,7 @@
// decoding.
class SpsVuiRewriter : private SpsParser {
public:
- enum class ParseResult { kFailure, kPocOk, kVuiOk, kVuiRewritten };
+ enum class ParseResult { kFailure, kVuiOk, kVuiRewritten };
// Parses an SPS block and if necessary copies it and rewrites the VUI.
// Returns kFailure on failure, kParseOk if parsing succeeded and no update
diff --git a/common_video/h264/sps_vui_rewriter_unittest.cc b/common_video/h264/sps_vui_rewriter_unittest.cc
index 7061dc0..60bef79 100644
--- a/common_video/h264/sps_vui_rewriter_unittest.cc
+++ b/common_video/h264/sps_vui_rewriter_unittest.cc
@@ -21,7 +21,6 @@
namespace webrtc {
enum SpsMode {
- kNoRewriteRequired_PocCorrect,
kNoRewriteRequired_VuiOptimal,
kRewriteRequired_NoVui,
kRewriteRequired_NoBitstreamRestriction,
@@ -55,14 +54,10 @@
// log2_max_frame_num_minus4: ue(v). 0 is fine.
writer.WriteExponentialGolomb(0);
// pic_order_cnt_type: ue(v).
- // POC type 2 is the one that doesn't need to be rewritten.
- if (mode == kNoRewriteRequired_PocCorrect) {
- writer.WriteExponentialGolomb(2);
- } else {
- writer.WriteExponentialGolomb(0);
- // log2_max_pic_order_cnt_lsb_minus4: ue(v). 0 is fine.
- writer.WriteExponentialGolomb(0);
- }
+ writer.WriteExponentialGolomb(0);
+ // log2_max_pic_order_cnt_lsb_minus4: ue(v). 0 is fine.
+ writer.WriteExponentialGolomb(0);
+
// max_num_ref_frames: ue(v). Use 1, to make optimal/suboptimal more obvious.
writer.WriteExponentialGolomb(1);
// gaps_in_frame_num_value_allowed_flag: u(1).
@@ -96,7 +91,7 @@
// Finally! The VUI.
// vui_parameters_present_flag: u(1)
- if (mode == kNoRewriteRequired_PocCorrect || mode == kRewriteRequired_NoVui) {
+ if (mode == kRewriteRequired_NoVui) {
writer.WriteBits(0, 1);
} else {
writer.WriteBits(1, 1);
@@ -124,7 +119,7 @@
if (mode == kRewriteRequired_VuiSuboptimal) {
writer.WriteExponentialGolomb(4);
writer.WriteExponentialGolomb(4);
- } else if (kNoRewriteRequired_VuiOptimal) {
+ } else {
writer.WriteExponentialGolomb(0);
writer.WriteExponentialGolomb(1);
}
@@ -138,42 +133,42 @@
byte_count++;
}
- // Write the NALU header and type; {0 0 0 1} and 7 for the SPS header type.
- uint8_t header[] = {0, 0, 0, 1, 7};
- out_buffer->AppendData(header, sizeof(header));
-
H264::WriteRbsp(rbsp, byte_count, out_buffer);
}
void TestSps(SpsMode mode, SpsVuiRewriter::ParseResult expected_parse_result) {
rtc::LogMessage::LogToDebug(rtc::LS_VERBOSE);
- rtc::Buffer buffer;
- GenerateFakeSps(mode, &buffer);
- std::vector<H264::NaluIndex> start_offsets =
- H264::FindNaluIndices(buffer.data(), buffer.size());
- EXPECT_EQ(1u, start_offsets.size());
- H264::NaluIndex index = start_offsets[0];
-
- H264::NaluType nal_type =
- H264::ParseNaluType(buffer[index.payload_start_offset]);
- EXPECT_EQ(H264::kSps, nal_type);
- index.payload_start_offset += H264::kNaluTypeSize;
- index.payload_size -= H264::kNaluTypeSize;
+ rtc::Buffer original_sps;
+ GenerateFakeSps(mode, &original_sps);
absl::optional<SpsParser::SpsState> sps;
- rtc::Buffer out_buffer;
- SpsVuiRewriter::ParseResult result =
- SpsVuiRewriter::ParseAndRewriteSps(&buffer[index.payload_start_offset],
- index.payload_size, &sps, &out_buffer);
+ rtc::Buffer rewritten_sps;
+ SpsVuiRewriter::ParseResult result = SpsVuiRewriter::ParseAndRewriteSps(
+ original_sps.data(), original_sps.size(), &sps, &rewritten_sps);
EXPECT_EQ(expected_parse_result, result);
+ ASSERT_TRUE(sps);
+ EXPECT_EQ(sps->width, kWidth);
+ EXPECT_EQ(sps->height, kHeight);
+ if (mode != kRewriteRequired_NoVui) {
+ EXPECT_EQ(sps->vui_params_present, 1u);
+ }
+
+ if (result == SpsVuiRewriter::ParseResult::kVuiRewritten) {
+ // Ensure that added/rewritten SPS is parsable.
+ rtc::Buffer tmp;
+ result = SpsVuiRewriter::ParseAndRewriteSps(
+ rewritten_sps.data(), rewritten_sps.size(), &sps, &tmp);
+ EXPECT_EQ(SpsVuiRewriter::ParseResult::kVuiOk, result);
+ ASSERT_TRUE(sps);
+ EXPECT_EQ(sps->width, kWidth);
+ EXPECT_EQ(sps->height, kHeight);
+ EXPECT_EQ(sps->vui_params_present, 1u);
+ }
}
#define REWRITE_TEST(test_name, mode, expected_parse_result) \
TEST(SpsVuiRewriterTest, test_name) { TestSps(mode, expected_parse_result); }
-REWRITE_TEST(PocCorrect,
- kNoRewriteRequired_PocCorrect,
- SpsVuiRewriter::ParseResult::kPocOk);
REWRITE_TEST(VuiAlreadyOptimal,
kNoRewriteRequired_VuiOptimal,
SpsVuiRewriter::ParseResult::kVuiOk);
@@ -186,5 +181,4 @@
REWRITE_TEST(RewriteSuboptimalVui,
kRewriteRequired_VuiSuboptimal,
SpsVuiRewriter::ParseResult::kVuiRewritten);
-
} // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format_h264.cc b/modules/rtp_rtcp/source/rtp_format_h264.cc
index b702a09..d10831f 100644
--- a/modules/rtp_rtcp/source/rtp_format_h264.cc
+++ b/modules/rtp_rtcp/source/rtp_format_h264.cc
@@ -43,7 +43,6 @@
static const char* kSpsValidHistogramName = "WebRTC.Video.H264.SpsValid";
enum SpsValidEvent {
- kReceivedSpsPocOk = 0,
kReceivedSpsVuiOk = 1,
kReceivedSpsRewritten = 2,
kReceivedSpsParseFailure = 3,
@@ -135,11 +134,6 @@
SpsValidEvent::kSentSpsRewritten,
SpsValidEvent::kSpsRewrittenMax);
break;
- case SpsVuiRewriter::ParseResult::kPocOk:
- RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
- SpsValidEvent::kSentSpsPocOk,
- SpsValidEvent::kSpsRewrittenMax);
- break;
case SpsVuiRewriter::ParseResult::kVuiOk:
RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
SpsValidEvent::kSentSpsVuiOk,
@@ -559,11 +553,6 @@
SpsValidEvent::kReceivedSpsRewritten,
SpsValidEvent::kSpsRewrittenMax);
break;
- case SpsVuiRewriter::ParseResult::kPocOk:
- RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
- SpsValidEvent::kReceivedSpsPocOk,
- SpsValidEvent::kSpsRewrittenMax);
- break;
case SpsVuiRewriter::ParseResult::kVuiOk:
RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
SpsValidEvent::kReceivedSpsVuiOk,