• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }