blob: 32dd1260f10b84fa316f156d88dcb34b87945ba5 [file] [log] [blame]
* Copyright (c) 2013 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/base/scoped_ptr.h"
#include "webrtc/modules/include/module_common_types.h"
namespace webrtc {
namespace acm2 {
class InitialDelayManager {
enum PacketType {
kUndefinedPacket, kCngPacket, kAvtPacket, kAudioPacket, kSyncPacket };
// Specifies a stream of sync-packets.
struct SyncStream {
: num_sync_packets(0),
timestamp_step(0) {
memset(&rtp_info, 0, sizeof(rtp_info));
int num_sync_packets;
// RTP header of the first sync-packet in the sequence.
WebRtcRTPHeader rtp_info;
// Received timestamp of the first sync-packet in the sequence.
uint32_t receive_timestamp;
// Samples per packet.
uint32_t timestamp_step;
InitialDelayManager(int initial_delay_ms, int late_packet_threshold);
// Update with the last received RTP header, |header|, and received timestamp,
// |received_timestamp|. |type| indicates the packet type. If codec is changed
// since the last time |new_codec| should be true. |sample_rate_hz| is the
// decoder's sampling rate in Hz. |header| has a field to store sampling rate
// but we are not sure if that is properly set at the send side, and |header|
// is declared constant in the caller of this function
// (AcmReceiver::InsertPacket()). |sync_stream| contains information required
// to generate a stream of sync packets.
void UpdateLastReceivedPacket(const WebRtcRTPHeader& header,
uint32_t receive_timestamp,
PacketType type,
bool new_codec,
int sample_rate_hz,
SyncStream* sync_stream);
// Based on the last received timestamp and given the current timestamp,
// sequence of late (or perhaps missing) packets is computed.
void LatePackets(uint32_t timestamp_now, SyncStream* sync_stream);
// Get playout timestamp.
// Returns true if the timestamp is valid (when buffering), otherwise false.
bool GetPlayoutTimestamp(uint32_t* playout_timestamp);
// True if buffered audio is less than the given initial delay (specified at
// the constructor). Buffering might be disabled by the client of this class.
bool buffering() { return buffering_; }
// Disable buffering in the class.
void DisableBuffering();
// True if any packet received for buffering.
bool PacketBuffered() { return last_packet_type_ != kUndefinedPacket; }
static const uint8_t kInvalidPayloadType = 0xFF;
// Update playout timestamps. While buffering, this is about
// |initial_delay_ms| millisecond behind the latest received timestamp.
void UpdatePlayoutTimestamp(const RTPHeader& current_header,
int sample_rate_hz);
// Record an RTP headr and related parameter
void RecordLastPacket(const WebRtcRTPHeader& rtp_info,
uint32_t receive_timestamp,
PacketType type);
PacketType last_packet_type_;
WebRtcRTPHeader last_packet_rtp_info_;
uint32_t last_receive_timestamp_;
uint32_t timestamp_step_;
uint8_t audio_payload_type_;
const int initial_delay_ms_;
int buffered_audio_ms_;
bool buffering_;
// During the initial phase where packets are being accumulated and silence
// is played out, |playout_ts| is a timestamp which is equal to
// |initial_delay_ms_| milliseconds earlier than the most recently received
// RTP timestamp.
uint32_t playout_timestamp_;
// If the number of late packets exceed this value (computed based on current
// timestamp and last received timestamp), sequence of sync-packets is
// specified.
const int late_packet_threshold_;
} // namespace acm2
} // namespace webrtc