From 3f10ca8145d9831910e80b7ac2801eac7fccd097 Mon Sep 17 00:00:00 2001 From: Benjamin Wright Date: Fri, 7 Dec 2018 03:45:19 -0800 Subject: [PATCH] Always record receive timestamps even on when the invalid flag is set. This change is based on a discussion for integrating a new statistic that measures the delay between the first frame being received and the first frame being decoded. To enable this in the context of FrameEncryption it makes sense for packet receive timestamps to be unconditionally recorded. Bug: webrtc:10105 Change-Id: I6b3b0118121db1fe5d4a4fb16cf5d94341cd2b1b Reviewed-on: https://webrtc-review.googlesource.com/c/113487 Commit-Queue: Benjamin Wright Reviewed-by: Ilya Nikolaevskiy Cr-Commit-Position: refs/heads/master@{#25931} --- modules/video_coding/frame_object.cc | 5 ++--- modules/video_coding/generic_decoder.cc | 20 ++++++++++---------- video/receive_statistics_proxy.cc | 6 ++++-- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/modules/video_coding/frame_object.cc b/modules/video_coding/frame_object.cc index 925f1a191f..46511cef4d 100644 --- a/modules/video_coding/frame_object.cc +++ b/modules/video_coding/frame_object.cc @@ -99,11 +99,10 @@ RtpFrameObject::RtpFrameObject(PacketBuffer* packet_buffer, timing_.network2_timestamp_ms = ntp_time_ms_ + last_packet->video_header.video_timing.network2_timestamp_delta_ms; - - timing_.receive_start_ms = first_packet->receive_time_ms; - timing_.receive_finish_ms = last_packet->receive_time_ms; } timing_.flags = last_packet->video_header.video_timing.flags; + timing_.receive_start_ms = first_packet->receive_time_ms; + timing_.receive_finish_ms = last_packet->receive_time_ms; is_last_spatial_layer = last_packet->markerBit; } diff --git a/modules/video_coding/generic_decoder.cc b/modules/video_coding/generic_decoder.cc index 5ee8d4eb70..dee28ae891 100644 --- a/modules/video_coding/generic_decoder.cc +++ b/modules/video_coding/generic_decoder.cc @@ -91,6 +91,7 @@ void VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage, frameInfo->renderTimeMs); // Report timing information. + TimingFrameInfo timing_frame_info; if (frameInfo->timing.flags != VideoSendTiming::kInvalid) { int64_t capture_time_ms = decodedImage.ntp_time_ms() - ntp_offset_; // Convert remote timestamps to local time from ntp timestamps. @@ -115,7 +116,6 @@ void VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage, 1; } - TimingFrameInfo timing_frame_info; timing_frame_info.capture_time_ms = capture_time_ms - sender_delta_ms; timing_frame_info.encode_start_ms = @@ -130,17 +130,17 @@ void VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage, frameInfo->timing.network_timestamp_ms - sender_delta_ms; timing_frame_info.network2_timestamp_ms = frameInfo->timing.network2_timestamp_ms - sender_delta_ms; - timing_frame_info.receive_start_ms = frameInfo->timing.receive_start_ms; - timing_frame_info.receive_finish_ms = frameInfo->timing.receive_finish_ms; - timing_frame_info.decode_start_ms = frameInfo->decodeStartTimeMs; - timing_frame_info.decode_finish_ms = now_ms; - timing_frame_info.render_time_ms = frameInfo->renderTimeMs; - timing_frame_info.rtp_timestamp = decodedImage.timestamp(); - timing_frame_info.flags = frameInfo->timing.flags; - - _timing->SetTimingFrameInfo(timing_frame_info); } + timing_frame_info.flags = frameInfo->timing.flags; + timing_frame_info.decode_start_ms = frameInfo->decodeStartTimeMs; + timing_frame_info.decode_finish_ms = now_ms; + timing_frame_info.render_time_ms = frameInfo->renderTimeMs; + timing_frame_info.rtp_timestamp = decodedImage.timestamp(); + timing_frame_info.receive_start_ms = frameInfo->timing.receive_start_ms; + timing_frame_info.receive_finish_ms = frameInfo->timing.receive_finish_ms; + _timing->SetTimingFrameInfo(timing_frame_info); + decodedImage.set_timestamp_us(frameInfo->renderTimeMs * rtc::kNumMicrosecsPerMillisec); decodedImage.set_rotation(frameInfo->rotation); diff --git a/video/receive_statistics_proxy.cc b/video/receive_statistics_proxy.cc index e20b7d294f..8d398871cc 100644 --- a/video/receive_statistics_proxy.cc +++ b/video/receive_statistics_proxy.cc @@ -638,8 +638,10 @@ void ReceiveStatisticsProxy::OnUniqueFramesCounted(int num_unique_frames) { void ReceiveStatisticsProxy::OnTimingFrameInfoUpdated( const TimingFrameInfo& info) { rtc::CritScope lock(&crit_); - int64_t now_ms = clock_->TimeInMilliseconds(); - timing_frame_info_counter_.Add(info, now_ms); + if (info.flags != VideoSendTiming::kInvalid) { + int64_t now_ms = clock_->TimeInMilliseconds(); + timing_frame_info_counter_.Add(info, now_ms); + } } void ReceiveStatisticsProxy::RtcpPacketTypesCounterUpdated(