Index: webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc b/webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc |
index ed30fc1c7188e2989a79f5e05f06ca07081a3765..e6d8d8ff0021cf8e6c33b6c294372b7d8bdadc63 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc |
@@ -95,24 +95,18 @@ bool LayerInfoPresent(const RTPVideoHeaderVP9& hdr) { |
// Reference indices: |
// |
-// +-+-+-+-+-+-+-+-+ -| P=1,F=1: At least one reference index |
-// P,F: | P_DIFF |X|N| . has to be specified. |
-// +-+-+-+-+-+-+-+-+ . up to 3 times |
-// X: |EXTENDED P_DIFF| . X=1: Extended P_DIFF is used (14 |
-// +-+-+-+-+-+-+-+-+ -| bits). Else 6 bits are used. |
-// N=1: An additional P_DIFF follows |
-// current P_DIFF. |
+// +-+-+-+-+-+-+-+-+ P=1,F=1: At least one reference index |
+// P,F: | P_DIFF |N| up to 3 times has to be specified. |
+// +-+-+-+-+-+-+-+-+ N=1: An additional P_DIFF follows |
+// current P_DIFF. |
+// |
size_t RefIndicesLength(const RTPVideoHeaderVP9& hdr) { |
if (!hdr.inter_pic_predicted || !hdr.flexible_mode) |
return 0; |
RTC_DCHECK_GT(hdr.num_ref_pics, 0U); |
RTC_DCHECK_LE(hdr.num_ref_pics, kMaxVp9RefPics); |
- size_t length = 0; |
- for (size_t i = 0; i < hdr.num_ref_pics; ++i) { |
- length += hdr.pid_diff[i] > 0x3F ? 2 : 1; // P_DIFF > 6 bits => extended |
- } |
- return length; |
+ return hdr.num_ref_pics; |
} |
// Scalability structure (SS). |
@@ -237,13 +231,11 @@ bool WriteLayerInfo(const RTPVideoHeaderVP9& vp9, |
// Reference indices: |
// |
-// +-+-+-+-+-+-+-+-+ -| P=1,F=1: At least one reference index |
-// P,F: | P_DIFF |X|N| . has to be specified. |
-// +-+-+-+-+-+-+-+-+ . up to 3 times |
-// X: |EXTENDED P_DIFF| . X=1: Extended P_DIFF is used (14 |
-// +-+-+-+-+-+-+-+-+ -| bits). Else 6 bits are used. |
-// N=1: An additional P_DIFF follows |
-// current P_DIFF. |
+// +-+-+-+-+-+-+-+-+ P=1,F=1: At least one reference index |
+// P,F: | P_DIFF |N| up to 3 times has to be specified. |
+// +-+-+-+-+-+-+-+-+ N=1: An additional P_DIFF follows |
+// current P_DIFF. |
+// |
bool WriteRefIndices(const RTPVideoHeaderVP9& vp9, |
rtc::BitBufferWriter* writer) { |
if (!PictureIdPresent(vp9) || |
@@ -251,18 +243,9 @@ bool WriteRefIndices(const RTPVideoHeaderVP9& vp9, |
return false; |
} |
for (size_t i = 0; i < vp9.num_ref_pics; ++i) { |
- bool x_bit = (vp9.pid_diff[i] > 0x3F); |
bool n_bit = !(i == vp9.num_ref_pics - 1); |
- if (x_bit) { |
- RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.pid_diff[i] >> 8, 6)); |
- RETURN_FALSE_ON_ERROR(writer->WriteBits(x_bit ? 1 : 0, 1)); |
- RETURN_FALSE_ON_ERROR(writer->WriteBits(n_bit ? 1 : 0, 1)); |
- RETURN_FALSE_ON_ERROR(writer->WriteUInt8(vp9.pid_diff[i])); |
- } else { |
- RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.pid_diff[i], 6)); |
- RETURN_FALSE_ON_ERROR(writer->WriteBits(x_bit ? 1 : 0, 1)); |
- RETURN_FALSE_ON_ERROR(writer->WriteBits(n_bit ? 1 : 0, 1)); |
- } |
+ RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.pid_diff[i], 7)); |
+ RETURN_FALSE_ON_ERROR(writer->WriteBits(n_bit ? 1 : 0, 1)); |
} |
return true; |
} |
@@ -391,13 +374,11 @@ bool ParseLayerInfo(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) { |
// Reference indices: |
// |
-// +-+-+-+-+-+-+-+-+ -| P=1,F=1: At least one reference index |
-// P,F: | P_DIFF |X|N| . has to be specified. |
-// +-+-+-+-+-+-+-+-+ . up to 3 times |
-// X: |EXTENDED P_DIFF| . X=1: Extended P_DIFF is used (14 |
-// +-+-+-+-+-+-+-+-+ -| bits). Else 6 bits are used. |
-// N=1: An additional P_DIFF follows |
-// current P_DIFF. |
+// +-+-+-+-+-+-+-+-+ P=1,F=1: At least one reference index |
+// P,F: | P_DIFF |N| up to 3 times has to be specified. |
+// +-+-+-+-+-+-+-+-+ N=1: An additional P_DIFF follows |
+// current P_DIFF. |
+// |
bool ParseRefIndices(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) { |
if (vp9->picture_id == kNoPictureId) |
return false; |
@@ -408,21 +389,14 @@ bool ParseRefIndices(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) { |
if (vp9->num_ref_pics == kMaxVp9RefPics) |
return false; |
- uint32_t p_diff, x_bit; |
- RETURN_FALSE_ON_ERROR(parser->ReadBits(&p_diff, 6)); |
- RETURN_FALSE_ON_ERROR(parser->ReadBits(&x_bit, 1)); |
+ uint32_t p_diff; |
+ RETURN_FALSE_ON_ERROR(parser->ReadBits(&p_diff, 7)); |
RETURN_FALSE_ON_ERROR(parser->ReadBits(&n_bit, 1)); |
- if (x_bit) { |
- // P_DIFF is 14 bits. |
- uint8_t ext_p_diff; |
- RETURN_FALSE_ON_ERROR(parser->ReadUInt8(&ext_p_diff)); |
- p_diff = (p_diff << 8) + ext_p_diff; |
- } |
- |
vp9->pid_diff[vp9->num_ref_pics] = p_diff; |
uint32_t scaled_pid = vp9->picture_id; |
- while (p_diff > scaled_pid) { |
+ if (p_diff > scaled_pid) { |
+ // TODO(asapersson): Max should correspond to the picture id of last wrap. |
scaled_pid += vp9->max_picture_id + 1; |
} |
vp9->ref_picture_id[vp9->num_ref_pics++] = scaled_pid - p_diff; |
@@ -597,9 +571,7 @@ bool RtpPacketizerVp9::NextPacket(uint8_t* buffer, |
// +-+-+-+-+-+-+-+-+ |
// L: | T |U| S |D| (CONDITIONALLY RECOMMENDED) |
// +-+-+-+-+-+-+-+-+ -| |
-// P,F: | P_DIFF |X|N| (CONDITIONALLY RECOMMENDED) . |
-// +-+-+-+-+-+-+-+-+ . up to 3 times |
-// X: |EXTENDED P_DIFF| . |
+// P,F: | P_DIFF |N| (CONDITIONALLY RECOMMENDED) . up to 3 times |
// +-+-+-+-+-+-+-+-+ -| |
// V: | SS | |
// | .. | |