• 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_NETEQ_DECISION_LOGIC_NORMAL_H_
12 #define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DECISION_LOGIC_NORMAL_H_
13 
14 #include "webrtc/base/constructormagic.h"
15 #include "webrtc/modules/audio_coding/neteq/decision_logic.h"
16 #include "webrtc/typedefs.h"
17 
18 namespace webrtc {
19 
20 // Implementation of the DecisionLogic class for playout modes kPlayoutOn and
21 // kPlayoutStreaming.
22 class DecisionLogicNormal : public DecisionLogic {
23  public:
24   // Constructor.
DecisionLogicNormal(int fs_hz,int output_size_samples,NetEqPlayoutMode playout_mode,DecoderDatabase * decoder_database,const PacketBuffer & packet_buffer,DelayManager * delay_manager,BufferLevelFilter * buffer_level_filter)25   DecisionLogicNormal(int fs_hz,
26                       int output_size_samples,
27                       NetEqPlayoutMode playout_mode,
28                       DecoderDatabase* decoder_database,
29                       const PacketBuffer& packet_buffer,
30                       DelayManager* delay_manager,
31                       BufferLevelFilter* buffer_level_filter)
32       : DecisionLogic(fs_hz, output_size_samples, playout_mode,
33                       decoder_database, packet_buffer, delay_manager,
34                       buffer_level_filter) {
35   }
36 
37   // Destructor.
~DecisionLogicNormal()38   virtual ~DecisionLogicNormal() {}
39 
40  protected:
41   static const int kAllowMergeWithoutExpandMs = 20;  // 20 ms.
42   static const int kReinitAfterExpands = 100;
43   static const int kMaxWaitForPacket = 10;
44 
45   // Returns the operation that should be done next. |sync_buffer| and |expand|
46   // are provided for reference. |decoder_frame_length| is the number of samples
47   // obtained from the last decoded frame. If there is a packet available, the
48   // packet header should be supplied in |packet_header|; otherwise it should
49   // be NULL. The mode resulting form the last call to NetEqImpl::GetAudio is
50   // supplied in |prev_mode|. If there is a DTMF event to play, |play_dtmf|
51   // should be set to true. The output variable |reset_decoder| will be set to
52   // true if a reset is required; otherwise it is left unchanged (i.e., it can
53   // remain true if it was true before the call).
54   virtual Operations GetDecisionSpecialized(const SyncBuffer& sync_buffer,
55                                             const Expand& expand,
56                                             int decoder_frame_length,
57                                             const RTPHeader* packet_header,
58                                             Modes prev_mode, bool play_dtmf,
59                                             bool* reset_decoder);
60 
61   // Returns the operation to do given that the expected packet is not
62   // available, but a packet further into the future is at hand.
63   virtual Operations FuturePacketAvailable(
64       const SyncBuffer& sync_buffer,
65       const Expand& expand,
66       int decoder_frame_length, Modes prev_mode,
67       uint32_t target_timestamp,
68       uint32_t available_timestamp,
69       bool play_dtmf);
70 
71   // Returns the operation to do given that the expected packet is available.
72   virtual Operations ExpectedPacketAvailable(Modes prev_mode, bool play_dtmf);
73 
74   // Returns the operation given that no packets are available (except maybe
75   // a DTMF event, flagged by setting |play_dtmf| true).
76   virtual Operations NoPacket(bool play_dtmf);
77 
78  private:
79   // Returns the operation given that the next available packet is a comfort
80   // noise payload (RFC 3389 only, not codec-internal).
81   Operations CngOperation(Modes prev_mode, uint32_t target_timestamp,
82                           uint32_t available_timestamp);
83 
84   // Checks if enough time has elapsed since the last successful timescale
85   // operation was done (i.e., accelerate or preemptive expand).
TimescaleAllowed()86   bool TimescaleAllowed() const { return timescale_hold_off_ == 0; }
87 
88   // Checks if the current (filtered) buffer level is under the target level.
89   bool UnderTargetLevel() const;
90 
91   // Checks if |timestamp_leap| is so long into the future that a reset due
92   // to exceeding kReinitAfterExpands will be done.
93   bool ReinitAfterExpands(uint32_t timestamp_leap) const;
94 
95   // Checks if we still have not done enough expands to cover the distance from
96   // the last decoded packet to the next available packet, the distance beeing
97   // conveyed in |timestamp_leap|.
98   bool PacketTooEarly(uint32_t timestamp_leap) const;
99 
100   // Checks if num_consecutive_expands_ >= kMaxWaitForPacket.
101   bool MaxWaitForPacket() const;
102 
103   DISALLOW_COPY_AND_ASSIGN(DecisionLogicNormal);
104 };
105 
106 }  // namespace webrtc
107 #endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DECISION_LOGIC_NORMAL_H_
108