blob: 9050d22acc2c91276594277f92c4b9d4b225137e [file] [log] [blame]
stefan@webrtc.org5f284982012-06-28 07:51:16 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef VIDEO_STREAM_SYNCHRONIZATION_H_
12#define VIDEO_STREAM_SYNCHRONIZATION_H_
stefan@webrtc.org5f284982012-06-28 07:51:16 +000013
Yves Gerey3e707812018-11-28 16:47:49 +010014#include <stdint.h>
stefan@webrtc.org7c3523c2012-09-11 07:00:42 +000015
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "system_wrappers/include/rtp_to_ntp_estimator.h"
stefan@webrtc.org5f284982012-06-28 07:51:16 +000017
18namespace webrtc {
19
stefan@webrtc.org5f284982012-06-28 07:51:16 +000020class StreamSynchronization {
21 public:
22 struct Measurements {
asaperssonfe50b4d2016-12-22 07:53:51 -080023 Measurements() : latest_receive_time_ms(0), latest_timestamp(0) {}
24 RtpToNtpEstimator rtp_to_ntp;
stefan@webrtc.org7c3523c2012-09-11 07:00:42 +000025 int64_t latest_receive_time_ms;
26 uint32_t latest_timestamp;
stefan@webrtc.org5f284982012-06-28 07:51:16 +000027 };
28
solenberg3ebbcb52017-01-31 03:58:40 -080029 StreamSynchronization(int video_stream_id, int audio_stream_id);
stefan@webrtc.org5f284982012-06-28 07:51:16 +000030
stefan@webrtc.org7c3523c2012-09-11 07:00:42 +000031 bool ComputeDelays(int relative_delay_ms,
32 int current_audio_delay_ms,
33 int* extra_audio_delay_ms,
34 int* total_video_delay_target_ms);
35
36 // On success |relative_delay| contains the number of milliseconds later video
37 // is rendered relative audio. If audio is played back later than video a
38 // |relative_delay| will be negative.
39 static bool ComputeRelativeDelay(const Measurements& audio_measurement,
40 const Measurements& video_measurement,
41 int* relative_delay_ms);
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +000042 // Set target buffering delay - All audio and video will be delayed by at
43 // least target_delay_ms.
44 void SetTargetBufferingDelay(int target_delay_ms);
stefan@webrtc.org5f284982012-06-28 07:51:16 +000045
46 private:
mflodman4cd27902016-08-05 06:28:45 -070047 struct SynchronizationDelays {
48 int extra_video_delay_ms = 0;
49 int last_video_delay_ms = 0;
50 int extra_audio_delay_ms = 0;
51 int last_audio_delay_ms = 0;
52 };
53
54 SynchronizationDelays channel_delay_;
solenberg3ebbcb52017-01-31 03:58:40 -080055 const int video_stream_id_;
56 const int audio_stream_id_;
mikhal@webrtc.orgef9f76a2013-02-15 23:22:18 +000057 int base_target_delay_ms_;
pwestin@webrtc.org63117332013-04-22 18:57:14 +000058 int avg_diff_ms_;
stefan@webrtc.org5f284982012-06-28 07:51:16 +000059};
stefan@webrtc.org5f284982012-06-28 07:51:16 +000060} // namespace webrtc
61
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020062#endif // VIDEO_STREAM_SYNCHRONIZATION_H_