From ee46340054fac6072259be0d7f43263299d9b88b Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Wed, 29 Nov 2023 14:05:39 +0100 Subject: [PATCH] Move and extend frame decode failure logging Move logging of decode failure from VCMGenericDecoder to VideoReceiveStream2 where remote SSRC is always known. Log frame details such as size and resolution which help to identify this frame in bitstream dump. Bug: b/309132190 Change-Id: Ibe50799e448ffdc19f9857cc1625cfde0d7aa7a1 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/328821 Reviewed-by: Stefan Holmer Commit-Queue: Sergey Silkin Cr-Commit-Position: refs/heads/main@{#41276} --- modules/video_coding/generic_decoder.cc | 13 +------------ video/video_receive_stream2.cc | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/modules/video_coding/generic_decoder.cc b/modules/video_coding/generic_decoder.cc index fc356e7a44..00585abbc9 100644 --- a/modules/video_coding/generic_decoder.cc +++ b/modules/video_coding/generic_decoder.cc @@ -329,18 +329,7 @@ int32_t VCMGenericDecoder::Decode(const EncodedImage& frame, } _callback->OnDecoderInfoChanged(std::move(decoder_info)); } - if (ret < WEBRTC_VIDEO_CODEC_OK) { - const absl::optional ssrc = - !frame_info.packet_infos.empty() - ? absl::make_optional(frame_info.packet_infos[0].ssrc()) - : absl::nullopt; - RTC_LOG(LS_WARNING) << "Failed to decode frame with timestamp " - << frame.RtpTimestamp() << ", ssrc " - << (ssrc ? rtc::ToString(*ssrc) : "") - << ", error code: " << ret; - _callback->ClearTimestampMap(); - } else if (ret == WEBRTC_VIDEO_CODEC_NO_OUTPUT) { - // No output. + if (ret < WEBRTC_VIDEO_CODEC_OK || ret == WEBRTC_VIDEO_CODEC_NO_OUTPUT) { _callback->ClearTimestampMap(); } return ret; diff --git a/video/video_receive_stream2.cc b/video/video_receive_stream2.cc index 2696647616..af25c364de 100644 --- a/video/video_receive_stream2.cc +++ b/video/video_receive_stream2.cc @@ -904,6 +904,22 @@ int VideoReceiveStream2::DecodeAndMaybeDispatchEncodedFrame( } int decode_result = video_receiver_.Decode(frame_ptr); + if (decode_result < WEBRTC_VIDEO_CODEC_OK) { + // Asynchronous decoders may delay error reporting, potentially resulting in + // error reports reflecting issues that occurred several frames back. + RTC_LOG(LS_WARNING) + << "Failed to decode frame. Return code: " << decode_result + << ", SSRC: " << remote_ssrc() + << ", frame RTP timestamp: " << frame_ptr->RtpTimestamp() + << ", type: " << VideoFrameTypeToString(frame_ptr->FrameType()) + << ", size: " << frame_ptr->size() + << ", width: " << frame_ptr->_encodedWidth + << ", height: " << frame_ptr->_encodedHeight + << ", spatial idx: " << frame_ptr->SpatialIndex().value_or(-1) + << ", temporal idx: " << frame_ptr->TemporalIndex().value_or(-1) + << ", id: " << frame_ptr->Id(); + } + if (encoded_frame_output_enabled) { absl::optional pending_resolution;