1 /*
2  *  Copyright (c) 2014 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_TOOLS_NETEQ_QUALITY_TEST_H_
12 #define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_QUALITY_TEST_H_
13 
14 #include <fstream>
15 #include <gflags/gflags.h>
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "webrtc/base/scoped_ptr.h"
18 #include "webrtc/modules/audio_coding/neteq/include/neteq.h"
19 #include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h"
20 #include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
21 #include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
22 #include "webrtc/typedefs.h"
23 
24 using google::RegisterFlagValidator;
25 
26 namespace webrtc {
27 namespace test {
28 
29 class LossModel {
30  public:
~LossModel()31   virtual ~LossModel() {};
32   virtual bool Lost() = 0;
33 };
34 
35 class NoLoss : public LossModel {
36  public:
37   bool Lost() override;
38 };
39 
40 class UniformLoss : public LossModel {
41  public:
42   UniformLoss(double loss_rate);
43   bool Lost() override;
set_loss_rate(double loss_rate)44   void set_loss_rate(double loss_rate) { loss_rate_ = loss_rate; }
45 
46  private:
47   double loss_rate_;
48 };
49 
50 class GilbertElliotLoss : public LossModel {
51  public:
52   GilbertElliotLoss(double prob_trans_11, double prob_trans_01);
53   bool Lost() override;
54 
55  private:
56   // Prob. of losing current packet, when previous packet is lost.
57   double prob_trans_11_;
58   // Prob. of losing current packet, when previous packet is not lost.
59   double prob_trans_01_;
60   bool lost_last_;
61   rtc::scoped_ptr<UniformLoss> uniform_loss_model_;
62 };
63 
64 class NetEqQualityTest : public ::testing::Test {
65  protected:
66   NetEqQualityTest(int block_duration_ms,
67                    int in_sampling_khz,
68                    int out_sampling_khz,
69                    NetEqDecoder decoder_type);
70   virtual ~NetEqQualityTest();
71 
72   void SetUp() override;
73 
74   // EncodeBlock(...) does the following:
75   // 1. encodes a block of audio, saved in |in_data| and has a length of
76   // |block_size_samples| (samples per channel),
77   // 2. save the bit stream to |payload| of |max_bytes| bytes in size,
78   // 3. returns the length of the payload (in bytes),
79   virtual int EncodeBlock(int16_t* in_data, size_t block_size_samples,
80                           uint8_t* payload, size_t max_bytes) = 0;
81 
82   // PacketLost(...) determines weather a packet sent at an indicated time gets
83   // lost or not.
84   bool PacketLost();
85 
86   // DecodeBlock() decodes a block of audio using the payload stored in
87   // |payload_| with the length of |payload_size_bytes_| (bytes). The decoded
88   // audio is to be stored in |out_data_|.
89   int DecodeBlock();
90 
91   // Transmit() uses |rtp_generator_| to generate a packet and passes it to
92   // |neteq_|.
93   int Transmit();
94 
95   // Runs encoding / transmitting / decoding.
96   void Simulate();
97 
98   // Write to log file. Usage Log() << ...
99   std::ofstream& Log();
100 
101   NetEqDecoder decoder_type_;
102   const size_t channels_;
103 
104  private:
105   int decoded_time_ms_;
106   int decodable_time_ms_;
107   double drift_factor_;
108   int packet_loss_rate_;
109   const int block_duration_ms_;
110   const int in_sampling_khz_;
111   const int out_sampling_khz_;
112 
113   // Number of samples per channel in a frame.
114   const size_t in_size_samples_;
115 
116   // Expected output number of samples per channel in a frame.
117   const size_t out_size_samples_;
118 
119   size_t payload_size_bytes_;
120   size_t max_payload_bytes_;
121 
122   rtc::scoped_ptr<InputAudioFile> in_file_;
123   rtc::scoped_ptr<AudioSink> output_;
124   std::ofstream log_file_;
125 
126   rtc::scoped_ptr<RtpGenerator> rtp_generator_;
127   rtc::scoped_ptr<NetEq> neteq_;
128   rtc::scoped_ptr<LossModel> loss_model_;
129 
130   rtc::scoped_ptr<int16_t[]> in_data_;
131   rtc::scoped_ptr<uint8_t[]> payload_;
132   rtc::scoped_ptr<int16_t[]> out_data_;
133   WebRtcRTPHeader rtp_header_;
134 
135   size_t total_payload_size_bytes_;
136 };
137 
138 }  // namespace test
139 }  // namespace webrtc
140 
141 #endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_QUALITY_TEST_H_
142