• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023, Alliance for Open Media. All rights reserved
3  *
4  * This source code is subject to the terms of the BSD 3-Clause Clear License
5  * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
6  * License was not distributed with this source code in the LICENSE file, you
7  * can obtain it at www.aomedia.org/license/software-license/bsd-3-c-c. If the
8  * Alliance for Open Media Patent License 1.0 was not distributed with this
9  * source code in the PATENTS file, you can obtain it at
10  * www.aomedia.org/license/patent.
11  */
12 #include "iamf/cli/codec/aac_encoder.h"
13 
14 #include <cstdint>
15 #include <memory>
16 #include <vector>
17 
18 #include "absl/status/status.h"
19 #include "absl/status/status_matchers.h"
20 #include "gmock/gmock.h"
21 #include "gtest/gtest.h"
22 #include "iamf/cli/codec/tests/encoder_test_base.h"
23 #include "iamf/cli/proto/codec_config.pb.h"
24 #include "iamf/obu/codec_config.h"
25 #include "iamf/obu/decoder_config/aac_decoder_config.h"
26 #include "iamf/obu/obu_header.h"
27 
28 namespace iamf_tools {
29 namespace {
30 
31 using ::absl_testing::IsOk;
32 
33 constexpr bool kOverrideAudioRollDistance = true;
34 constexpr bool kIgnoredValidatePreskip = true;
35 
36 class AacEncoderTest : public EncoderTestBase, public testing::Test {
37  public:
AacEncoderTest()38   AacEncoderTest() {
39     aac_encoder_metadata_.set_bitrate_mode(0);
40     aac_encoder_metadata_.set_enable_afterburner(true);
41     aac_encoder_metadata_.set_signaling_mode(2);
42     num_samples_per_frame_ = 1024;
43     input_sample_size_ = 16;
44   }
45 
46   ~AacEncoderTest() = default;
47 
48  protected:
ConstructEncoder()49   void ConstructEncoder() override {
50     // Construct a Codec Config OBU. The only fields that should affect the
51     // output are `num_samples_per_frame` and `decoder_config`.
52     const CodecConfig temp = {.codec_id = CodecConfig::kCodecIdAacLc,
53                               .num_samples_per_frame = num_samples_per_frame_,
54                               .decoder_config = aac_decoder_config_};
55 
56     CodecConfigObu codec_config(ObuHeader(), 0, temp);
57     ASSERT_THAT(codec_config.Initialize(kOverrideAudioRollDistance), IsOk());
58 
59     encoder_ = std::make_unique<AacEncoder>(aac_encoder_metadata_, codec_config,
60                                             num_channels_);
61   }
62 
63   AacDecoderConfig aac_decoder_config_ = {
64       .reserved_ = 0,
65       .buffer_size_db_ = 0,
66       .max_bitrate_ = 0,
67       .average_bit_rate_ = 0,
68       .decoder_specific_info_ =
69           {.audio_specific_config =
70                {.sample_frequency_index_ =
71                     AudioSpecificConfig::SampleFrequencyIndex::k64000}},
72   };
73   iamf_tools_cli_proto::AacEncoderMetadata aac_encoder_metadata_ = {};
74 };  // namespace iamf_tools
75 
TEST_F(AacEncoderTest,FramesAreInOrder)76 TEST_F(AacEncoderTest, FramesAreInOrder) {
77   InitExpectOk();
78 
79   // Encode several frames and ensure the correct number of frames are output in
80   // the same order as the input.
81   const int kNumFrames = 100;
82   for (int i = 0; i < kNumFrames; i++) {
83     EncodeAudioFrame(std::vector<std::vector<int32_t>>(
84         num_samples_per_frame_, std::vector<int32_t>(num_channels_, i)));
85   }
86   FinalizeAndValidateOrderOnly(kNumFrames);
87 }
88 
TEST_F(AacEncoderTest,InitSucceedsWithDefaultAacEncoderMetadata)89 TEST_F(AacEncoderTest, InitSucceedsWithDefaultAacEncoderMetadata) {
90   aac_encoder_metadata_ = {};
91   InitExpectOk();
92 }
93 
TEST_F(AacEncoderTest,InitSucceedsWithAfterburnerEnabled)94 TEST_F(AacEncoderTest, InitSucceedsWithAfterburnerEnabled) {
95   aac_encoder_metadata_.set_enable_afterburner(true);
96   InitExpectOk();
97 }
98 
TEST_F(AacEncoderTest,InitSucceedsWithAfterburnerDisabled)99 TEST_F(AacEncoderTest, InitSucceedsWithAfterburnerDisabled) {
100   aac_encoder_metadata_.set_enable_afterburner(false);
101   InitExpectOk();
102 }
103 
TEST_F(AacEncoderTest,InitFailsWithInvalidBitrateMode)104 TEST_F(AacEncoderTest, InitFailsWithInvalidBitrateMode) {
105   aac_encoder_metadata_.set_bitrate_mode(-1);
106   ConstructEncoder();
107 
108   EXPECT_FALSE(encoder_->Initialize(kIgnoredValidatePreskip).ok());
109 }
110 
TEST_F(AacEncoderTest,InitFailsWithInvalidSignalingMode)111 TEST_F(AacEncoderTest, InitFailsWithInvalidSignalingMode) {
112   aac_encoder_metadata_.set_signaling_mode(-1);
113   ConstructEncoder();
114 
115   EXPECT_FALSE(encoder_->Initialize(kIgnoredValidatePreskip).ok());
116 }
117 
118 }  // namespace
119 }  // namespace iamf_tools
120