Refactor parsing generic descriptor extension into own function

Before making it even more complicated that it is right now.

Bug: webrtc:10342
Change-Id: I54f67309b8832cd85b6c5213f9b090908814ebd7
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168766
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30557}
This commit is contained in:
Danil Chapovalov 2020-02-19 12:56:33 +01:00 committed by Commit Bot
parent e52115a33e
commit b42c54f949
2 changed files with 58 additions and 38 deletions

View File

@ -327,6 +327,52 @@ absl::optional<Syncable::Info> RtpVideoStreamReceiver::GetSyncInfo() const {
return info; return info;
} }
RtpVideoStreamReceiver::ParseGenericDependenciesResult
RtpVideoStreamReceiver::ParseGenericDependenciesExtension(
const RtpPacketReceived& rtp_packet,
RTPVideoHeader* video_header) {
if (rtp_packet.HasExtension<RtpGenericFrameDescriptorExtension00>() &&
rtp_packet.HasExtension<RtpGenericFrameDescriptorExtension01>()) {
RTC_LOG(LS_WARNING) << "RTP packet had two different GFD versions.";
return kDropPacket;
}
RtpGenericFrameDescriptor generic_descriptor;
bool has_generic_descriptor =
rtp_packet.GetExtension<RtpGenericFrameDescriptorExtension01>(
&generic_descriptor) ||
rtp_packet.GetExtension<RtpGenericFrameDescriptorExtension00>(
&generic_descriptor);
if (!has_generic_descriptor) {
return kNoGenericDescriptor;
}
video_header->is_first_packet_in_frame =
generic_descriptor.FirstPacketInSubFrame();
video_header->is_last_packet_in_frame =
generic_descriptor.LastPacketInSubFrame();
if (generic_descriptor.FirstPacketInSubFrame()) {
video_header->frame_type =
generic_descriptor.FrameDependenciesDiffs().empty()
? VideoFrameType::kVideoFrameKey
: VideoFrameType::kVideoFrameDelta;
auto& descriptor = video_header->generic.emplace();
int64_t frame_id = frame_id_unwrapper_.Unwrap(generic_descriptor.FrameId());
descriptor.frame_id = frame_id;
descriptor.spatial_index = generic_descriptor.SpatialLayer();
descriptor.temporal_index = generic_descriptor.TemporalLayer();
descriptor.discardable = generic_descriptor.Discardable().value_or(false);
for (uint16_t fdiff : generic_descriptor.FrameDependenciesDiffs()) {
descriptor.dependencies.push_back(frame_id - fdiff);
}
}
video_header->width = generic_descriptor.Width();
video_header->height = generic_descriptor.Height();
return kHasGenericDescriptor;
}
void RtpVideoStreamReceiver::OnReceivedPayloadData( void RtpVideoStreamReceiver::OnReceivedPayloadData(
rtc::CopyOnWriteBuffer codec_payload, rtc::CopyOnWriteBuffer codec_payload,
const RtpPacketReceived& rtp_packet, const RtpPacketReceived& rtp_packet,
@ -368,44 +414,10 @@ void RtpVideoStreamReceiver::OnReceivedPayloadData(
rtp_packet.GetExtension<PlayoutDelayLimits>(&video_header.playout_delay); rtp_packet.GetExtension<PlayoutDelayLimits>(&video_header.playout_delay);
rtp_packet.GetExtension<FrameMarkingExtension>(&video_header.frame_marking); rtp_packet.GetExtension<FrameMarkingExtension>(&video_header.frame_marking);
if (rtp_packet.HasExtension<RtpGenericFrameDescriptorExtension00>() && ParseGenericDependenciesResult generic_descriptor_state =
rtp_packet.HasExtension<RtpGenericFrameDescriptorExtension01>()) { ParseGenericDependenciesExtension(rtp_packet, &video_header);
RTC_LOG(LS_WARNING) << "RTP packet had two different GFD versions."; if (generic_descriptor_state == kDropPacket)
return; return;
}
RtpGenericFrameDescriptor generic_descriptor;
bool has_generic_descriptor =
rtp_packet.GetExtension<RtpGenericFrameDescriptorExtension01>(
&generic_descriptor) ||
rtp_packet.GetExtension<RtpGenericFrameDescriptorExtension00>(
&generic_descriptor);
if (has_generic_descriptor) {
video_header.is_first_packet_in_frame =
generic_descriptor.FirstPacketInSubFrame();
video_header.is_last_packet_in_frame =
generic_descriptor.LastPacketInSubFrame();
if (generic_descriptor.FirstPacketInSubFrame()) {
video_header.frame_type =
generic_descriptor.FrameDependenciesDiffs().empty()
? VideoFrameType::kVideoFrameKey
: VideoFrameType::kVideoFrameDelta;
auto& descriptor = video_header.generic.emplace();
int64_t frame_id =
frame_id_unwrapper_.Unwrap(generic_descriptor.FrameId());
descriptor.frame_id = frame_id;
descriptor.spatial_index = generic_descriptor.SpatialLayer();
descriptor.temporal_index = generic_descriptor.TemporalLayer();
descriptor.discardable = generic_descriptor.Discardable().value_or(false);
for (uint16_t fdiff : generic_descriptor.FrameDependenciesDiffs()) {
descriptor.dependencies.push_back(frame_id - fdiff);
}
}
video_header.width = generic_descriptor.Width();
video_header.height = generic_descriptor.Height();
}
// Color space should only be transmitted in the last packet of a frame, // Color space should only be transmitted in the last packet of a frame,
// therefore, neglect it otherwise so that last_color_space_ is not reset by // therefore, neglect it otherwise so that last_color_space_ is not reset by
@ -428,7 +440,7 @@ void RtpVideoStreamReceiver::OnReceivedPayloadData(
// TODO(bugs.webrtc.org/10336): Implement support for reordering. // TODO(bugs.webrtc.org/10336): Implement support for reordering.
RTC_LOG(LS_INFO) RTC_LOG(LS_INFO)
<< "LossNotificationController does not support reordering."; << "LossNotificationController does not support reordering.";
} else if (!has_generic_descriptor) { } else if (generic_descriptor_state == kNoGenericDescriptor) {
RTC_LOG(LS_WARNING) << "LossNotificationController requires generic " RTC_LOG(LS_WARNING) << "LossNotificationController requires generic "
"frame descriptor, but it is missing."; "frame descriptor, but it is missing.";
} else { } else {

View File

@ -236,6 +236,11 @@ class RtpVideoStreamReceiver : public LossNotificationSender,
}; };
absl::optional<LossNotificationState> lntf_state_ RTC_GUARDED_BY(cs_); absl::optional<LossNotificationState> lntf_state_ RTC_GUARDED_BY(cs_);
}; };
enum ParseGenericDependenciesResult {
kDropPacket,
kHasGenericDescriptor,
kNoGenericDescriptor
};
// Entry point doing non-stats work for a received packet. Called // Entry point doing non-stats work for a received packet. Called
// for the same packet both before and after RED decapsulation. // for the same packet both before and after RED decapsulation.
@ -248,6 +253,9 @@ class RtpVideoStreamReceiver : public LossNotificationSender,
bool IsRedEnabled() const; bool IsRedEnabled() const;
void InsertSpsPpsIntoTracker(uint8_t payload_type); void InsertSpsPpsIntoTracker(uint8_t payload_type);
void OnInsertedPacket(video_coding::PacketBuffer::InsertResult result); void OnInsertedPacket(video_coding::PacketBuffer::InsertResult result);
ParseGenericDependenciesResult ParseGenericDependenciesExtension(
const RtpPacketReceived& rtp_packet,
RTPVideoHeader* video_header) RTC_RUN_ON(worker_task_checker_);
void OnAssembledFrame(std::unique_ptr<video_coding::RtpFrameObject> frame); void OnAssembledFrame(std::unique_ptr<video_coding::RtpFrameObject> frame);
Clock* const clock_; Clock* const clock_;