• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "gtest/gtest.h"
2 #include "gmock/gmock.h"
3 #define private public
4 #include "avcodec_audio_codec_inner_impl.h"
5 #undef private
6 #include "i_avcodec_service.h"
7 #include "avcodec_log.h"
8 #include "avcodec_errors.h"
9 #include "avcodec_trace.h"
10 
11 using namespace testing;
12 using namespace testing::ext;
13 using namespace OHOS::MediaAVCodec;
14 
15 namespace {
16 constexpr int32_t DEFAULT_BUFFER_SIZE = 4;
17 }
18 
19 namespace OHOS {
20 namespace Media {
21 
22 class MockCodecService : public ICodecService {
23 public:
24     MOCK_METHOD(int32_t, Init,
25         (AVCodecType type, bool isMimeType, const std::string &name, Meta &callerInfo, API_VERSION apiVersion),
26         (override));
27     MOCK_METHOD(int32_t, Configure, (const Format &format), (override));
28     MOCK_METHOD(int32_t, SetCustomBuffer, (std::shared_ptr<AVBuffer> buffer), (override));
29     MOCK_METHOD(int32_t, Start, (), (override));
30     MOCK_METHOD(int32_t, Stop, (), (override));
31     MOCK_METHOD(int32_t, Flush, (), (override));
32     MOCK_METHOD(int32_t, Reset, (), (override));
33     MOCK_METHOD(int32_t, Release, (), (override));
34     MOCK_METHOD(int32_t, NotifyEos, (), (override));
35     MOCK_METHOD(sptr<Surface>, CreateInputSurface, (), (override));
36     MOCK_METHOD(int32_t, SetOutputSurface, (sptr<Surface> surface), (override));
37     MOCK_METHOD(
38         int32_t, QueueInputBuffer, (uint32_t index, AVCodecBufferInfo info, AVCodecBufferFlag flag), (override));
39     MOCK_METHOD(int32_t, QueueInputBuffer, (uint32_t index), (override));
40     MOCK_METHOD(int32_t, QueueInputParameter, (uint32_t index), (override));
41     MOCK_METHOD(int32_t, GetOutputFormat, (Format & format), (override));
42     MOCK_METHOD(int32_t, ReleaseOutputBuffer, (uint32_t index, bool render), (override));
43     MOCK_METHOD(int32_t, RenderOutputBufferAtTime, (uint32_t index, int64_t renderTimestampNs), (override));
44     MOCK_METHOD(int32_t, SetParameter, (const Format &format), (override));
45     MOCK_METHOD(int32_t, SetCallback, (const std::shared_ptr<AVCodecCallback> &callback), (override));
46     MOCK_METHOD(int32_t, SetCallback, (const std::shared_ptr<MediaCodecCallback> &callback), (override));
47     MOCK_METHOD(int32_t, SetCallback, (const std::shared_ptr<MediaCodecParameterCallback> &callback), (override));
48     MOCK_METHOD(
49         int32_t, SetCallback, (const std::shared_ptr<MediaCodecParameterWithAttrCallback> &callback), (override));
50     MOCK_METHOD(int32_t, ChangePlugin, (const std::string &mime, bool isEncoder, const std::shared_ptr<Meta> &meta),
51         (override));
52     MOCK_METHOD(int32_t, SetCodecCallback, (const std::shared_ptr<MediaCodecCallback> &codecCallback), (override));
53     MOCK_METHOD(void, SetDumpInfo, (bool isDump, uint64_t instanceId), (override));
54     MOCK_METHOD(int32_t, GetInputFormat, (Format & format), (override));
55     MOCK_METHOD(int32_t, SetDecryptConfig,
56         (const sptr<DrmStandard::IMediaKeySessionService> &keySession, const bool svpFlag), (override));
57     MOCK_METHOD(int32_t, CreateCodecByName, (const std::string &name), (override));
58     MOCK_METHOD(int32_t, Configure, (const std::shared_ptr<Meta> &meta), (override));
59     MOCK_METHOD(int32_t, SetParameter, (const std::shared_ptr<Meta> &parameter), (override));
60     MOCK_METHOD(int32_t, GetOutputFormat, (std::shared_ptr<Meta> & parameter), (override));
61     MOCK_METHOD(int32_t, SetOutputBufferQueue, (const sptr<AVBufferQueueProducer> &bufferQueueProducer), (override));
62     MOCK_METHOD(int32_t, Prepare, (), (override));
63     MOCK_METHOD(sptr<AVBufferQueueProducer>, GetInputBufferQueue, (), (override));
64     MOCK_METHOD(void, ProcessInputBuffer, (), (override));
65     MOCK_METHOD(bool, CheckRunning, (), (override));
66     MOCK_METHOD(int32_t, SetAudioDecryptionConfig,
67         (const sptr<DrmStandard::IMediaKeySessionService> &keySession, const bool svpFlag), (override));
68     MOCK_METHOD(sptr<AVBufferQueueConsumer>, GetInputBufferQueueConsumer, (), (override));
69     MOCK_METHOD(sptr<AVBufferQueueProducer>, GetOutputBufferQueueProducer, (), (override));
70     MOCK_METHOD(
71         void, ProcessInputBufferInner, (bool isTriggeredByOutPort, bool isFlushed, uint32_t &bufferStatus), (override));
72 
73     MOCK_METHOD(int32_t, GetChannelId, (int32_t & channelId));
74     MOCK_METHOD(int32_t, SetLowPowerPlayerMode, (bool isLpp));
75     MOCK_METHOD(int32_t, NotifyMemoryExchange, (const bool exchangeFlag), (override));
76 };
77 
78 class AudioCodecInnerTest : public ::testing::Test {
79 protected:
SetUp()80     void SetUp() override
81     {
82         mockCodecService_ = std::make_shared<MockCodecService>();
83         avCodecAudioCodecInnerImpl_ = std::make_unique<AVCodecAudioCodecInnerImpl>();
84         avCodecAudioCodecInnerImpl_->codecService_ = mockCodecService_;
85         innerBufferQueue_ =
86             AVBufferQueue::Create(DEFAULT_BUFFER_SIZE, MemoryType::SHARED_MEMORY, "AudioCodecInnerTest");
87     }
88 
TearDown()89     void TearDown() override
90     {}
91 
92     std::shared_ptr<MockCodecService> mockCodecService_;
93     std::unique_ptr<AVCodecAudioCodecInnerImpl> avCodecAudioCodecInnerImpl_;
94     std::shared_ptr<AVBufferQueue> innerBufferQueue_;
95 };
96 
97 HWTEST_F(AudioCodecInnerTest, ATC_Configure_ShouldReturnInvalidOperation_WhenCodecServiceIsNull, TestSize.Level0)
98 {
99     avCodecAudioCodecInnerImpl_->codecService_.reset();
100     std::shared_ptr<Meta> meta = std::make_shared<Meta>();
101     int32_t result = avCodecAudioCodecInnerImpl_->Configure(meta);
102     EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_INVALID_OPERATION), result);
103 }
104 
105 HWTEST_F(AudioCodecInnerTest, ATC_Configure_ShouldCreateSyncCodecAdapter_WhenSyncModeIsEnabled, TestSize.Level0)
106 {
107     std::shared_ptr<Meta> meta = std::make_shared<Meta>();
108     meta->Set<Tag::AV_CODEC_ENABLE_SYNC_MODE>(true);
109     EXPECT_CALL(*mockCodecService_, SetOutputBufferQueue(_))
110         .WillOnce(Return(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK)));
111 
112     int32_t result = avCodecAudioCodecInnerImpl_->Configure(meta);
113     EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK), result);
114     EXPECT_NE(nullptr, avCodecAudioCodecInnerImpl_->syncCodecAdapter_);
115 }
116 
117 HWTEST_F(AudioCodecInnerTest, ATC_Configure_ShouldResetSyncCodecAdapter_WhenSetProducerFails, TestSize.Level0)
118 {
119     std::shared_ptr<Meta> meta = std::make_shared<Meta>();
120     meta->Set<Tag::AV_CODEC_ENABLE_SYNC_MODE>(true);
121     EXPECT_CALL(*mockCodecService_, SetOutputBufferQueue(_))
122         .WillOnce(Return(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_UNKNOWN)));
123     int32_t result = avCodecAudioCodecInnerImpl_->Configure(meta);
124     EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_UNKNOWN), result);
125     EXPECT_EQ(nullptr, avCodecAudioCodecInnerImpl_->syncCodecAdapter_);
126 }
127 
128 HWTEST_F(AudioCodecInnerTest, ATC_Configure_ShouldCallCodecServiceConfigure_WhenSyncModeIsDisabled, TestSize.Level0)
129 {
130     std::shared_ptr<Meta> meta = std::make_shared<Meta>();
131     EXPECT_CALL(*mockCodecService_, Configure(meta))
132         .WillOnce(Return(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK)));
133 
134     int32_t result = avCodecAudioCodecInnerImpl_->Configure(meta);
135     EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK), result);
136     EXPECT_EQ(nullptr, avCodecAudioCodecInnerImpl_->syncCodecAdapter_);
137 }
138 
139 HWTEST_F(
140     AudioCodecInnerTest, ATC_SetOutputBufferQueue_ShouldReturnInvalidOperation_WhenCodecServiceIsNull, TestSize.Level0)
141 {
142     avCodecAudioCodecInnerImpl_->codecService_.reset();
143     int32_t result = avCodecAudioCodecInnerImpl_->SetOutputBufferQueue(nullptr);
144     EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_INVALID_OPERATION), result);
145 }
146 
147 HWTEST_F(AudioCodecInnerTest, ATC_SetOutputBufferQueue_ShouldReturnOk_WhenSyncCodecAdapterIsNotNull, TestSize.Level0)
148 {
149     avCodecAudioCodecInnerImpl_->syncCodecAdapter_ = std::make_shared<AVCodecAudioCodecInnerImpl::SyncCodecAdapter>(4);
150     int32_t result = avCodecAudioCodecInnerImpl_->SetOutputBufferQueue(innerBufferQueue_->GetProducer());
151     EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK), result);
152 }
153 
154 HWTEST_F(AudioCodecInnerTest,
155     ATC_SetOutputBufferQueue_ShouldCallCodecServiceSetOutputBufferQueue_WhenSyncCodecAdapterIsNull, TestSize.Level0)
156 {
157     EXPECT_CALL(*mockCodecService_, SetOutputBufferQueue(innerBufferQueue_->GetProducer()))
158         .WillOnce(Return(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK)));
159     int32_t result = avCodecAudioCodecInnerImpl_->SetOutputBufferQueue(innerBufferQueue_->GetProducer());
160     EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_OK), result);
161 }
162 
163 HWTEST_F(AudioCodecInnerTest, ATC_QueryInputBuffer_ShouldReturnInvalid_WhenSyncModeIsDisabled, TestSize.Level0)
164 {
165     uint32_t index = 0;
166     const size_t bufferSize = 0;
167     const int64_t timeoutUs = 0;
168     int32_t result = avCodecAudioCodecInnerImpl_->QueryInputBuffer(&index, bufferSize, timeoutUs);
169     EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_INVALID_VAL), result);
170 }
171 
172 HWTEST_F(AudioCodecInnerTest, ATC_GetInputBuffer_ShouldReturnInvalid_WhenSyncModeIsDisabled, TestSize.Level0)
173 {
174     const uint32_t index = 0;
175     auto result = avCodecAudioCodecInnerImpl_->GetInputBuffer(index);
176     EXPECT_EQ(nullptr, result);
177 }
178 
179 HWTEST_F(AudioCodecInnerTest, ATC_PushInputBuffer_ShouldReturnInvalid_WhenSyncModeIsDisabled, TestSize.Level0)
180 {
181     const uint32_t index = 0;
182     int32_t result = avCodecAudioCodecInnerImpl_->PushInputBuffer(index, true);
183     EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_INVALID_VAL), result);
184 }
185 
186 HWTEST_F(AudioCodecInnerTest, ATC_GetOutputBuffer_ShouldReturnInvalid_WhenSyncModeIsDisabled, TestSize.Level0)
187 {
188     const int64_t timeoutUs = 0;
189     auto result = avCodecAudioCodecInnerImpl_->GetOutputBuffer(timeoutUs);
190     EXPECT_EQ(nullptr, result);
191 }
192 
193 HWTEST_F(AudioCodecInnerTest, ATC_ReleaseOutputBuffer_ShouldReturnInvalid_WhenSyncModeIsDisabled, TestSize.Level0)
194 {
195     std::shared_ptr<AVBuffer> buffer;
196     int32_t result = avCodecAudioCodecInnerImpl_->ReleaseOutputBuffer(buffer);
197     EXPECT_EQ(static_cast<int32_t>(AVCodecServiceErrCode::AVCS_ERR_INVALID_VAL), result);
198 }
199 }  // namespace Media
200 }  // namespace OHOS