1 /*
2  *  Copyright (c) 2012 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_NETEQ_TIMESTAMP_SCALER_H_
12 #define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TIMESTAMP_SCALER_H_
13 
14 #include "webrtc/base/constructormagic.h"
15 #include "webrtc/modules/audio_coding/neteq/packet.h"
16 #include "webrtc/typedefs.h"
17 
18 namespace webrtc {
19 
20 // Forward declaration.
21 class DecoderDatabase;
22 
23 // This class scales timestamps for codecs that need timestamp scaling.
24 // This is done for codecs where one RTP timestamp does not correspond to
25 // one sample.
26 class TimestampScaler {
27  public:
TimestampScaler(const DecoderDatabase & decoder_database)28   explicit TimestampScaler(const DecoderDatabase& decoder_database)
29       : first_packet_received_(false),
30         numerator_(1),
31         denominator_(1),
32         external_ref_(0),
33         internal_ref_(0),
34         decoder_database_(decoder_database) {}
35 
~TimestampScaler()36   virtual ~TimestampScaler() {}
37 
38   // Start over.
39   virtual void Reset();
40 
41   // Scale the timestamp in |packet| from external to internal.
42   virtual void ToInternal(Packet* packet);
43 
44   // Scale the timestamp for all packets in |packet_list| from external to
45   // internal.
46   virtual void ToInternal(PacketList* packet_list);
47 
48   // Returns the internal equivalent of |external_timestamp|, given the
49   // RTP payload type |rtp_payload_type|.
50   virtual uint32_t ToInternal(uint32_t external_timestamp,
51                               uint8_t rtp_payload_type);
52 
53   // Scales back to external timestamp. This is the inverse of ToInternal().
54   virtual uint32_t ToExternal(uint32_t internal_timestamp) const;
55 
56  private:
57   bool first_packet_received_;
58   int numerator_;
59   int denominator_;
60   uint32_t external_ref_;
61   uint32_t internal_ref_;
62   const DecoderDatabase& decoder_database_;
63 
64   RTC_DISALLOW_COPY_AND_ASSIGN(TimestampScaler);
65 };
66 
67 }  // namespace webrtc
68 #endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TIMESTAMP_SCALER_H_
69