1 #include <C2.h>
2 #include <C2Component.h>
3
4 #include <android/hardware_buffer_aidl.h>
5 #include <apex/ApexCodecs.h>
6 #include <apex/ApexCodecsParam.h>
7 #include <gtest/gtest.h>
8
9 // static_asserts for enum values match
10 static_assert((uint32_t)APEXCODEC_STATUS_OK == (uint32_t)C2_OK);
11 static_assert((uint32_t)APEXCODEC_STATUS_BAD_VALUE == (uint32_t)C2_BAD_VALUE);
12 static_assert((uint32_t)APEXCODEC_STATUS_BAD_INDEX == (uint32_t)C2_BAD_INDEX);
13 static_assert((uint32_t)APEXCODEC_STATUS_CANNOT_DO == (uint32_t)C2_CANNOT_DO);
14 static_assert((uint32_t)APEXCODEC_STATUS_DUPLICATE == (uint32_t)C2_DUPLICATE);
15 static_assert((uint32_t)APEXCODEC_STATUS_NOT_FOUND == (uint32_t)C2_NOT_FOUND);
16 static_assert((uint32_t)APEXCODEC_STATUS_BAD_STATE == (uint32_t)C2_BAD_STATE);
17 static_assert((uint32_t)APEXCODEC_STATUS_BLOCKING == (uint32_t)C2_BLOCKING);
18 static_assert((uint32_t)APEXCODEC_STATUS_CANCELED == (uint32_t)C2_CANCELED);
19 static_assert((uint32_t)APEXCODEC_STATUS_NO_MEMORY == (uint32_t)C2_NO_MEMORY);
20 static_assert((uint32_t)APEXCODEC_STATUS_REFUSED == (uint32_t)C2_REFUSED);
21 static_assert((uint32_t)APEXCODEC_STATUS_TIMED_OUT == (uint32_t)C2_TIMED_OUT);
22 static_assert((uint32_t)APEXCODEC_STATUS_OMITTED == (uint32_t)C2_OMITTED);
23 static_assert((uint32_t)APEXCODEC_STATUS_CORRUPTED == (uint32_t)C2_CORRUPTED);
24 static_assert((uint32_t)APEXCODEC_STATUS_NO_INIT == (uint32_t)C2_NO_INIT);
25
26 static_assert((uint32_t)APEXCODEC_KIND_OTHER == (uint32_t)C2Component::KIND_OTHER);
27 static_assert((uint32_t)APEXCODEC_KIND_DECODER == (uint32_t)C2Component::KIND_DECODER);
28 static_assert((uint32_t)APEXCODEC_KIND_ENCODER == (uint32_t)C2Component::KIND_ENCODER);
29
30 static_assert((uint32_t)APEXCODEC_DOMAIN_OTHER == (uint32_t)C2Component::DOMAIN_OTHER);
31 static_assert((uint32_t)APEXCODEC_DOMAIN_VIDEO == (uint32_t)C2Component::DOMAIN_VIDEO);
32 static_assert((uint32_t)APEXCODEC_DOMAIN_AUDIO == (uint32_t)C2Component::DOMAIN_AUDIO);
33 static_assert((uint32_t)APEXCODEC_DOMAIN_IMAGE == (uint32_t)C2Component::DOMAIN_IMAGE);
34
35 static_assert((uint32_t)APEXCODEC_FLAG_DROP_FRAME == (uint32_t)C2FrameData::FLAG_DROP_FRAME);
36 static_assert((uint32_t)APEXCODEC_FLAG_END_OF_STREAM == (uint32_t)C2FrameData::FLAG_END_OF_STREAM);
37 static_assert((uint32_t)APEXCODEC_FLAG_DISCARD_FRAME == (uint32_t)C2FrameData::FLAG_DISCARD_FRAME);
38 static_assert((uint32_t)APEXCODEC_FLAG_INCOMPLETE == (uint32_t)C2FrameData::FLAG_INCOMPLETE);
39 static_assert((uint32_t)APEXCODEC_FLAG_CORRECTED == (uint32_t)C2FrameData::FLAG_CORRECTED);
40 static_assert((uint32_t)APEXCODEC_FLAG_CORRUPT == (uint32_t)C2FrameData::FLAG_CORRUPT);
41 static_assert((uint32_t)APEXCODEC_FLAG_CODEC_CONFIG == (uint32_t)C2FrameData::FLAG_CODEC_CONFIG);
42
43 static_assert((uint32_t)APEXCODEC_BUFFER_TYPE_EMPTY ==
44 (uint32_t)C2BufferData::INVALID);
45 static_assert((uint32_t)APEXCODEC_BUFFER_TYPE_LINEAR ==
46 (uint32_t)C2BufferData::LINEAR);
47 static_assert((uint32_t)APEXCODEC_BUFFER_TYPE_LINEAR_CHUNKS ==
48 (uint32_t)C2BufferData::LINEAR_CHUNKS);
49 static_assert((uint32_t)APEXCODEC_BUFFER_TYPE_GRAPHIC ==
50 (uint32_t)C2BufferData::GRAPHIC);
51 static_assert((uint32_t)APEXCODEC_BUFFER_TYPE_GRAPHIC_CHUNKS ==
52 (uint32_t)C2BufferData::GRAPHIC_CHUNKS);
53
54 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_QUERY_CURRENT ==
55 (uint32_t)C2FieldSupportedValuesQuery::CURRENT);
56 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_QUERY_POSSIBLE ==
57 (uint32_t)C2FieldSupportedValuesQuery::POSSIBLE);
58
59 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_EMPTY ==
60 (uint32_t)C2FieldSupportedValues::EMPTY);
61 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_RANGE ==
62 (uint32_t)C2FieldSupportedValues::RANGE);
63 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_VALUES ==
64 (uint32_t)C2FieldSupportedValues::VALUES);
65 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_FLAGS ==
66 (uint32_t)C2FieldSupportedValues::FLAGS);
67
68 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_TYPE_NONE == (uint32_t)C2Value::NO_INIT);
69 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_TYPE_INT32 == (uint32_t)C2Value::INT32);
70 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_TYPE_UINT32 == (uint32_t)C2Value::UINT32);
71 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_TYPE_INT64 == (uint32_t)C2Value::INT64);
72 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_TYPE_UINT64 == (uint32_t)C2Value::UINT64);
73 static_assert((uint32_t)APEXCODEC_SUPPORTED_VALUES_TYPE_FLOAT == (uint32_t)C2Value::FLOAT);
74
75 static_assert((uint32_t)APEXCODEC_SETTING_RESULT_BAD_TYPE ==
76 (uint32_t)C2SettingResult::BAD_TYPE);
77 static_assert((uint32_t)APEXCODEC_SETTING_RESULT_BAD_PORT ==
78 (uint32_t)C2SettingResult::BAD_PORT);
79 static_assert((uint32_t)APEXCODEC_SETTING_RESULT_BAD_INDEX ==
80 (uint32_t)C2SettingResult::BAD_INDEX);
81 static_assert((uint32_t)APEXCODEC_SETTING_RESULT_READ_ONLY ==
82 (uint32_t)C2SettingResult::READ_ONLY);
83 static_assert((uint32_t)APEXCODEC_SETTING_RESULT_MISMATCH ==
84 (uint32_t)C2SettingResult::MISMATCH);
85 static_assert((uint32_t)APEXCODEC_SETTING_RESULT_BAD_VALUE ==
86 (uint32_t)C2SettingResult::BAD_VALUE);
87 static_assert((uint32_t)APEXCODEC_SETTING_RESULT_CONFLICT ==
88 (uint32_t)C2SettingResult::CONFLICT);
89 static_assert((uint32_t)APEXCODEC_SETTING_RESULT_UNSUPPORTED ==
90 (uint32_t)C2SettingResult::UNSUPPORTED);
91 static_assert((uint32_t)APEXCODEC_SETTING_RESULT_INFO_BAD_VALUE ==
92 (uint32_t)C2SettingResult::INFO_BAD_VALUE);
93 static_assert((uint32_t)APEXCODEC_SETTING_RESULT_INFO_CONFLICT ==
94 (uint32_t)C2SettingResult::INFO_CONFLICT);
95
96 static_assert((uint32_t)APEXCODEC_PARAM_IS_REQUIRED == (uint32_t)C2ParamDescriptor::IS_REQUIRED);
97 static_assert((uint32_t)APEXCODEC_PARAM_IS_PERSISTENT ==
98 (uint32_t)C2ParamDescriptor::IS_PERSISTENT);
99 static_assert((uint32_t)APEXCODEC_PARAM_IS_STRICT == (uint32_t)C2ParamDescriptor::IS_STRICT);
100 static_assert((uint32_t)APEXCODEC_PARAM_IS_READ_ONLY == (uint32_t)C2ParamDescriptor::IS_READ_ONLY);
101 static_assert((uint32_t)APEXCODEC_PARAM_IS_HIDDEN == (uint32_t)C2ParamDescriptor::IS_HIDDEN);
102 static_assert((uint32_t)APEXCODEC_PARAM_IS_INTERNAL == (uint32_t)C2ParamDescriptor::IS_INTERNAL);
103 static_assert((uint32_t)APEXCODEC_PARAM_IS_CONSTANT == (uint32_t)C2ParamDescriptor::IS_CONST);
104
105 using ::aidl::android::hardware::HardwareBuffer;
106
107 class SpApexCodecBuffer {
108 public:
SpApexCodecBuffer()109 SpApexCodecBuffer() {
110 mBuffer = ApexCodec_Buffer_create();
111 }
112
~SpApexCodecBuffer()113 ~SpApexCodecBuffer() {
114 ApexCodec_Buffer_destroy(mBuffer);
115 }
116
get() const117 ApexCodec_Buffer* get() const {
118 return mBuffer;
119 }
120
121 private:
122 ApexCodec_Buffer* mBuffer;
123 };
124
TEST(ApexCodecsTest,BufferCreateDestroyTest)125 TEST(ApexCodecsTest, BufferCreateDestroyTest) {
126 SpApexCodecBuffer buffer;
127 ASSERT_NE(buffer.get(), nullptr);
128 }
129
TEST(ApexCodecsTest,BufferInitialStateTest)130 TEST(ApexCodecsTest, BufferInitialStateTest) {
131 SpApexCodecBuffer buffer;
132 ASSERT_NE(buffer.get(), nullptr);
133 ASSERT_EQ(ApexCodec_Buffer_getType(buffer.get()), APEXCODEC_BUFFER_TYPE_EMPTY);
134
135 ApexCodec_BufferFlags flags;
136 uint64_t frameIndex;
137 uint64_t timestampUs;
138 ASSERT_EQ(ApexCodec_Buffer_getBufferInfo(buffer.get(), &flags, &frameIndex, ×tampUs),
139 APEXCODEC_STATUS_BAD_STATE);
140
141 ApexCodec_LinearBuffer linearBuffer;
142 ASSERT_EQ(ApexCodec_Buffer_getLinearBuffer(buffer.get(), &linearBuffer),
143 APEXCODEC_STATUS_BAD_STATE);
144
145 AHardwareBuffer* graphicBuffer;
146 ASSERT_EQ(ApexCodec_Buffer_getGraphicBuffer(buffer.get(), &graphicBuffer),
147 APEXCODEC_STATUS_BAD_STATE);
148
149 ApexCodec_LinearBuffer configUpdates;
150 bool ownedByClient;
151 ASSERT_EQ(ApexCodec_Buffer_getConfigUpdates(buffer.get(), &configUpdates, &ownedByClient),
152 APEXCODEC_STATUS_NOT_FOUND);
153 }
154
TEST(ApexCodecsTest,BufferSetGetInfoTest)155 TEST(ApexCodecsTest, BufferSetGetInfoTest) {
156 SpApexCodecBuffer buffer;
157 ASSERT_NE(buffer.get(), nullptr);
158
159 ApexCodec_Buffer_setBufferInfo(buffer.get(), APEXCODEC_FLAG_END_OF_STREAM, 123, 456);
160
161 ApexCodec_BufferFlags flags;
162 uint64_t frameIndex;
163 uint64_t timestampUs;
164 ASSERT_EQ(ApexCodec_Buffer_getBufferInfo(buffer.get(), &flags, &frameIndex, ×tampUs),
165 APEXCODEC_STATUS_OK);
166 ASSERT_EQ(flags, APEXCODEC_FLAG_END_OF_STREAM);
167 ASSERT_EQ(frameIndex, 123);
168 ASSERT_EQ(timestampUs, 456);
169 }
170
TEST(ApexCodecsTest,BufferSetGetLinearBufferTest)171 TEST(ApexCodecsTest, BufferSetGetLinearBufferTest) {
172 SpApexCodecBuffer buffer;
173 ASSERT_NE(buffer.get(), nullptr);
174
175 uint8_t data[10];
176 ApexCodec_LinearBuffer linearBuffer;
177 linearBuffer.data = data;
178 linearBuffer.size = 10;
179 ASSERT_EQ(ApexCodec_Buffer_setLinearBuffer(buffer.get(), &linearBuffer), APEXCODEC_STATUS_OK);
180 ASSERT_EQ(ApexCodec_Buffer_getType(buffer.get()), APEXCODEC_BUFFER_TYPE_LINEAR);
181 // Clear the data to ensure that the buffer owns the data.
182 linearBuffer.data = nullptr;
183 linearBuffer.size = 0;
184 ASSERT_EQ(ApexCodec_Buffer_getLinearBuffer(buffer.get(), &linearBuffer), APEXCODEC_STATUS_OK);
185 ASSERT_EQ(linearBuffer.data, data);
186 ASSERT_EQ(linearBuffer.size, 10);
187
188 ASSERT_EQ(ApexCodec_Buffer_setLinearBuffer(buffer.get(), &linearBuffer),
189 APEXCODEC_STATUS_BAD_STATE);
190 }
191
TEST(ApexCodecsTest,BufferSetGetGraphicBufferTest)192 TEST(ApexCodecsTest, BufferSetGetGraphicBufferTest) {
193 SpApexCodecBuffer buffer;
194 ASSERT_NE(buffer.get(), nullptr);
195
196 HardwareBuffer hardwareBuffer;
197 AHardwareBuffer_Desc desc;
198 desc.width = 100;
199 desc.height = 100;
200 desc.layers = 1;
201 desc.format = AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420;
202 desc.usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
203 AHardwareBuffer* graphicBuffer = nullptr;
204 AHardwareBuffer_allocate(&desc, &graphicBuffer);
205 hardwareBuffer.reset(graphicBuffer);
206 ASSERT_NE(graphicBuffer, nullptr);
207 ASSERT_EQ(ApexCodec_Buffer_setGraphicBuffer(buffer.get(), graphicBuffer), APEXCODEC_STATUS_OK);
208 ASSERT_EQ(ApexCodec_Buffer_getType(buffer.get()), APEXCODEC_BUFFER_TYPE_GRAPHIC);
209 graphicBuffer = nullptr;
210 ASSERT_EQ(ApexCodec_Buffer_getGraphicBuffer(buffer.get(), &graphicBuffer), APEXCODEC_STATUS_OK);
211 ASSERT_NE(graphicBuffer, nullptr);
212
213 ASSERT_EQ(ApexCodec_Buffer_setGraphicBuffer(buffer.get(), graphicBuffer),
214 APEXCODEC_STATUS_BAD_STATE);
215 }
216
TEST(ApexCodecsTest,BufferSetGetConfigUpdatesTest)217 TEST(ApexCodecsTest, BufferSetGetConfigUpdatesTest) {
218 SpApexCodecBuffer buffer;
219 ASSERT_NE(buffer.get(), nullptr);
220
221 uint8_t configData[20];
222 ApexCodec_LinearBuffer configUpdates;
223 configUpdates.data = configData;
224 configUpdates.size = 20;
225 ASSERT_EQ(ApexCodec_Buffer_setConfigUpdates(buffer.get(), &configUpdates), APEXCODEC_STATUS_OK);
226
227 bool ownedByClient;
228 ASSERT_EQ(ApexCodec_Buffer_getConfigUpdates(buffer.get(), &configUpdates, &ownedByClient),
229 APEXCODEC_STATUS_OK);
230 ASSERT_EQ(configUpdates.data, configData);
231 ASSERT_EQ(configUpdates.size, 20);
232 ASSERT_EQ(ownedByClient, false);
233
234 ASSERT_EQ(ApexCodec_Buffer_setConfigUpdates(buffer.get(), &configUpdates),
235 APEXCODEC_STATUS_BAD_STATE);
236 }
237
TEST(ApexCodecsTest,BufferClearTest)238 TEST(ApexCodecsTest, BufferClearTest) {
239 SpApexCodecBuffer buffer;
240 ASSERT_NE(buffer.get(), nullptr);
241
242 uint8_t data[10];
243 ApexCodec_LinearBuffer linearBuffer;
244 linearBuffer.data = data;
245 linearBuffer.size = 10;
246 ASSERT_EQ(ApexCodec_Buffer_setLinearBuffer(buffer.get(), &linearBuffer), APEXCODEC_STATUS_OK);
247
248 uint8_t configData[20];
249 ApexCodec_LinearBuffer configUpdates;
250 configUpdates.data = configData;
251 configUpdates.size = 20;
252 ASSERT_EQ(ApexCodec_Buffer_setConfigUpdates(buffer.get(), &configUpdates), APEXCODEC_STATUS_OK);
253
254 ApexCodec_Buffer_clear(buffer.get());
255 ASSERT_EQ(ApexCodec_Buffer_getType(buffer.get()), APEXCODEC_BUFFER_TYPE_EMPTY);
256
257 ApexCodec_BufferFlags flags;
258 uint64_t frameIndex;
259 uint64_t timestampUs;
260 ASSERT_EQ(ApexCodec_Buffer_getBufferInfo(buffer.get(), &flags, &frameIndex, ×tampUs),
261 APEXCODEC_STATUS_BAD_STATE);
262 ASSERT_EQ(ApexCodec_Buffer_getLinearBuffer(buffer.get(), &linearBuffer),
263 APEXCODEC_STATUS_BAD_STATE);
264 bool ownedByClient;
265
266 ASSERT_EQ(ApexCodec_Buffer_getConfigUpdates(buffer.get(), &configUpdates, &ownedByClient),
267 APEXCODEC_STATUS_NOT_FOUND);
268 }
269