Fix maybe incorrect spatial id when reading corruption detection message

In addition, avoid empty conversion when no message is present.

Bug: chromium:379326016
Change-Id: I855069fa89a157ba862b5162c56858825ebc1a40
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/370160
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Auto-Submit: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43487}
This commit is contained in:
Erik Språng 2024-12-03 13:45:55 +01:00 committed by WebRTC LUCI CQ
parent ae1ad04077
commit 94f2b91f11

View File

@ -616,36 +616,49 @@ bool RtpVideoStreamReceiver2::OnReceivedPayloadData(
} else if (last_color_space_) {
video_header.color_space = last_color_space_;
}
CorruptionDetectionMessage message;
rtp_packet.GetExtension<CorruptionDetectionExtension>(&message);
int spatial_idx = 0;
std::optional<int> spatial_id;
if (video_header.generic.has_value()) {
spatial_idx = video_header.generic->spatial_index;
spatial_id = video_header.generic->spatial_index;
if (spatial_id >= kMaxSpatialLayers) {
RTC_LOG(LS_WARNING) << "Invalid spatial id: " << *spatial_id
<< ". Ignoring corruption detection mesaage.";
spatial_id.reset();
}
if (message.sample_values().empty()) {
} else {
spatial_id = 0;
}
std::optional<CorruptionDetectionMessage> message =
rtp_packet.GetExtension<CorruptionDetectionExtension>();
if (message.has_value() && spatial_id.has_value()) {
if (message->sample_values().empty()) {
video_header.frame_instrumentation_data =
ConvertCorruptionDetectionMessageToFrameInstrumentationSyncData(
message, last_corruption_detection_state_by_layer_[spatial_idx]
*message, last_corruption_detection_state_by_layer_[*spatial_id]
.sequence_index);
} else {
// `OnReceivedPayloadData` might be called several times, however, we
// don't want to increase the sequence index each time.
if (!last_corruption_detection_state_by_layer_[spatial_idx]
if (!last_corruption_detection_state_by_layer_[*spatial_id]
.timestamp.has_value() ||
rtp_packet.Timestamp() !=
last_corruption_detection_state_by_layer_[spatial_idx]
last_corruption_detection_state_by_layer_[*spatial_id]
.timestamp) {
video_header.frame_instrumentation_data =
ConvertCorruptionDetectionMessageToFrameInstrumentationData(
message, last_corruption_detection_state_by_layer_[spatial_idx]
*message,
last_corruption_detection_state_by_layer_[*spatial_id]
.sequence_index);
last_corruption_detection_state_by_layer_[spatial_idx].timestamp =
last_corruption_detection_state_by_layer_[*spatial_id].timestamp =
rtp_packet.Timestamp();
}
}
if (video_header.frame_instrumentation_data.has_value()) {
SetLastCorruptionDetectionIndex(*video_header.frame_instrumentation_data,
spatial_idx);
SetLastCorruptionDetectionIndex(
*video_header.frame_instrumentation_data, *spatial_id);
}
}
}
video_header.video_frame_tracking_id =