diff --git a/webrtc/video_engine/include/vie_codec.h b/webrtc/video_engine/include/vie_codec.h index 0535038e6..f24832d2d 100644 --- a/webrtc/video_engine/include/vie_codec.h +++ b/webrtc/video_engine/include/vie_codec.h @@ -124,6 +124,11 @@ class WEBRTC_DLLEXPORT ViECodec { unsigned int& key_frames, unsigned int& delta_frames) const = 0; + // Estimate of the min required buffer time from the expected arrival time + // until rendering to get smooth playback. + virtual int GetReceiveSideDelay(const int video_channel, + int* delay_ms) const = 0; + // Gets the bitrate targeted by the video codec rate control in kbit/s. virtual int GetCodecTargetBitrate(const int video_channel, unsigned int* bitrate) const = 0; diff --git a/webrtc/video_engine/test/auto_test/source/vie_autotest_codec.cc b/webrtc/video_engine/test/auto_test/source/vie_autotest_codec.cc index bdf577dad..445c44975 100644 --- a/webrtc/video_engine/test/auto_test/source/vie_autotest_codec.cc +++ b/webrtc/video_engine/test/auto_test/source/vie_autotest_codec.cc @@ -231,6 +231,11 @@ void ViEAutoTest::ViECodecStandardTest() { } AutoTestSleep(kAutoTestSleepTimeMs); + // Verify the delay estimate is larger than 0. + int delay_ms = 0; + EXPECT_EQ(0, codec->GetReceiveSideDelay(video_channel, &delay_ms)); + EXPECT_GT(delay_ms, 0); + EXPECT_EQ(0, base->StopSend(video_channel)); EXPECT_EQ(0, codec->DeregisterEncoderObserver(video_channel)); EXPECT_EQ(0, codec->DeregisterDecoderObserver(video_channel)); diff --git a/webrtc/video_engine/vie_channel.cc b/webrtc/video_engine/vie_channel.cc index 3529122e4..f22a3503a 100644 --- a/webrtc/video_engine/vie_channel.cc +++ b/webrtc/video_engine/vie_channel.cc @@ -522,6 +522,10 @@ WebRtc_UWord32 ViEChannel::DiscardedPackets() const { return vcm_.DiscardedPackets(); } +int ViEChannel::ReceiveDelay() const { + return vcm_.Delay(); +} + WebRtc_Word32 ViEChannel::WaitForKeyFrame(bool wait) { WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, channel_id_), "%s(wait: %d)", __FUNCTION__, wait); diff --git a/webrtc/video_engine/vie_channel.h b/webrtc/video_engine/vie_channel.h index ea4344623..4ff77f5a5 100644 --- a/webrtc/video_engine/vie_channel.h +++ b/webrtc/video_engine/vie_channel.h @@ -96,6 +96,9 @@ class ViEChannel WebRtc_UWord32* num_delta_frames); WebRtc_UWord32 DiscardedPackets() const; + // Returns the estimated delay in milliseconds. + int ReceiveDelay() const; + // Only affects calls to SetReceiveCodec done after this call. WebRtc_Word32 WaitForKeyFrame(bool wait); diff --git a/webrtc/video_engine/vie_codec_impl.cc b/webrtc/video_engine/vie_codec_impl.cc index 27559d5f5..712bbf896 100644 --- a/webrtc/video_engine/vie_codec_impl.cc +++ b/webrtc/video_engine/vie_codec_impl.cc @@ -14,6 +14,7 @@ #include "engine_configurations.h" // NOLINT #include "modules/video_coding/main/interface/video_coding.h" +#include "system_wrappers/interface/logging.h" #include "system_wrappers/interface/trace.h" #include "video_engine/include/vie_errors.h" #include "video_engine/vie_capturer.h" @@ -446,7 +447,7 @@ int ViECodecImpl::GetReceiveCodecStastistics(const int video_channel, unsigned int& delta_frames) const { WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_->instance_id(), video_channel), - "%s(video_channel: %d, codec_type: %d)", __FUNCTION__, + "%s(video_channel: %d)", __FUNCTION__, video_channel); ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); @@ -465,6 +466,33 @@ int ViECodecImpl::GetReceiveCodecStastistics(const int video_channel, return 0; } +int ViECodecImpl::GetReceiveSideDelay(const int video_channel, + int* delay_ms) const { + WEBRTC_TRACE(kTraceApiCall, kTraceVideo, + ViEId(shared_data_->instance_id(), video_channel), + "%s(video_channel: %d)", __FUNCTION__, video_channel); + if (delay_ms == NULL) { + LOG_F(LS_ERROR) << "NULL pointer argument."; + return -1; + } + + ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); + ViEChannel* vie_channel = cs.Channel(video_channel); + if (!vie_channel) { + WEBRTC_TRACE(kTraceError, kTraceVideo, + ViEId(shared_data_->instance_id(), video_channel), + "%s: No channel %d", __FUNCTION__, video_channel); + shared_data_->SetLastError(kViECodecInvalidChannelId); + return -1; + } + *delay_ms = vie_channel->ReceiveDelay(); + if (*delay_ms < 0) { + return -1; + } + return 0; +} + + int ViECodecImpl::GetCodecTargetBitrate(const int video_channel, unsigned int* bitrate) const { WEBRTC_TRACE(kTraceApiCall, kTraceVideo, diff --git a/webrtc/video_engine/vie_codec_impl.h b/webrtc/video_engine/vie_codec_impl.h index 2d34540c2..60624601c 100644 --- a/webrtc/video_engine/vie_codec_impl.h +++ b/webrtc/video_engine/vie_codec_impl.h @@ -49,6 +49,8 @@ class ViECodecImpl virtual int GetReceiveCodecStastistics(const int video_channel, unsigned int& key_frames, unsigned int& delta_frames) const; + virtual int GetReceiveSideDelay(const int video_channel, + int* delay_ms) const; virtual int GetCodecTargetBitrate(const int video_channel, unsigned int* bitrate) const; virtual unsigned int GetDiscardedPackets(const int video_channel) const;