1c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org/*
2c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org *
4c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org *  Use of this source code is governed by a BSD-style license
5c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org *  that can be found in the LICENSE file in the root of the source
6c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org *  tree. An additional intellectual property rights grant can be found
7c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org *  in the file PATENTS.  All contributing project authors may
8c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org */
10c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
1151ccf376387266225cd8c78e63238b725860f0afjmarusic@webrtc.org#include <vector>
1251ccf376387266225cd8c78e63238b725860f0afjmarusic@webrtc.org
13c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
14f45c8ca88bf5d8534fb1fbbbe5f79f585515743fhenrik.lundin@webrtc.org#include "webrtc/base/checks.h"
1500b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h"
16c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/codecs/red/audio_encoder_copy_red.h"
17c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/codecs/mock/mock_audio_encoder.h"
18c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
19c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgusing ::testing::Return;
20c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgusing ::testing::_;
21c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgusing ::testing::SetArgPointee;
22c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgusing ::testing::InSequence;
23c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgusing ::testing::Invoke;
24c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgusing ::testing::MockFunction;
25c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
26c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgnamespace webrtc {
27c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
28c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgnamespace {
2951ccf376387266225cd8c78e63238b725860f0afjmarusic@webrtc.orgstatic const size_t kMockMaxEncodedBytes = 1000;
30c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgstatic const size_t kMaxNumSamples = 48 * 10 * 2;  // 10 ms @ 48 kHz stereo.
31c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
32c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
33c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgclass AudioEncoderCopyRedTest : public ::testing::Test {
34c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org protected:
35c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  AudioEncoderCopyRedTest()
36c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org      : timestamp_(4711),
37c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org        sample_rate_hz_(16000),
38c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org        num_audio_samples_10ms(sample_rate_hz_ / 100),
39c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org        red_payload_type_(200) {
40c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    AudioEncoderCopyRed::Config config;
41c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    config.payload_type = red_payload_type_;
42c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    config.speech_encoder = &mock_encoder_;
43c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    red_.reset(new AudioEncoderCopyRed(config));
44c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    memset(audio_, 0, sizeof(audio_));
456955870806624479723addfae6dcf5d13968796cPeter Kasting    EXPECT_CALL(mock_encoder_, NumChannels()).WillRepeatedly(Return(1U));
4605211277798ca4791fbdc508e24d7fd06d5ee6ffkwiberg@webrtc.org    EXPECT_CALL(mock_encoder_, SampleRateHz())
47c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org        .WillRepeatedly(Return(sample_rate_hz_));
4851ccf376387266225cd8c78e63238b725860f0afjmarusic@webrtc.org    EXPECT_CALL(mock_encoder_, MaxEncodedBytes())
4951ccf376387266225cd8c78e63238b725860f0afjmarusic@webrtc.org        .WillRepeatedly(Return(kMockMaxEncodedBytes));
5051ccf376387266225cd8c78e63238b725860f0afjmarusic@webrtc.org    encoded_.resize(red_->MaxEncodedBytes(), 0);
51c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
52c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
5314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  void TearDown() override {
54c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    red_.reset();
55c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    // Don't expect the red_ object to delete the AudioEncoder object. But it
56c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    // will be deleted with the test fixture. This is why we explicitly delete
57c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    // the red_ object above, and set expectations on mock_encoder_ afterwards.
58c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    EXPECT_CALL(mock_encoder_, Die()).Times(1);
59c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
60c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
61c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  void Encode() {
62c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    ASSERT_TRUE(red_.get() != NULL);
63288886b2ec9a2dac730f115e9c3079d8439efe60kwiberg    encoded_info_ = red_->Encode(
64288886b2ec9a2dac730f115e9c3079d8439efe60kwiberg        timestamp_,
65288886b2ec9a2dac730f115e9c3079d8439efe60kwiberg        rtc::ArrayView<const int16_t>(audio_, num_audio_samples_10ms),
66288886b2ec9a2dac730f115e9c3079d8439efe60kwiberg        encoded_.size(), &encoded_[0]);
67c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    timestamp_ += num_audio_samples_10ms;
68c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
69c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
70c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  MockAudioEncoder mock_encoder_;
7100b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<AudioEncoderCopyRed> red_;
72c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  uint32_t timestamp_;
73c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  int16_t audio_[kMaxNumSamples];
74c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  const int sample_rate_hz_;
75c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  size_t num_audio_samples_10ms;
7651ccf376387266225cd8c78e63238b725860f0afjmarusic@webrtc.org  std::vector<uint8_t> encoded_;
77c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  AudioEncoder::EncodedInfo encoded_info_;
78c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  const int red_payload_type_;
79c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org};
80c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
81c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgclass MockEncodeHelper {
82c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org public:
83c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  MockEncodeHelper() : write_payload_(false), payload_(NULL) {
84c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    memset(&info_, 0, sizeof(info_));
85c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
86c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
879afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org  AudioEncoder::EncodedInfo Encode(uint32_t timestamp,
88288886b2ec9a2dac730f115e9c3079d8439efe60kwiberg                                   rtc::ArrayView<const int16_t> audio,
899afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org                                   size_t max_encoded_bytes,
909afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org                                   uint8_t* encoded) {
91c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    if (write_payload_) {
9291d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg      RTC_CHECK(encoded);
9391d6edef35e7275879c30ce16ecb8b6dc73c6e4ahenrikg      RTC_CHECK_LE(info_.encoded_bytes, max_encoded_bytes);
94c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org      memcpy(encoded, payload_, info_.encoded_bytes);
95c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    }
969afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org    return info_;
97c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
98c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
99c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  AudioEncoder::EncodedInfo info_;
100c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  bool write_payload_;
101c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  uint8_t* payload_;
102c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org};
103c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
104c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CreateAndDestroy) {
105c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
106c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
107c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckSampleRatePropagation) {
10805211277798ca4791fbdc508e24d7fd06d5ee6ffkwiberg@webrtc.org  EXPECT_CALL(mock_encoder_, SampleRateHz()).WillOnce(Return(17));
10905211277798ca4791fbdc508e24d7fd06d5ee6ffkwiberg@webrtc.org  EXPECT_EQ(17, red_->SampleRateHz());
110c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
111c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
112c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckNumChannelsPropagation) {
1136955870806624479723addfae6dcf5d13968796cPeter Kasting  EXPECT_CALL(mock_encoder_, NumChannels()).WillOnce(Return(17U));
1146955870806624479723addfae6dcf5d13968796cPeter Kasting  EXPECT_EQ(17U, red_->NumChannels());
115c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
116c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
117c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckFrameSizePropagation) {
118dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  EXPECT_CALL(mock_encoder_, Num10MsFramesInNextPacket()).WillOnce(Return(17U));
119dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  EXPECT_EQ(17U, red_->Num10MsFramesInNextPacket());
120c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
121c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
122c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckMaxFrameSizePropagation) {
123dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  EXPECT_CALL(mock_encoder_, Max10MsFramesInAPacket()).WillOnce(Return(17U));
124dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  EXPECT_EQ(17U, red_->Max10MsFramesInAPacket());
125c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
126c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
127478cedc055f95bd160b53a4d7b69d8b3dd023ec7henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckSetBitratePropagation) {
128478cedc055f95bd160b53a4d7b69d8b3dd023ec7henrik.lundin@webrtc.org  EXPECT_CALL(mock_encoder_, SetTargetBitrate(4711));
129478cedc055f95bd160b53a4d7b69d8b3dd023ec7henrik.lundin@webrtc.org  red_->SetTargetBitrate(4711);
130478cedc055f95bd160b53a4d7b69d8b3dd023ec7henrik.lundin@webrtc.org}
131478cedc055f95bd160b53a4d7b69d8b3dd023ec7henrik.lundin@webrtc.org
132478cedc055f95bd160b53a4d7b69d8b3dd023ec7henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckProjectedPacketLossRatePropagation) {
133478cedc055f95bd160b53a4d7b69d8b3dd023ec7henrik.lundin@webrtc.org  EXPECT_CALL(mock_encoder_, SetProjectedPacketLossRate(0.5));
134478cedc055f95bd160b53a4d7b69d8b3dd023ec7henrik.lundin@webrtc.org  red_->SetProjectedPacketLossRate(0.5);
135478cedc055f95bd160b53a4d7b69d8b3dd023ec7henrik.lundin@webrtc.org}
136478cedc055f95bd160b53a4d7b69d8b3dd023ec7henrik.lundin@webrtc.org
137c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// Checks that the an Encode() call is immediately propagated to the speech
138c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// encoder.
139c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckImmediateEncode) {
140c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // Interleaving the EXPECT_CALL sequence with expectations on the MockFunction
141c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // check ensures that exactly one call to EncodeInternal happens in each
142c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // Encode call.
143c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  InSequence s;
144c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  MockFunction<void(int check_point_id)> check;
145c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  for (int i = 1; i <= 6; ++i) {
1469afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org    EXPECT_CALL(mock_encoder_, EncodeInternal(_, _, _, _))
1479afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org        .WillRepeatedly(Return(AudioEncoder::EncodedInfo()));
148c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    EXPECT_CALL(check, Call(i));
149c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    Encode();
150c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    check.Call(i);
151c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
152c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
153c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
154c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// Checks that no output is produced if the underlying codec doesn't emit any
155c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// new data, even if the RED codec is loaded with a secondary encoding.
1569afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckNoOutput) {
157c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // Start with one Encode() call that will produce output.
158c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  static const size_t kEncodedSize = 17;
159019955d77015fed0b2dcec0cc62a8bdd63e0481etommi@webrtc.org  AudioEncoder::EncodedInfo info;
160019955d77015fed0b2dcec0cc62a8bdd63e0481etommi@webrtc.org  info.encoded_bytes = kEncodedSize;
1619afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org  EXPECT_CALL(mock_encoder_, EncodeInternal(_, _, _, _))
1629afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org      .WillOnce(Return(info));
163c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  Encode();
164c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // First call is a special case, since it does not include a secondary
165c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // payload.
166c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(1u, encoded_info_.redundant.size());
167c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(kEncodedSize, encoded_info_.encoded_bytes);
168c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
169c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // Next call to the speech encoder will not produce any output.
170019955d77015fed0b2dcec0cc62a8bdd63e0481etommi@webrtc.org  info.encoded_bytes = 0;
1719afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org  EXPECT_CALL(mock_encoder_, EncodeInternal(_, _, _, _))
1729afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org      .WillOnce(Return(info));
173c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  Encode();
174c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(0u, encoded_info_.encoded_bytes);
175c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
176c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // Final call to the speech encoder will produce output.
177019955d77015fed0b2dcec0cc62a8bdd63e0481etommi@webrtc.org  info.encoded_bytes = kEncodedSize;
1789afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org  EXPECT_CALL(mock_encoder_, EncodeInternal(_, _, _, _))
1799afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org      .WillOnce(Return(info));
180c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  Encode();
181c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(2 * kEncodedSize, encoded_info_.encoded_bytes);
182c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  ASSERT_EQ(2u, encoded_info_.redundant.size());
183c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
184c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
185c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// Checks that the correct payload sizes are populated into the redundancy
186c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// information.
187c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckPayloadSizes) {
188c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // Let the mock encoder return payload sizes 1, 2, 3, ..., 10 for the sequence
189c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // of calls.
190c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  static const int kNumPackets = 10;
191c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  InSequence s;
192c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  for (int encode_size = 1; encode_size <= kNumPackets; ++encode_size) {
193c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    AudioEncoder::EncodedInfo info;
194c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    info.encoded_bytes = encode_size;
1959afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org    EXPECT_CALL(mock_encoder_, EncodeInternal(_, _, _, _))
1969afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org        .WillOnce(Return(info));
197c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
198c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
199c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // First call is a special case, since it does not include a secondary
200c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // payload.
201c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  Encode();
202c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(1u, encoded_info_.redundant.size());
203c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(1u, encoded_info_.encoded_bytes);
204c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
205c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  for (size_t i = 2; i <= kNumPackets; ++i) {
206c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    Encode();
207c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    ASSERT_EQ(2u, encoded_info_.redundant.size());
208c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    EXPECT_EQ(i, encoded_info_.redundant[0].encoded_bytes);
209c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    EXPECT_EQ(i - 1, encoded_info_.redundant[1].encoded_bytes);
210c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    EXPECT_EQ(i + i - 1, encoded_info_.encoded_bytes);
211c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
212c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
213c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
214c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// Checks that the correct timestamps are returned.
215c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckTimestamps) {
216c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  MockEncodeHelper helper;
217c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
218c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  helper.info_.encoded_bytes = 17;
219c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  helper.info_.encoded_timestamp = timestamp_;
220c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  uint32_t primary_timestamp = timestamp_;
2219afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org  EXPECT_CALL(mock_encoder_, EncodeInternal(_, _, _, _))
222c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org      .WillRepeatedly(Invoke(&helper, &MockEncodeHelper::Encode));
223c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
224c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // First call is a special case, since it does not include a secondary
225c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // payload.
226c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  Encode();
227c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(primary_timestamp, encoded_info_.encoded_timestamp);
228c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
229c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  uint32_t secondary_timestamp = primary_timestamp;
230c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  primary_timestamp = timestamp_;
231c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  helper.info_.encoded_timestamp = timestamp_;
232c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  Encode();
233c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  ASSERT_EQ(2u, encoded_info_.redundant.size());
234c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(primary_timestamp, encoded_info_.redundant[0].encoded_timestamp);
235c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(secondary_timestamp, encoded_info_.redundant[1].encoded_timestamp);
236c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(primary_timestamp, encoded_info_.encoded_timestamp);
237c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
238c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
239c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// Checks that the primary and secondary payloads are written correctly.
240c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckPayloads) {
241c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // Let the mock encoder write payloads with increasing values. The first
242c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // payload will have values 0, 1, 2, ..., kPayloadLenBytes - 1.
243c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  MockEncodeHelper helper;
244c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  static const size_t kPayloadLenBytes = 5;
245c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  helper.info_.encoded_bytes = kPayloadLenBytes;
246c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  helper.write_payload_ = true;
247c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  uint8_t payload[kPayloadLenBytes];
248c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  for (uint8_t i = 0; i < kPayloadLenBytes; ++i) {
249c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    payload[i] = i;
250c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
251c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  helper.payload_ = payload;
2529afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org  EXPECT_CALL(mock_encoder_, EncodeInternal(_, _, _, _))
253c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org      .WillRepeatedly(Invoke(&helper, &MockEncodeHelper::Encode));
254c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
255c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // First call is a special case, since it does not include a secondary
256c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // payload.
257c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  Encode();
258c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(kPayloadLenBytes, encoded_info_.encoded_bytes);
259c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  for (size_t i = 0; i < kPayloadLenBytes; ++i) {
260c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    EXPECT_EQ(i, encoded_[i]);
261c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
262c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
263c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  for (int j = 0; j < 5; ++j) {
264c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    // Increment all values of the payload by 10.
265c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    for (size_t i = 0; i < kPayloadLenBytes; ++i)
266c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org      helper.payload_[i] += 10;
267c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
268c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    Encode();
269c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    ASSERT_EQ(2u, encoded_info_.redundant.size());
270c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    EXPECT_EQ(kPayloadLenBytes, encoded_info_.redundant[0].encoded_bytes);
271c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    EXPECT_EQ(kPayloadLenBytes, encoded_info_.redundant[1].encoded_bytes);
272c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    for (size_t i = 0; i < kPayloadLenBytes; ++i) {
273c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org      // Check primary payload.
274c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org      EXPECT_EQ((j + 1) * 10 + i, encoded_[i]);
275c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org      // Check secondary payload.
276c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org      EXPECT_EQ(j * 10 + i, encoded_[i + kPayloadLenBytes]);
277c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org    }
278c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  }
279c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
280c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
281c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// Checks correct propagation of payload type.
282c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// Checks that the correct timestamps are returned.
283c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedTest, CheckPayloadType) {
284c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  MockEncodeHelper helper;
285c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
286c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  helper.info_.encoded_bytes = 17;
287c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  const int primary_payload_type = red_payload_type_ + 1;
288c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  helper.info_.payload_type = primary_payload_type;
2899afaee74ab1ef36c8b4ea4c22f4c5aebf2359da2jmarusic@webrtc.org  EXPECT_CALL(mock_encoder_, EncodeInternal(_, _, _, _))
290c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org      .WillRepeatedly(Invoke(&helper, &MockEncodeHelper::Encode));
291c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
292c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // First call is a special case, since it does not include a secondary
293c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  // payload.
294c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  Encode();
295c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  ASSERT_EQ(1u, encoded_info_.redundant.size());
296c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(primary_payload_type, encoded_info_.redundant[0].payload_type);
297c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(red_payload_type_, encoded_info_.payload_type);
298c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
299c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  const int secondary_payload_type = red_payload_type_ + 2;
300c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  helper.info_.payload_type = secondary_payload_type;
301c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  Encode();
302c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  ASSERT_EQ(2u, encoded_info_.redundant.size());
303c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(secondary_payload_type, encoded_info_.redundant[0].payload_type);
304c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(primary_payload_type, encoded_info_.redundant[1].payload_type);
305c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_EQ(red_payload_type_, encoded_info_.payload_type);
306c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
307c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
308c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
309c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
310c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// This test fixture tests various error conditions that makes the
311c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org// AudioEncoderCng die via CHECKs.
312c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgclass AudioEncoderCopyRedDeathTest : public AudioEncoderCopyRedTest {
313c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org protected:
314c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  AudioEncoderCopyRedDeathTest() : AudioEncoderCopyRedTest() {}
315c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org};
316c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
317c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedDeathTest, WrongFrameSize) {
318c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  num_audio_samples_10ms *= 2;  // 20 ms frame.
319c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_DEATH(Encode(), "");
320c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  num_audio_samples_10ms = 0;  // Zero samples.
321c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_DEATH(Encode(), "");
322c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
323c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
324cab12917457325ad8200bf23389ba6e80369f0f6henrik.lundin@webrtc.orgTEST_F(AudioEncoderCopyRedDeathTest, NullSpeechEncoder) {
325cab12917457325ad8200bf23389ba6e80369f0f6henrik.lundin@webrtc.org  AudioEncoderCopyRed* red = NULL;
326c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  AudioEncoderCopyRed::Config config;
327c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  config.speech_encoder = NULL;
328c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org  EXPECT_DEATH(red = new AudioEncoderCopyRed(config),
329c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org               "Speech encoder not provided.");
330cab12917457325ad8200bf23389ba6e80369f0f6henrik.lundin@webrtc.org  // The delete operation is needed to avoid leak reports from memcheck.
331cab12917457325ad8200bf23389ba6e80369f0f6henrik.lundin@webrtc.org  delete red;
332c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}
333c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
334c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org#endif  // GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
335c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org
336c1c9291e9b73c3a9633cd5c5cbc2e243ab5d6920henrik.lundin@webrtc.org}  // namespace webrtc
337