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