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:
parent
e52115a33e
commit
b42c54f949
@ -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 {
|
||||||
|
|||||||
@ -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_;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user