1274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek/* 2274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek * 4274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek * Use of this source code is governed by a BSD-style license 5274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek * that can be found in the LICENSE file in the root of the source 6274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek * tree. An additional intellectual property rights grant can be found 7274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek * in the file PATENTS. All contributing project authors may 8274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek * be found in the AUTHORS file in the root of the source tree. 9274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek */ 10274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek 11274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek#include "webrtc/voice_engine/include/voe_codec.h" 12274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek 13274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek#include "testing/gtest/include/gtest/gtest.h" 140c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek#include "webrtc/modules/audio_device/include/fake_audio_device.h" 150c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek#include "webrtc/system_wrappers/interface/scoped_ptr.h" 160c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek#include "webrtc/test/testsupport/gtest_disable.h" 17274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek#include "webrtc/voice_engine/include/voe_base.h" 18274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek#include "webrtc/voice_engine/include/voe_hardware.h" 190c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek#include "webrtc/voice_engine/voice_engine_defines.h" 200c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek 210c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremeneknamespace webrtc { 220c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremeneknamespace voe { 230c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremeneknamespace { 240c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek 250c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenekclass VoECodecTest : public ::testing::Test { 26274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek protected: 27274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek VoECodecTest() 2818d9afb815bd8aff885dd64c5078760b3398d7beTed Kremenek : voe_(VoiceEngine::Create()), 29268ee7016a2811803989487c0ad3799486092c63Ted Kremenek base_(VoEBase::GetInterface(voe_)), 30e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek voe_codec_(VoECodec::GetInterface(voe_)), 31e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek channel_(-1), 32e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek adm_(new FakeAudioDeviceModule), 33e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek red_payload_type_(-1) { 34e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek } 35e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek 36e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek ~VoECodecTest() {} 37e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek 38e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek void TearDown() { 39e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek base_->DeleteChannel(channel_); 40e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek base_->Terminate(); 41e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek base_->Release(); 42e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek voe_codec_->Release(); 43e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek VoiceEngine::Delete(voe_); 44e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek } 45e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek 46e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek void SetUp() { 47e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek // Check if all components are valid. 48e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek ASSERT_TRUE(voe_ != NULL); 49e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek ASSERT_TRUE(base_ != NULL); 502b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner ASSERT_TRUE(voe_codec_ != NULL); 512b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner ASSERT_TRUE(adm_.get() != NULL); 522b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner ASSERT_EQ(0, base_->Init(adm_.get())); 532b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner channel_ = base_->CreateChannel(); 545f074266cc59563036c40516c814d63825723e20Ted Kremenek ASSERT_NE(-1, channel_); 552b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner 562b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner CodecInst my_codec; 572b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner 585f074266cc59563036c40516c814d63825723e20Ted Kremenek bool primary_found = false; 59274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek bool valid_secondary_found = false; 60e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek bool invalid_secondary_found = false; 61e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek 62866bdf74547efe32c320554837ffce00fcc084feTed Kremenek // Find primary and secondary codecs. 63866bdf74547efe32c320554837ffce00fcc084feTed Kremenek int num_codecs = voe_codec_->NumOfCodecs(); 64866bdf74547efe32c320554837ffce00fcc084feTed Kremenek int n = 0; 65866bdf74547efe32c320554837ffce00fcc084feTed Kremenek while (n < num_codecs && (!primary_found || !valid_secondary_found || 66e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek !invalid_secondary_found || red_payload_type_ < 0)) { 67866bdf74547efe32c320554837ffce00fcc084feTed Kremenek EXPECT_EQ(0, voe_codec_->GetCodec(n, my_codec)); 68866bdf74547efe32c320554837ffce00fcc084feTed Kremenek if (!STR_CASE_CMP(my_codec.plname, "isac") && my_codec.plfreq == 16000) { 69866bdf74547efe32c320554837ffce00fcc084feTed Kremenek memcpy(&valid_secondary_, &my_codec, sizeof(my_codec)); 70866bdf74547efe32c320554837ffce00fcc084feTed Kremenek valid_secondary_found = true; 71866bdf74547efe32c320554837ffce00fcc084feTed Kremenek } else if (!STR_CASE_CMP(my_codec.plname, "isac") && 72866bdf74547efe32c320554837ffce00fcc084feTed Kremenek my_codec.plfreq == 32000) { 73866bdf74547efe32c320554837ffce00fcc084feTed Kremenek memcpy(&invalid_secondary_, &my_codec, sizeof(my_codec)); 746b1c9708c8fca3786c766b6d1869721656b31322Ted Kremenek invalid_secondary_found = true; 75866bdf74547efe32c320554837ffce00fcc084feTed Kremenek } else if (!STR_CASE_CMP(my_codec.plname, "L16") && 7618d9afb815bd8aff885dd64c5078760b3398d7beTed Kremenek my_codec.plfreq == 16000) { 770c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek memcpy(&primary_, &my_codec, sizeof(my_codec)); 7818d9afb815bd8aff885dd64c5078760b3398d7beTed Kremenek primary_found = true; 7918d9afb815bd8aff885dd64c5078760b3398d7beTed Kremenek } else if (!STR_CASE_CMP(my_codec.plname, "RED")) { 8018d9afb815bd8aff885dd64c5078760b3398d7beTed Kremenek red_payload_type_ = my_codec.pltype; 8118d9afb815bd8aff885dd64c5078760b3398d7beTed Kremenek } 82e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek n++; 8318d9afb815bd8aff885dd64c5078760b3398d7beTed Kremenek } 8418d9afb815bd8aff885dd64c5078760b3398d7beTed Kremenek 85e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek EXPECT_TRUE(primary_found); 86866bdf74547efe32c320554837ffce00fcc084feTed Kremenek EXPECT_TRUE(valid_secondary_found); 87e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek EXPECT_TRUE(invalid_secondary_found); 88866bdf74547efe32c320554837ffce00fcc084feTed Kremenek EXPECT_NE(-1, red_payload_type_); 89866bdf74547efe32c320554837ffce00fcc084feTed Kremenek } 90866bdf74547efe32c320554837ffce00fcc084feTed Kremenek 91e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek VoiceEngine* voe_; 92866bdf74547efe32c320554837ffce00fcc084feTed Kremenek VoEBase* base_; 93866bdf74547efe32c320554837ffce00fcc084feTed Kremenek VoECodec* voe_codec_; 9459d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek int channel_; 9559d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek CodecInst primary_; 966b1c9708c8fca3786c766b6d1869721656b31322Ted Kremenek CodecInst valid_secondary_; 972b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner scoped_ptr<FakeAudioDeviceModule> adm_; 98866bdf74547efe32c320554837ffce00fcc084feTed Kremenek 9989d7ee9619d2dbdfa8d956a695c612a104a92cadTed Kremenek // A codec which is not valid to be registered as secondary codec. 100866bdf74547efe32c320554837ffce00fcc084feTed Kremenek CodecInst invalid_secondary_; 101866bdf74547efe32c320554837ffce00fcc084feTed Kremenek int red_payload_type_; 102866bdf74547efe32c320554837ffce00fcc084feTed Kremenek}; 1035f074266cc59563036c40516c814d63825723e20Ted Kremenek 1045f074266cc59563036c40516c814d63825723e20Ted Kremenek 1055f074266cc59563036c40516c814d63825723e20Ted KremenekTEST_F(VoECodecTest, 1065f074266cc59563036c40516c814d63825723e20Ted Kremenek DISABLED_ON_ANDROID(DualStreamSetSecondaryBeforePrimaryFails)) { 1075f074266cc59563036c40516c814d63825723e20Ted Kremenek // Setting secondary before a primary is registered should fail. 1085f074266cc59563036c40516c814d63825723e20Ted Kremenek EXPECT_EQ(-1, voe_codec_->SetSecondarySendCodec(channel_, valid_secondary_, 1095f074266cc59563036c40516c814d63825723e20Ted Kremenek red_payload_type_)); 11089d7ee9619d2dbdfa8d956a695c612a104a92cadTed Kremenek red_payload_type_ = 1; 11159d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek} 11259d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek 11359d08cb672136322375e5400578ee1fbd0947de2Ted KremenekTEST_F(VoECodecTest, 11459d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek DISABLED_ON_ANDROID(DualStreamRegisterWithWrongInputsFails)) { 11559d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek // Register primary codec. 11659d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek EXPECT_EQ(0, voe_codec_->SetSendCodec(channel_, primary_)); 117e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek 118e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek // Wrong secondary. 119e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek EXPECT_EQ(-1, voe_codec_->SetSecondarySendCodec(channel_, invalid_secondary_, 120cd4e2aecde5bb7810715d5d5a88ac63ce7946f34Ted Kremenek red_payload_type_)); 12159d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek 12259d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek // Wrong payload. 12359d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek EXPECT_EQ(-1, voe_codec_->SetSecondarySendCodec(channel_, valid_secondary_, 12459d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek -1)); 12559d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek // Wrong channel. 12659d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek EXPECT_EQ(-1, voe_codec_->SetSecondarySendCodec(channel_ + 1, 127d6f53dc4951aace69014619761760addac9e59ecTed Kremenek valid_secondary_, 12859d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek red_payload_type_)); 129cd4e2aecde5bb7810715d5d5a88ac63ce7946f34Ted Kremenek} 130cd4e2aecde5bb7810715d5d5a88ac63ce7946f34Ted Kremenek 131cd4e2aecde5bb7810715d5d5a88ac63ce7946f34Ted KremenekTEST_F(VoECodecTest, DISABLED_ON_ANDROID(DualStreamGetSecodaryEncoder)) { 132d6f53dc4951aace69014619761760addac9e59ecTed Kremenek // Register primary codec. 13359d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek EXPECT_EQ(0, voe_codec_->SetSendCodec(channel_, primary_)); 13459d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek 13559d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek // Register a valid codec. 13659d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek EXPECT_EQ(0, voe_codec_->SetSecondarySendCodec(channel_, valid_secondary_, 137d6f53dc4951aace69014619761760addac9e59ecTed Kremenek red_payload_type_)); 13859d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek CodecInst my_codec; 13959d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek 140e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek // Get secondary codec from wrong channel. 14159d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek EXPECT_EQ(-1, voe_codec_->GetSecondarySendCodec(channel_ + 1, my_codec)); 142e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek 143e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek // Get secondary and compare. 14459d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek memset(&my_codec, 0, sizeof(my_codec)); 14559d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek EXPECT_EQ(0, voe_codec_->GetSecondarySendCodec(channel_, my_codec)); 14659d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek 14759d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek EXPECT_EQ(valid_secondary_.plfreq, my_codec.plfreq); 14859d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek EXPECT_EQ(valid_secondary_.channels, my_codec.channels); 149274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek EXPECT_EQ(valid_secondary_.pacsize, my_codec.pacsize); 15059d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek EXPECT_EQ(valid_secondary_.rate, my_codec.rate); 151cd4e2aecde5bb7810715d5d5a88ac63ce7946f34Ted Kremenek EXPECT_EQ(valid_secondary_.pltype, my_codec.pltype); 152cd4e2aecde5bb7810715d5d5a88ac63ce7946f34Ted Kremenek EXPECT_EQ(0, STR_CASE_CMP(valid_secondary_.plname, my_codec.plname)); 153e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek} 154e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek 15559d08cb672136322375e5400578ee1fbd0947de2Ted KremenekTEST_F(VoECodecTest, DISABLED_ON_ANDROID(DualStreamRemoveSecondaryCodec)) { 156defb7094c835998bb821e894253287625ce8c74dTed Kremenek // Register primary codec. 1570c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek EXPECT_EQ(0, voe_codec_->SetSendCodec(channel_, primary_)); 158274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek 15917ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek // Register a valid codec. 16017ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek EXPECT_EQ(0, voe_codec_->SetSecondarySendCodec(channel_, valid_secondary_, 16117ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek red_payload_type_)); 16217ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek // Remove from wrong channel. 1634d35da2e41941965bbee8ed7e8c30e7c21000d71Ted Kremenek EXPECT_EQ(-1, voe_codec_->RemoveSecondarySendCodec(channel_ + 1)); 164e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek EXPECT_EQ(0, voe_codec_->RemoveSecondarySendCodec(channel_)); 165e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek 166e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek CodecInst my_codec; 167e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek 16874c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek // Get should fail, if secondary is removed. 16974c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek EXPECT_EQ(-1, voe_codec_->GetSecondarySendCodec(channel_, my_codec)); 17074c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek} 17174c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek 17274c3e6e5e95af08096aab415d1ce15f15ffff02aTed KremenekTEST(VoECodecInst, TestCompareCodecInstances) { 17374c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek CodecInst codec1, codec2; 17474c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek memset(&codec1, 0, sizeof(CodecInst)); 17574c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek memset(&codec2, 0, sizeof(CodecInst)); 176e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek 17774c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek codec1.pltype = 101; 17874c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek strncpy(codec1.plname, "isac", 4); 17980d2f3059326f99ebf7c867db1c7f106ec9485f5Ted Kremenek codec1.plfreq = 8000; 18074c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek codec1.pacsize = 110; 18174c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek codec1.channels = 1; 18274c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek codec1.rate = 8000; 18374c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek memcpy(&codec2, &codec1, sizeof(CodecInst)); 18474c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek // Compare two codecs now. 18574c3e6e5e95af08096aab415d1ce15f15ffff02aTed Kremenek EXPECT_TRUE(codec1 == codec2); 18617ff58a63197b398ae52697b088dc0fb8b255519Ted Kremenek EXPECT_FALSE(codec1 != codec2); 1870c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek 188268ee7016a2811803989487c0ad3799486092c63Ted Kremenek // Changing pltype. 189268ee7016a2811803989487c0ad3799486092c63Ted Kremenek codec2.pltype = 102; 190268ee7016a2811803989487c0ad3799486092c63Ted Kremenek EXPECT_FALSE(codec1 == codec2); 191268ee7016a2811803989487c0ad3799486092c63Ted Kremenek EXPECT_TRUE(codec1 != codec2); 192268ee7016a2811803989487c0ad3799486092c63Ted Kremenek 19341a2660377d215d004fe413c03874bd066b5384cTed Kremenek // Reset to codec2 to codec1 state. 194268ee7016a2811803989487c0ad3799486092c63Ted Kremenek memcpy(&codec2, &codec1, sizeof(CodecInst)); 195268ee7016a2811803989487c0ad3799486092c63Ted Kremenek // payload name should be case insensitive. 196268ee7016a2811803989487c0ad3799486092c63Ted Kremenek strncpy(codec2.plname, "ISAC", 4); 197268ee7016a2811803989487c0ad3799486092c63Ted Kremenek EXPECT_TRUE(codec1 == codec2); 19841a2660377d215d004fe413c03874bd066b5384cTed Kremenek 199268ee7016a2811803989487c0ad3799486092c63Ted Kremenek // Test modifying the |plfreq| 20041a2660377d215d004fe413c03874bd066b5384cTed Kremenek codec2.plfreq = 16000; 20141a2660377d215d004fe413c03874bd066b5384cTed Kremenek EXPECT_FALSE(codec1 == codec2); 202268ee7016a2811803989487c0ad3799486092c63Ted Kremenek 20341a2660377d215d004fe413c03874bd066b5384cTed Kremenek // Reset to codec2 to codec1 state. 20441a2660377d215d004fe413c03874bd066b5384cTed Kremenek memcpy(&codec2, &codec1, sizeof(CodecInst)); 20541a2660377d215d004fe413c03874bd066b5384cTed Kremenek // Test modifying the |pacsize|. 20641a2660377d215d004fe413c03874bd066b5384cTed Kremenek codec2.pacsize = 440; 20741a2660377d215d004fe413c03874bd066b5384cTed Kremenek EXPECT_FALSE(codec1 == codec2); 20841a2660377d215d004fe413c03874bd066b5384cTed Kremenek 20941a2660377d215d004fe413c03874bd066b5384cTed Kremenek // Reset to codec2 to codec1 state. 21041a2660377d215d004fe413c03874bd066b5384cTed Kremenek memcpy(&codec2, &codec1, sizeof(CodecInst)); 21141a2660377d215d004fe413c03874bd066b5384cTed Kremenek // Test modifying the |channels|. 21241a2660377d215d004fe413c03874bd066b5384cTed Kremenek codec2.channels = 2; 21341a2660377d215d004fe413c03874bd066b5384cTed Kremenek EXPECT_FALSE(codec1 == codec2); 21441a2660377d215d004fe413c03874bd066b5384cTed Kremenek 21541a2660377d215d004fe413c03874bd066b5384cTed Kremenek // Reset to codec2 to codec1 state. 21641a2660377d215d004fe413c03874bd066b5384cTed Kremenek memcpy(&codec2, &codec1, sizeof(CodecInst)); 21741a2660377d215d004fe413c03874bd066b5384cTed Kremenek // Test modifying the |rate|. 21841a2660377d215d004fe413c03874bd066b5384cTed Kremenek codec2.rate = 0; 21941a2660377d215d004fe413c03874bd066b5384cTed Kremenek EXPECT_FALSE(codec1 == codec2); 22041a2660377d215d004fe413c03874bd066b5384cTed Kremenek} 22141a2660377d215d004fe413c03874bd066b5384cTed Kremenek 22241a2660377d215d004fe413c03874bd066b5384cTed Kremenek} // namespace 22341a2660377d215d004fe413c03874bd066b5384cTed Kremenek} // namespace voe 22441a2660377d215d004fe413c03874bd066b5384cTed Kremenek} // namespace webrtc 22541a2660377d215d004fe413c03874bd066b5384cTed Kremenek