Parse extension and store it in RTPVideoHeader

Bug: webrtc:358039777
Change-Id: Ib70046662877efa5f8d0cbe559b44d138f4733e2
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/364481
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Fanny Linderborg <linderborg@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Auto-Submit: Fanny Linderborg <linderborg@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43146}
This commit is contained in:
Fanny Linderborg 2024-10-02 14:34:49 +02:00 committed by WebRTC LUCI CQ
parent 4c675e3850
commit 1869afa63a
3 changed files with 46 additions and 3 deletions

View File

@ -117,6 +117,9 @@ rtc_library("video") {
"../call:rtp_sender", "../call:rtp_sender",
"../call:video_stream_api", "../call:video_stream_api",
"../common_video", "../common_video",
"../common_video:corruption_detection_converters",
"../common_video:corruption_detection_message",
"../common_video:frame_instrumentation_data",
"../media:media_constants", "../media:media_constants",
"../media:rtc_sdp_video_format_utils", "../media:rtc_sdp_video_format_utils",
"../modules:module_api", "../modules:module_api",
@ -170,6 +173,7 @@ rtc_library("video") {
"//third_party/abseil-cpp/absl/algorithm:container", "//third_party/abseil-cpp/absl/algorithm:container",
"//third_party/abseil-cpp/absl/memory", "//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings", "//third_party/abseil-cpp/absl/strings",
"//third_party/abseil-cpp/absl/types:variant",
] ]
if (!build_with_mozilla) { if (!build_with_mozilla) {

View File

@ -19,12 +19,17 @@
#include "absl/algorithm/container.h" #include "absl/algorithm/container.h"
#include "absl/memory/memory.h" #include "absl/memory/memory.h"
#include "absl/types/variant.h"
#include "api/video/video_codec_type.h" #include "api/video/video_codec_type.h"
#include "common_video/corruption_detection_converters.h"
#include "common_video/corruption_detection_message.h"
#include "common_video/frame_instrumentation_data.h"
#include "media/base/media_constants.h" #include "media/base/media_constants.h"
#include "modules/pacing/packet_router.h" #include "modules/pacing/packet_router.h"
#include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" #include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
#include "modules/rtp_rtcp/include/receive_statistics.h" #include "modules/rtp_rtcp/include/receive_statistics.h"
#include "modules/rtp_rtcp/include/rtp_cvo.h" #include "modules/rtp_rtcp/include/rtp_cvo.h"
#include "modules/rtp_rtcp/source/corruption_detection_extension.h"
#include "modules/rtp_rtcp/source/create_video_rtp_depacketizer.h" #include "modules/rtp_rtcp/source/create_video_rtp_depacketizer.h"
#include "modules/rtp_rtcp/source/frame_object.h" #include "modules/rtp_rtcp/source/frame_object.h"
#include "modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h" #include "modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h"
@ -497,6 +502,21 @@ RtpVideoStreamReceiver2::ParseGenericDependenciesExtension(
return kHasGenericDescriptor; return kHasGenericDescriptor;
} }
void RtpVideoStreamReceiver2::SetLastCorruptionDetectionIndex(
const absl::variant<FrameInstrumentationSyncData, FrameInstrumentationData>&
frame_instrumentation_data) {
if (const auto* sync_data = absl::get_if<FrameInstrumentationSyncData>(
&frame_instrumentation_data)) {
last_corruption_detection_index_ = sync_data->sequence_index;
} else if (const auto* data = absl::get_if<FrameInstrumentationData>(
&frame_instrumentation_data)) {
last_corruption_detection_index_ =
data->sequence_index + data->sample_values.size();
} else {
RTC_DCHECK_NOTREACHED();
}
}
bool RtpVideoStreamReceiver2::OnReceivedPayloadData( bool RtpVideoStreamReceiver2::OnReceivedPayloadData(
rtc::CopyOnWriteBuffer codec_payload, rtc::CopyOnWriteBuffer codec_payload,
const RtpPacketReceived& rtp_packet, const RtpPacketReceived& rtp_packet,
@ -582,9 +602,7 @@ bool RtpVideoStreamReceiver2::OnReceivedPayloadData(
return false; return false;
} }
// Color space should only be transmitted in the last packet of a frame, // Extensions that should only be transmitted in the last packet of a frame.
// therefore, neglect it otherwise so that last_color_space_ is not reset by
// mistake.
if (video_header.is_last_packet_in_frame) { if (video_header.is_last_packet_in_frame) {
video_header.color_space = rtp_packet.GetExtension<ColorSpaceExtension>(); video_header.color_space = rtp_packet.GetExtension<ColorSpaceExtension>();
if (video_header.color_space || if (video_header.color_space ||
@ -596,6 +614,20 @@ bool RtpVideoStreamReceiver2::OnReceivedPayloadData(
} else if (last_color_space_) { } else if (last_color_space_) {
video_header.color_space = last_color_space_; video_header.color_space = last_color_space_;
} }
CorruptionDetectionMessage message;
rtp_packet.GetExtension<CorruptionDetectionExtension>(&message);
if (message.sample_values().empty()) {
// TODO: bugs.webrtc.org/358039777 - Convert message to sync data and
// use that for assignment instead of `std::nullptr`.
video_header.frame_instrumentation_data = std::nullopt;
} else {
video_header.frame_instrumentation_data =
ConvertCorruptionDetectionMessageToFrameInstrumentationData(
message, last_corruption_detection_index_);
}
if (video_header.frame_instrumentation_data.has_value()) {
SetLastCorruptionDetectionIndex(*video_header.frame_instrumentation_data);
}
} }
video_header.video_frame_tracking_id = video_header.video_frame_tracking_id =
rtp_packet.GetExtension<VideoFrameTrackingIdExtension>(); rtp_packet.GetExtension<VideoFrameTrackingIdExtension>();

View File

@ -17,6 +17,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "absl/types/variant.h"
#include "api/crypto/frame_decryptor_interface.h" #include "api/crypto/frame_decryptor_interface.h"
#include "api/environment/environment.h" #include "api/environment/environment.h"
#include "api/sequence_checker.h" #include "api/sequence_checker.h"
@ -26,6 +27,7 @@
#include "call/rtp_packet_sink_interface.h" #include "call/rtp_packet_sink_interface.h"
#include "call/syncable.h" #include "call/syncable.h"
#include "call/video_receive_stream.h" #include "call/video_receive_stream.h"
#include "common_video/frame_instrumentation_data.h"
#include "modules/rtp_rtcp/include/receive_statistics.h" #include "modules/rtp_rtcp/include/receive_statistics.h"
#include "modules/rtp_rtcp/include/recovered_packet_receiver.h" #include "modules/rtp_rtcp/include/recovered_packet_receiver.h"
#include "modules/rtp_rtcp/include/remote_ntp_time_estimator.h" #include "modules/rtp_rtcp/include/remote_ntp_time_estimator.h"
@ -313,6 +315,10 @@ class RtpVideoStreamReceiver2 : public LossNotificationSender,
void UpdatePacketReceiveTimestamps(const RtpPacketReceived& packet, void UpdatePacketReceiveTimestamps(const RtpPacketReceived& packet,
bool is_keyframe) bool is_keyframe)
RTC_RUN_ON(packet_sequence_checker_); RTC_RUN_ON(packet_sequence_checker_);
void SetLastCorruptionDetectionIndex(
const absl::variant<FrameInstrumentationSyncData,
FrameInstrumentationData>&
frame_instrumentation_data);
const Environment env_; const Environment env_;
TaskQueueBase* const worker_queue_; TaskQueueBase* const worker_queue_;
@ -445,6 +451,7 @@ class RtpVideoStreamReceiver2 : public LossNotificationSender,
Timestamp next_keyframe_request_for_missing_video_structure_ = Timestamp next_keyframe_request_for_missing_video_structure_ =
Timestamp::MinusInfinity(); Timestamp::MinusInfinity();
bool sps_pps_idr_is_h264_keyframe_ = false; bool sps_pps_idr_is_h264_keyframe_ = false;
int last_corruption_detection_index_ = 0;
}; };
} // namespace webrtc } // namespace webrtc