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