mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-14 06:10:40 +01:00

Putting these classes in a sub folder increases structure and clarifies that they are used as helper classes. Affected classes in this change: * CodecTimer * InterFrameDelay * RttFilter VCMTiming will be moved in a separate CL. Additional changes: * Remove VCM prefix from class names. * Introduce granular BUILD.gn targets. * Update some includes. Bug: webrtc:14111 Change-Id: Ia75128aa955a819033b97d4784cb61904de7230b Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/262960 Commit-Queue: Rasmus Brandt <brandtr@webrtc.org> Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org> Reviewed-by: Åsa Persson <asapersson@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36975}
71 lines
2.4 KiB
C++
71 lines
2.4 KiB
C++
/*
|
|
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "modules/video_coding/timing/inter_frame_delay.h"
|
|
|
|
#include "absl/types/optional.h"
|
|
#include "api/units/frequency.h"
|
|
#include "api/units/time_delta.h"
|
|
#include "modules/include/module_common_types_public.h"
|
|
|
|
namespace webrtc {
|
|
|
|
namespace {
|
|
constexpr Frequency k90kHz = Frequency::KiloHertz(90);
|
|
}
|
|
|
|
InterFrameDelay::InterFrameDelay() {
|
|
Reset();
|
|
}
|
|
|
|
// Resets the delay estimate.
|
|
void InterFrameDelay::Reset() {
|
|
prev_wall_clock_ = absl::nullopt;
|
|
prev_rtp_timestamp_unwrapped_ = 0;
|
|
}
|
|
|
|
// Calculates the delay of a frame with the given timestamp.
|
|
// This method is called when the frame is complete.
|
|
absl::optional<TimeDelta> InterFrameDelay::CalculateDelay(
|
|
uint32_t rtp_timestamp,
|
|
Timestamp now) {
|
|
int64_t rtp_timestamp_unwrapped = unwrapper_.Unwrap(rtp_timestamp);
|
|
if (!prev_wall_clock_) {
|
|
// First set of data, initialization, wait for next frame.
|
|
prev_wall_clock_ = now;
|
|
prev_rtp_timestamp_unwrapped_ = rtp_timestamp_unwrapped;
|
|
return TimeDelta::Zero();
|
|
}
|
|
|
|
// Account for reordering in jitter variance estimate in the future?
|
|
// Note that this also captures incomplete frames which are grabbed for
|
|
// decoding after a later frame has been complete, i.e. real packet losses.
|
|
uint32_t cropped_last = static_cast<uint32_t>(prev_rtp_timestamp_unwrapped_);
|
|
if (rtp_timestamp_unwrapped < prev_rtp_timestamp_unwrapped_ ||
|
|
!IsNewerTimestamp(rtp_timestamp, cropped_last)) {
|
|
return absl::nullopt;
|
|
}
|
|
|
|
// Compute the compensated timestamp difference.
|
|
int64_t d_rtp_ticks = rtp_timestamp_unwrapped - prev_rtp_timestamp_unwrapped_;
|
|
TimeDelta dts = d_rtp_ticks / k90kHz;
|
|
TimeDelta dt = now - *prev_wall_clock_;
|
|
|
|
// frameDelay is the difference of dT and dTS -- i.e. the difference of the
|
|
// wall clock time difference and the timestamp difference between two
|
|
// following frames.
|
|
TimeDelta delay = dt - dts;
|
|
|
|
prev_rtp_timestamp_unwrapped_ = rtp_timestamp_unwrapped;
|
|
prev_wall_clock_ = now;
|
|
return delay;
|
|
}
|
|
|
|
} // namespace webrtc
|