• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 Huawei Device 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 "image_receiver_mdk_kits.h"
17 #include "image_receiver_napi_listener.h"
18 #include "image_napi.h"
19 
20 #include <map>
21 
22 namespace OHOS {
23 namespace Media {
24 using ImageReceiverNapiEnvFunc = int32_t (*)(napi_env env, struct ImageReceiverArgs* args);
25 using ImageReceiverNapiCtxFunc = int32_t (*)(ImageReceiverNapi* native, struct ImageReceiverArgs* args);
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
GetNativeReceiver(ImageReceiverNapi * napi)29 static ImageReceiver* GetNativeReceiver(ImageReceiverNapi* napi)
30 {
31     if (napi == nullptr) {
32         return nullptr;
33     }
34     return napi->GetNative();
35 }
36 
CheckAndGetReceiver(ImageReceiverNapi * native,const struct ImageReceiverArgs * args)37 static ImageReceiver* CheckAndGetReceiver(ImageReceiverNapi* native, const struct ImageReceiverArgs* args)
38 {
39     if (args == nullptr) {
40         return nullptr;
41     }
42     return GetNativeReceiver(native);
43 }
44 
ImageReceiverNapiCreate(napi_env env,struct ImageReceiverArgs * args)45 static int32_t ImageReceiverNapiCreate(napi_env env, struct ImageReceiverArgs* args)
46 {
47     if (args == nullptr) {
48         return IMAGE_RESULT_JNI_ENV_ABNORMAL;
49     }
50 
51     ImageReceiverCreateArgs createArgs;
52     createArgs.width = args->inNum0;
53     createArgs.height = args->inNum1;
54     createArgs.format = args->inNum2;
55     createArgs.capicity = args->inNum3;
56     *(args->outValue) = ImageReceiverNapi::CreateImageReceiverJsObject(env, createArgs);
57     if (*(args->outValue) == nullptr) {
58         return IMAGE_RESULT_BAD_PARAMETER;
59     }
60     return IMAGE_RESULT_SUCCESS;
61 }
62 
ImageReceiverNapiGetReceiverId(ImageReceiverNapi * native,struct ImageReceiverArgs * args)63 static int32_t ImageReceiverNapiGetReceiverId(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
64 {
65     auto receiver = CheckAndGetReceiver(native, args);
66     if (receiver == nullptr || receiver->iraContext_ == nullptr || args->id == nullptr) {
67         return IMAGE_RESULT_BAD_PARAMETER;
68     }
69     auto sId = receiver->iraContext_->GetReceiverKey();
70     if (sId.empty() || sId.c_str() == nullptr || args->inLen < sId.size()) {
71         return IMAGE_RESULT_BAD_PARAMETER;
72     }
73     memcpy_s(args->id, args->inLen, sId.c_str(), sId.size());
74     return IMAGE_RESULT_SUCCESS;
75 }
76 
ImageReceiverNapiReadLatestImage(ImageReceiverNapi * native,struct ImageReceiverArgs * args)77 static int32_t ImageReceiverNapiReadLatestImage(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
78 {
79     auto receiver = CheckAndGetReceiver(native, args);
80     if (receiver == nullptr || args->inEnv == nullptr) {
81         return IMAGE_RESULT_JNI_ENV_ABNORMAL;
82     }
83     auto image = receiver->LastNativeImage();
84     if (image == nullptr) {
85         return IMAGE_RESULT_BAD_PARAMETER;
86     }
87     *(args->outValue) = ImageNapi::Create(args->inEnv, image);
88     return IMAGE_RESULT_SUCCESS;
89 }
90 
ImageReceiverNapiReadNextImage(ImageReceiverNapi * native,struct ImageReceiverArgs * args)91 static int32_t ImageReceiverNapiReadNextImage(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
92 {
93     auto receiver = CheckAndGetReceiver(native, args);
94     if (receiver == nullptr || args->inEnv == nullptr) {
95         return IMAGE_RESULT_JNI_ENV_ABNORMAL;
96     }
97     auto image = receiver->NextNativeImage();
98     if (image == nullptr) {
99         return IMAGE_RESULT_BAD_PARAMETER;
100     }
101     *(args->outValue) = ImageNapi::Create(args->inEnv, image);
102     return IMAGE_RESULT_SUCCESS;
103 }
104 
ImageReceiverNapiOn(ImageReceiverNapi * native,struct ImageReceiverArgs * args)105 static int32_t ImageReceiverNapiOn(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
106 {
107     auto receiver = CheckAndGetReceiver(native, args);
108     if (receiver == nullptr || args->callback == nullptr) {
109         return IMAGE_RESULT_JNI_ENV_ABNORMAL;
110     }
111     std::shared_ptr<ImageReceiverNapiListener> listener = std::make_shared<ImageReceiverNapiListener>();
112     listener->callBack = args->callback;
113     receiver->RegisterBufferAvaliableListener(listener);
114     return IMAGE_RESULT_SUCCESS;
115 }
116 
ImageReceiverNapiGetSize(ImageReceiverNapi * native,struct ImageReceiverArgs * args)117 static int32_t ImageReceiverNapiGetSize(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
118 {
119     auto receiver = CheckAndGetReceiver(native, args);
120     if (receiver == nullptr || receiver->iraContext_ == nullptr || args->outSize == nullptr) {
121         return IMAGE_RESULT_JNI_ENV_ABNORMAL;
122     }
123     args->outSize->width = receiver->iraContext_->GetWidth();
124     args->outSize->height = receiver->iraContext_->GetHeight();
125     return IMAGE_RESULT_SUCCESS;
126 }
127 
ImageReceiverNapiGetCapacity(ImageReceiverNapi * native,struct ImageReceiverArgs * args)128 static int32_t ImageReceiverNapiGetCapacity(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
129 {
130     auto receiver = CheckAndGetReceiver(native, args);
131     if (receiver == nullptr || receiver->iraContext_ == nullptr) {
132         return IMAGE_RESULT_JNI_ENV_ABNORMAL;
133     }
134     *(args->outNum0) = receiver->iraContext_->GetCapicity();
135     return IMAGE_RESULT_SUCCESS;
136 }
137 
ImageReceiverNapiGetFormat(ImageReceiverNapi * native,struct ImageReceiverArgs * args)138 static int32_t ImageReceiverNapiGetFormat(ImageReceiverNapi* native, struct ImageReceiverArgs* args)
139 {
140     auto receiver = CheckAndGetReceiver(native, args);
141     if (receiver == nullptr || receiver->iraContext_ == nullptr) {
142         return IMAGE_RESULT_JNI_ENV_ABNORMAL;
143     }
144     *(args->outNum0) = receiver->iraContext_->GetFormat();
145     return IMAGE_RESULT_SUCCESS;
146 }
147 static const std::map<int32_t, ImageReceiverNapiEnvFunc> g_EnvFunctions = {
148     {ENV_FUNC_IMAGE_RECEIVER_CREATE, ImageReceiverNapiCreate},
149 };
150 static const std::map<int32_t, ImageReceiverNapiCtxFunc> g_CtxFunctions = {
151     {CTX_FUNC_IMAGE_RECEIVER_GET_RECEIVER_ID, ImageReceiverNapiGetReceiverId},
152     {CTX_FUNC_IMAGE_RECEIVER_READ_LATEST_IMAGE, ImageReceiverNapiReadLatestImage},
153     {CTX_FUNC_IMAGE_RECEIVER_READ_NEXT_IMAGE, ImageReceiverNapiReadNextImage},
154     {CTX_FUNC_IMAGE_RECEIVER_ON, ImageReceiverNapiOn},
155     {CTX_FUNC_IMAGE_RECEIVER_GET_SIZE, ImageReceiverNapiGetSize},
156     {CTX_FUNC_IMAGE_RECEIVER_GET_CAPACITY, ImageReceiverNapiGetCapacity},
157     {CTX_FUNC_IMAGE_RECEIVER_GET_FORMAT, ImageReceiverNapiGetFormat},
158 };
159 
160 MIDK_EXPORT
ImageReceiverNativeEnvCall(int32_t mode,napi_env env,struct ImageReceiverArgs * args)161 int32_t ImageReceiverNativeEnvCall(int32_t mode, napi_env env, struct ImageReceiverArgs* args)
162 {
163     auto funcSearch = g_EnvFunctions.find(mode);
164     if (funcSearch == g_EnvFunctions.end()) {
165         return IMAGE_RESULT_BAD_PARAMETER;
166     }
167     return funcSearch->second(env, args);
168 }
169 
170 MIDK_EXPORT
ImageReceiverNativeCtxCall(int32_t mode,ImageReceiverNapi * native,struct ImageReceiverArgs * args)171 int32_t ImageReceiverNativeCtxCall(int32_t mode, ImageReceiverNapi* native, struct ImageReceiverArgs* args)
172 {
173     auto funcSearch = g_CtxFunctions.find(mode);
174     if (funcSearch == g_CtxFunctions.end()) {
175         return IMAGE_RESULT_BAD_PARAMETER;
176     }
177     return funcSearch->second(native, args);
178 }
179 
180 MIDK_EXPORT
ImageReceiver_Unwrap(napi_env env,napi_value value)181 ImageReceiverNapi* ImageReceiver_Unwrap(napi_env env, napi_value value)
182 {
183     napi_valuetype valueType;
184     napi_typeof(env, value, &valueType);
185     if (valueType != napi_object) {
186         return nullptr;
187     }
188     std::unique_ptr<ImageReceiverNapi> receiverNapi = nullptr;
189     napi_status status = napi_unwrap(env, value, reinterpret_cast<void**>(&receiverNapi));
190     if ((status == napi_ok) && receiverNapi != nullptr) {
191         return receiverNapi.release();
192     }
193     return nullptr;
194 }
195 #ifdef __cplusplus
196 };
197 #endif
198 }  // namespace Media
199 }  // namespace OHOS
200