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