From c241af9cca13d082e367ef0adc1f21886d028c67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Fri, 10 Nov 2017 08:51:29 +0100 Subject: [PATCH] Add timing info to all encoded frames. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Even if we're not going to transmit any timing info over the wire. Bug: webrtc:8504 Change-Id: Id54192a10e6b2a6a2cb57a2ff6b28fc0d16e471d Reviewed-on: https://webrtc-review.googlesource.com/21160 Reviewed-by: Per Kjellander Reviewed-by: Ilya Nikolaevskiy Reviewed-by: Erik Språng Commit-Queue: Niels Moller Cr-Commit-Position: refs/heads/master@{#20628} --- api/video/OWNERS | 2 ++ api/video/video_timing.h | 6 +++++- modules/video_coding/generic_encoder.cc | 6 ++---- modules/video_coding/generic_encoder_unittest.cc | 3 ++- video/payload_router.cc | 7 +++++-- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/api/video/OWNERS b/api/video/OWNERS index 4d31ffb663..8327124e23 100644 --- a/api/video/OWNERS +++ b/api/video/OWNERS @@ -1 +1,3 @@ magjed@webrtc.org + +per-file video_timing.h=ilnik@webrtc.org diff --git a/api/video/video_timing.h b/api/video/video_timing.h index d6e270ab46..2271f5de7f 100644 --- a/api/video/video_timing.h +++ b/api/video/video_timing.h @@ -22,7 +22,11 @@ namespace webrtc { enum TimingFrameFlags : uint8_t { - kDefault = 0, // No flags set (used by old protocol) + kNotTriggered = 0, // Timing info valid, but not to be transmitted. + // Used on send-side only. + // TODO(ilnik): Delete compatibility alias. + // Used to be sent over the wire, for the old protocol. + kDefault = 0, // Old name, for API compatibility. kTriggeredByTimer = 1 << 0, // Frame marked for tracing by periodic timer. kTriggeredBySize = 1 << 1, // Frame marked for tracing due to size. kInvalid = std::numeric_limits::max() // Invalid, ignore! diff --git a/modules/video_coding/generic_encoder.cc b/modules/video_coding/generic_encoder.cc index 731c4f8b2b..ec4795254f 100644 --- a/modules/video_coding/generic_encoder.cc +++ b/modules/video_coding/generic_encoder.cc @@ -255,7 +255,7 @@ EncodedImageCallback::Result VCMEncodedFrameCallback::OnEncodedImage( rtc::Optional outlier_frame_size; rtc::Optional encode_start_ms; size_t num_simulcast_svc_streams = 1; - uint8_t timing_flags = TimingFrameFlags::kInvalid; + uint8_t timing_flags = TimingFrameFlags::kNotTriggered; if (!internal_source_) { rtc::CritScope crit(&timing_params_lock_); @@ -308,8 +308,6 @@ EncodedImageCallback::Result VCMEncodedFrameCallback::OnEncodedImage( // Outliers trigger timing frames, but do not affect scheduled timing // frames. if (outlier_frame_size && encoded_image._length >= *outlier_frame_size) { - if (timing_flags == TimingFrameFlags::kInvalid) - timing_flags = 0; timing_flags |= TimingFrameFlags::kTriggeredBySize; } } @@ -319,7 +317,7 @@ EncodedImageCallback::Result VCMEncodedFrameCallback::OnEncodedImage( // drift relative to rtc::TimeMillis(). We can't use it for Timing frames, // because to being sent in the network capture time required to be less than // all the other timestamps. - if (timing_flags != TimingFrameFlags::kInvalid && encode_start_ms) { + if (encode_start_ms) { encoded_image.SetEncodeTime(*encode_start_ms, rtc::TimeMillis()); encoded_image.timing_.flags = timing_flags; } else { diff --git a/modules/video_coding/generic_encoder_unittest.cc b/modules/video_coding/generic_encoder_unittest.cc index 9c879e3add..caada6e720 100644 --- a/modules/video_coding/generic_encoder_unittest.cc +++ b/modules/video_coding/generic_encoder_unittest.cc @@ -33,7 +33,8 @@ class FakeEncodedImageCallback : public EncodedImageCallback { const CodecSpecificInfo* codec_specific_info, const RTPFragmentationHeader* fragmentation) override { last_frame_was_timing_ = - encoded_image.timing_.flags != TimingFrameFlags::kInvalid; + encoded_image.timing_.flags != TimingFrameFlags::kInvalid && + encoded_image.timing_.flags != TimingFrameFlags::kNotTriggered; return Result(Result::OK); }; diff --git a/video/payload_router.cc b/video/payload_router.cc index 24627e73a3..4147d71aff 100644 --- a/video/payload_router.cc +++ b/video/payload_router.cc @@ -187,7 +187,8 @@ EncodedImageCallback::Result PayloadRouter::OnEncodedImage( CopyCodecSpecific(codec_specific_info, &rtp_video_header); rtp_video_header.rotation = encoded_image.rotation_; rtp_video_header.content_type = encoded_image.content_type_; - if (encoded_image.timing_.flags != TimingFrameFlags::kInvalid) { + if (encoded_image.timing_.flags != TimingFrameFlags::kInvalid && + encoded_image.timing_.flags != TimingFrameFlags::kNotTriggered) { rtp_video_header.video_timing.encode_start_delta_ms = VideoSendTiming::GetDeltaCappedMs( encoded_image.capture_time_ms_, @@ -200,8 +201,10 @@ EncodedImageCallback::Result PayloadRouter::OnEncodedImage( rtp_video_header.video_timing.pacer_exit_delta_ms = 0; rtp_video_header.video_timing.network_timestamp_delta_ms = 0; rtp_video_header.video_timing.network2_timestamp_delta_ms = 0; + rtp_video_header.video_timing.flags = encoded_image.timing_.flags; + } else { + rtp_video_header.video_timing.flags = TimingFrameFlags::kInvalid; } - rtp_video_header.video_timing.flags = encoded_image.timing_.flags; rtp_video_header.playout_delay = encoded_image.playout_delay_; int stream_index = rtp_video_header.simulcastIdx;