From cd4ab49ee7a543836793494b8ba3568694b612c7 Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Thu, 2 Sep 2021 13:37:54 +0200 Subject: [PATCH] in Vp9UncompressedHeaderParser fix reading delta quantization parameter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit delta_q is encoded as signed integer (s(4)) that uses extra bit for the sign. See VP9 Bitstream Specification section 6.2.10 Delta quantizer syntax Bug: None Change-Id: Ib458c2a2ded3c4d6c153b6bedd29c48ef12cc538 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/231125 Commit-Queue: Danil Chapovalov Reviewed-by: Erik Språng Cr-Commit-Position: refs/heads/main@{#34908} --- .../video_coding/utility/vp9_uncompressed_header_parser.cc | 5 ++++- .../utility/vp9_uncompressed_header_parser_unittest.cc | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/video_coding/utility/vp9_uncompressed_header_parser.cc b/modules/video_coding/utility/vp9_uncompressed_header_parser.cc index d8f24be0dc..867967ddc0 100644 --- a/modules/video_coding/utility/vp9_uncompressed_header_parser.cc +++ b/modules/video_coding/utility/vp9_uncompressed_header_parser.cc @@ -145,7 +145,10 @@ void Vp9ReadQp(BitstreamReader& br, Vp9UncompressedHeader* frame_info) { frame_info->is_lossless = frame_info->base_qp == 0; for (int i = 0; i < 3; ++i) { if (br.Read()) { // if delta_coded - if (br.ReadBits(4) != 0) { + // delta_q is a signed integer with leading 4 bits containing absolute + // value and last bit containing sign. There are are two ways to represent + // zero with such encoding. + if ((br.ReadBits(5) & 0b1111'0) != 0) { // delta_q frame_info->is_lossless = false; } } diff --git a/modules/video_coding/utility/vp9_uncompressed_header_parser_unittest.cc b/modules/video_coding/utility/vp9_uncompressed_header_parser_unittest.cc index be0a303708..d8cc738e07 100644 --- a/modules/video_coding/utility/vp9_uncompressed_header_parser_unittest.cc +++ b/modules/video_coding/utility/vp9_uncompressed_header_parser_unittest.cc @@ -72,7 +72,7 @@ TEST(Vp9UncompressedHeaderParserTest, FrameWithSegmentation) { TEST(Vp9UncompressedHeaderParserTest, SegmentationWithDefaultPredProbs) { const uint8_t kHeader[] = {0x90, 0x49, 0x83, 0x42, 0x80, 0x2e, 0x30, 0x0, 0xb0, 0x0, 0x37, 0xff, - 0xd, 0x0, 0x0, 0x0, 0x0, 0x0}; + 0x06, 0x80, 0x0, 0x0, 0x0, 0x0}; absl::optional frame_info = ParseUncompressedVp9Header(kHeader); ASSERT_TRUE(frame_info.has_value()); @@ -82,7 +82,7 @@ TEST(Vp9UncompressedHeaderParserTest, SegmentationWithDefaultPredProbs) { TEST(Vp9UncompressedHeaderParserTest, SegmentationWithSkipLevel) { const uint8_t kHeader[] = {0x90, 0x49, 0x83, 0x42, 0x80, 0x2e, 0x30, 0x00, - 0xb0, 0x00, 0x37, 0xff, 0x0d, 0x00, 0x02, 0x10, + 0xb0, 0x00, 0x37, 0xff, 0x06, 0x80, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; absl::optional frame_info = ParseUncompressedVp9Header(kHeader);