Reland of "Change type of pid_diff (int16_t -> uint8_t) according to updates in RTP payload profile."
BUG=webrtc:5144 TBR=mflodman@webrtc.org Review URL: https://codereview.webrtc.org/1409753007 Cr-Commit-Position: refs/heads/master@{#10533}
This commit is contained in:
@ -131,7 +131,7 @@ struct GofInfoVP9 {
|
|||||||
temporal_idx[i] = src.temporal_idx[i];
|
temporal_idx[i] = src.temporal_idx[i];
|
||||||
temporal_up_switch[i] = src.temporal_up_switch[i];
|
temporal_up_switch[i] = src.temporal_up_switch[i];
|
||||||
num_ref_pics[i] = src.num_ref_pics[i];
|
num_ref_pics[i] = src.num_ref_pics[i];
|
||||||
for (size_t r = 0; r < num_ref_pics[i]; ++r) {
|
for (uint8_t r = 0; r < num_ref_pics[i]; ++r) {
|
||||||
pid_diff[i][r] = src.pid_diff[i][r];
|
pid_diff[i][r] = src.pid_diff[i][r];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -140,8 +140,8 @@ struct GofInfoVP9 {
|
|||||||
size_t num_frames_in_gof;
|
size_t num_frames_in_gof;
|
||||||
uint8_t temporal_idx[kMaxVp9FramesInGof];
|
uint8_t temporal_idx[kMaxVp9FramesInGof];
|
||||||
bool temporal_up_switch[kMaxVp9FramesInGof];
|
bool temporal_up_switch[kMaxVp9FramesInGof];
|
||||||
size_t num_ref_pics[kMaxVp9FramesInGof];
|
uint8_t num_ref_pics[kMaxVp9FramesInGof];
|
||||||
int16_t pid_diff[kMaxVp9FramesInGof][kMaxVp9RefPics];
|
uint8_t pid_diff[kMaxVp9FramesInGof][kMaxVp9RefPics];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RTPVideoHeaderVP9 {
|
struct RTPVideoHeaderVP9 {
|
||||||
@ -185,9 +185,9 @@ struct RTPVideoHeaderVP9 {
|
|||||||
|
|
||||||
uint8_t gof_idx; // Index to predefined temporal frame info in SS data.
|
uint8_t gof_idx; // Index to predefined temporal frame info in SS data.
|
||||||
|
|
||||||
size_t num_ref_pics; // Number of reference pictures used by this layer
|
uint8_t num_ref_pics; // Number of reference pictures used by this layer
|
||||||
// frame.
|
// frame.
|
||||||
int16_t pid_diff[kMaxVp9RefPics]; // P_DIFF signaled to derive the PictureID
|
uint8_t pid_diff[kMaxVp9RefPics]; // P_DIFF signaled to derive the PictureID
|
||||||
// of the reference pictures.
|
// of the reference pictures.
|
||||||
int16_t ref_picture_id[kMaxVp9RefPics]; // PictureID of reference pictures.
|
int16_t ref_picture_id[kMaxVp9RefPics]; // PictureID of reference pictures.
|
||||||
|
|
||||||
|
|||||||
@ -133,7 +133,7 @@ struct GofInfoVP9 {
|
|||||||
temporal_idx[i] = src.temporal_idx[i];
|
temporal_idx[i] = src.temporal_idx[i];
|
||||||
temporal_up_switch[i] = src.temporal_up_switch[i];
|
temporal_up_switch[i] = src.temporal_up_switch[i];
|
||||||
num_ref_pics[i] = src.num_ref_pics[i];
|
num_ref_pics[i] = src.num_ref_pics[i];
|
||||||
for (size_t r = 0; r < num_ref_pics[i]; ++r) {
|
for (uint8_t r = 0; r < num_ref_pics[i]; ++r) {
|
||||||
pid_diff[i][r] = src.pid_diff[i][r];
|
pid_diff[i][r] = src.pid_diff[i][r];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,8 +142,8 @@ struct GofInfoVP9 {
|
|||||||
size_t num_frames_in_gof;
|
size_t num_frames_in_gof;
|
||||||
uint8_t temporal_idx[kMaxVp9FramesInGof];
|
uint8_t temporal_idx[kMaxVp9FramesInGof];
|
||||||
bool temporal_up_switch[kMaxVp9FramesInGof];
|
bool temporal_up_switch[kMaxVp9FramesInGof];
|
||||||
size_t num_ref_pics[kMaxVp9FramesInGof];
|
uint8_t num_ref_pics[kMaxVp9FramesInGof];
|
||||||
int16_t pid_diff[kMaxVp9FramesInGof][kMaxVp9RefPics];
|
uint8_t pid_diff[kMaxVp9FramesInGof][kMaxVp9RefPics];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RTPVideoHeaderVP9 {
|
struct RTPVideoHeaderVP9 {
|
||||||
@ -187,9 +187,9 @@ struct RTPVideoHeaderVP9 {
|
|||||||
|
|
||||||
uint8_t gof_idx; // Index to predefined temporal frame info in SS data.
|
uint8_t gof_idx; // Index to predefined temporal frame info in SS data.
|
||||||
|
|
||||||
size_t num_ref_pics; // Number of reference pictures used by this layer
|
uint8_t num_ref_pics; // Number of reference pictures used by this layer
|
||||||
// frame.
|
// frame.
|
||||||
int16_t pid_diff[kMaxVp9RefPics]; // P_DIFF signaled to derive the PictureID
|
uint8_t pid_diff[kMaxVp9RefPics]; // P_DIFF signaled to derive the PictureID
|
||||||
// of the reference pictures.
|
// of the reference pictures.
|
||||||
int16_t ref_picture_id[kMaxVp9RefPics]; // PictureID of reference pictures.
|
int16_t ref_picture_id[kMaxVp9RefPics]; // PictureID of reference pictures.
|
||||||
|
|
||||||
|
|||||||
@ -239,7 +239,7 @@ bool WriteRefIndices(const RTPVideoHeaderVP9& vp9,
|
|||||||
vp9.num_ref_pics == 0 || vp9.num_ref_pics > kMaxVp9RefPics) {
|
vp9.num_ref_pics == 0 || vp9.num_ref_pics > kMaxVp9RefPics) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < vp9.num_ref_pics; ++i) {
|
for (uint8_t i = 0; i < vp9.num_ref_pics; ++i) {
|
||||||
bool n_bit = !(i == vp9.num_ref_pics - 1);
|
bool n_bit = !(i == vp9.num_ref_pics - 1);
|
||||||
RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.pid_diff[i], 7));
|
RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.pid_diff[i], 7));
|
||||||
RETURN_FALSE_ON_ERROR(writer->WriteBits(n_bit ? 1 : 0, 1));
|
RETURN_FALSE_ON_ERROR(writer->WriteBits(n_bit ? 1 : 0, 1));
|
||||||
@ -294,7 +294,7 @@ bool WriteSsData(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) {
|
|||||||
writer->WriteBits(vp9.gof.temporal_up_switch[i] ? 1 : 0, 1));
|
writer->WriteBits(vp9.gof.temporal_up_switch[i] ? 1 : 0, 1));
|
||||||
RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.gof.num_ref_pics[i], 2));
|
RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.gof.num_ref_pics[i], 2));
|
||||||
RETURN_FALSE_ON_ERROR(writer->WriteBits(kReservedBitValue0, 2));
|
RETURN_FALSE_ON_ERROR(writer->WriteBits(kReservedBitValue0, 2));
|
||||||
for (size_t r = 0; r < vp9.gof.num_ref_pics[i]; ++r) {
|
for (uint8_t r = 0; r < vp9.gof.num_ref_pics[i]; ++r) {
|
||||||
RETURN_FALSE_ON_ERROR(writer->WriteUInt8(vp9.gof.pid_diff[i][r]));
|
RETURN_FALSE_ON_ERROR(writer->WriteUInt8(vp9.gof.pid_diff[i][r]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -453,7 +453,7 @@ bool ParseSsData(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) {
|
|||||||
vp9->gof.temporal_up_switch[i] = u_bit ? true : false;
|
vp9->gof.temporal_up_switch[i] = u_bit ? true : false;
|
||||||
vp9->gof.num_ref_pics[i] = r;
|
vp9->gof.num_ref_pics[i] = r;
|
||||||
|
|
||||||
for (size_t p = 0; p < vp9->gof.num_ref_pics[i]; ++p) {
|
for (uint8_t p = 0; p < vp9->gof.num_ref_pics[i]; ++p) {
|
||||||
uint8_t p_diff;
|
uint8_t p_diff;
|
||||||
RETURN_FALSE_ON_ERROR(parser->ReadUInt8(&p_diff));
|
RETURN_FALSE_ON_ERROR(parser->ReadUInt8(&p_diff));
|
||||||
vp9->gof.pid_diff[i][p] = p_diff;
|
vp9->gof.pid_diff[i][p] = p_diff;
|
||||||
|
|||||||
@ -55,7 +55,7 @@ void VerifyHeader(const RTPVideoHeaderVP9& expected,
|
|||||||
actual.gof.temporal_up_switch[i]);
|
actual.gof.temporal_up_switch[i]);
|
||||||
EXPECT_EQ(expected.gof.temporal_idx[i], actual.gof.temporal_idx[i]);
|
EXPECT_EQ(expected.gof.temporal_idx[i], actual.gof.temporal_idx[i]);
|
||||||
EXPECT_EQ(expected.gof.num_ref_pics[i], actual.gof.num_ref_pics[i]);
|
EXPECT_EQ(expected.gof.num_ref_pics[i], actual.gof.num_ref_pics[i]);
|
||||||
for (size_t j = 0; j < expected.gof.num_ref_pics[i]; j++) {
|
for (uint8_t j = 0; j < expected.gof.num_ref_pics[i]; j++) {
|
||||||
EXPECT_EQ(expected.gof.pid_diff[i][j], actual.gof.pid_diff[i][j]);
|
EXPECT_EQ(expected.gof.pid_diff[i][j], actual.gof.pid_diff[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -550,9 +550,9 @@ TEST_F(RtpDepacketizerVp9Test, ParseLayerInfoWithFlexibleMode) {
|
|||||||
TEST_F(RtpDepacketizerVp9Test, ParseRefIdx) {
|
TEST_F(RtpDepacketizerVp9Test, ParseRefIdx) {
|
||||||
const uint8_t kHeaderLength = 6;
|
const uint8_t kHeaderLength = 6;
|
||||||
const int16_t kPictureId = 17;
|
const int16_t kPictureId = 17;
|
||||||
const int16_t kPdiff1 = 17;
|
const uint8_t kPdiff1 = 17;
|
||||||
const int16_t kPdiff2 = 18;
|
const uint8_t kPdiff2 = 18;
|
||||||
const int16_t kPdiff3 = 127;
|
const uint8_t kPdiff3 = 127;
|
||||||
uint8_t packet[13] = {0};
|
uint8_t packet[13] = {0};
|
||||||
packet[0] = 0xD8; // I:1 P:1 L:0 F:1 B:1 E:0 V:0 R:0
|
packet[0] = 0xD8; // I:1 P:1 L:0 F:1 B:1 E:0 V:0 R:0
|
||||||
packet[1] = 0x80 | ((kPictureId >> 8) & 0x7F); // Two byte pictureID.
|
packet[1] = 0x80 | ((kPictureId >> 8) & 0x7F); // Two byte pictureID.
|
||||||
@ -582,7 +582,7 @@ TEST_F(RtpDepacketizerVp9Test, ParseRefIdx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(RtpDepacketizerVp9Test, ParseRefIdxFailsWithNoPictureId) {
|
TEST_F(RtpDepacketizerVp9Test, ParseRefIdxFailsWithNoPictureId) {
|
||||||
const int16_t kPdiff = 3;
|
const uint8_t kPdiff = 3;
|
||||||
uint8_t packet[13] = {0};
|
uint8_t packet[13] = {0};
|
||||||
packet[0] = 0x58; // I:0 P:1 L:0 F:1 B:1 E:0 V:0 R:0
|
packet[0] = 0x58; // I:0 P:1 L:0 F:1 B:1 E:0 V:0 R:0
|
||||||
packet[1] = (kPdiff << 1); // P,F: P_DIFF:3 N:0
|
packet[1] = (kPdiff << 1); // P,F: P_DIFF:3 N:0
|
||||||
@ -592,7 +592,7 @@ TEST_F(RtpDepacketizerVp9Test, ParseRefIdxFailsWithNoPictureId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(RtpDepacketizerVp9Test, ParseRefIdxFailsWithTooManyRefPics) {
|
TEST_F(RtpDepacketizerVp9Test, ParseRefIdxFailsWithTooManyRefPics) {
|
||||||
const int16_t kPdiff = 3;
|
const uint8_t kPdiff = 3;
|
||||||
uint8_t packet[13] = {0};
|
uint8_t packet[13] = {0};
|
||||||
packet[0] = 0xD8; // I:1 P:1 L:0 F:1 B:1 E:0 V:0 R:0
|
packet[0] = 0xD8; // I:1 P:1 L:0 F:1 B:1 E:0 V:0 R:0
|
||||||
packet[1] = kMaxOneBytePictureId; // I: PICTURE ID:127
|
packet[1] = kMaxOneBytePictureId; // I: PICTURE ID:127
|
||||||
|
|||||||
@ -168,6 +168,7 @@ void Vp9SsMap::AdvanceFront(uint32_t timestamp) {
|
|||||||
ss_map_[timestamp] = gof;
|
ss_map_[timestamp] = gof;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(asapersson): Update according to updates in RTP payload profile.
|
||||||
bool Vp9SsMap::UpdatePacket(VCMPacket* packet) {
|
bool Vp9SsMap::UpdatePacket(VCMPacket* packet) {
|
||||||
uint8_t gof_idx = packet->codecSpecificHeader.codecHeader.VP9.gof_idx;
|
uint8_t gof_idx = packet->codecSpecificHeader.codecHeader.VP9.gof_idx;
|
||||||
if (gof_idx == kNoGofIdx)
|
if (gof_idx == kNoGofIdx)
|
||||||
@ -186,7 +187,7 @@ bool Vp9SsMap::UpdatePacket(VCMPacket* packet) {
|
|||||||
|
|
||||||
// TODO(asapersson): Set vp9.ref_picture_id[i] and add usage.
|
// TODO(asapersson): Set vp9.ref_picture_id[i] and add usage.
|
||||||
vp9->num_ref_pics = it->second.num_ref_pics[gof_idx];
|
vp9->num_ref_pics = it->second.num_ref_pics[gof_idx];
|
||||||
for (size_t i = 0; i < it->second.num_ref_pics[gof_idx]; ++i) {
|
for (uint8_t i = 0; i < it->second.num_ref_pics[gof_idx]; ++i) {
|
||||||
vp9->pid_diff[i] = it->second.pid_diff[gof_idx][i];
|
vp9->pid_diff[i] = it->second.pid_diff[gof_idx][i];
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@ -126,7 +126,7 @@ void VCMSessionInfo::SetGofInfo(const GofInfoVP9& gof_info, size_t idx) {
|
|||||||
gof_info.temporal_up_switch[idx];
|
gof_info.temporal_up_switch[idx];
|
||||||
packets_.front().codecSpecificHeader.codecHeader.VP9.num_ref_pics =
|
packets_.front().codecSpecificHeader.codecHeader.VP9.num_ref_pics =
|
||||||
gof_info.num_ref_pics[idx];
|
gof_info.num_ref_pics[idx];
|
||||||
for (size_t i = 0; i < gof_info.num_ref_pics[idx]; ++i) {
|
for (uint8_t i = 0; i < gof_info.num_ref_pics[idx]; ++i) {
|
||||||
packets_.front().codecSpecificHeader.codecHeader.VP9.pid_diff[i] =
|
packets_.front().codecSpecificHeader.codecHeader.VP9.pid_diff[i] =
|
||||||
gof_info.pid_diff[idx][i];
|
gof_info.pid_diff[idx][i];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user