Use generic video header frame ID as picture ID.
Bug: webrtc:9582 Change-Id: I7b68a66205f704cba3afe1f461cce2c993016056 Reviewed-on: https://webrtc-review.googlesource.com/96501 Reviewed-by: Philip Eliasson <philipel@webrtc.org> Commit-Queue: Sami Kalliomäki <sakal@webrtc.org> Cr-Commit-Position: refs/heads/master@{#24479}
This commit is contained in:

committed by
Commit Bot

parent
f16776280f
commit
9882495eca
@ -151,12 +151,12 @@ bool RtpFrameObject::delayed_by_retransmission() const {
|
|||||||
return times_nacked() > 0;
|
return times_nacked() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
absl::optional<RTPVideoTypeHeader> RtpFrameObject::GetCodecHeader() const {
|
absl::optional<RTPVideoHeader> RtpFrameObject::GetCodecHeader() const {
|
||||||
rtc::CritScope lock(&packet_buffer_->crit_);
|
rtc::CritScope lock(&packet_buffer_->crit_);
|
||||||
VCMPacket* packet = packet_buffer_->GetPacket(first_seq_num_);
|
VCMPacket* packet = packet_buffer_->GetPacket(first_seq_num_);
|
||||||
if (!packet)
|
if (!packet)
|
||||||
return absl::nullopt;
|
return absl::nullopt;
|
||||||
return packet->video_header.video_type_header;
|
return packet->video_header;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace video_coding
|
} // namespace video_coding
|
||||||
|
@ -40,7 +40,7 @@ class RtpFrameObject : public EncodedFrame {
|
|||||||
int64_t ReceivedTime() const override;
|
int64_t ReceivedTime() const override;
|
||||||
int64_t RenderTime() const override;
|
int64_t RenderTime() const override;
|
||||||
bool delayed_by_retransmission() const override;
|
bool delayed_by_retransmission() const override;
|
||||||
absl::optional<RTPVideoTypeHeader> GetCodecHeader() const;
|
absl::optional<RTPVideoHeader> GetCodecHeader() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
rtc::scoped_refptr<PacketBuffer> packet_buffer_;
|
rtc::scoped_refptr<PacketBuffer> packet_buffer_;
|
||||||
|
@ -88,8 +88,14 @@ RtpFrameReferenceFinder::ManageFrameInternal(RtpFrameObject* frame) {
|
|||||||
return ManageFrameVp8(frame);
|
return ManageFrameVp8(frame);
|
||||||
case kVideoCodecVP9:
|
case kVideoCodecVP9:
|
||||||
return ManageFrameVp9(frame);
|
return ManageFrameVp9(frame);
|
||||||
default:
|
default: {
|
||||||
return ManageFrameGeneric(frame, kNoPictureId);
|
// Use 15 first bits of frame ID as picture ID if available.
|
||||||
|
absl::optional<RTPVideoHeader> video_header = frame->GetCodecHeader();
|
||||||
|
absl::optional<RTPVideoHeader::GenericDescriptorInfo> generic_info =
|
||||||
|
video_header ? video_header->generic : absl::nullopt;
|
||||||
|
return ManageFrameGeneric(
|
||||||
|
frame, generic_info ? generic_info->frame_id & 0x7fff : kNoPictureId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,15 +235,16 @@ RtpFrameReferenceFinder::ManageFrameGeneric(RtpFrameObject* frame,
|
|||||||
|
|
||||||
RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp8(
|
RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp8(
|
||||||
RtpFrameObject* frame) {
|
RtpFrameObject* frame) {
|
||||||
absl::optional<RTPVideoTypeHeader> rtp_codec_header = frame->GetCodecHeader();
|
absl::optional<RTPVideoHeader> video_header = frame->GetCodecHeader();
|
||||||
if (!rtp_codec_header) {
|
if (!video_header) {
|
||||||
RTC_LOG(LS_WARNING)
|
RTC_LOG(LS_WARNING)
|
||||||
<< "Failed to get codec header from frame, dropping frame.";
|
<< "Failed to get codec header from frame, dropping frame.";
|
||||||
return kDrop;
|
return kDrop;
|
||||||
}
|
}
|
||||||
|
RTPVideoTypeHeader rtp_codec_header = video_header->video_type_header;
|
||||||
|
|
||||||
const RTPVideoHeaderVP8& codec_header =
|
const RTPVideoHeaderVP8& codec_header =
|
||||||
absl::get<RTPVideoHeaderVP8>(*rtp_codec_header);
|
absl::get<RTPVideoHeaderVP8>(rtp_codec_header);
|
||||||
|
|
||||||
if (codec_header.pictureId == kNoPictureId ||
|
if (codec_header.pictureId == kNoPictureId ||
|
||||||
codec_header.temporalIdx == kNoTemporalIdx ||
|
codec_header.temporalIdx == kNoTemporalIdx ||
|
||||||
@ -381,15 +388,16 @@ void RtpFrameReferenceFinder::UpdateLayerInfoVp8(RtpFrameObject* frame,
|
|||||||
|
|
||||||
RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9(
|
RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9(
|
||||||
RtpFrameObject* frame) {
|
RtpFrameObject* frame) {
|
||||||
absl::optional<RTPVideoTypeHeader> rtp_codec_header = frame->GetCodecHeader();
|
absl::optional<RTPVideoHeader> video_header = frame->GetCodecHeader();
|
||||||
if (!rtp_codec_header) {
|
if (!video_header) {
|
||||||
RTC_LOG(LS_WARNING)
|
RTC_LOG(LS_WARNING)
|
||||||
<< "Failed to get codec header from frame, dropping frame.";
|
<< "Failed to get codec header from frame, dropping frame.";
|
||||||
return kDrop;
|
return kDrop;
|
||||||
}
|
}
|
||||||
|
RTPVideoTypeHeader rtp_codec_header = video_header->video_type_header;
|
||||||
|
|
||||||
const RTPVideoHeaderVP9& codec_header =
|
const RTPVideoHeaderVP9& codec_header =
|
||||||
absl::get<RTPVideoHeaderVP9>(*rtp_codec_header);
|
absl::get<RTPVideoHeaderVP9>(rtp_codec_header);
|
||||||
|
|
||||||
if (codec_header.picture_id == kNoPictureId ||
|
if (codec_header.picture_id == kNoPictureId ||
|
||||||
codec_header.temporal_idx == kNoTemporalIdx) {
|
codec_header.temporal_idx == kNoTemporalIdx) {
|
||||||
|
Reference in New Issue
Block a user