diff options
Diffstat (limited to 'webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc')
-rw-r--r-- | webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc | 72 |
1 files changed, 30 insertions, 42 deletions
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc b/webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc index 0e76a8eae8..d2f22d5044 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_format_vp9.cc @@ -47,10 +47,6 @@ int16_t Tl0PicIdxField(const RTPVideoHeaderVP9& hdr, uint8_t def) { return (hdr.tl0_pic_idx == kNoTl0PicIdx) ? def : hdr.tl0_pic_idx; } -uint8_t GofIdxField(const RTPVideoHeaderVP9& hdr, uint8_t def) { - return (hdr.gof_idx == kNoGofIdx) ? def : hdr.gof_idx; -} - // Picture ID: // // +-+-+-+-+-+-+-+-+ @@ -74,19 +70,17 @@ bool PictureIdPresent(const RTPVideoHeaderVP9& hdr) { // Flexible mode (F=1): Non-flexible mode (F=0): // // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ -// L: | T |U| S |D| |GOF_IDX| S |D| +// L: | T |U| S |D| | T |U| S |D| // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ // | TL0PICIDX | // +-+-+-+-+-+-+-+-+ // size_t LayerInfoLength(const RTPVideoHeaderVP9& hdr) { - if (hdr.flexible_mode) { - return (hdr.temporal_idx == kNoTemporalIdx && - hdr.spatial_idx == kNoSpatialIdx) ? 0 : 1; - } else { - return (hdr.gof_idx == kNoGofIdx && - hdr.spatial_idx == kNoSpatialIdx) ? 0 : 2; + if (hdr.temporal_idx == kNoTemporalIdx && + hdr.spatial_idx == kNoSpatialIdx) { + return 0; } + return hdr.flexible_mode ? 1 : 2; } bool LayerInfoPresent(const RTPVideoHeaderVP9& hdr) { @@ -198,8 +192,8 @@ bool WritePictureId(const RTPVideoHeaderVP9& vp9, // L: | T |U| S |D| // +-+-+-+-+-+-+-+-+ // -bool WriteLayerInfoFlexibleMode(const RTPVideoHeaderVP9& vp9, - rtc::BitBufferWriter* writer) { +bool WriteLayerInfoCommon(const RTPVideoHeaderVP9& vp9, + rtc::BitBufferWriter* writer) { RETURN_FALSE_ON_ERROR(writer->WriteBits(TemporalIdxField(vp9, 0), 3)); RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.temporal_up_switch ? 1 : 0, 1)); RETURN_FALSE_ON_ERROR(writer->WriteBits(SpatialIdxField(vp9, 0), 3)); @@ -210,27 +204,26 @@ bool WriteLayerInfoFlexibleMode(const RTPVideoHeaderVP9& vp9, // Non-flexible mode (F=0): // // +-+-+-+-+-+-+-+-+ -// L: |GOF_IDX| S |D| +// L: | T |U| S |D| // +-+-+-+-+-+-+-+-+ // | TL0PICIDX | // +-+-+-+-+-+-+-+-+ // bool WriteLayerInfoNonFlexibleMode(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) { - RETURN_FALSE_ON_ERROR(writer->WriteBits(GofIdxField(vp9, 0), 4)); - RETURN_FALSE_ON_ERROR(writer->WriteBits(SpatialIdxField(vp9, 0), 3)); - RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.inter_layer_predicted ? 1: 0, 1)); RETURN_FALSE_ON_ERROR(writer->WriteUInt8(Tl0PicIdxField(vp9, 0))); return true; } bool WriteLayerInfo(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) { - if (vp9.flexible_mode) { - return WriteLayerInfoFlexibleMode(vp9, writer); - } else { - return WriteLayerInfoNonFlexibleMode(vp9, writer); - } + if (!WriteLayerInfoCommon(vp9, writer)) + return false; + + if (vp9.flexible_mode) + return true; + + return WriteLayerInfoNonFlexibleMode(vp9, writer); } // Reference indices: @@ -246,7 +239,7 @@ bool WriteRefIndices(const RTPVideoHeaderVP9& vp9, vp9.num_ref_pics == 0 || vp9.num_ref_pics > kMaxVp9RefPics) { 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); RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.pid_diff[i], 7)); RETURN_FALSE_ON_ERROR(writer->WriteBits(n_bit ? 1 : 0, 1)); @@ -301,7 +294,7 @@ bool WriteSsData(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) { 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(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])); } } @@ -337,8 +330,7 @@ bool ParsePictureId(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) { // L: | T |U| S |D| // +-+-+-+-+-+-+-+-+ // -bool ParseLayerInfoFlexibleMode(rtc::BitBuffer* parser, - RTPVideoHeaderVP9* vp9) { +bool ParseLayerInfoCommon(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) { uint32_t t, u_bit, s, d_bit; RETURN_FALSE_ON_ERROR(parser->ReadBits(&t, 3)); RETURN_FALSE_ON_ERROR(parser->ReadBits(&u_bit, 1)); @@ -354,32 +346,27 @@ bool ParseLayerInfoFlexibleMode(rtc::BitBuffer* parser, // Layer indices (non-flexible mode): // // +-+-+-+-+-+-+-+-+ -// L: |GOF_IDX| S |D| +// L: | T |U| S |D| // +-+-+-+-+-+-+-+-+ // | TL0PICIDX | // +-+-+-+-+-+-+-+-+ // bool ParseLayerInfoNonFlexibleMode(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) { - uint32_t gof_idx, s, d_bit; uint8_t tl0picidx; - RETURN_FALSE_ON_ERROR(parser->ReadBits(&gof_idx, 4)); - RETURN_FALSE_ON_ERROR(parser->ReadBits(&s, 3)); - RETURN_FALSE_ON_ERROR(parser->ReadBits(&d_bit, 1)); RETURN_FALSE_ON_ERROR(parser->ReadUInt8(&tl0picidx)); - vp9->gof_idx = gof_idx; - vp9->spatial_idx = s; - vp9->inter_layer_predicted = d_bit ? true : false; vp9->tl0_pic_idx = tl0picidx; return true; } bool ParseLayerInfo(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) { - if (vp9->flexible_mode) { - return ParseLayerInfoFlexibleMode(parser, vp9); - } else { - return ParseLayerInfoNonFlexibleMode(parser, vp9); - } + if (!ParseLayerInfoCommon(parser, vp9)) + return false; + + if (vp9->flexible_mode) + return true; + + return ParseLayerInfoNonFlexibleMode(parser, vp9); } // Reference indices: @@ -466,7 +453,7 @@ bool ParseSsData(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) { vp9->gof.temporal_up_switch[i] = u_bit ? true : false; 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; RETURN_FALSE_ON_ERROR(parser->ReadUInt8(&p_diff)); vp9->gof.pid_diff[i][p] = p_diff; @@ -604,7 +591,7 @@ bool RtpPacketizerVp9::NextPacket(uint8_t* buffer, // +-+-+-+-+-+-+-+-+ // M: | EXTENDED PID | (RECOMMENDED) // +-+-+-+-+-+-+-+-+ -// L: |GOF_IDX| S |D| (CONDITIONALLY RECOMMENDED) +// L: | T |U| S |D| (CONDITIONALLY RECOMMENDED) // +-+-+-+-+-+-+-+-+ // | TL0PICIDX | (CONDITIONALLY REQUIRED) // +-+-+-+-+-+-+-+-+ @@ -738,7 +725,8 @@ bool RtpDepacketizerVp9::Parse(ParsedPayload* parsed_payload, parsed_payload->type.Video.height = vp9->height[0]; } } - parsed_payload->type.Video.isFirstPacket = b_bit && (vp9->spatial_idx == 0); + parsed_payload->type.Video.isFirstPacket = + b_bit && (!l_bit || !vp9->inter_layer_predicted); uint64_t rem_bits = parser.RemainingBitCount(); assert(rem_bits % 8 == 0); |