/*
 *  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.
 */

// This sub-API supports the following functionalities:
//
//  - RTP header modification (time stamp and sequence number fields).
//  - Playout delay tuning to synchronize the voice with video.
//  - Playout delay monitoring.
//
// Usage example, omitting error checking:
//
//  using namespace webrtc;
//  VoiceEngine* voe = VoiceEngine::Create();
//  VoEBase* base = VoEBase::GetInterface(voe);
//  VoEVideoSync* vsync  = VoEVideoSync::GetInterface(voe);
//  base->Init();
//  ...
//  int buffer_ms(0);
//  vsync->GetPlayoutBufferSize(buffer_ms);
//  ...
//  base->Terminate();
//  base->Release();
//  vsync->Release();
//  VoiceEngine::Delete(voe);
//
#ifndef WEBRTC_VOICE_ENGINE_VOE_VIDEO_SYNC_H
#define WEBRTC_VOICE_ENGINE_VOE_VIDEO_SYNC_H

#include "webrtc/common_types.h"

namespace webrtc {

class RtpReceiver;
class RtpRtcp;
class VoiceEngine;

class WEBRTC_DLLEXPORT VoEVideoSync {
 public:
  // Factory for the VoEVideoSync sub-API. Increases an internal
  // reference counter if successful. Returns NULL if the API is not
  // supported or if construction fails.
  static VoEVideoSync* GetInterface(VoiceEngine* voiceEngine);

  // Releases the VoEVideoSync sub-API and decreases an internal
  // reference counter. Returns the new reference count. This value should
  // be zero for all sub-API:s before the VoiceEngine object can be safely
  // deleted.
  virtual int Release() = 0;

  // Gets the current sound card buffer size (playout delay).
  virtual int GetPlayoutBufferSize(int& buffer_ms) = 0;

  // Sets a minimum target delay for the jitter buffer. This delay is
  // maintained by the jitter buffer, unless channel condition (jitter in
  // inter-arrival times) dictates a higher required delay. The overall
  // jitter buffer delay is max of |delay_ms| and the latency that NetEq
  // computes based on inter-arrival times and its playout mode.
  virtual int SetMinimumPlayoutDelay(int channel, int delay_ms) = 0;

  // Sets an initial delay for the playout jitter buffer. The playout of the
  // audio is delayed by |delay_ms| in milliseconds. Thereafter, the delay is
  // maintained, unless NetEq's internal mechanism requires a higher latency.
  // Such a latency is computed based on inter-arrival times and NetEq's
  // playout mode.
  virtual int SetInitialPlayoutDelay(int channel, int delay_ms) = 0;

  // Gets the |jitter_buffer_delay_ms| (including the algorithmic delay), and
  // the |playout_buffer_delay_ms| for a specified |channel|.
  virtual int GetDelayEstimate(int channel,
                               int* jitter_buffer_delay_ms,
                               int* playout_buffer_delay_ms) = 0;

  // Returns the least required jitter buffer delay. This is computed by the
  // the jitter buffer based on the inter-arrival time of RTP packets and
  // playout mode. NetEq maintains this latency unless a higher value is
  // requested by calling SetMinimumPlayoutDelay().
  virtual int GetLeastRequiredDelayMs(int channel) const = 0;

  // Manual initialization of the RTP timestamp.
  virtual int SetInitTimestamp(int channel, unsigned int timestamp) = 0;

  // Manual initialization of the RTP sequence number.
  virtual int SetInitSequenceNumber(int channel, short sequenceNumber) = 0;

  // Get the received RTP timestamp
  virtual int GetPlayoutTimestamp(int channel, unsigned int& timestamp) = 0;

  virtual int GetRtpRtcp(int channel,
                         RtpRtcp** rtpRtcpModule,
                         RtpReceiver** rtp_receiver) = 0;

 protected:
  VoEVideoSync() {}
  virtual ~VoEVideoSync() {}
};

}  // namespace webrtc

#endif  // #ifndef WEBRTC_VOICE_ENGINE_VOE_VIDEO_SYNC_H
