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:
Sami Kalliomäki
2018-08-28 14:39:21 +02:00
committed by Commit Bot
parent f16776280f
commit 9882495eca
3 changed files with 19 additions and 11 deletions

View File

@ -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

View File

@ -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_;

View File

@ -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) {