• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2013 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 
11 #ifndef WEBRTC_MODULES_AUDIO_CODING_ACM2_INITIAL_DELAY_MANAGER_H_
12 #define WEBRTC_MODULES_AUDIO_CODING_ACM2_INITIAL_DELAY_MANAGER_H_
13 
14 #include "webrtc/base/scoped_ptr.h"
15 #include "webrtc/modules/include/module_common_types.h"
16 
17 namespace webrtc {
18 
19 namespace acm2 {
20 
21 class InitialDelayManager {
22  public:
23   enum PacketType {
24     kUndefinedPacket, kCngPacket, kAvtPacket, kAudioPacket, kSyncPacket };
25 
26   // Specifies a stream of sync-packets.
27   struct SyncStream {
SyncStreamSyncStream28     SyncStream()
29         : num_sync_packets(0),
30           receive_timestamp(0),
31           timestamp_step(0) {
32       memset(&rtp_info, 0, sizeof(rtp_info));
33     }
34 
35     int num_sync_packets;
36 
37     // RTP header of the first sync-packet in the sequence.
38     WebRtcRTPHeader rtp_info;
39 
40     // Received timestamp of the first sync-packet in the sequence.
41     uint32_t receive_timestamp;
42 
43     // Samples per packet.
44     uint32_t timestamp_step;
45   };
46 
47   InitialDelayManager(int initial_delay_ms, int late_packet_threshold);
48 
49   // Update with the last received RTP header, |header|, and received timestamp,
50   // |received_timestamp|. |type| indicates the packet type. If codec is changed
51   // since the last time |new_codec| should be true. |sample_rate_hz| is the
52   // decoder's sampling rate in Hz. |header| has a field to store sampling rate
53   // but we are not sure if that is properly set at the send side, and |header|
54   // is declared constant in the caller of this function
55   // (AcmReceiver::InsertPacket()). |sync_stream| contains information required
56   // to generate a stream of sync packets.
57   void UpdateLastReceivedPacket(const WebRtcRTPHeader& header,
58                                 uint32_t receive_timestamp,
59                                 PacketType type,
60                                 bool new_codec,
61                                 int sample_rate_hz,
62                                 SyncStream* sync_stream);
63 
64   // Based on the last received timestamp and given the current timestamp,
65   // sequence of late (or perhaps missing) packets is computed.
66   void LatePackets(uint32_t timestamp_now, SyncStream* sync_stream);
67 
68   // Get playout timestamp.
69   // Returns true if the timestamp is valid (when buffering), otherwise false.
70   bool GetPlayoutTimestamp(uint32_t* playout_timestamp);
71 
72   // True if buffered audio is less than the given initial delay (specified at
73   // the constructor). Buffering might be disabled by the client of this class.
buffering()74   bool buffering() { return buffering_; }
75 
76   // Disable buffering in the class.
77   void DisableBuffering();
78 
79   // True if any packet received for buffering.
PacketBuffered()80   bool PacketBuffered() { return last_packet_type_ != kUndefinedPacket; }
81 
82  private:
83   static const uint8_t kInvalidPayloadType = 0xFF;
84 
85   // Update playout timestamps. While buffering, this is about
86   // |initial_delay_ms| millisecond behind the latest received timestamp.
87   void UpdatePlayoutTimestamp(const RTPHeader& current_header,
88                               int sample_rate_hz);
89 
90   // Record an RTP headr and related parameter
91   void RecordLastPacket(const WebRtcRTPHeader& rtp_info,
92                         uint32_t receive_timestamp,
93                         PacketType type);
94 
95   PacketType last_packet_type_;
96   WebRtcRTPHeader last_packet_rtp_info_;
97   uint32_t last_receive_timestamp_;
98   uint32_t timestamp_step_;
99   uint8_t audio_payload_type_;
100   const int initial_delay_ms_;
101   int buffered_audio_ms_;
102   bool buffering_;
103 
104   // During the initial phase where packets are being accumulated and silence
105   // is played out, |playout_ts| is a timestamp which is equal to
106   // |initial_delay_ms_| milliseconds earlier than the most recently received
107   // RTP timestamp.
108   uint32_t playout_timestamp_;
109 
110   // If the number of late packets exceed this value (computed based on current
111   // timestamp and last received timestamp), sequence of sync-packets is
112   // specified.
113   const int late_packet_threshold_;
114 };
115 
116 }  // namespace acm2
117 
118 }  // namespace webrtc
119 
120 #endif  // WEBRTC_MODULES_AUDIO_CODING_ACM2_INITIAL_DELAY_MANAGER_H_
121