• 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/renderer/audio_element_renderer_base.h"
14 
15 #include <cstdint>
16 #include <vector>
17 
18 #include "absl/status/status.h"
19 #include "absl/status/status_matchers.h"
20 #include "absl/types/span.h"
21 #include "gmock/gmock.h"
22 #include "gtest/gtest.h"
23 #include "iamf/obu/types.h"
24 
25 namespace iamf_tools {
26 namespace {
27 
28 using ::absl_testing::IsOk;
29 using testing::DoubleEq;
30 using testing::Pointwise;
31 
32 const std::vector<int32_t> kSamplesToRender = {0, 1, 2, 3};
33 
34 // Mock renderer which "renders" `kSamplesToRender` each call to
35 // `RenderLabeledFrame`.
36 class MockAudioElementRenderer : public AudioElementRendererBase {
37  public:
MockAudioElementRenderer()38   MockAudioElementRenderer() : AudioElementRendererBase({}, 0, 0) {};
39 
RenderSamples(absl::Span<const std::vector<InternalSampleType>>,std::vector<InternalSampleType> & rendered_samples)40   absl::Status RenderSamples(
41       absl::Span<const std::vector<InternalSampleType>>,
42       std::vector<InternalSampleType>& rendered_samples) override {
43     rendered_samples.insert(rendered_samples.end(), kSamplesToRender.begin(),
44                             kSamplesToRender.end());
45     return absl::OkStatus();
46   }
47 };
48 
TEST(AudioElementRendererBase,IsFinalizedReturnsFalseBeforeFinalizeIsCalled)49 TEST(AudioElementRendererBase, IsFinalizedReturnsFalseBeforeFinalizeIsCalled) {
50   MockAudioElementRenderer renderer;
51   EXPECT_FALSE(renderer.IsFinalized());
52 }
53 
TEST(AudioElementRendererBase,BaseImmediatelyAfterFinalizeIsFinalized)54 TEST(AudioElementRendererBase, BaseImmediatelyAfterFinalizeIsFinalized) {
55   MockAudioElementRenderer renderer;
56   EXPECT_THAT(renderer.Finalize(), IsOk());
57   EXPECT_TRUE(renderer.IsFinalized());
58 }
59 
TEST(AudioElementRendererBase,FinalizeAndFlushWithOutRenderingSucceeds)60 TEST(AudioElementRendererBase, FinalizeAndFlushWithOutRenderingSucceeds) {
61   MockAudioElementRenderer renderer;
62   EXPECT_THAT(renderer.Finalize(), IsOk());
63   EXPECT_TRUE(renderer.IsFinalized());
64   std::vector<InternalSampleType> rendered_samples;
65   EXPECT_THAT(renderer.Flush(rendered_samples), IsOk());
66   EXPECT_TRUE(rendered_samples.empty());
67 }
68 
TEST(AudioElementRendererBase,FlushingTwiceDoesNotAppendMore)69 TEST(AudioElementRendererBase, FlushingTwiceDoesNotAppendMore) {
70   MockAudioElementRenderer renderer;
71   std::vector<InternalSampleType> vector_to_collect_rendered_samples;
72 
73   EXPECT_THAT(renderer.RenderLabeledFrame({}), IsOk());
74   EXPECT_THAT(renderer.Finalize(), IsOk());
75   EXPECT_TRUE(renderer.IsFinalized());
76 
77   EXPECT_THAT(renderer.Flush(vector_to_collect_rendered_samples), IsOk());
78   EXPECT_FALSE(vector_to_collect_rendered_samples.empty());
79   vector_to_collect_rendered_samples.clear();
80 
81   // Samples are already flushed. Flushing again is OK, but it does nothing.
82   EXPECT_THAT(renderer.Flush(vector_to_collect_rendered_samples), IsOk());
83   EXPECT_TRUE(vector_to_collect_rendered_samples.empty());
84 }
85 
TEST(AudioElementRendererBase,AppendsWhenFlushing)86 TEST(AudioElementRendererBase, AppendsWhenFlushing) {
87   MockAudioElementRenderer renderer;
88   std::vector<InternalSampleType> vector_to_collect_rendered_samples(
89       {100, 200, 300, 400});
90   // Flush should append `kSamplesToRender` to the initial vector.
91   std::vector<InternalSampleType> expected_samples(
92       vector_to_collect_rendered_samples);
93   expected_samples.insert(expected_samples.end(), kSamplesToRender.begin(),
94                           kSamplesToRender.end());
95 
96   EXPECT_THAT(renderer.RenderLabeledFrame({}), IsOk());
97   EXPECT_THAT(renderer.Finalize(), IsOk());
98   EXPECT_TRUE(renderer.IsFinalized());
99 
100   EXPECT_THAT(renderer.Flush(vector_to_collect_rendered_samples), IsOk());
101   EXPECT_THAT(vector_to_collect_rendered_samples,
102               Pointwise(DoubleEq(), expected_samples));
103 }
104 
105 }  // namespace
106 }  // namespace iamf_tools
107