aboutsummaryrefslogtreecommitdiff
path: root/webrtc/video_engine/stream_synchronization.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webrtc/video_engine/stream_synchronization.cc')
-rw-r--r--webrtc/video_engine/stream_synchronization.cc226
1 files changed, 0 insertions, 226 deletions
diff --git a/webrtc/video_engine/stream_synchronization.cc b/webrtc/video_engine/stream_synchronization.cc
deleted file mode 100644
index b78cfe8874..0000000000
--- a/webrtc/video_engine/stream_synchronization.cc
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright (c) 2012 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 "webrtc/video_engine/stream_synchronization.h"
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-
-#include <algorithm>
-
-#include "webrtc/base/logging.h"
-
-namespace webrtc {
-
-static const int kMaxChangeMs = 80;
-static const int kMaxDeltaDelayMs = 10000;
-static const int kFilterLength = 4;
-// Minimum difference between audio and video to warrant a change.
-static const int kMinDeltaMs = 30;
-
-struct ViESyncDelay {
- ViESyncDelay() {
- extra_video_delay_ms = 0;
- last_video_delay_ms = 0;
- extra_audio_delay_ms = 0;
- last_audio_delay_ms = 0;
- network_delay = 120;
- }
-
- int extra_video_delay_ms;
- int last_video_delay_ms;
- int extra_audio_delay_ms;
- int last_audio_delay_ms;
- int network_delay;
-};
-
-StreamSynchronization::StreamSynchronization(uint32_t video_primary_ssrc,
- int audio_channel_id)
- : channel_delay_(new ViESyncDelay),
- video_primary_ssrc_(video_primary_ssrc),
- audio_channel_id_(audio_channel_id),
- base_target_delay_ms_(0),
- avg_diff_ms_(0) {
-}
-
-StreamSynchronization::~StreamSynchronization() {
- delete channel_delay_;
-}
-
-bool StreamSynchronization::ComputeRelativeDelay(
- const Measurements& audio_measurement,
- const Measurements& video_measurement,
- int* relative_delay_ms) {
- assert(relative_delay_ms);
- if (audio_measurement.rtcp.size() < 2 || video_measurement.rtcp.size() < 2) {
- // We need two RTCP SR reports per stream to do synchronization.
- return false;
- }
- int64_t audio_last_capture_time_ms;
- if (!RtpToNtpMs(audio_measurement.latest_timestamp,
- audio_measurement.rtcp,
- &audio_last_capture_time_ms)) {
- return false;
- }
- int64_t video_last_capture_time_ms;
- if (!RtpToNtpMs(video_measurement.latest_timestamp,
- video_measurement.rtcp,
- &video_last_capture_time_ms)) {
- return false;
- }
- if (video_last_capture_time_ms < 0) {
- return false;
- }
- // Positive diff means that video_measurement is behind audio_measurement.
- *relative_delay_ms = video_measurement.latest_receive_time_ms -
- audio_measurement.latest_receive_time_ms -
- (video_last_capture_time_ms - audio_last_capture_time_ms);
- if (*relative_delay_ms > kMaxDeltaDelayMs ||
- *relative_delay_ms < -kMaxDeltaDelayMs) {
- return false;
- }
- return true;
-}
-
-bool StreamSynchronization::ComputeDelays(int relative_delay_ms,
- int current_audio_delay_ms,
- int* total_audio_delay_target_ms,
- int* total_video_delay_target_ms) {
- assert(total_audio_delay_target_ms && total_video_delay_target_ms);
-
- int current_video_delay_ms = *total_video_delay_target_ms;
- LOG(LS_VERBOSE) << "Audio delay: " << current_audio_delay_ms
- << ", network delay diff: " << channel_delay_->network_delay
- << " current diff: " << relative_delay_ms
- << " for channel " << audio_channel_id_;
- // Calculate the difference between the lowest possible video delay and
- // the current audio delay.
- int current_diff_ms = current_video_delay_ms - current_audio_delay_ms +
- relative_delay_ms;
-
- avg_diff_ms_ = ((kFilterLength - 1) * avg_diff_ms_ +
- current_diff_ms) / kFilterLength;
- if (abs(avg_diff_ms_) < kMinDeltaMs) {
- // Don't adjust if the diff is within our margin.
- return false;
- }
-
- // Make sure we don't move too fast.
- int diff_ms = avg_diff_ms_ / 2;
- diff_ms = std::min(diff_ms, kMaxChangeMs);
- diff_ms = std::max(diff_ms, -kMaxChangeMs);
-
- // Reset the average after a move to prevent overshooting reaction.
- avg_diff_ms_ = 0;
-
- if (diff_ms > 0) {
- // The minimum video delay is longer than the current audio delay.
- // We need to decrease extra video delay, or add extra audio delay.
- if (channel_delay_->extra_video_delay_ms > base_target_delay_ms_) {
- // We have extra delay added to ViE. Reduce this delay before adding
- // extra delay to VoE.
- channel_delay_->extra_video_delay_ms -= diff_ms;
- channel_delay_->extra_audio_delay_ms = base_target_delay_ms_;
- } else { // channel_delay_->extra_video_delay_ms > 0
- // We have no extra video delay to remove, increase the audio delay.
- channel_delay_->extra_audio_delay_ms += diff_ms;
- channel_delay_->extra_video_delay_ms = base_target_delay_ms_;
- }
- } else { // if (diff_ms > 0)
- // The video delay is lower than the current audio delay.
- // We need to decrease extra audio delay, or add extra video delay.
- if (channel_delay_->extra_audio_delay_ms > base_target_delay_ms_) {
- // We have extra delay in VoiceEngine.
- // Start with decreasing the voice delay.
- // Note: diff_ms is negative; add the negative difference.
- channel_delay_->extra_audio_delay_ms += diff_ms;
- channel_delay_->extra_video_delay_ms = base_target_delay_ms_;
- } else { // channel_delay_->extra_audio_delay_ms > base_target_delay_ms_
- // We have no extra delay in VoiceEngine, increase the video delay.
- // Note: diff_ms is negative; subtract the negative difference.
- channel_delay_->extra_video_delay_ms -= diff_ms; // X - (-Y) = X + Y.
- channel_delay_->extra_audio_delay_ms = base_target_delay_ms_;
- }
- }
-
- // Make sure that video is never below our target.
- channel_delay_->extra_video_delay_ms = std::max(
- channel_delay_->extra_video_delay_ms, base_target_delay_ms_);
-
- int new_video_delay_ms;
- if (channel_delay_->extra_video_delay_ms > base_target_delay_ms_) {
- new_video_delay_ms = channel_delay_->extra_video_delay_ms;
- } else {
- // No change to the extra video delay. We are changing audio and we only
- // allow to change one at the time.
- new_video_delay_ms = channel_delay_->last_video_delay_ms;
- }
-
- // Make sure that we don't go below the extra video delay.
- new_video_delay_ms = std::max(
- new_video_delay_ms, channel_delay_->extra_video_delay_ms);
-
- // Verify we don't go above the maximum allowed video delay.
- new_video_delay_ms =
- std::min(new_video_delay_ms, base_target_delay_ms_ + kMaxDeltaDelayMs);
-
- int new_audio_delay_ms;
- if (channel_delay_->extra_audio_delay_ms > base_target_delay_ms_) {
- new_audio_delay_ms = channel_delay_->extra_audio_delay_ms;
- } else {
- // No change to the audio delay. We are changing video and we only
- // allow to change one at the time.
- new_audio_delay_ms = channel_delay_->last_audio_delay_ms;
- }
-
- // Make sure that we don't go below the extra audio delay.
- new_audio_delay_ms = std::max(
- new_audio_delay_ms, channel_delay_->extra_audio_delay_ms);
-
- // Verify we don't go above the maximum allowed audio delay.
- new_audio_delay_ms =
- std::min(new_audio_delay_ms, base_target_delay_ms_ + kMaxDeltaDelayMs);
-
- // Remember our last audio and video delays.
- channel_delay_->last_video_delay_ms = new_video_delay_ms;
- channel_delay_->last_audio_delay_ms = new_audio_delay_ms;
-
- LOG(LS_VERBOSE) << "Sync video delay " << new_video_delay_ms
- << " for video primary SSRC " << video_primary_ssrc_
- << " and audio delay " << channel_delay_->extra_audio_delay_ms
- << " for audio channel " << audio_channel_id_;
-
- // Return values.
- *total_video_delay_target_ms = new_video_delay_ms;
- *total_audio_delay_target_ms = new_audio_delay_ms;
- return true;
-}
-
-void StreamSynchronization::SetTargetBufferingDelay(int target_delay_ms) {
- // Initial extra delay for audio (accounting for existing extra delay).
- channel_delay_->extra_audio_delay_ms +=
- target_delay_ms - base_target_delay_ms_;
- channel_delay_->last_audio_delay_ms +=
- target_delay_ms - base_target_delay_ms_;
-
- // The video delay is compared to the last value (and how much we can update
- // is limited by that as well).
- channel_delay_->last_video_delay_ms +=
- target_delay_ms - base_target_delay_ms_;
-
- channel_delay_->extra_video_delay_ms +=
- target_delay_ms - base_target_delay_ms_;
-
- // Video is already delayed by the desired amount.
- base_target_delay_ms_ = target_delay_ms;
-}
-
-} // namespace webrtc