1 /*
2 * Copyright (c) 2021 Shenzhen Kaihong DID Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "codec_config_parser.h"
17 #include <osal_mem.h>
18 #include <securec.h>
19 #include "hdf_base.h"
20 #include "hdf_log.h"
21
22 #define HDF_LOG_TAG "codec_config_parser"
23 #ifdef __ARM64__
24 #define MASK_NUM_LIMIT 64
25 #else
26 #define MASK_NUM_LIMIT 32
27 #endif
28
29 static CodecCapablites g_codecCapabilites = {0};
30 static const struct DeviceResourceNode *g_resourceNode;
31
GetGroupCapabilitiesNumber(const struct DeviceResourceNode * node,const char * nodeName,int32_t * num)32 static int32_t GetGroupCapabilitiesNumber(const struct DeviceResourceNode *node,
33 const char *nodeName, int32_t *num)
34 {
35 int result = 0;
36 const struct DeviceResourceNode *codecGroupNode = NULL;
37 struct DeviceResourceNode *childNode = NULL;
38 struct DeviceResourceIface *iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
39
40 *num = 0;
41 if (iface == NULL || node == NULL || nodeName == NULL) {
42 HDF_LOGE("%{public}s, failed for codecs %{public}s, variable NULL!", __func__, nodeName);
43 return HDF_FAILURE;
44 }
45
46 codecGroupNode = iface->GetChildNode(node, nodeName);
47 if (codecGroupNode == NULL) {
48 HDF_LOGE("%{public}s, failed to get child node %{public}s,!", __func__, nodeName);
49 return HDF_FAILURE;
50 }
51 DEV_RES_NODE_FOR_EACH_CHILD_NODE(codecGroupNode, childNode) {
52 result++;
53 }
54 *num = result;
55
56 return HDF_SUCCESS;
57 }
58
GetCapabilityBase(const struct DeviceResourceIface * iface,const struct DeviceResourceNode * childNode,CodecCapability * cap)59 static int32_t GetCapabilityBase(const struct DeviceResourceIface *iface,
60 const struct DeviceResourceNode *childNode, CodecCapability *cap)
61 {
62 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MIME,
63 (uint32_t*)&cap->mime, MEDIA_MIMETYPE_INVALID) != HDF_SUCCESS) {
64 cap->mime = MEDIA_MIMETYPE_INVALID;
65 HDF_LOGE("%{public}s, failed to get mime for: %{public}s! Discarded", __func__, childNode->name);
66 return HDF_FAILURE;
67 }
68 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_TYPE, (uint32_t*)&cap->type, INVALID_TYPE) != HDF_SUCCESS) {
69 cap->mime = MEDIA_MIMETYPE_INVALID;
70 cap->type = INVALID_TYPE;
71 HDF_LOGE("%{public}s, failed to get type for: %{public}s! Discarded", __func__, childNode->name);
72 return HDF_FAILURE;
73 }
74 const char *name = NULL;
75 if (iface->GetString(childNode, CODEC_CONFIG_KEY_NAME, &name, "") != HDF_SUCCESS) {
76 cap->mime = MEDIA_MIMETYPE_INVALID;
77 HDF_LOGE("%{public}s, failed to get name for: %{public}s! Discarded", __func__, childNode->name);
78 return HDF_FAILURE;
79 }
80 if (name == NULL || strlen(name) >= NAME_LENGTH || strlen(name) == 0) {
81 cap->mime = MEDIA_MIMETYPE_INVALID;
82 HDF_LOGE("%{public}s, name(%{public}s) is illegal", __func__, childNode->name);
83 return HDF_FAILURE;
84 }
85 int32_t ret = strcpy_s(cap->name, NAME_LENGTH, name);
86 if (ret != EOK) {
87 cap->mime = MEDIA_MIMETYPE_INVALID;
88 HDF_LOGE("%{public}s, strcpy_s is failed, error code: %{public}d!", __func__, ret);
89 return HDF_FAILURE;
90 }
91 return HDF_SUCCESS;
92 }
93
GetUintTableConfig(const struct DeviceResourceIface * iface,const struct DeviceResourceNode * node,ConfigUintArrayNodeAttr * attr)94 static int32_t GetUintTableConfig(const struct DeviceResourceIface *iface,
95 const struct DeviceResourceNode *node, ConfigUintArrayNodeAttr *attr)
96 {
97 if (iface == NULL || node == NULL || attr == NULL) {
98 HDF_LOGE("%{public}s, failed, invalid param!", __func__);
99 return HDF_ERR_INVALID_PARAM;
100 }
101 if (attr->array == NULL || attr->attrName == NULL) {
102 HDF_LOGE("%{public}s, failed, invalid attr!", __func__);
103 return HDF_ERR_INVALID_PARAM;
104 }
105
106 int32_t count = iface->GetElemNum(node, attr->attrName);
107 if (count < 0 || count >= attr->length) {
108 HDF_LOGE("%{public}s, %{public}s table size: %{public}d incorrect or exceed max size %{public}d!",
109 __func__, attr->attrName, count, attr->length - 1);
110 return HDF_FAILURE;
111 }
112
113 if (count > 0) {
114 iface->GetUint32Array(node, attr->attrName, (uint32_t *)attr->array, count, 0);
115 }
116 attr->array[count] = attr->endValue;
117
118 return HDF_SUCCESS;
119 }
120
GetMaskedConfig(const struct DeviceResourceIface * iface,const struct DeviceResourceNode * node,const char * attrName,uint32_t * mask)121 static int32_t GetMaskedConfig(const struct DeviceResourceIface *iface,
122 const struct DeviceResourceNode *node, const char *attrName, uint32_t *mask)
123 {
124 if (iface == NULL || node == NULL || attrName == NULL || mask == NULL) {
125 HDF_LOGE("%{public}s, failed, invalid param!", __func__);
126 return HDF_ERR_INVALID_PARAM;
127 }
128
129 uint32_t *values = NULL;
130 int32_t count = iface->GetElemNum(node, attrName);
131
132 *mask = 0;
133 if (count < 0 || count > MASK_NUM_LIMIT) {
134 HDF_LOGE("%{public}s, failed, %{public}s count %{public}d incorrect!", __func__, attrName, count);
135 return HDF_FAILURE;
136 } else if (count == 0) {
137 // mask is not set, do not need to read
138 return HDF_SUCCESS;
139 }
140
141 values = (uint32_t *)OsalMemAlloc(sizeof(uint32_t) * count);
142 if (values == NULL) {
143 HDF_LOGE("%{public}s, failed to allocate mem for %{public}s!", __func__, attrName);
144 return HDF_FAILURE;
145 }
146 iface->GetUint32Array(node, attrName, values, count, 0);
147 for (int32_t index = 0; index < count; index++) {
148 *mask |= values[index];
149 }
150 OsalMemFree(values);
151
152 return HDF_SUCCESS;
153 }
154
GetBufferConfig(const struct DeviceResourceIface * iface,const struct DeviceResourceNode * childNode,CodecCapability * cap)155 static int32_t GetBufferConfig(const struct DeviceResourceIface *iface,
156 const struct DeviceResourceNode *childNode, CodecCapability *cap)
157 {
158 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MIN_INPUT_BUFFER_NUM, (uint32_t*)&cap->inputBufferNum.min, 0)
159 != HDF_SUCCESS) {
160 cap->mime = MEDIA_MIMETYPE_INVALID;
161 HDF_LOGE("%{public}s, %{public}s:min%{public}s not config.",
162 __func__, childNode->name, CODEC_CONFIG_KEY_MIN_INPUT_BUFFER_NUM);
163 return HDF_FAILURE;
164 }
165 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MAX_INPUT_BUFFER_NUM, (uint32_t*)&cap->inputBufferNum.max, 0)
166 != HDF_SUCCESS) {
167 cap->mime = MEDIA_MIMETYPE_INVALID;
168 HDF_LOGE("%{public}s, %{public}s:max%{public}s not config.",
169 __func__, childNode->name, CODEC_CONFIG_KEY_MAX_INPUT_BUFFER_NUM);
170 return HDF_FAILURE;
171 }
172 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MIN_OUTPUT_BUFFER_NUM, (uint32_t*)&cap->outputBufferNum.min, 0)
173 != HDF_SUCCESS) {
174 cap->mime = MEDIA_MIMETYPE_INVALID;
175 HDF_LOGE("%{public}s, %{public}s:min%{public}s not config.",
176 __func__, childNode->name, CODEC_CONFIG_KEY_MIN_OUTPUT_BUFFER_NUM);
177 return HDF_FAILURE;
178 }
179 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MAX_OUTPUT_BUFFER_NUM, (uint32_t*)&cap->outputBufferNum.max, 0)
180 != HDF_SUCCESS) {
181 cap->mime = MEDIA_MIMETYPE_INVALID;
182 HDF_LOGE("%{public}s, %{public}s:max%{public}s not config.",
183 __func__, childNode->name, CODEC_CONFIG_KEY_MAX_OUTPUT_BUFFER_NUM);
184 return HDF_FAILURE;
185 }
186 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_INPUT_BUFFER_SIZE, (uint32_t*)&cap->inputBufferSize, 0)
187 != HDF_SUCCESS) {
188 cap->mime = MEDIA_MIMETYPE_INVALID;
189 HDF_LOGE("%{public}s, %{public}s:%{public}s not config.",
190 __func__, childNode->name, CODEC_CONFIG_KEY_INPUT_BUFFER_SIZE);
191 return HDF_FAILURE;
192 }
193 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_OUTPUT_BUFFER_SIZE, (uint32_t*)&cap->outputBufferSize, 0)
194 != HDF_SUCCESS) {
195 cap->mime = MEDIA_MIMETYPE_INVALID;
196 HDF_LOGE("%{public}s, %{public}s:%{public}s not config.",
197 __func__, childNode->name, CODEC_CONFIG_KEY_OUTPUT_BUFFER_SIZE);
198 return HDF_FAILURE;
199 }
200 return HDF_SUCCESS;
201 }
202
GetBitRateConfig(const struct DeviceResourceIface * iface,const struct DeviceResourceNode * childNode,CodecCapability * cap)203 static int32_t GetBitRateConfig(const struct DeviceResourceIface *iface,
204 const struct DeviceResourceNode *childNode, CodecCapability *cap)
205 {
206 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MIN_BITRATE, (uint32_t*)&cap->bitRate.min, 0)
207 != HDF_SUCCESS) {
208 cap->mime = MEDIA_MIMETYPE_INVALID;
209 HDF_LOGE("%{public}s, %{public}s:min%{public}s not config.",
210 __func__, childNode->name, CODEC_CONFIG_KEY_MIN_BITRATE);
211 return HDF_FAILURE;
212 }
213 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MAX_BITRATE, (uint32_t*)&cap->bitRate.max, 0)
214 != HDF_SUCCESS) {
215 cap->mime = MEDIA_MIMETYPE_INVALID;
216 HDF_LOGE("%{public}s, %{public}s:max%{public}s not config.",
217 __func__, childNode->name, CODEC_CONFIG_KEY_MAX_BITRATE);
218 return HDF_FAILURE;
219 }
220 return HDF_SUCCESS;
221 }
222
GetAudioOfCapability(const struct DeviceResourceIface * iface,const struct DeviceResourceNode * childNode,CodecCapability * cap)223 static int32_t GetAudioOfCapability(const struct DeviceResourceIface *iface,
224 const struct DeviceResourceNode *childNode, CodecCapability *cap)
225 {
226 ConfigUintArrayNodeAttr sampleFormatsAttr = {CODEC_CONFIG_KEY_SAMPLE_FORMATS, cap->port.audio.sampleFormats,
227 SAMPLE_FORMAT_NUM, 0};
228 if (GetUintTableConfig(iface, childNode, &sampleFormatsAttr) != HDF_SUCCESS) {
229 HDF_LOGE("%{public}s, failed to get %{public}s for: %{public}s!",
230 __func__, CODEC_CONFIG_KEY_SAMPLE_FORMATS, childNode->name);
231 return HDF_FAILURE;
232 }
233
234 ConfigUintArrayNodeAttr sampleRateAttr = {CODEC_CONFIG_KEY_SAMPLE_RATE, cap->port.audio.sampleRate,
235 SAMPLE_RATE_NUM, 0};
236 if (GetUintTableConfig(iface, childNode, &sampleRateAttr) != HDF_SUCCESS) {
237 HDF_LOGE("%{public}s, failed to get %{public}s for: %{public}s!",
238 __func__, CODEC_CONFIG_KEY_SAMPLE_RATE, childNode->name);
239 return HDF_FAILURE;
240 }
241
242 ConfigUintArrayNodeAttr channelLayoutsAttr = {CODEC_CONFIG_KEY_CHANNEL_LAYOUTS, cap->port.audio.channelLayouts,
243 CHANNEL_NUM, 0};
244 if (GetUintTableConfig(iface, childNode, &channelLayoutsAttr) != HDF_SUCCESS) {
245 HDF_LOGE("%{public}s, failed to get %{public}s for: %{public}s!",
246 __func__, CODEC_CONFIG_KEY_CHANNEL_LAYOUTS, childNode->name);
247 return HDF_FAILURE;
248 }
249 return HDF_SUCCESS;
250 }
251
GetVideoOfCapability(const struct DeviceResourceIface * iface,const struct DeviceResourceNode * childNode,CodecCapability * cap)252 static int32_t GetVideoOfCapability(const struct DeviceResourceIface *iface,
253 const struct DeviceResourceNode *childNode, CodecCapability *cap)
254 {
255 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MIN_WIDTH, (uint32_t*)&cap->port.video.minSize.width, 0)
256 != HDF_SUCCESS) {
257 cap->mime = MEDIA_MIMETYPE_INVALID;
258 HDF_LOGE("%{public}s, failed to get %{public}s for: %{public}s! Discarded",
259 __func__, CODEC_CONFIG_KEY_MIN_WIDTH, childNode->name);
260 return HDF_FAILURE;
261 }
262 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MIN_HEIGHT, (uint32_t*)&cap->port.video.minSize.height, 0)
263 != HDF_SUCCESS) {
264 cap->mime = MEDIA_MIMETYPE_INVALID;
265 HDF_LOGE("%{public}s, failed to get %{public}s for: %{public}s! Discarded",
266 __func__, CODEC_CONFIG_KEY_MIN_HEIGHT, childNode->name);
267 return HDF_FAILURE;
268 }
269 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MAX_WIDTH, (uint32_t*)&cap->port.video.maxSize.width, 0)
270 != HDF_SUCCESS) {
271 cap->mime = MEDIA_MIMETYPE_INVALID;
272 HDF_LOGE("%{public}s, failed to get %{public}s for: %{public}s! Discarded",
273 __func__, CODEC_CONFIG_KEY_MAX_WIDTH, childNode->name);
274 return HDF_FAILURE;
275 }
276 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_MAX_HEIGHT, (uint32_t*)&cap->port.video.maxSize.height, 0)
277 != HDF_SUCCESS) {
278 cap->mime = MEDIA_MIMETYPE_INVALID;
279 HDF_LOGE("%{public}s, failed to get %{public}s for: %{public}s! Discarded",
280 __func__, CODEC_CONFIG_KEY_MAX_HEIGHT, childNode->name);
281 return HDF_FAILURE;
282 }
283 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_WIDTH_ALIGNMENT,
284 (uint32_t*)&cap->port.video.whAlignment.widthAlignment, 0) != HDF_SUCCESS) {
285 cap->mime = MEDIA_MIMETYPE_INVALID;
286 HDF_LOGE("%{public}s, failed to get %{public}s for: %{public}s! Discarded",
287 __func__, CODEC_CONFIG_KEY_WIDTH_ALIGNMENT, childNode->name);
288 return HDF_FAILURE;
289 }
290 if (iface->GetUint32(childNode, CODEC_CONFIG_KEY_HEIGHT_ALIGNMENT,
291 (uint32_t*)&cap->port.video.whAlignment.heightAlignment, 0) != HDF_SUCCESS) {
292 cap->mime = MEDIA_MIMETYPE_INVALID;
293 HDF_LOGE("%{public}s, failed to get %{public}s for: %{public}s! Discarded",
294 __func__, CODEC_CONFIG_KEY_HEIGHT_ALIGNMENT, childNode->name);
295 return HDF_FAILURE;
296 }
297 ConfigUintArrayNodeAttr attr = {CODEC_CONFIG_KEY_SUPPORT_PIXELF_MTS, cap->port.video.supportPixFmts,
298 PIX_FMT_NUM, INVALID_PROFILE};
299 if (GetUintTableConfig(iface, childNode, &attr) != HDF_SUCCESS) {
300 return HDF_FAILURE;
301 }
302 return HDF_SUCCESS;
303 }
GetOneCapability(const struct DeviceResourceIface * iface,const struct DeviceResourceNode * childNode,CodecCapability * cap,bool isVideoGroup)304 static int32_t GetOneCapability(const struct DeviceResourceIface *iface,
305 const struct DeviceResourceNode *childNode, CodecCapability *cap, bool isVideoGroup)
306 {
307 if (iface == NULL || childNode == NULL || cap == NULL) {
308 HDF_LOGE("%{public}s, failed, invalid param!", __func__);
309 return HDF_FAILURE;
310 }
311 if (GetCapabilityBase(iface, childNode, cap) != HDF_SUCCESS) {
312 return HDF_FAILURE;
313 }
314 ConfigUintArrayNodeAttr attr = {CODEC_CONFIG_KEY_SUPPORT_PROFILES,
315 cap->supportProfiles, PROFILE_NUM, INVALID_PROFILE};
316 if (GetUintTableConfig(iface, childNode, &attr) != HDF_SUCCESS) {
317 return HDF_FAILURE;
318 }
319 cap->isSoftwareCodec = iface->GetBool(childNode, CODEC_CONFIG_KEY_IS_SOFTWARE_CODEC);
320 if (GetMaskedConfig(iface, childNode, CODEC_CONFIG_KEY_PROCESS_MODE_MASK,
321 (uint32_t *)&cap->processModeMask) != HDF_SUCCESS) {
322 return HDF_FAILURE;
323 }
324 if (GetMaskedConfig(iface, childNode, CODEC_CONFIG_KEY_CAPS_MASK, &cap->capsMask) != HDF_SUCCESS) {
325 return HDF_FAILURE;
326 }
327 if (GetMaskedConfig(iface, childNode, CODEC_CONFIG_KEY_ALLOCATE_MASK, &cap->allocateMask) != HDF_SUCCESS) {
328 return HDF_FAILURE;
329 }
330 if (GetBufferConfig(iface, childNode, cap) != HDF_SUCCESS) {
331 return HDF_FAILURE;
332 }
333 if (GetBitRateConfig(iface, childNode, cap) != HDF_SUCCESS) {
334 return HDF_FAILURE;
335 }
336 if (isVideoGroup) {
337 if (GetVideoOfCapability(iface, childNode, cap) != HDF_SUCCESS) {
338 return HDF_FAILURE;
339 }
340 } else {
341 if (GetAudioOfCapability(iface, childNode, cap) != HDF_SUCCESS) {
342 return HDF_FAILURE;
343 }
344 }
345 return HDF_SUCCESS;
346 }
347
GetGroupCapabilities(const struct DeviceResourceNode * node,const char * nodeName,CodecCapablityGroup * capsGroup)348 static int32_t GetGroupCapabilities(const struct DeviceResourceNode *node,
349 const char *nodeName, CodecCapablityGroup *capsGroup)
350 {
351 int32_t index = 0;
352 bool isVideoGroup = true;
353 const struct DeviceResourceNode *codecGroupNode = NULL;
354 struct DeviceResourceNode *childNode = NULL;
355 struct DeviceResourceIface *iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);
356
357 if (iface == NULL || node == NULL || nodeName == NULL) {
358 HDF_LOGE("%{public}s, failed for node %{public}s, variable NULL!", __func__, nodeName);
359 return HDF_FAILURE;
360 }
361
362 codecGroupNode = iface->GetChildNode(node, nodeName);
363 if (codecGroupNode == NULL) {
364 HDF_LOGE("%{public}s, failed to get child node: %{public}s!", __func__, nodeName);
365 return HDF_FAILURE;
366 }
367 if (strstr(nodeName, "Video") == NULL) {
368 isVideoGroup = false;
369 }
370 DEV_RES_NODE_FOR_EACH_CHILD_NODE(codecGroupNode, childNode) {
371 if (index >= capsGroup->num) {
372 HDF_LOGE("%{public}s, failed to get child node: %{public}s, index error!", __func__, nodeName);
373 return HDF_FAILURE;
374 }
375 GetOneCapability(iface, childNode, &(capsGroup->capablitis[index++]), isVideoGroup);
376 }
377 return HDF_SUCCESS;
378 }
379
LoadCodecCapabilityFromHcs(const struct DeviceResourceNode * node)380 int32_t LoadCodecCapabilityFromHcs(const struct DeviceResourceNode *node)
381 {
382 CodecCapablityGroup *codecCapGroup = NULL;
383 int32_t index;
384 int32_t codecNum = 0;
385
386 if (node == NULL) {
387 HDF_LOGE("%{public}s, load capability failed, node is null!", __func__);
388 return HDF_FAILURE;
389 }
390 g_resourceNode = node;
391
392 char *codecGroupsNodeName[] = {
393 NODE_VIDEO_HARDWARE_ENCODERS, NODE_VIDEO_HARDWARE_DECODERS,
394 NODE_VIDEO_SOFTWARE_ENCODERS, NODE_VIDEO_SOFTWARE_DECODERS,
395 NODE_AUDIO_HARDWARE_ENCODERS, NODE_AUDIO_HARDWARE_DECODERS,
396 NODE_AUDIO_SOFTWARE_ENCODERS, NODE_AUDIO_SOFTWARE_DECODERS
397 };
398 for (index = 0; index < CODEC_CAPABLITY_GROUP_NUM; index++) {
399 codecCapGroup = GetCapablityGroup(index);
400 if (codecCapGroup == NULL) {
401 continue;
402 }
403 if (GetGroupCapabilitiesNumber(node, codecGroupsNodeName[index], &codecNum) == HDF_SUCCESS) {
404 codecCapGroup->num = codecNum;
405 if (codecNum <= 0) {
406 codecCapGroup->capablitis = NULL;
407 continue;
408 }
409 size_t capablitisSize = sizeof(CodecCapability) * codecNum;
410 codecCapGroup->capablitis = (CodecCapability *)OsalMemAlloc(capablitisSize);
411 if (codecCapGroup->capablitis == NULL) {
412 codecCapGroup->num = 0;
413 HDF_LOGE("%{public}s, MemAlloc for capability group failed!", __func__);
414 return HDF_FAILURE;
415 }
416 int32_t ret = memset_s(codecCapGroup->capablitis, capablitisSize, 0, capablitisSize);
417 if (ret != EOK) {
418 codecCapGroup->num = 0;
419 OsalMemFree(codecCapGroup->capablitis);
420 HDF_LOGE("%{public}s, memset_s for capability group failed!", __func__);
421 return HDF_FAILURE;
422 }
423 } else {
424 codecCapGroup->num = 0;
425 }
426 }
427 for (index = 0; index < CODEC_CAPABLITY_GROUP_NUM; index++) {
428 if (GetGroupCapabilities(node, codecGroupsNodeName[index], GetCapablityGroup(index)) != HDF_SUCCESS) {
429 return HDF_FAILURE;
430 }
431 }
432
433 g_codecCapabilites.inited = true;
434 return HDF_SUCCESS;
435 }
436
ClearCapabilityGroup()437 int32_t ClearCapabilityGroup()
438 {
439 int32_t index;
440 CodecCapablityGroup *codecCapGroup = NULL;
441 for (index = 0; index < CODEC_CAPABLITY_GROUP_NUM; index++) {
442 codecCapGroup = GetCapablityGroup(index);
443 if (codecCapGroup == NULL) {
444 continue;
445 }
446 if (codecCapGroup->capablitis != NULL) {
447 OsalMemFree(codecCapGroup->capablitis);
448 codecCapGroup->num = 0;
449 codecCapGroup->capablitis = NULL;
450 }
451 }
452 g_codecCapabilites.inited = false;
453 return HDF_SUCCESS;
454 }
455
GetCapablityGroup(int32_t groupIndex)456 CodecCapablityGroup *GetCapablityGroup(int32_t groupIndex)
457 {
458 CodecCapablityGroup *codecCapGroups[] = {
459 &(g_codecCapabilites.videoHwEncoderGroup), &(g_codecCapabilites.videoHwDecoderGroup),
460 &(g_codecCapabilites.videoSwEncoderGroup), &(g_codecCapabilites.videoSwDecoderGroup),
461 &(g_codecCapabilites.audioHwEncoderGroup), &(g_codecCapabilites.audioHwDecoderGroup),
462 &(g_codecCapabilites.audioSwEncoderGroup), &(g_codecCapabilites.audioSwDecoderGroup)
463 };
464 if (groupIndex < 0) {
465 return NULL;
466 }
467 if (groupIndex >= CODEC_CAPABLITY_GROUP_NUM) {
468 return NULL;
469 }
470 return codecCapGroups[groupIndex];
471 }
472
CodecCapablitesInited()473 bool CodecCapablitesInited()
474 {
475 return g_codecCapabilites.inited;
476 }
477
ReloadCapabilities()478 int32_t ReloadCapabilities()
479 {
480 ClearCapabilityGroup();
481 LoadCodecCapabilityFromHcs(g_resourceNode);
482 return HDF_SUCCESS;
483 }