1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This sub-API supports the following functionalities: 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// - RTP header modification (time stamp and sequence number fields). 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// - Playout delay tuning to synchronize the voice with video. 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// - Playout delay monitoring. 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Usage example, omitting error checking: 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// using namespace webrtc; 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// VoiceEngine* voe = VoiceEngine::Create(); 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// VoEBase* base = VoEBase::GetInterface(voe); 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// VoEVideoSync* vsync = VoEVideoSync::GetInterface(voe); 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// base->Init(); 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// ... 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// int buffer_ms(0); 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// vsync->GetPlayoutBufferSize(buffer_ms); 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// ... 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// base->Terminate(); 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// base->Release(); 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// vsync->Release(); 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// VoiceEngine::Delete(voe); 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VOICE_ENGINE_VOE_VIDEO_SYNC_H 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_VOICE_ENGINE_VOE_VIDEO_SYNC_H 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 36ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org#include "webrtc/common_types.h" 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 407fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.orgclass RtpReceiver; 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass RtpRtcp; 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VoiceEngine; 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass WEBRTC_DLLEXPORT VoEVideoSync 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic: 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Factory for the VoEVideoSync sub-API. Increases an internal 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // reference counter if successful. Returns NULL if the API is not 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // supported or if construction fails. 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org static VoEVideoSync* GetInterface(VoiceEngine* voiceEngine); 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Releases the VoEVideoSync sub-API and decreases an internal 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // reference counter. Returns the new reference count. This value should 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // be zero for all sub-API:s before the VoiceEngine object can be safely 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // deleted. 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int Release() = 0; 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Gets the current sound card buffer size (playout delay). 59f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org virtual int GetPlayoutBufferSize(int& buffer_ms) = 0; 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 61d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // Sets a minimum target delay for the jitter buffer. This delay is 62d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // maintained by the jitter buffer, unless channel condition (jitter in 63d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // inter-arrival times) dictates a higher required delay. The overall 64d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // jitter buffer delay is max of |delay_ms| and the latency that NetEq 65d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // computes based on inter-arrival times and its playout mode. 66f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org virtual int SetMinimumPlayoutDelay(int channel, int delay_ms) = 0; 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 68ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org // Sets an initial delay for the playout jitter buffer. The playout of the 69d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // audio is delayed by |delay_ms| in milliseconds. Thereafter, the delay is 70d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // maintained, unless NetEq's internal mechanism requires a higher latency. 71d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // Such a latency is computed based on inter-arrival times and NetEq's 72d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // playout mode. 73ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org virtual int SetInitialPlayoutDelay(int channel, int delay_ms) = 0; 74ead8a5bbdcdf3ac429c23af04d4a91f3de334f28turaj@webrtc.org 75f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org // Gets the |jitter_buffer_delay_ms| (including the algorithmic delay), and 76f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org // the |playout_buffer_delay_ms| for a specified |channel|. 77f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org virtual int GetDelayEstimate(int channel, 78f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org int* jitter_buffer_delay_ms, 79f2724977323ae0d162fa0b33135046701f3eba66pwestin@webrtc.org int* playout_buffer_delay_ms) = 0; 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 81d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // Returns the least required jitter buffer delay. This is computed by the 82d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // the jitter buffer based on the inter-arrival time of RTP packets and 83d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // playout mode. NetEq maintains this latency unless a higher value is 84d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org // requested by calling SetMinimumPlayoutDelay(). 85d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org virtual int GetLeastRequiredDelayMs(int channel) const = 0; 86d5577346d12d09f3e619c7c60340859e5d60f80fturaj@webrtc.org 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Manual initialization of the RTP timestamp. 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int SetInitTimestamp(int channel, unsigned int timestamp) = 0; 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Manual initialization of the RTP sequence number. 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int SetInitSequenceNumber(int channel, short sequenceNumber) = 0; 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Get the received RTP timestamp 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual int GetPlayoutTimestamp(int channel, unsigned int& timestamp) = 0; 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 967fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org virtual int GetRtpRtcp (int channel, RtpRtcp** rtpRtcpModule, 977fc75bbb65cc1cd99fdf45d9fce44bcce1396dfawu@webrtc.org RtpReceiver** rtp_receiver) = 0; 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprotected: 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VoEVideoSync() { } 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org virtual ~VoEVideoSync() { } 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1043b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org} // namespace webrtc 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // #ifndef WEBRTC_VOICE_ENGINE_VOE_VIDEO_SYNC_H 107