blob: 4dfcbda044e9ced05c001c428e9b5c0cc9fa6174 [file] [log] [blame]
kwiberg4dc94112015-11-11 08:34:21 -08001/*
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
kwiberg16c5a962016-02-15 02:27:22 -080011#include <memory>
12
kjellander3e6db232015-11-26 04:44:54 -080013#include "webrtc/modules/audio_coding/acm2/codec_manager.h"
kwiberga6db4952015-12-16 04:19:08 -080014#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
kwibergac9f8762016-09-30 22:29:43 -070015#include "webrtc/test/gtest.h"
ossueb1fde42017-05-02 06:46:30 -070016#include "webrtc/test/mock_audio_encoder.h"
kwiberg4dc94112015-11-11 08:34:21 -080017
18namespace webrtc {
19namespace acm2 {
20
21using ::testing::Return;
22
23namespace {
24
25// Create a MockAudioEncoder with some reasonable default behavior.
kwiberg16c5a962016-02-15 02:27:22 -080026std::unique_ptr<MockAudioEncoder> CreateMockEncoder() {
27 auto enc = std::unique_ptr<MockAudioEncoder>(new MockAudioEncoder);
kwiberg4dc94112015-11-11 08:34:21 -080028 EXPECT_CALL(*enc, SampleRateHz()).WillRepeatedly(Return(8000));
29 EXPECT_CALL(*enc, NumChannels()).WillRepeatedly(Return(1));
30 EXPECT_CALL(*enc, Max10MsFramesInAPacket()).WillRepeatedly(Return(1));
31 EXPECT_CALL(*enc, Die());
32 return enc;
33}
34
35} // namespace
36
37TEST(CodecManagerTest, ExternalEncoderFec) {
38 auto enc0 = CreateMockEncoder();
39 auto enc1 = CreateMockEncoder();
kwiberg6030a122016-03-08 06:01:31 -080040 auto enc2 = CreateMockEncoder();
kwiberg4dc94112015-11-11 08:34:21 -080041 {
42 ::testing::InSequence s;
43 EXPECT_CALL(*enc0, SetFec(false)).WillOnce(Return(true));
kwiberg4dc94112015-11-11 08:34:21 -080044 EXPECT_CALL(*enc1, SetFec(true)).WillOnce(Return(true));
kwiberg6030a122016-03-08 06:01:31 -080045 EXPECT_CALL(*enc2, SetFec(true)).WillOnce(Return(false));
kwiberg4dc94112015-11-11 08:34:21 -080046 }
47
48 CodecManager cm;
kwiberga6db4952015-12-16 04:19:08 -080049 RentACodec rac;
kwiberg6030a122016-03-08 06:01:31 -080050
51 // use_codec_fec starts out false.
kwiberga6db4952015-12-16 04:19:08 -080052 EXPECT_FALSE(cm.GetStackParams()->use_codec_fec);
kwiberg6030a122016-03-08 06:01:31 -080053 cm.GetStackParams()->speech_encoder = std::move(enc0);
kwiberga6db4952015-12-16 04:19:08 -080054 EXPECT_TRUE(rac.RentEncoderStack(cm.GetStackParams()));
55 EXPECT_FALSE(cm.GetStackParams()->use_codec_fec);
kwiberg6030a122016-03-08 06:01:31 -080056
57 // Set it to true.
kwiberga6db4952015-12-16 04:19:08 -080058 EXPECT_EQ(true, cm.SetCodecFEC(true));
kwiberga6db4952015-12-16 04:19:08 -080059 EXPECT_TRUE(cm.GetStackParams()->use_codec_fec);
kwiberg6030a122016-03-08 06:01:31 -080060 cm.GetStackParams()->speech_encoder = std::move(enc1);
kwiberga6db4952015-12-16 04:19:08 -080061 EXPECT_TRUE(rac.RentEncoderStack(cm.GetStackParams()));
62 EXPECT_TRUE(cm.GetStackParams()->use_codec_fec);
kwiberg4dc94112015-11-11 08:34:21 -080063
kwiberg6030a122016-03-08 06:01:31 -080064 // Switch to a codec that doesn't support it.
65 cm.GetStackParams()->speech_encoder = std::move(enc2);
kwiberga6db4952015-12-16 04:19:08 -080066 EXPECT_TRUE(rac.RentEncoderStack(cm.GetStackParams()));
67 EXPECT_FALSE(cm.GetStackParams()->use_codec_fec);
kwiberg4dc94112015-11-11 08:34:21 -080068}
69
70} // namespace acm2
71} // namespace webrtc