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:
parent
4c675e3850
commit
1869afa63a
@ -117,6 +117,9 @@ rtc_library("video") {
|
||||
"../call:rtp_sender",
|
||||
"../call:video_stream_api",
|
||||
"../common_video",
|
||||
"../common_video:corruption_detection_converters",
|
||||
"../common_video:corruption_detection_message",
|
||||
"../common_video:frame_instrumentation_data",
|
||||
"../media:media_constants",
|
||||
"../media:rtc_sdp_video_format_utils",
|
||||
"../modules:module_api",
|
||||
@ -170,6 +173,7 @@ rtc_library("video") {
|
||||
"//third_party/abseil-cpp/absl/algorithm:container",
|
||||
"//third_party/abseil-cpp/absl/memory",
|
||||
"//third_party/abseil-cpp/absl/strings",
|
||||
"//third_party/abseil-cpp/absl/types:variant",
|
||||
]
|
||||
|
||||
if (!build_with_mozilla) {
|
||||
|
||||
@ -19,12 +19,17 @@
|
||||
|
||||
#include "absl/algorithm/container.h"
|
||||
#include "absl/memory/memory.h"
|
||||
#include "absl/types/variant.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 "modules/pacing/packet_router.h"
|
||||
#include "modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
|
||||
#include "modules/rtp_rtcp/include/receive_statistics.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/frame_object.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h"
|
||||
@ -497,6 +502,21 @@ RtpVideoStreamReceiver2::ParseGenericDependenciesExtension(
|
||||
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(
|
||||
rtc::CopyOnWriteBuffer codec_payload,
|
||||
const RtpPacketReceived& rtp_packet,
|
||||
@ -582,9 +602,7 @@ bool RtpVideoStreamReceiver2::OnReceivedPayloadData(
|
||||
return false;
|
||||
}
|
||||
|
||||
// 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
|
||||
// mistake.
|
||||
// Extensions that should only be transmitted in the last packet of a frame.
|
||||
if (video_header.is_last_packet_in_frame) {
|
||||
video_header.color_space = rtp_packet.GetExtension<ColorSpaceExtension>();
|
||||
if (video_header.color_space ||
|
||||
@ -596,6 +614,20 @@ bool RtpVideoStreamReceiver2::OnReceivedPayloadData(
|
||||
} else if (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 =
|
||||
rtp_packet.GetExtension<VideoFrameTrackingIdExtension>();
|
||||
|
||||
@ -17,6 +17,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "absl/types/variant.h"
|
||||
#include "api/crypto/frame_decryptor_interface.h"
|
||||
#include "api/environment/environment.h"
|
||||
#include "api/sequence_checker.h"
|
||||
@ -26,6 +27,7 @@
|
||||
#include "call/rtp_packet_sink_interface.h"
|
||||
#include "call/syncable.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/recovered_packet_receiver.h"
|
||||
#include "modules/rtp_rtcp/include/remote_ntp_time_estimator.h"
|
||||
@ -313,6 +315,10 @@ class RtpVideoStreamReceiver2 : public LossNotificationSender,
|
||||
void UpdatePacketReceiveTimestamps(const RtpPacketReceived& packet,
|
||||
bool is_keyframe)
|
||||
RTC_RUN_ON(packet_sequence_checker_);
|
||||
void SetLastCorruptionDetectionIndex(
|
||||
const absl::variant<FrameInstrumentationSyncData,
|
||||
FrameInstrumentationData>&
|
||||
frame_instrumentation_data);
|
||||
|
||||
const Environment env_;
|
||||
TaskQueueBase* const worker_queue_;
|
||||
@ -445,6 +451,7 @@ class RtpVideoStreamReceiver2 : public LossNotificationSender,
|
||||
Timestamp next_keyframe_request_for_missing_video_structure_ =
|
||||
Timestamp::MinusInfinity();
|
||||
bool sps_pps_idr_is_h264_keyframe_ = false;
|
||||
int last_corruption_detection_index_ = 0;
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user