1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2022-2023 Shenzhen Kaihong DID Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "codec_component_capability_config.h"
17094332d3Sopenharmony_ci#include "codec_log_wrapper.h"
18094332d3Sopenharmony_ci
19094332d3Sopenharmony_cistatic CodecCapablites g_codecCapabilites = {0};
20094332d3Sopenharmony_cistatic const struct DeviceResourceNode *g_resourceNode = NULL;
21094332d3Sopenharmony_ci
22094332d3Sopenharmony_ciint32_t InitDataNode(const struct DeviceResourceNode *node)
23094332d3Sopenharmony_ci{
24094332d3Sopenharmony_ci    if (node == NULL) {
25094332d3Sopenharmony_ci        CODEC_LOGE("data node is null!");
26094332d3Sopenharmony_ci        return HDF_FAILURE;
27094332d3Sopenharmony_ci    }
28094332d3Sopenharmony_ci    g_resourceNode = node;
29094332d3Sopenharmony_ci    return HDF_SUCCESS;
30094332d3Sopenharmony_ci}
31094332d3Sopenharmony_ci
32094332d3Sopenharmony_ciint32_t ClearCapabilityData()
33094332d3Sopenharmony_ci{
34094332d3Sopenharmony_ci    return ClearCapabilityGroup(&g_codecCapabilites);
35094332d3Sopenharmony_ci}
36094332d3Sopenharmony_ci
37094332d3Sopenharmony_ciint32_t LoadCapabilityData()
38094332d3Sopenharmony_ci{
39094332d3Sopenharmony_ci    return LoadCodecCapabilityFromHcs(g_resourceNode, &g_codecCapabilites);
40094332d3Sopenharmony_ci}
41094332d3Sopenharmony_ci
42094332d3Sopenharmony_ciint32_t GetComponentNum(int32_t *num)
43094332d3Sopenharmony_ci{
44094332d3Sopenharmony_ci    if (!g_codecCapabilites.inited) {
45094332d3Sopenharmony_ci        CODEC_LOGE("g_codecCapabilites not init!");
46094332d3Sopenharmony_ci        return HDF_FAILURE;
47094332d3Sopenharmony_ci    }
48094332d3Sopenharmony_ci    *num = g_codecCapabilites.total;
49094332d3Sopenharmony_ci    return HDF_SUCCESS;
50094332d3Sopenharmony_ci}
51094332d3Sopenharmony_ci
52094332d3Sopenharmony_ciint32_t GetComponentCapabilityList(CodecCompCapability *capList, int32_t count)
53094332d3Sopenharmony_ci{
54094332d3Sopenharmony_ci    if (!g_codecCapabilites.inited) {
55094332d3Sopenharmony_ci        CODEC_LOGE("g_codecCapabilites not init!");
56094332d3Sopenharmony_ci        return HDF_FAILURE;
57094332d3Sopenharmony_ci    }
58094332d3Sopenharmony_ci    if (count != g_codecCapabilites.total) {
59094332d3Sopenharmony_ci        CODEC_LOGE("The length does not match!");
60094332d3Sopenharmony_ci        return HDF_FAILURE;
61094332d3Sopenharmony_ci    }
62094332d3Sopenharmony_ci    int32_t groupIndex;
63094332d3Sopenharmony_ci    int32_t capIndex;
64094332d3Sopenharmony_ci    int32_t curCount = 0;
65094332d3Sopenharmony_ci    CodecCapablityGroup *group = NULL;
66094332d3Sopenharmony_ci    CodecCompCapability *cap = NULL;
67094332d3Sopenharmony_ci    CodecCapablityGroup *codeCapGroups[] = {
68094332d3Sopenharmony_ci        &(g_codecCapabilites.videoHwEncoderGroup), &(g_codecCapabilites.videoHwDecoderGroup),
69094332d3Sopenharmony_ci        &(g_codecCapabilites.audioHwEncoderGroup), &(g_codecCapabilites.audioHwDecoderGroup),
70094332d3Sopenharmony_ci        &(g_codecCapabilites.videoSwEncoderGroup), &(g_codecCapabilites.videoSwDecoderGroup),
71094332d3Sopenharmony_ci        &(g_codecCapabilites.audioSwEncoderGroup), &(g_codecCapabilites.audioSwDecoderGroup)};
72094332d3Sopenharmony_ci
73094332d3Sopenharmony_ci    for (groupIndex = 0; groupIndex < CODEC_CAPABLITY_GROUP_NUM; groupIndex++) {
74094332d3Sopenharmony_ci        group = codeCapGroups[groupIndex];
75094332d3Sopenharmony_ci        if (group == NULL) {
76094332d3Sopenharmony_ci            continue;
77094332d3Sopenharmony_ci        }
78094332d3Sopenharmony_ci        for (capIndex = 0; (capIndex < group->num) && (count > 0); capIndex++) {
79094332d3Sopenharmony_ci            cap = &group->capablitis[capIndex];
80094332d3Sopenharmony_ci            capList[curCount++] = *cap;
81094332d3Sopenharmony_ci        }
82094332d3Sopenharmony_ci    }
83094332d3Sopenharmony_ci    return HDF_SUCCESS;
84094332d3Sopenharmony_ci}
85