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#include "codec_component_manager_stub.h" 16094332d3Sopenharmony_ci#include <dlfcn.h> 17094332d3Sopenharmony_ci#include <hdf_device_desc.h> 18094332d3Sopenharmony_ci#include <hdf_device_object.h> 19094332d3Sopenharmony_ci#include <osal_mem.h> 20094332d3Sopenharmony_ci#include <securec.h> 21094332d3Sopenharmony_ci#include "codec_component_capability_config.h" 22094332d3Sopenharmony_ci#include "codec_component_manager_service.h" 23094332d3Sopenharmony_ci#include "codec_util.h" 24094332d3Sopenharmony_ci#include "codec_log_wrapper.h" 25094332d3Sopenharmony_ci 26094332d3Sopenharmony_ci#define CODEC_SERVICE_IMPL "libcodec_hdi_omx_service_impl" 27094332d3Sopenharmony_citypedef void (*SERVICE_CONSTRUCT_FUNC)(struct OmxComponentManager *); 28094332d3Sopenharmony_cistatic int32_t SerStubGetComponentNum(struct CodecComponentManager *serviceImpl, struct HdfSBuf *data, 29094332d3Sopenharmony_ci struct HdfSBuf *reply) 30094332d3Sopenharmony_ci{ 31094332d3Sopenharmony_ci if (serviceImpl == NULL) { 32094332d3Sopenharmony_ci CODEC_LOGE("invalid paramter"); 33094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 34094332d3Sopenharmony_ci } 35094332d3Sopenharmony_ci int32_t num = serviceImpl->GetComponentNum(); 36094332d3Sopenharmony_ci if (!HdfSbufWriteInt32(reply, num)) { 37094332d3Sopenharmony_ci CODEC_LOGE("write num failed!"); 38094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 39094332d3Sopenharmony_ci } 40094332d3Sopenharmony_ci return HDF_SUCCESS; 41094332d3Sopenharmony_ci} 42094332d3Sopenharmony_ci 43094332d3Sopenharmony_cistatic int32_t SerStubGetComponentCapablityList(struct CodecComponentManager *serviceImpl, struct HdfSBuf *data, 44094332d3Sopenharmony_ci struct HdfSBuf *reply) 45094332d3Sopenharmony_ci{ 46094332d3Sopenharmony_ci if (serviceImpl == NULL) { 47094332d3Sopenharmony_ci CODEC_LOGE("invalid paramter"); 48094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 49094332d3Sopenharmony_ci } 50094332d3Sopenharmony_ci int32_t count = 0; 51094332d3Sopenharmony_ci int32_t err = HDF_SUCCESS; 52094332d3Sopenharmony_ci CodecCompCapability *caps = NULL; 53094332d3Sopenharmony_ci if (!HdfSbufReadInt32(data, &count) || (count <= 0)) { 54094332d3Sopenharmony_ci CODEC_LOGE("read count failed!"); 55094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 56094332d3Sopenharmony_ci } 57094332d3Sopenharmony_ci if (count > serviceImpl->GetComponentNum()) { 58094332d3Sopenharmony_ci CODEC_LOGE("count exceed compomentNum"); 59094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 60094332d3Sopenharmony_ci } 61094332d3Sopenharmony_ci caps = (CodecCompCapability *)OsalMemCalloc(sizeof(CodecCompCapability) * (count)); 62094332d3Sopenharmony_ci if (caps == NULL) { 63094332d3Sopenharmony_ci CODEC_LOGE("alloc caps failed!"); 64094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 65094332d3Sopenharmony_ci } 66094332d3Sopenharmony_ci err = serviceImpl->GetComponentCapabilityList(caps, count); 67094332d3Sopenharmony_ci if (err != HDF_SUCCESS) { 68094332d3Sopenharmony_ci OsalMemFree(caps); 69094332d3Sopenharmony_ci CODEC_LOGE("call GetComponentCapabilityList function failed!"); 70094332d3Sopenharmony_ci return err; 71094332d3Sopenharmony_ci } 72094332d3Sopenharmony_ci 73094332d3Sopenharmony_ci for (int32_t i = 0; i < count; i++) { 74094332d3Sopenharmony_ci if (!CodecCompCapabilityBlockMarshalling(reply, &caps[i])) { 75094332d3Sopenharmony_ci CODEC_LOGE("call CodecCompCapabilityBlockMarshalling function failed!"); 76094332d3Sopenharmony_ci err = HDF_ERR_INVALID_PARAM; 77094332d3Sopenharmony_ci break; 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci } 80094332d3Sopenharmony_ci OsalMemFree(caps); 81094332d3Sopenharmony_ci return err; 82094332d3Sopenharmony_ci} 83094332d3Sopenharmony_ci 84094332d3Sopenharmony_cistatic int32_t ReadParamsForCreateComponent(struct HdfSBuf *data, char **compName, int64_t *appData, 85094332d3Sopenharmony_ci struct CodecCallbackType **callback) 86094332d3Sopenharmony_ci{ 87094332d3Sopenharmony_ci const char *compNameCp = HdfSbufReadString(data); 88094332d3Sopenharmony_ci if (compNameCp == NULL) { 89094332d3Sopenharmony_ci CODEC_LOGE("read compNameCp failed!"); 90094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 91094332d3Sopenharmony_ci } 92094332d3Sopenharmony_ci 93094332d3Sopenharmony_ci if (!HdfSbufReadInt64(data, appData)) { 94094332d3Sopenharmony_ci CODEC_LOGE("read appData failed!"); 95094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 96094332d3Sopenharmony_ci } 97094332d3Sopenharmony_ci *compName = strdup(compNameCp); 98094332d3Sopenharmony_ci 99094332d3Sopenharmony_ci struct HdfRemoteService *callbackRemote = HdfSbufReadRemoteService(data); 100094332d3Sopenharmony_ci if (callbackRemote == NULL) { 101094332d3Sopenharmony_ci CODEC_LOGE("read callbackRemote failed!"); 102094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 103094332d3Sopenharmony_ci } 104094332d3Sopenharmony_ci *callback = CodecCallbackTypeGet(callbackRemote); 105094332d3Sopenharmony_ci 106094332d3Sopenharmony_ci return HDF_SUCCESS; 107094332d3Sopenharmony_ci} 108094332d3Sopenharmony_ci 109094332d3Sopenharmony_cistatic int32_t SerStubCreateComponent(struct CodecComponentManager *serviceImpl, struct HdfSBuf *data, 110094332d3Sopenharmony_ci struct HdfSBuf *reply) 111094332d3Sopenharmony_ci{ 112094332d3Sopenharmony_ci if (serviceImpl == NULL) { 113094332d3Sopenharmony_ci CODEC_LOGE("invalid paramter"); 114094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 115094332d3Sopenharmony_ci } 116094332d3Sopenharmony_ci int32_t ret = HDF_SUCCESS; 117094332d3Sopenharmony_ci struct CodecComponentType *component = NULL; 118094332d3Sopenharmony_ci uint32_t componentId = 0; 119094332d3Sopenharmony_ci int64_t appData = 0; 120094332d3Sopenharmony_ci struct CodecCallbackType *callback = NULL; 121094332d3Sopenharmony_ci char *compName = NULL; 122094332d3Sopenharmony_ci 123094332d3Sopenharmony_ci ret = ReadParamsForCreateComponent(data, &compName, &appData, &callback); 124094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 125094332d3Sopenharmony_ci if (compName != NULL) { 126094332d3Sopenharmony_ci OsalMemFree(compName); 127094332d3Sopenharmony_ci compName = NULL; 128094332d3Sopenharmony_ci } 129094332d3Sopenharmony_ci return ret; 130094332d3Sopenharmony_ci } 131094332d3Sopenharmony_ci ret = serviceImpl->CreateComponent(&component, &componentId, compName, appData, callback); 132094332d3Sopenharmony_ci if (component == NULL) { 133094332d3Sopenharmony_ci CODEC_LOGE("fail to create component"); 134094332d3Sopenharmony_ci if (compName != NULL) { 135094332d3Sopenharmony_ci OsalMemFree(compName); 136094332d3Sopenharmony_ci compName = NULL; 137094332d3Sopenharmony_ci } 138094332d3Sopenharmony_ci return ret; 139094332d3Sopenharmony_ci } 140094332d3Sopenharmony_ci if (compName != NULL) { 141094332d3Sopenharmony_ci OsalMemFree(compName); 142094332d3Sopenharmony_ci compName = NULL; 143094332d3Sopenharmony_ci } 144094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 145094332d3Sopenharmony_ci CODEC_LOGE("call CreateComponent function failed!"); 146094332d3Sopenharmony_ci return ret; 147094332d3Sopenharmony_ci } 148094332d3Sopenharmony_ci 149094332d3Sopenharmony_ci if (HdfSbufWriteRemoteService(reply, component->AsObject(component)) != 0) { 150094332d3Sopenharmony_ci CODEC_LOGE("write component failed!"); 151094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 152094332d3Sopenharmony_ci } 153094332d3Sopenharmony_ci if (!HdfSbufWriteUint32(reply, componentId)) { 154094332d3Sopenharmony_ci CODEC_LOGE("write componentId failed!"); 155094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 156094332d3Sopenharmony_ci } 157094332d3Sopenharmony_ci#ifdef CONFIG_USE_JEMALLOC_DFX_INTF 158094332d3Sopenharmony_ci ReleaseCodecCache(); 159094332d3Sopenharmony_ci#endif 160094332d3Sopenharmony_ci return ret; 161094332d3Sopenharmony_ci} 162094332d3Sopenharmony_ci 163094332d3Sopenharmony_cistatic int32_t SerStubDestroyComponent(struct CodecComponentManager *serviceImpl, struct HdfSBuf *data, 164094332d3Sopenharmony_ci struct HdfSBuf *reply) 165094332d3Sopenharmony_ci{ 166094332d3Sopenharmony_ci if (serviceImpl == NULL) { 167094332d3Sopenharmony_ci CODEC_LOGE("invalid paramter"); 168094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 169094332d3Sopenharmony_ci } 170094332d3Sopenharmony_ci uint32_t componentId = 0; 171094332d3Sopenharmony_ci if (!HdfSbufReadUint32(data, &componentId)) { 172094332d3Sopenharmony_ci CODEC_LOGE("read componentId failed!"); 173094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 174094332d3Sopenharmony_ci } 175094332d3Sopenharmony_ci int32_t ret = serviceImpl->DestroyComponent(componentId); 176094332d3Sopenharmony_ci if (ret != HDF_SUCCESS) { 177094332d3Sopenharmony_ci CODEC_LOGE("call DestroyComponent function failed!"); 178094332d3Sopenharmony_ci } 179094332d3Sopenharmony_ci#ifdef CONFIG_USE_JEMALLOC_DFX_INTF 180094332d3Sopenharmony_ci ReleaseCodecCache(); 181094332d3Sopenharmony_ci#endif 182094332d3Sopenharmony_ci return ret; 183094332d3Sopenharmony_ci} 184094332d3Sopenharmony_ci 185094332d3Sopenharmony_cistatic int32_t CodecComponentManagerServiceOnRemoteRequest(struct CodecComponentManager *serviceImpl, int32_t cmdId, 186094332d3Sopenharmony_ci struct HdfSBuf *data, struct HdfSBuf *reply) 187094332d3Sopenharmony_ci{ 188094332d3Sopenharmony_ci switch (cmdId) { 189094332d3Sopenharmony_ci case CMD_CODEC_GET_COMPONENT_NUM: 190094332d3Sopenharmony_ci return SerStubGetComponentNum(serviceImpl, data, reply); 191094332d3Sopenharmony_ci case CMD_CODEC_GET_COMPONENT_CAPABILITY_LIST: 192094332d3Sopenharmony_ci return SerStubGetComponentCapablityList(serviceImpl, data, reply); 193094332d3Sopenharmony_ci case CMD_CREATE_COMPONENT: 194094332d3Sopenharmony_ci return SerStubCreateComponent(serviceImpl, data, reply); 195094332d3Sopenharmony_ci case CMD_DESTROY_COMPONENT: 196094332d3Sopenharmony_ci return SerStubDestroyComponent(serviceImpl, data, reply); 197094332d3Sopenharmony_ci default: 198094332d3Sopenharmony_ci CODEC_LOGE("not support cmd %{public}d", cmdId); 199094332d3Sopenharmony_ci return HDF_ERR_INVALID_PARAM; 200094332d3Sopenharmony_ci } 201094332d3Sopenharmony_ci} 202094332d3Sopenharmony_ci 203094332d3Sopenharmony_cistatic struct HdfRemoteService *CodecComponentManagerStubAsObject(struct CodecComponentManager *self) 204094332d3Sopenharmony_ci{ 205094332d3Sopenharmony_ci return NULL; 206094332d3Sopenharmony_ci} 207094332d3Sopenharmony_ci 208094332d3Sopenharmony_cibool CodecComponentManagerStubConstruct(struct CodecComponentManagerStub *stub) 209094332d3Sopenharmony_ci{ 210094332d3Sopenharmony_ci if (stub == NULL) { 211094332d3Sopenharmony_ci CODEC_LOGE("stub is null!"); 212094332d3Sopenharmony_ci return false; 213094332d3Sopenharmony_ci } 214094332d3Sopenharmony_ci 215094332d3Sopenharmony_ci stub->OnRemoteRequest = CodecComponentManagerServiceOnRemoteRequest; 216094332d3Sopenharmony_ci stub->interface.AsObject = CodecComponentManagerStubAsObject; 217094332d3Sopenharmony_ci return true; 218094332d3Sopenharmony_ci}