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 TEST_MOCK_AUDIO_ENCODER_H_
12 #define TEST_MOCK_AUDIO_ENCODER_H_
13 
14 #include <string>
15 
16 #include "api/array_view.h"
17 #include "api/audio_codecs/audio_encoder.h"
18 #include "test/gmock.h"
19 
20 namespace webrtc {
21 
22 class MockAudioEncoder : public AudioEncoder {
23  public:
24   MockAudioEncoder();
25   ~MockAudioEncoder();
26   MOCK_METHOD(int, SampleRateHz, (), (const, override));
27   MOCK_METHOD(size_t, NumChannels, (), (const, override));
28   MOCK_METHOD(int, RtpTimestampRateHz, (), (const, override));
29   MOCK_METHOD(size_t, Num10MsFramesInNextPacket, (), (const, override));
30   MOCK_METHOD(size_t, Max10MsFramesInAPacket, (), (const, override));
31   MOCK_METHOD(int, GetTargetBitrate, (), (const, override));
32   MOCK_METHOD((absl::optional<std::pair<TimeDelta, TimeDelta>>),
33               GetFrameLengthRange,
34               (),
35               (const, override));
36 
37   MOCK_METHOD(void, Reset, (), (override));
38   MOCK_METHOD(bool, SetFec, (bool enable), (override));
39   MOCK_METHOD(bool, SetDtx, (bool enable), (override));
40   MOCK_METHOD(bool, SetApplication, (Application application), (override));
41   MOCK_METHOD(void, SetMaxPlaybackRate, (int frequency_hz), (override));
42   MOCK_METHOD(void,
43               OnReceivedUplinkBandwidth,
44               (int target_audio_bitrate_bps,
45                absl::optional<int64_t> probing_interval_ms),
46               (override));
47   MOCK_METHOD(void,
48               OnReceivedUplinkPacketLossFraction,
49               (float uplink_packet_loss_fraction),
50               (override));
51 
52   MOCK_METHOD(bool,
53               EnableAudioNetworkAdaptor,
54               (const std::string& config_string, RtcEventLog*),
55               (override));
56 
57   // Note, we explicitly chose not to create a mock for the Encode method.
58   MOCK_METHOD(EncodedInfo,
59               EncodeImpl,
60               (uint32_t timestamp,
61                rtc::ArrayView<const int16_t> audio,
62                rtc::Buffer*),
63               (override));
64 
65   class FakeEncoding {
66    public:
67     // Creates a functor that will return |info| and adjust the rtc::Buffer
68     // given as input to it, so it is info.encoded_bytes larger.
69     explicit FakeEncoding(const AudioEncoder::EncodedInfo& info);
70 
71     // Shorthand version of the constructor above, for when only setting
72     // encoded_bytes in the EncodedInfo object matters.
73     explicit FakeEncoding(size_t encoded_bytes);
74 
75     AudioEncoder::EncodedInfo operator()(uint32_t timestamp,
76                                          rtc::ArrayView<const int16_t> audio,
77                                          rtc::Buffer* encoded);
78 
79    private:
80     AudioEncoder::EncodedInfo info_;
81   };
82 
83   class CopyEncoding {
84    public:
85     ~CopyEncoding();
86 
87     // Creates a functor that will return |info| and append the data in the
88     // payload to the buffer given as input to it. Up to info.encoded_bytes are
89     // appended - make sure the payload is big enough!  Since it uses an
90     // ArrayView, it _does not_ copy the payload. Make sure it doesn't fall out
91     // of scope!
92     CopyEncoding(AudioEncoder::EncodedInfo info,
93                  rtc::ArrayView<const uint8_t> payload);
94 
95     // Shorthand version of the constructor above, for when you wish to append
96     // the whole payload and do not care about any EncodedInfo attribute other
97     // than encoded_bytes.
98     explicit CopyEncoding(rtc::ArrayView<const uint8_t> payload);
99 
100     AudioEncoder::EncodedInfo operator()(uint32_t timestamp,
101                                          rtc::ArrayView<const int16_t> audio,
102                                          rtc::Buffer* encoded);
103 
104    private:
105     AudioEncoder::EncodedInfo info_;
106     rtc::ArrayView<const uint8_t> payload_;
107   };
108 };
109 
110 }  // namespace webrtc
111 
112 #endif  // TEST_MOCK_AUDIO_ENCODER_H_
113