1 /*
2 * Copyright (c) 2025 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 #include <dlfcn.h>
16 #include <unistd.h>
17 #include <regex>
18 #include "ipc_skeleton.h"
19 #include "bundle_mgr_interface.h"
20 #include "system_ability_definition.h"
21 #include "camera_fwk_metadata_utils.h"
22 #include "camera_log.h"
23 #include "rotate_plugin/camera_rotate_plugin.h"
24 #include "camera_util.h"
25 #include "surface.h"
26 #include "hcapture_session.h"
27 #include "parameters.h"
28
29 namespace OHOS {
30 namespace CameraStandard {
31 #if (defined(__aarch64__) || defined(__x86_64__))
32 const std::string CAMERA_PLUGIN_SO_PATH = "/system/lib64/libcompatible_policy_camera.z.so";
33 #else
34 const std::string CAMERA_PLUGIN_SO_PATH = "/system/lib/libcompatible_policy_camera.z.so";
35 #endif
36 using UpdateParameterFunc = bool(*)(ParameterMap&, ParameterMap&);
37 bool CameraRotatePlugin::initResult = false;
38 sptr<CameraRotatePlugin> CameraRotatePlugin::cameraRotatePlugin_;
39 std::mutex CameraRotatePlugin::instanceMutex_;
GetInstance()40 sptr<CameraRotatePlugin> &CameraRotatePlugin::GetInstance()
41 {
42 if (cameraRotatePlugin_ == nullptr) {
43 std::unique_lock<std::mutex> lock(instanceMutex_);
44 if (cameraRotatePlugin_ == nullptr) {
45 MEDIA_INFO_LOG("Initializing CameraRotatePlugin instance");
46 cameraRotatePlugin_ = new CameraRotatePlugin();
47 initResult = cameraRotatePlugin_->Init();
48 }
49 }
50 CHECK_PRINT_ELOG(!initResult, "CameraRotatePlugin::GetInstance init first failed");
51 CHECK_EXECUTE(!initResult, initResult = cameraRotatePlugin_->Init());
52 CHECK_PRINT_ELOG(!initResult, "CameraRotatePlugin::GetInstance init second failed");
53 return CameraRotatePlugin::cameraRotatePlugin_;
54 }
55
CameraRotatePlugin()56 CameraRotatePlugin::CameraRotatePlugin()
57 {
58 MEDIA_INFO_LOG("CameraRotatePlugin construct");
59 }
60
~CameraRotatePlugin()61 CameraRotatePlugin::~CameraRotatePlugin()
62 {
63 if (handle_) {
64 dlclose(handle_);
65 handle_ = nullptr;
66 }
67 }
68
69
SetCaptureSession(const std::string & bundleName,wptr<HCaptureSession> hcaptureSession)70 void CameraRotatePlugin::SetCaptureSession(const std::string& bundleName, wptr<HCaptureSession> hcaptureSession)
71 {
72 captureSessionMap_.EnsureInsert(bundleName, hcaptureSession);
73 }
74
HookCameraAbility(const std::string & cameraId,std::shared_ptr<OHOS::Camera::CameraMetadata> & inability)75 bool CameraRotatePlugin::HookCameraAbility(const std::string& cameraId,
76 std::shared_ptr<OHOS::Camera::CameraMetadata>& inability)
77 {
78 if (inability == nullptr) {
79 return false;
80 }
81 ParameterMap param;
82 int uid = IPCSkeleton::GetCallingUid();
83 InitParam(GetClientBundle(uid), inability, cameraId, param);
84
85 camera_metadata_item_t item;
86 int32_t ret = OHOS::Camera::FindCameraMetadataItem(inability->get(), OHOS_ABILITY_CAMERA_POSITION, &item);
87 if (ret == CAM_META_SUCCESS) {
88 param[PLUGIN_CAMERA_POSITION] = to_string(item.data.u8[0]);
89 } else {
90 return false;
91 }
92 ret = OHOS::Camera::FindCameraMetadataItem(inability->get(), OHOS_SENSOR_ORIENTATION, &item);
93 if (ret == CAM_META_SUCCESS) {
94 param[PLUGIN_SENSOR_ORIENTATION] = to_string(item.data.i32[0]);
95 } else {
96 return false;
97 }
98 uint8_t cameraPosition = 0;
99 int32_t sensorOrientation = 0;
100 if (GetCameraAbility(param, cameraPosition, sensorOrientation)) {
101 std::shared_ptr<OHOS::Camera::CameraMetadata> outputCapability =
102 CameraFwkMetadataUtils::CopyMetadata(inability);
103 outputCapability->updateEntry(OHOS_ABILITY_CAMERA_POSITION, &cameraPosition, 1);
104 outputCapability->updateEntry(OHOS_SENSOR_ORIENTATION, &sensorOrientation, 1);
105 inability = outputCapability;
106 return true;
107 }
108 return false;
109 }
110
HookOpenDeviceForRotate(const std::string & bundleName,std::shared_ptr<OHOS::Camera::CameraMetadata> inputCapability,const std::string & cameraId)111 bool CameraRotatePlugin::HookOpenDeviceForRotate(const std::string& bundleName,
112 std::shared_ptr<OHOS::Camera::CameraMetadata> inputCapability, const std::string& cameraId)
113 {
114 ParameterMap param;
115 InitParam(bundleName, inputCapability, cameraId, param);
116 return SubscribeUpdateSettingCallback(param);
117 }
118
HookCloseDeviceForRotate(const std::string & bundleName,std::shared_ptr<OHOS::Camera::CameraMetadata> inputCapability,const std::string & cameraId)119 bool CameraRotatePlugin::HookCloseDeviceForRotate(const std::string& bundleName,
120 std::shared_ptr<OHOS::Camera::CameraMetadata> inputCapability, const std::string& cameraId)
121 {
122 ParameterMap param;
123 InitParam(bundleName, inputCapability, cameraId, param);
124 return UnSubscribeUpdateSettingCallback(param);
125 }
126
HookCreatePreviewFormat(const std::string & bundleName,int32_t & format)127 bool CameraRotatePlugin::HookCreatePreviewFormat(const std::string& bundleName, int32_t& format)
128 {
129 ParameterMap param = {
130 {PLUGIN_BUNDLE_NAME, bundleName},
131 {PLUGIN_PREVIEW_FORMAT, to_string(format)}
132 };
133 return CreatePreviewOutput(param, format);
134 }
135
HookCreateVideoOutput(ParameterMap basicInfoMap,const sptr<OHOS::IBufferProducer> & producer)136 bool CameraRotatePlugin::HookCreateVideoOutput(ParameterMap basicInfoMap, const sptr<OHOS::IBufferProducer>& producer)
137 {
138 if (producer == nullptr) {
139 return false;
140 }
141 std::string surfaceAppFwkType = "";
142 uint32_t transform = 0;
143 if (CreateVideoOutput(basicInfoMap, surfaceAppFwkType, transform)) {
144 producer->SetTransform(static_cast<OHOS::GraphicTransformType>(transform));
145 producer->SetSurfaceAppFrameworkType(surfaceAppFwkType);
146 return true;
147 }
148 return false;
149 }
150
HookPreviewStreamStart(ParameterMap basicInfoMap,const sptr<OHOS::IBufferProducer> & producer,int32_t & rotateAngle)151 bool CameraRotatePlugin::HookPreviewStreamStart(ParameterMap basicInfoMap,
152 const sptr<OHOS::IBufferProducer>& producer, int32_t& rotateAngle)
153 {
154 if (producer == nullptr) {
155 return false;
156 }
157 MEDIA_DEBUG_LOG("CameraRotatePlugin::HookPreviewStreamStart enter");
158 int32_t frameGravity = -1;
159 int32_t fixedRotation = -1;
160 if (PreviewStreamStart(basicInfoMap, frameGravity, fixedRotation, rotateAngle)) {
161 MEDIA_DEBUG_LOG("CameraRotatePlugin::HookPreviewStreamStart %{public}d %{public}d",
162 frameGravity, fixedRotation);
163 producer->SetFrameGravity(frameGravity);
164 producer->SetFixedRotation(fixedRotation);
165 return true;
166 }
167 return false;
168 }
169
HookPreviewTransform(ParameterMap basicInfoMap,const sptr<OHOS::IBufferProducer> & producer,int32_t & sensorOrientation,int32_t & cameraPosition)170 bool CameraRotatePlugin::HookPreviewTransform(ParameterMap basicInfoMap,
171 const sptr<OHOS::IBufferProducer>& producer,
172 int32_t& sensorOrientation, int32_t& cameraPosition)
173 {
174 if (producer == nullptr) {
175 return false;
176 }
177 int32_t frameGravity = -1;
178 int32_t fixedRotation = -1;
179 if (PreviewTransform(basicInfoMap, frameGravity, fixedRotation, sensorOrientation, cameraPosition)) {
180 MEDIA_DEBUG_LOG("CameraRotatePlugin::HookPreviewTransform frameGravity: %{public}d, fixedRotation: %{public}d, "
181 "sensorOrientation: %{public}d, cameraPosition: %{public}d",
182 frameGravity, fixedRotation, sensorOrientation, cameraPosition);
183 producer->SetFrameGravity(frameGravity);
184 producer->SetFixedRotation(fixedRotation);
185 return true;
186 }
187 return false;
188 }
189
HookVideoStreamStart(ParameterMap basicInfoMap,const sptr<OHOS::IBufferProducer> & producer,bool & mirror)190 bool CameraRotatePlugin::HookVideoStreamStart(ParameterMap basicInfoMap,
191 const sptr<OHOS::IBufferProducer>& producer, bool& mirror)
192 {
193 if (producer == nullptr) {
194 return false;
195 }
196
197 std::string surfaceAppFwkType = "";
198 uint32_t transform = 0;
199 if (VideoStreamStart(basicInfoMap, surfaceAppFwkType, transform, mirror)) {
200 producer->SetTransform(static_cast<OHOS::GraphicTransformType>(transform));
201 producer->SetSurfaceAppFrameworkType(surfaceAppFwkType);
202 return true;
203 }
204 return false;
205 }
206
HookCaptureStreamStart(ParameterMap basicInfoMap,int32_t & jpegOrientation,bool & mirror)207 bool CameraRotatePlugin::HookCaptureStreamStart(ParameterMap basicInfoMap, int32_t& jpegOrientation, bool& mirror)
208 {
209 return CaptureStreamStart(basicInfoMap, jpegOrientation, mirror);
210 }
211
GetFunction(const std::string & functionName)212 void* CameraRotatePlugin::GetFunction(const std::string& functionName)
213 {
214 CHECK_RETURN_RET_DLOG(
215 handle_ == nullptr, nullptr, "CameraRotatePlugin::GetFunction fail not loaded");
216 void* funcInstance = nullptr;
217 if (functionMap_.Find(functionName, funcInstance)) {
218 return funcInstance;
219 }
220 void* handleFunc = dlsym(handle_, functionName.c_str());
221 CHECK_RETURN_RET_DLOG(
222 handleFunc == nullptr, nullptr, "CameraRotatePlugin::GetFunction fail function:%{public}s not find",
223 functionName.c_str());
224 MEDIA_INFO_LOG("CameraRotatePlugin::GetFunction %{public}s success", functionName.c_str());
225 functionMap_.EnsureInsert(functionName, handleFunc);
226 return handleFunc;
227 }
228
GetParameterResult(ParameterMap basicInfoMap,const std::string & functionName,ParameterMap & parameterMap)229 bool CameraRotatePlugin::GetParameterResult(ParameterMap basicInfoMap, const std::string& functionName,
230 ParameterMap& parameterMap)
231 {
232 UpdateParameterFunc updateParameterFunc = (UpdateParameterFunc)GetFunction(functionName);
233 CHECK_RETURN_RET_DLOG(updateParameterFunc == nullptr, false,
234 "function %{public}s is failed", functionName.c_str());
235 bool result = updateParameterFunc(basicInfoMap, parameterMap);
236 CHECK_RETURN_RET_DLOG(!result, false, "function %{public}s is failed", functionName.c_str());
237 return true;
238 }
239
InitParam(const std::string & bundleName,std::shared_ptr<OHOS::Camera::CameraMetadata> inputCapability,const std::string & cameraId,ParameterMap & param)240 void CameraRotatePlugin::InitParam(const std::string& bundleName,
241 std::shared_ptr<OHOS::Camera::CameraMetadata> inputCapability, const std::string& cameraId, ParameterMap& param)
242 {
243 if (inputCapability == nullptr) {
244 return;
245 }
246 camera_metadata_item_t item;
247 int32_t ret = OHOS::Camera::FindCameraMetadataItem(inputCapability->get(),
248 OHOS_ABILITY_CAMERA_CONNECTION_TYPE, &item);
249 int32_t connectionType = 0;
250 if (ret == CAM_META_SUCCESS) {
251 connectionType = static_cast<int32_t>(item.data.u8[0]);
252 }
253 param[PLUGIN_BUNDLE_NAME] = bundleName;
254 param[PLUGIN_CAMERA_ID] = cameraId;
255 param[PLUGIN_CAMERA_CONNECTION_TYPE] = std::to_string(connectionType);
256 }
257
Init()258 bool CameraRotatePlugin::Init()
259 {
260 if (handle_) {
261 ParameterMap updateParameter;
262 return GetParameterResult(updateParameter, "Init", updateParameter);
263 }
264 if (system::GetParameter("const.camera.compatible_policy_camera.enable", "false") != "true" ||
265 access(CAMERA_PLUGIN_SO_PATH.c_str(), R_OK) != 0) {
266 MEDIA_ERR_LOG("so file not exist.");
267 return false;
268 }
269 handle_ = ::dlopen(CAMERA_PLUGIN_SO_PATH.c_str(), RTLD_NOW);
270 if (!handle_) {
271 MEDIA_ERR_LOG("dlopen failed check so file exists");
272 return false;
273 }
274 ParameterMap updateParameter;
275 bool result = GetParameterResult(updateParameter, "Init", updateParameter);
276 return result;
277 }
278
GetCameraAbility(ParameterMap basicInfoMap,uint8_t & cameraPosition,int32_t & sensorOrientation)279 bool CameraRotatePlugin::GetCameraAbility(ParameterMap basicInfoMap,
280 uint8_t& cameraPosition, int32_t& sensorOrientation)
281 {
282 ParameterMap updateParameter;
283 bool result = GetParameterResult(basicInfoMap, "GetCameraAbility", updateParameter);
284 CHECK_RETURN_RET_ELOG((updateParameter.size() < 1 || !result), false, "GetCameraAbility is failed");
285 result = (updateParameter.find(PLUGIN_CAMERA_POSITION) != updateParameter.end()) &&
286 (updateParameter.find(PLUGIN_SENSOR_ORIENTATION) != updateParameter.end());
287 CHECK_RETURN_RET_ELOG(!result, false, "updateParameter result not include needed parameter");
288 result = isIntegerRegex(updateParameter[PLUGIN_CAMERA_POSITION]) &&
289 isIntegerRegex(updateParameter[PLUGIN_SENSOR_ORIENTATION]);
290 CHECK_RETURN_RET_ELOG(!result, false, "updateParameter result not valid number");
291 cameraPosition = std::stoi(updateParameter[PLUGIN_CAMERA_POSITION]);
292 sensorOrientation = std::stoi(updateParameter[PLUGIN_SENSOR_ORIENTATION]);
293 return result;
294 }
295
OnParameterChange(ParameterMap ParameterMap)296 int32_t CameraRotatePlugin::OnParameterChange(ParameterMap ParameterMap)
297 {
298 wptr<HCaptureSession> hcaptureSessionWptr;
299 captureSessionMap_.Find(ParameterMap[PLUGIN_BUNDLE_NAME], hcaptureSessionWptr);
300 sptr<HCaptureSession> hcaptureSessionSptr = hcaptureSessionWptr.promote();
301 CHECK_RETURN_RET_ELOG((hcaptureSessionSptr == nullptr || ParameterMap.size() < 1), CAMERA_INVALID_ARG,
302 "hcaptureSession is null");
303 hcaptureSessionSptr->UpdateHookBasicInfo(ParameterMap);
304 return 0;
305 }
306
307 using OpenCameraDeviceFunc = bool(*)(ParameterMap&, UpdateSettingsCallback, ParameterMap&);
SubscribeUpdateSettingCallback(ParameterMap basicInfoMap)308 bool CameraRotatePlugin::SubscribeUpdateSettingCallback(ParameterMap basicInfoMap)
309 {
310 OpenCameraDeviceFunc openCameraDeviceFunc = (OpenCameraDeviceFunc)GetFunction("SubscribeUpdateSettingCallback");
311 CHECK_RETURN_RET_ELOG(openCameraDeviceFunc == nullptr, false, "SubscribeUpdateSettingCallback is failed");
312 // 定义接口
313 UpdateSettingsCallback callback = std::bind(&CameraRotatePlugin::OnParameterChange, this, std::placeholders::_1);
314 ParameterMap updateParameter;
315 bool result = openCameraDeviceFunc(basicInfoMap, callback, updateParameter);
316 CHECK_RETURN_RET_ELOG(!result, false, "SubscribeUpdateSettingCallback is failed");
317 return true;
318 }
319
UnSubscribeUpdateSettingCallback(ParameterMap basicInfoMap)320 bool CameraRotatePlugin::UnSubscribeUpdateSettingCallback(ParameterMap basicInfoMap)
321 {
322 ParameterMap updateParameter;
323 bool result = GetParameterResult(basicInfoMap, "UnSubscribeUpdateSettingCallback", updateParameter);
324 CHECK_RETURN_RET_ELOG(!result, false, "UnSubscribeUpdateSettingCallback is failed");
325 captureSessionMap_.Erase(basicInfoMap[PLUGIN_BUNDLE_NAME]);
326 return result;
327 }
328
CreatePreviewOutput(ParameterMap basicInfoMap,int32_t & format)329 bool CameraRotatePlugin::CreatePreviewOutput(ParameterMap basicInfoMap, int32_t& format)
330 {
331 ParameterMap updateParameter;
332 bool result = GetParameterResult(basicInfoMap, "CreatePreviewOutput", updateParameter);
333 CHECK_RETURN_RET_ELOG((updateParameter.size() < 1 || !result), false, "CreatePreviewOutput is failed");
334 result = updateParameter.find(PLUGIN_PREVIEW_FORMAT) != updateParameter.end() &&
335 isIntegerRegex(updateParameter[PLUGIN_PREVIEW_FORMAT]);
336 CHECK_RETURN_RET_ELOG(!result, false, "CreatePreviewOutput updateParameter result not valid number");
337 format = std::stoi(updateParameter[PLUGIN_PREVIEW_FORMAT]);
338 return true;
339 }
340
PreviewStreamStart(ParameterMap basicInfoMap,int32_t & frameGravity,int32_t & fixedRotation,int32_t & rotateAngle)341 bool CameraRotatePlugin::PreviewStreamStart(ParameterMap basicInfoMap, int32_t& frameGravity,
342 int32_t& fixedRotation, int32_t& rotateAngle)
343 {
344 ParameterMap updateParameter;
345 bool result = GetParameterResult(basicInfoMap, "PreviewStreamStart", updateParameter);
346 CHECK_RETURN_RET_ELOG((updateParameter.size() < 1 || !result), false, "PreviewStreamStart is failed");
347 result = updateParameter.find(PLUGIN_CAMERA_HAL_ROTATE_ANGLE) != updateParameter.end();
348 CHECK_RETURN_RET_ELOG(!result, false, "PreviewStreamStart result not include needed parameter");
349 CHECK_EXECUTE(updateParameter.find(PLUGIN_SURFACE_FRAME_GRAVITY) != updateParameter.end() &&
350 isIntegerRegex(updateParameter[PLUGIN_SURFACE_FIXED_ROTATION]),
351 frameGravity = std::stoi(updateParameter[PLUGIN_SURFACE_FRAME_GRAVITY]));
352 CHECK_EXECUTE(updateParameter.find(PLUGIN_SURFACE_FIXED_ROTATION) != updateParameter.end() &&
353 isIntegerRegex(updateParameter[PLUGIN_SURFACE_FIXED_ROTATION]),
354 fixedRotation = std::stoi(updateParameter[PLUGIN_SURFACE_FIXED_ROTATION]));
355 rotateAngle = std::stoi(updateParameter[PLUGIN_CAMERA_HAL_ROTATE_ANGLE]);
356 return true;
357 }
358
PreviewTransform(ParameterMap basicInfoMap,int32_t & frameGravity,int32_t & fixedRotation,int32_t & sensorOrientation,int32_t & cameraPosition)359 bool CameraRotatePlugin::PreviewTransform(ParameterMap basicInfoMap, int32_t& frameGravity, int32_t& fixedRotation,
360 int32_t& sensorOrientation, int32_t& cameraPosition)
361 {
362 ParameterMap updateParameter;
363 bool result = GetParameterResult(basicInfoMap, "PreviewTransform", updateParameter);
364 CHECK_RETURN_RET_ELOG((updateParameter.size() < 1 || !result), false, "PreviewTransform is failed");
365 result = (updateParameter.find(PLUGIN_SURFACE_FRAME_GRAVITY) != updateParameter.end()) &&
366 (updateParameter.find(PLUGIN_SURFACE_FIXED_ROTATION) != updateParameter.end()) &&
367 (updateParameter.find(PLUGIN_CAMERA_POSITION) != updateParameter.end()) &&
368 (updateParameter.find(PLUGIN_SENSOR_ORIENTATION) != updateParameter.end());
369 CHECK_RETURN_RET_ELOG(!result, false, "PreviewTransform result not include needed parameter");
370 result = isIntegerRegex(updateParameter[PLUGIN_SURFACE_FRAME_GRAVITY]) &&
371 isIntegerRegex(updateParameter[PLUGIN_SURFACE_FIXED_ROTATION]) &&
372 isIntegerRegex(updateParameter[PLUGIN_CAMERA_POSITION]) &&
373 isIntegerRegex(updateParameter[PLUGIN_SENSOR_ORIENTATION]);
374 frameGravity = std::stoi(updateParameter[PLUGIN_SURFACE_FRAME_GRAVITY]);
375 fixedRotation = std::stoi(updateParameter[PLUGIN_SURFACE_FIXED_ROTATION]);
376 cameraPosition = std::stoi(updateParameter[PLUGIN_CAMERA_POSITION]);
377 sensorOrientation = std::stoi(updateParameter[PLUGIN_SENSOR_ORIENTATION]);
378 return true;
379 }
380
CaptureStreamStart(ParameterMap basicInfoMap,int32_t & jpegOrientation,bool & mirror)381 bool CameraRotatePlugin::CaptureStreamStart(ParameterMap basicInfoMap, int32_t& jpegOrientation, bool& mirror)
382 {
383 ParameterMap updateParameter;
384 basicInfoMap[PLUGIN_JPEG_ORIENTATION] = to_string(jpegOrientation);
385 basicInfoMap[PLUGIN_CAPTURE_MIRROR] = to_string(mirror);
386 bool result = GetParameterResult(basicInfoMap, "CaptureStreamStart", updateParameter);
387 CHECK_RETURN_RET_ELOG((updateParameter.size() < 1 || !result), false, "CaptureStreamStart is failed");
388 result = (updateParameter.find(PLUGIN_CAPTURE_MIRROR) != updateParameter.end()) &&
389 (updateParameter.find(PLUGIN_JPEG_ORIENTATION) != updateParameter.end());
390 CHECK_RETURN_RET_ELOG(!result, false, "CaptureStreamStart result not include needed parameter");
391 result = isIntegerRegex(updateParameter[PLUGIN_JPEG_ORIENTATION]) &&
392 isIntegerRegex(updateParameter[PLUGIN_CAPTURE_MIRROR]);
393 CHECK_RETURN_RET_ELOG(!result, false, "CaptureStreamStart result not valid parameter");
394 result = (std::stoi(updateParameter[PLUGIN_CAPTURE_MIRROR]) == 0 ||
395 std::stoi(updateParameter[PLUGIN_CAPTURE_MIRROR]) == 1);
396 CHECK_RETURN_RET_ELOG(!result, false, "CaptureStreamStart result not valid bool parameter");
397 jpegOrientation = std::stoi(updateParameter[PLUGIN_JPEG_ORIENTATION]);
398 mirror = std::stoi(updateParameter[PLUGIN_CAPTURE_MIRROR]);
399 return true;
400 }
401
CreateVideoOutput(ParameterMap basicInfoMap,std::string & surfaceAppFwkType,uint32_t & transform)402 bool CameraRotatePlugin::CreateVideoOutput(ParameterMap basicInfoMap, std::string& surfaceAppFwkType,
403 uint32_t& transform)
404 {
405 ParameterMap updateParameter;
406 basicInfoMap[PLUGIN_VIDEO_SURFACE_TRANSFORM] = to_string(transform);
407 bool result = GetParameterResult(basicInfoMap, "CreateVideoOutput", updateParameter);
408 CHECK_RETURN_RET_ELOG((updateParameter.size() < 1 || !result), false, "CreateVideoOutput is failed");
409 result = (updateParameter.find(PLUGIN_SURFACE_APP_FWK_TYPE) != updateParameter.end()) &&
410 (updateParameter.find(PLUGIN_VIDEO_SURFACE_TRANSFORM) != updateParameter.end());
411 CHECK_RETURN_RET_ELOG(!result, false, "CreateVideoOutput result not include needed parameter");
412 result = isIntegerRegex(updateParameter[PLUGIN_VIDEO_SURFACE_TRANSFORM]);
413 CHECK_RETURN_RET_ELOG(!result, false, "CreateVideoOutput result not valid parameter");
414 surfaceAppFwkType = updateParameter[PLUGIN_SURFACE_APP_FWK_TYPE];
415 transform = static_cast<uint32_t>(std::stoi(updateParameter[PLUGIN_VIDEO_SURFACE_TRANSFORM]));
416 return true;
417 }
418
VideoStreamStart(ParameterMap basicInfoMap,std::string & surfaceAppFwkType,uint32_t & transform,bool & mirror)419 bool CameraRotatePlugin::VideoStreamStart(ParameterMap basicInfoMap, std::string& surfaceAppFwkType,
420 uint32_t& transform, bool& mirror)
421 {
422 ParameterMap updateParameter;
423 basicInfoMap[PLUGIN_VIDEO_SURFACE_TRANSFORM] = to_string(transform);
424 bool result = GetParameterResult(basicInfoMap, "VideoStreamStart", updateParameter);
425 CHECK_RETURN_RET_ELOG((updateParameter.size() < 1 || !result), false, "VideoStreamStart is failed");
426 result = (updateParameter.find(PLUGIN_SURFACE_APP_FWK_TYPE) != updateParameter.end()) &&
427 (updateParameter.find(PLUGIN_VIDEO_SURFACE_TRANSFORM) != updateParameter.end()) &&
428 (updateParameter.find(PLUGIN_VIDEO_MIRROR) != updateParameter.end());
429 CHECK_RETURN_RET_ELOG(!result, false, "VideoStreamStart result not include needed parameter");
430 result = isIntegerRegex(updateParameter[PLUGIN_VIDEO_SURFACE_TRANSFORM]) &&
431 isIntegerRegex(updateParameter[PLUGIN_VIDEO_MIRROR]);
432 CHECK_RETURN_RET_ELOG(!result, false, "VideoStreamStart result not valid parameter");
433 surfaceAppFwkType = updateParameter[PLUGIN_SURFACE_APP_FWK_TYPE];
434 transform = static_cast<uint32_t>(std::stoi(updateParameter[PLUGIN_VIDEO_SURFACE_TRANSFORM]));
435 mirror = std::stoi(updateParameter[PLUGIN_VIDEO_MIRROR]);
436 return true;
437 }
438 }
439 }
440