• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024, 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 
13 #include "iamf/cli/codec/flac_decoder_stream_callbacks.h"
14 
15 #include <cstddef>
16 #include <cstdint>
17 #include <vector>
18 
19 #include "gmock/gmock.h"
20 #include "gtest/gtest.h"
21 #include "iamf/cli/codec/flac_decoder.h"
22 #include "include/FLAC/format.h"
23 #include "include/FLAC/ordinals.h"
24 #include "include/FLAC/stream_decoder.h"
25 
26 namespace iamf_tools {
27 namespace {
28 
29 using ::testing::ElementsAreArray;
30 
31 constexpr uint32_t kNumSamplesPerFrame = 1024;
32 constexpr int kNumChannels = 2;
33 
TEST(LibFlacReadCallback,ReadCallbackReturnsEndOfStreamForEmptyFrame)34 TEST(LibFlacReadCallback, ReadCallbackReturnsEndOfStreamForEmptyFrame) {
35   FlacDecoder flac_decoder(kNumChannels, kNumSamplesPerFrame);
36   FLAC__byte buffer[1024];
37   size_t bytes = 1024;
38 
39   auto status = LibFlacReadCallback(/*stream_decoder=*/nullptr, buffer, &bytes,
40                                     &flac_decoder);
41 
42   EXPECT_EQ(status, FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM);
43   EXPECT_EQ(bytes, 0);
44 }
45 
TEST(LibFlacReadCallback,ReadCallbackReturnsAbortForTooLargeFrame)46 TEST(LibFlacReadCallback, ReadCallbackReturnsAbortForTooLargeFrame) {
47   FlacDecoder flac_decoder(kNumChannels, kNumSamplesPerFrame);
48   FLAC__byte buffer[1024];
49   size_t bytes = 1024;
50   flac_decoder.SetEncodedFrame(std::vector<uint8_t>(1025));
51 
52   auto status = LibFlacReadCallback(/*stream_decoder=*/nullptr, buffer, &bytes,
53                                     &flac_decoder);
54 
55   EXPECT_EQ(status, FLAC__STREAM_DECODER_READ_STATUS_ABORT);
56   EXPECT_EQ(bytes, 0);
57 }
58 
TEST(LibFlacReadCallback,Success)59 TEST(LibFlacReadCallback, Success) {
60   FlacDecoder flac_decoder(kNumChannels, kNumSamplesPerFrame);
61   FLAC__byte buffer[1024];
62   size_t bytes = 1028;
63   const std::vector<uint8_t> encoded_frame(1024, 1);
64   flac_decoder.SetEncodedFrame(encoded_frame);
65 
66   auto status = LibFlacReadCallback(/*stream_decoder=*/nullptr, buffer, &bytes,
67                                     &flac_decoder);
68 
69   EXPECT_EQ(status, FLAC__STREAM_DECODER_READ_STATUS_CONTINUE);
70   EXPECT_EQ(bytes, 1024);
71   EXPECT_THAT(buffer, ElementsAreArray(encoded_frame));
72 }
73 
TEST(LibFlacWriteCallback,Success32BitSamples)74 TEST(LibFlacWriteCallback, Success32BitSamples) {
75   FlacDecoder flac_decoder(kNumChannels, kNumSamplesPerFrame);
76   const FLAC__Frame kFlacFrame = {.header = {.blocksize = 3,
77                                              .channels = kNumChannels,
78                                              .bits_per_sample = 32}};
79   FLAC__int32 channel_0[] = {1, 0x7fffffff, 3};
80   FLAC__int32 channel_1[] = {2, 3, 4};
81   const FLAC__int32 *const buffer[] = {channel_0, channel_1};
82 
83   auto status = LibFlacWriteCallback(/*stream_decoder=*/nullptr, &kFlacFrame,
84                                      buffer, &flac_decoder);
85 
86   EXPECT_EQ(status, FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE);
87   EXPECT_THAT(flac_decoder.GetDecodedFrame(),
88               ElementsAreArray(std::vector<std::vector<int32_t>>(
89                   {{1, 0x7fffffff, 3}, {2, 3, 4}})));
90 }
91 
TEST(LibFlacWriteCallback,Success16BitSamples)92 TEST(LibFlacWriteCallback, Success16BitSamples) {
93   FlacDecoder flac_decoder(kNumChannels, kNumSamplesPerFrame);
94   const FLAC__Frame kFlacFrame = {.header = {.blocksize = 2,
95                                              .channels = kNumChannels,
96                                              .bits_per_sample = 16}};
97   FLAC__int32 channel_0[] = {0x11110000, 0x7fff0000};
98   FLAC__int32 channel_1[] = {0x01010000, 0x22220000};
99   const FLAC__int32 *const buffer[] = {channel_0, channel_1};
100 
101   auto status = LibFlacWriteCallback(/*stream_decoder=*/nullptr, &kFlacFrame,
102                                      buffer, &flac_decoder);
103 
104   EXPECT_EQ(status, FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE);
105   EXPECT_THAT(flac_decoder.GetDecodedFrame(),
106               ElementsAreArray(std::vector<std::vector<int32_t>>(
107                   {{0x11110000, 0x7fff0000}, {0x01010000, 0x22220000}})));
108 }
109 
110 }  // namespace
111 }  // namespace iamf_tools
112