• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &timestampUs),
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, &timestampUs),
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, &timestampUs),
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