/* * 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. */ #ifndef WEBRTC_MODULES_AUDIO_CODING_ACM2_INITIAL_DELAY_MANAGER_H_ #define WEBRTC_MODULES_AUDIO_CODING_ACM2_INITIAL_DELAY_MANAGER_H_ #include "webrtc/base/scoped_ptr.h" #include "webrtc/modules/include/module_common_types.h" namespace webrtc { namespace acm2 { class InitialDelayManager { public: enum PacketType { kUndefinedPacket, kCngPacket, kAvtPacket, kAudioPacket, kSyncPacket }; // Specifies a stream of sync-packets. struct SyncStream { SyncStream() : num_sync_packets(0), receive_timestamp(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; } private: 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 #endif // WEBRTC_MODULES_AUDIO_CODING_ACM2_INITIAL_DELAY_MANAGER_H_