From f755442f30ebbb568707aeb760054a9a71f8a4ff Mon Sep 17 00:00:00 2001 From: mamingshuai Date: Thu, 11 Mar 2021 18:43:18 +0800 Subject: [PATCH] update openharmony 1.0.1 --- .gitee/ISSUE_TEMPLATE.zh-CN.md | 13 -- .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md | 15 -- BUILD.gn | 45 ----- README.md | 49 ++++++ README_zh.md | 49 ++++++ ...-blue-box)-in-the-multimedia-subsystem.png | Bin 0 -> 41993 bytes ...体子系统架构(蓝色虚线框是camera_lite).png | Bin 0 -> 54555 bytes frameworks/BUILD.gn | 43 +++++ .../camera_ability.cpp | 2 +- .../camera_config.cpp | 2 +- .../camera_device.cpp | 56 +++++-- camera_device.h => frameworks/camera_device.h | 4 +- camera_impl.cpp => frameworks/camera_impl.cpp | 4 +- camera_impl.h => frameworks/camera_impl.h | 4 +- camera_kit.cpp => frameworks/camera_kit.cpp | 6 +- .../camera_manager.cpp | 7 +- .../camera_manager.h | 4 +- .../camera_service.cpp | 4 +- .../camera_service.h | 4 +- .../camera_service_callback.h | 4 +- .../event_handler.cpp | 4 +- .../frame_config.cpp | 19 ++- interfaces/kits/camera.h | 156 ++++++++++++++++++ interfaces/kits/camera_ability.h | 117 +++++++++++++ interfaces/kits/camera_config.h | 105 ++++++++++++ interfaces/kits/camera_device_callback.h | 77 +++++++++ interfaces/kits/camera_kit.h | 119 +++++++++++++ interfaces/kits/camera_state_callback.h | 93 +++++++++++ interfaces/kits/event_handler.h | 71 ++++++++ interfaces/kits/frame_config.h | 142 ++++++++++++++++ interfaces/kits/frame_state_callback.h | 86 ++++++++++ interfaces/kits/meta_data.h | 99 +++++++++++ readme.md | 3 - 33 files changed, 1292 insertions(+), 114 deletions(-) delete mode 100755 .gitee/ISSUE_TEMPLATE.zh-CN.md delete mode 100755 .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md delete mode 100755 BUILD.gn create mode 100644 README.md create mode 100644 README_zh.md create mode 100644 figures/position-of-this-repository-(in-the-dotted-blue-box)-in-the-multimedia-subsystem.png create mode 100644 figures/媒体子系统架构(蓝色虚线框是camera_lite).png create mode 100644 frameworks/BUILD.gn rename camera_ability.cpp => frameworks/camera_ability.cpp (93%) rename camera_config.cpp => frameworks/camera_config.cpp (94%) rename camera_device.cpp => frameworks/camera_device.cpp (87%) rename camera_device.h => frameworks/camera_device.h (93%) rename camera_impl.cpp => frameworks/camera_impl.cpp (94%) rename camera_impl.h => frameworks/camera_impl.h (91%) rename camera_kit.cpp => frameworks/camera_kit.cpp (88%) rename camera_manager.cpp => frameworks/camera_manager.cpp (94%) rename camera_manager.h => frameworks/camera_manager.h (90%) rename camera_service.cpp => frameworks/camera_service.cpp (92%) rename camera_service.h => frameworks/camera_service.h (89%) rename camera_service_callback.h => frameworks/camera_service_callback.h (89%) rename event_handler.cpp => frameworks/event_handler.cpp (91%) rename frame_config.cpp => frameworks/frame_config.cpp (68%) create mode 100755 interfaces/kits/camera.h create mode 100755 interfaces/kits/camera_ability.h create mode 100755 interfaces/kits/camera_config.h create mode 100755 interfaces/kits/camera_device_callback.h create mode 100755 interfaces/kits/camera_kit.h create mode 100755 interfaces/kits/camera_state_callback.h create mode 100755 interfaces/kits/event_handler.h create mode 100755 interfaces/kits/frame_config.h create mode 100755 interfaces/kits/frame_state_callback.h create mode 100755 interfaces/kits/meta_data.h delete mode 100755 readme.md diff --git a/.gitee/ISSUE_TEMPLATE.zh-CN.md b/.gitee/ISSUE_TEMPLATE.zh-CN.md deleted file mode 100755 index f09d98d..0000000 --- a/.gitee/ISSUE_TEMPLATE.zh-CN.md +++ /dev/null @@ -1,13 +0,0 @@ -### 该问题是怎么引起的? - - - -### 重现步骤 - - - -### 报错信息 - - - - diff --git a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md deleted file mode 100755 index 33948fd..0000000 --- a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md +++ /dev/null @@ -1,15 +0,0 @@ -### 相关的Issue - - -### 原因(目的、解决的问题等) - - -### 描述(做了什么,变更了什么) - - -### 测试用例(新增、改动、可能影响的功能) - - - - - diff --git a/BUILD.gn b/BUILD.gn deleted file mode 100755 index 509c1e5..0000000 --- a/BUILD.gn +++ /dev/null @@ -1,45 +0,0 @@ -import("//build/lite/config/component/lite_component.gni") - -shared_library("camera") { - sources = [ - "camera_ability.cpp", - "camera_config.cpp", - "camera_device.cpp", - "camera_impl.cpp", - "camera_kit.cpp", - "camera_manager.cpp", - "camera_service.cpp", - "event_handler.cpp", - "frame_config.cpp", - ] - cflags = ["-fPIC"] - cflags += ["-Wall"] - cflags_cc = cflags - include_dirs = [ - "//base/security/interfaces/kits/iam_lite", - "//foundation/multimedia/hals/camera_lite", - "//drivers/hdf/lite/hdi/codec/include" - ] - - ldflags = ["-lstdc++"] - ldflags += ["-lcodec"] - ldflags += ["-lhdi_media"] - ldflags += ["-L$ohos_root_path/$root_out_dir"] - public_configs = [":camera_external_library_config"] - deps = [ - "//base/hiviewdfx/frameworks/hilog_lite/featured:hilog_shared", - "//base/security/services/iam_lite/pms_client:pms_client", - "//third_party/bounds_checking_function:libsec_shared", - "$ohos_vendor_adapter_dir/../../hardware:hardware_media_sdk", - "$ohos_vendor_adapter_dir/../../middleware:middleware_source_sdk", - "$ohos_vendor_adapter_dir/hals/multimedia:hdi_media", - ] - public_deps = [ - "//foundation/graphic/lite/frameworks/surface:surface", - ] -} - -config("camera_external_library_config") { - include_dirs = ["//foundation/multimedia/interfaces/kits/camera_lite"] - include_dirs += ["//foundation/multimedia/utils/lite/include"] -} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d15cfde --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# CAMERA\_LITE + +- [Introduction](#section11660541593) +- [Directory Structure](#section56984451495) +- [Usage](#section1648194512427) +- [Constraints](#section161941989596) +- [Repositories Involved](#section105062051111614) + +## Introduction + +This repository provides the camera capability. + +**Figure 1** Position of this repository \(in the dotted blue box\) in the multimedia subsystem +![](figures/position-of-this-repository-(in-the-dotted-blue-box)-in-the-multimedia-subsystem.png "position-of-this-repository-(in-the-dotted-blue-box)-in-the-multimedia-subsystem") + +## Directory Structure + +``` +/foundation/multimedia/camera_lite +├── frameworks # Framework code +└── interfaces # APIs + └── kits # External APIs +``` + +## Usage + +Build a single repository in the root directory. + +``` +# Select the development board. +hb set +# Build this repository. +hb build camera_lite +``` + +## Constraints + +C++ 11 or later + +## Repositories Involved + +/hmf/multimedia/audio\_lite + +/hmf/multimedia/media\_lite + +/hmf/multimedia/utils\_lite + +/hmf/multimedia/service\_lite + diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..a247a4f --- /dev/null +++ b/README_zh.md @@ -0,0 +1,49 @@ +# 媒体子系统CAMERA\_LITE组件 + +- [简介](#section11660541593) +- [目录](#section56984451495) +- [使用说明](#section1648194512427) +- [约束](#section161941989596) +- [相关仓](#section105062051111614) + +## 简介 + +Camera\_Lite组件提供相机能力的支持。 + +**图 1** 媒体子系统架构(蓝色虚线框是camera\_lite) +![](figures/媒体子系统架构(蓝色虚线框是camera_lite).png "媒体子系统架构(蓝色虚线框是camera_lite)") + +## 目录 + +``` +/foundation/multimedia/camera_lite +├── frameworks # 框架代码 +└── interfaces # 接口 + └── kits # 对外接口 +``` + +## 使用说明 + +单仓的编译构建,在根目录下进行整仓的构建和编译 + +``` +# 开发板选择 +hb set +# 单仓构建和编译 +hb build camera_lite +``` + +## 约束 + +C++11版本或以上 + +## 相关仓 + +/hmf/multimedia/audio\_lite + +/hmf/multimedia/media\_lite + +/hmf/multimedia/utils\_lite + +/hmf/multimedia/service\_lite + diff --git a/figures/position-of-this-repository-(in-the-dotted-blue-box)-in-the-multimedia-subsystem.png b/figures/position-of-this-repository-(in-the-dotted-blue-box)-in-the-multimedia-subsystem.png new file mode 100644 index 0000000000000000000000000000000000000000..68f86aeb6d713b965b5cf8c69c87b5b1ff2009f0 GIT binary patch literal 41993 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ℜIp)rT!Nt&Rn+=%3(`lW|Fl4oww4mlL_~MX?}{ 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 Fe*s;Djtl?* literal 0 HcmV?d00001 diff --git a/frameworks/BUILD.gn b/frameworks/BUILD.gn new file mode 100644 index 0000000..9e44287 --- /dev/null +++ b/frameworks/BUILD.gn @@ -0,0 +1,43 @@ +import("//build/lite/config/component/lite_component.gni") + +shared_library("camera_lite") { + sources = [ + "camera_ability.cpp", + "camera_config.cpp", + "camera_device.cpp", + "camera_impl.cpp", + "camera_kit.cpp", + "camera_manager.cpp", + "camera_service.cpp", + "event_handler.cpp", + "frame_config.cpp", + ] + cflags = [ "-fPIC" ] + cflags += [ "-Wall" ] + cflags_cc = cflags + include_dirs = [ + "//base/security/permission/interfaces/kits/permission_lite", + "//drivers/peripheral/codec/interfaces/include", + "//foundation/multimedia/utils/lite/hals", + ] + + ldflags = [ "-lstdc++" ] + ldflags += [ "-lcodec" ] + ldflags += [ "-lhdi_media" ] + ldflags += [ "-L$ohos_root_path/$root_out_dir" ] + public_configs = [ ":camera_external_library_config" ] + deps = [ + "$ohos_vendor_adapter_dir:hardware_media_sdk", + "$ohos_vendor_adapter_dir/../modules/middleware:middleware_source_sdk", + "$ohos_vendor_adapter_dir/multimedia:libhdi_media", + "//base/hiviewdfx/hilog_lite/frameworks/featured:hilog_shared", + "//base/security/permission/services/permission_lite/pms_client:pms_client", + "//third_party/bounds_checking_function:libsec_shared", + ] + public_deps = [ "//foundation/graphic/surface:lite_surface" ] +} + +config("camera_external_library_config") { + include_dirs = [ "//foundation/multimedia/camera_lite/interfaces/kits" ] + include_dirs += [ "//foundation/multimedia/utils/lite/include" ] +} diff --git a/camera_ability.cpp b/frameworks/camera_ability.cpp similarity index 93% rename from camera_ability.cpp rename to frameworks/camera_ability.cpp index c911d8d..72d2296 100755 --- a/camera_ability.cpp +++ b/frameworks/camera_ability.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/camera_config.cpp b/frameworks/camera_config.cpp similarity index 94% rename from camera_config.cpp rename to frameworks/camera_config.cpp index d1dfd7e..a205597 100755 --- a/camera_config.cpp +++ b/frameworks/camera_config.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/camera_device.cpp b/frameworks/camera_device.cpp similarity index 87% rename from camera_device.cpp rename to frameworks/camera_device.cpp index 18f222b..f0a1263 100755 --- a/camera_device.cpp +++ b/frameworks/camera_device.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -15,15 +15,15 @@ #include "camera_device.h" -#include -#include - #include "codec_interface.h" #include "hal_display.h" #include "media_log.h" #include "meta_data.h" #include "securec.h" +#include +#include + using namespace OHOS; using namespace OHOS::Media; using namespace std; @@ -33,10 +33,24 @@ const int32_t KEY_TIME_US = 2; // "timeUs" namespace OHOS { namespace Media { -inline PicSize Convert2CodecSize(CameraPicSize size) +inline PicSize Convert2CodecSize(int32_t width, int32_t height) { - return (PicSize)size; + struct SizeMap { + PicSize res_; + int32_t width_; + int32_t height_; + }; + static SizeMap sizeMap[] = {{Resolution_CIF, 352, 288}, {Resolution_360P, 640, 360}, + {Resolution_D1_PAL, 720, 576}, {Resolution_D1_NTSC, 720, 480}, + {Resolution_720P, 1280, 720}, {Resolution_1080P, 1920, 1080}}; + for (uint32_t i = 0; i < sizeof(sizeMap) / sizeof(SizeMap); i++) { + if (sizeMap[i].width_ == width && sizeMap[i].height_ == height) { + return sizeMap[i].res_; + } + } + return Resolution_INVALID; } + static int32_t SetVencSource(CODEC_HANDLETYPE codecHdl, uint32_t deviceId) { Param param = {.key = KEY_DEVICE_ID, .val = (void *)&deviceId, .size = sizeof(uint32_t)}; @@ -86,7 +100,7 @@ static int32_t param[paramIndex].size = sizeof(Profile); paramIndex++; - PicSize picSize = Convert2CodecSize(attr->size); + PicSize picSize = Convert2CodecSize(attr->width, attr->height); MEDIA_DEBUG_LOG("picSize=%d", picSize); param[paramIndex].key = KEY_VIDEO_PIC_SIZE; param[paramIndex].val = &picSize; @@ -115,7 +129,8 @@ static int32_t return HAL_MEDIA_OK; } -static int32_t CameraCreateJpegEnc(uint32_t srcDev, HalVideoProcessorAttr *attr, CODEC_HANDLETYPE *codecHdl) +static int32_t + CameraCreateJpegEnc(FrameConfig &fc, uint32_t srcDev, HalVideoProcessorAttr *attr, CODEC_HANDLETYPE *codecHdl) { const char *videoEncName = "codec.jpeg.hardware.encoder"; const uint32_t maxParamNum = 5; @@ -134,7 +149,7 @@ static int32_t CameraCreateJpegEnc(uint32_t srcDev, HalVideoProcessorAttr *attr, param[paramIndex].size = sizeof(AvCodecMime); paramIndex++; - PicSize picSize = Convert2CodecSize(attr->size); + PicSize picSize = Convert2CodecSize(attr->width, attr->height); param[paramIndex].key = KEY_VIDEO_PIC_SIZE; param[paramIndex].val = &picSize; param[paramIndex].size = sizeof(PicSize); @@ -145,6 +160,21 @@ static int32_t CameraCreateJpegEnc(uint32_t srcDev, HalVideoProcessorAttr *attr, return HAL_MEDIA_ERR; } + int32_t qfactor = -1; + fc.GetParameter(PARAM_KEY_IMAGE_ENCODE_QFACTOR, qfactor); + if (qfactor != -1) { + MEDIA_DEBUG_LOG("qfactor=%d", qfactor); + Param jpegParam = { + .key = KEY_IMAGE_Q_FACTOR, + .val = &qfactor, + .size = sizeof(qfactor) + }; + ret = CodecSetParameter(*codecHdl, &jpegParam, 1); + if (ret != 0) { + MEDIA_ERR_LOG("CodecSetParameter set jpeg qfactor failed.(ret=%u)", ret); + } + } + ret = SetVencSource(*codecHdl, srcDev); if (ret != 0) { MEDIA_ERR_LOG("Set video encoder source failed."); @@ -172,9 +202,8 @@ static int32_t CopyCodecOutput(void *dst, uint32_t *size, OutputInfo *buffer) static int32_t FindAvailProcessorIdx(Surface &surface, vector &attrs) { - CameraPicSize picSize = HalConvert2StandardSize(surface.GetWidth(), surface.GetHeight()); for (uint32_t i = 0; i < attrs.size(); i++) { - if (attrs[i].size == picSize) { + if (attrs[i].width == surface.GetWidth() && attrs[i].height == surface.GetHeight()) { return i; } } @@ -412,7 +441,7 @@ int32_t CaptureAssistant::SetFrameConfig(FrameConfig &fc, return MEDIA_ERR; } uint32_t deviceId = HalGetProcessorDeviceId(hdls[idx]); - int32_t ret = CameraCreateJpegEnc(deviceId, &attrs[idx], &vencHdl_); + int32_t ret = CameraCreateJpegEnc(fc, deviceId, &attrs[idx], &vencHdl_); if (ret != HAL_MEDIA_OK) { MEDIA_ERR_LOG("Create capture venc failed."); return MEDIA_ERR; @@ -504,7 +533,8 @@ int32_t CameraDevice::Initialize(CameraAbility &ability) for (int i = 0; i < size; i++) { prcessorAttrs_.emplace_back(attrs[i]); prcessorHdls_.emplace_back(hdls[i]); - range.emplace_back(attrs[i].size); + CameraPicSize tmpSize = {.width = attrs[i].width, .height = attrs[i].height}; + range.emplace_back(tmpSize); } ability.SetParameterRange(PARAM_KEY_SIZE, range); diff --git a/camera_device.h b/frameworks/camera_device.h similarity index 93% rename from camera_device.h rename to frameworks/camera_device.h index a64f84b..cfd8bb5 100755 --- a/camera_device.h +++ b/frameworks/camera_device.h @@ -1,10 +1,10 @@ /* - * Copyright(c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http ://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/camera_impl.cpp b/frameworks/camera_impl.cpp similarity index 94% rename from camera_impl.cpp rename to frameworks/camera_impl.cpp index 0d3a953..42971ce 100755 --- a/camera_impl.cpp +++ b/frameworks/camera_impl.cpp @@ -1,10 +1,10 @@ /* - * Copyright(c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http ://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/camera_impl.h b/frameworks/camera_impl.h similarity index 91% rename from camera_impl.h rename to frameworks/camera_impl.h index b5f66c7..9654898 100755 --- a/camera_impl.h +++ b/frameworks/camera_impl.h @@ -1,10 +1,10 @@ /* - * Copyright(c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http ://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/camera_kit.cpp b/frameworks/camera_kit.cpp similarity index 88% rename from camera_kit.cpp rename to frameworks/camera_kit.cpp index 02306b5..250ac2b 100755 --- a/camera_kit.cpp +++ b/frameworks/camera_kit.cpp @@ -1,10 +1,10 @@ /* - * Copyright(c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http ://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -29,7 +29,7 @@ CameraKit::~CameraKit() {} CameraKit *CameraKit::GetInstance() { - if (CheckPermission(0, "ohos.permission.CAMERA") != GRANTED) { + if (CheckSelfPermission("ohos.permission.CAMERA") != GRANTED) { MEDIA_WARNING_LOG("Process can not access camera."); return nullptr; } diff --git a/camera_manager.cpp b/frameworks/camera_manager.cpp similarity index 94% rename from camera_manager.cpp rename to frameworks/camera_manager.cpp index c0c5e82..f046d95 100755 --- a/camera_manager.cpp +++ b/frameworks/camera_manager.cpp @@ -1,10 +1,10 @@ /* - * Copyright(c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http ://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -127,6 +127,7 @@ public: auto p = cameraMapCache_.find(cameraId); if (p == cameraMapCache_.end()) { handler.Post([&callback, &cameraId] { callback.OnCreateFailed(cameraId, MEDIA_ERR); }); + return; } p->second->RegistCb(callback, handler); cameraService_->CreateCamera(cameraId); @@ -155,4 +156,4 @@ CameraManager *CameraManager::GetInstance() return &cameraManagerImpl; } } // namespace Media -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/camera_manager.h b/frameworks/camera_manager.h similarity index 90% rename from camera_manager.h rename to frameworks/camera_manager.h index 223203c..df49f44 100755 --- a/camera_manager.h +++ b/frameworks/camera_manager.h @@ -1,10 +1,10 @@ /* - * Copyright(c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http ://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/camera_service.cpp b/frameworks/camera_service.cpp similarity index 92% rename from camera_service.cpp rename to frameworks/camera_service.cpp index ba72ffc..eeb8d68 100755 --- a/camera_service.cpp +++ b/frameworks/camera_service.cpp @@ -1,10 +1,10 @@ /* - * Copyright(c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http ://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/camera_service.h b/frameworks/camera_service.h similarity index 89% rename from camera_service.h rename to frameworks/camera_service.h index 85c5700..a57fac7 100755 --- a/camera_service.h +++ b/frameworks/camera_service.h @@ -1,10 +1,10 @@ /* - * Copyright(c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http ://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/camera_service_callback.h b/frameworks/camera_service_callback.h similarity index 89% rename from camera_service_callback.h rename to frameworks/camera_service_callback.h index e42b4ad..b8ada0c 100755 --- a/camera_service_callback.h +++ b/frameworks/camera_service_callback.h @@ -1,10 +1,10 @@ /* - * Copyright(c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http ://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/event_handler.cpp b/frameworks/event_handler.cpp similarity index 91% rename from event_handler.cpp rename to frameworks/event_handler.cpp index 0eeb6a2..8483132 100755 --- a/event_handler.cpp +++ b/frameworks/event_handler.cpp @@ -1,10 +1,10 @@ /* - * Copyright(c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http ://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/frame_config.cpp b/frameworks/frame_config.cpp similarity index 68% rename from frame_config.cpp rename to frameworks/frame_config.cpp index a56c2d9..cf17675 100755 --- a/frame_config.cpp +++ b/frameworks/frame_config.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Huawei Device Co., Ltd. + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -39,6 +39,23 @@ void FrameConfig::RemoveSurface(Surface &surface) surfaceList_.remove(&surface); } +void *FrameConfig::GetValue(uint32_t key) +{ + auto p = keyMap_.find(key); + return (p == keyMap_.end()) ? nullptr : (&p->second); +} + +void FrameConfig::SetValue(uint32_t key, const void *value) +{ + switch (key) { + case PARAM_KEY_IMAGE_ENCODE_QFACTOR: + keyMap_[key] = *(static_cast(value)); + break; + default: + break; + } +} + FrameConfig::FrameConfig(int32_t type) : type_(type) {} } // namespace Media } // namespace OHOS \ No newline at end of file diff --git a/interfaces/kits/camera.h b/interfaces/kits/camera.h new file mode 100755 index 0000000..a18db1f --- /dev/null +++ b/interfaces/kits/camera.h @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @addtogroup MultiMedia_Camera + * @{ + * + * @brief Defines the Camera class for camera-related operations. + * + * @since 1.0 + * @version 1.0 + */ + +/** + * @file camera.h + * + * @brief Declares functions in the Camera class to implement camera + * operations. + * + * + * @since 1.0 + * @version 1.0 + */ + +#ifndef OHOS_CAMERA_H +#define OHOS_CAMERA_H + +#include +#include + +#include "camera_config.h" +#include "frame_config.h" + +namespace OHOS { +namespace Media { +/** + * + * @brief Provides functions in the Camera class to implement camera operations. + * operations. + * + * + * @since 1.0 + * @version 1.0 + */ +class Camera { +public: + /** + * @brief A destructor used to delete the Camera instance. + * + */ + virtual ~Camera() = default; + + /** + * @brief Obtains the camera ID. + * + * @return Returns the camera ID if obtained; returns the "Error" string if + * the camera fails to be created. + */ + virtual std::string GetCameraId() + { + return std::string(); + } + + /** + * @brief Obtains the camera configuration. + * You can use the obtained CameraConfig object to configure the + * camera. + * @return Returns the pointer to the CameraConfig object if obtained; + * returns NULL otherwise. + */ + virtual const CameraConfig *GetCameraConfig() const + { + return nullptr; + } + + /** + * @brief Obtains the frame configuration. + * + * @param type Indicates the type of the frame configuration. + * @return Returns the pointer to the FrameConfig object if obtained; + * returns NULL otherwise. + */ + virtual FrameConfig *GetFrameConfig(int32_t type) + { + return nullptr; + } + + /** + * @brief Configures the camera using the CameraConfig object. + * + * @param config Indicates the pointer to the CameraConfig object. + */ + virtual void Configure(CameraConfig &config) {} + + /** + * @brief Triggers looping-frame capture. + * + * @param fc Indicates the frame configuration. + * @return Returns true if the looping-frame capture is successfully + * started; returns false otherwise. + */ + virtual int32_t TriggerLoopingCapture(FrameConfig &frameConfig) + { + return -1; + } + + /** + * @brief Stops looping-frame capture. + * + * @return Returns true if the looping-frame capture is successfully + * stopped; returns false otherwise. + */ + virtual void StopLoopingCapture() {} + + /** + * @brief Starts single-frame capture. The frame parameters are set through + * the FrameConfig object, and the captured image data is stored in the + * surface of the FrameConfig object. + * + * @param fc Indicates the frame configuration. + * @return Returns true if the single-frame capture is successfully + * started and the data is stored; returns false otherwise. + */ + virtual int32_t TriggerSingleCapture(FrameConfig &frameConfig) + { + return -1; + } + + /** + * @brief Releases the Camera object and associated resources. + * + */ + virtual void Release() {} + +protected: + /** + * @brief A constructor used to create a Camera instance. + * + */ + Camera() = default; +}; +} // namespace Media +} // namespace OHOS +#endif // OHOS_CAMERA_H diff --git a/interfaces/kits/camera_ability.h b/interfaces/kits/camera_ability.h new file mode 100755 index 0000000..f64226e --- /dev/null +++ b/interfaces/kits/camera_ability.h @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @addtogroup MultiMedia_CameraAbility + * @{ + * + * @brief Defines the camera capability set for applications to achieve and access the capabilities. + * + * @since 1.0 + * @version 1.0 + */ + +/** + * @file camera_ability.h + * + * @brief Declares functions of the CameraAbility class. + * + * + * @since 1.0 + * @version 1.0 + */ + +#ifndef OHOS_CAMERA_ABILITY_H +#define OHOS_CAMERA_ABILITY_H + +#include "media_log.h" +#include "meta_data.h" + +#include +#include +#include +#include + +namespace OHOS { +namespace Media { +/** + * @brief Declares functions of the CameraAbility class. + * + * + * @since 1.0 + * @version 1.0 + */ +class CameraAbility { +public: + /** + * @brief A constructor used to create a CameraAbility instance. + * + */ + CameraAbility(); + + /** + * @brief A destructor used to delete the CameraAbility instance. + * + */ + virtual ~CameraAbility(); + + /** + * @brief Obtains the supported image sizes for a specified image format. + * + * @param format Indicates the image format, which can be YUV, H.265, or H.264. + * @return Returns the image size list if obtained; returns NULL otherwise. + */ + std::list GetSupportedSizes(int format) const; + + /** + * @brief Sets value ranges for a specified parameter. + * + * @param key Indicates the parameter key. + * @param rangeList Indicates the list of parameter value ranges. + * @return Returns SUCCESS if the setting is successful; returns FAIL otherwise. + */ + template int32_t SetParameterRange(uint32_t key, std::list rangeList) + { + if (IsParameterSupport(key)) { + SetSupportParameterRange(key, rangeList); + return MEDIA_OK; + } + return MEDIA_ERR; + } + + /** + * @brief Obtains the parameter value range based on a specified parameter key. + * + * @param key Indicates the parameter key. + * @return Returns the parameter value range if obtained; returns NULL otherwise. + */ + template std::list GetParameterRange(uint32_t key) const + { + if (supportProperties_.find(key) != supportProperties_.end()) { + return GetSupportParameterRange(key); + } + } + +private: + void SetSupportParameterRange(uint32_t key, std::list &rangeList); + std::list GetSupportParameterRange(uint32_t key) const; + bool IsParameterSupport(uint32_t key) const; + + std::map> SizeMap_; + std::set supportProperties_; +}; +} // namespace Media +} // namespace OHOS +#endif // OHOS_CAMERA_ABILITY_H diff --git a/interfaces/kits/camera_config.h b/interfaces/kits/camera_config.h new file mode 100755 index 0000000..f34f0e8 --- /dev/null +++ b/interfaces/kits/camera_config.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @addtogroup MultiMedia_CameraConfig + * @{ + * + * @brief Defines the CameraConfig class for operations on camera configurations. + * + * @since 1.0 + * @version 1.0 + */ + +/** + * @file camera_config.h + * + * @brief Declares functions in the CameraConfig class. + * + * + * @since 1.0 + * @version 1.0 + */ + +#ifndef OHOS_CAMERA_CONFIG_H +#define OHOS_CAMERA_CONFIG_H + +#include "event_handler.h" +#include "frame_state_callback.h" + +namespace OHOS { +namespace Media { +/** + * + * @brief Provides functions to configure camera parameters. + * + * + * @since 1.0 + * @version 1.0 + */ +class CameraConfig { +public: + /** + * @brief A destructor used to delete the CameraAbility instance. + * + */ + virtual ~CameraConfig() {} + + /** + * @brief Creates the CameraConfig instance of this singleton class to configure + * and read the required parameters. + * + * @return Returns the CameraConfig instance if created; returns NULL otherwise. + */ + static CameraConfig *CreateCameraConfig(); + + /** + * @brief Sets a frame state callback to responds to state changes. + * + * @param callback Indicates the frame state callback. + * @param handler Indicates the event handler. + */ + virtual void SetFrameStateCallback(FrameStateCallback *callback, EventHandler *handler) {} + + /** + * @brief Obtains the EventHandler object. + * + * @return Returns the pointer to the EventHandler object if obtained; returns NULL otherwise. + */ + virtual EventHandler *GetEventHandler() const + { + return nullptr; + } + + /** + * @brief Obtains a FrameStateCallback object. + * + * @return Returns the pointer to the FrameStateCallback object if obtained; returns NULL otherwise. + */ + virtual FrameStateCallback *GetFrameStateCb() const + { + return nullptr; + } + +protected: + /** + * @brief A constructor used to create a CameraConfig instance. + * + */ + CameraConfig() {} +}; +} // namespace Media +} // namespace OHOS +#endif // OHOS_CAMERA_CONFIG_H diff --git a/interfaces/kits/camera_device_callback.h b/interfaces/kits/camera_device_callback.h new file mode 100755 index 0000000..7dd80a0 --- /dev/null +++ b/interfaces/kits/camera_device_callback.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @addtogroup MultiMedia_CameraDeviceCallback + * @{ + * + * @brief Defines the CameraDeviceCallback class to response to device changes. + * + * @since 1.0 + * @version 1.0 + */ + +/** + * @file camera_device_callback.h + * + * @brief Declares functions in the CameraDeviceCallback class to response to device changes. + * + * + * @since 1.0 + * @version 1.0 + */ + +#ifndef OHOS_CAMERA_DEVICE_CALLBACK_H +#define OHOS_CAMERA_DEVICE_CALLBACK_H + +#include + +namespace OHOS { +namespace Media { +constexpr int32_t CAMERA_DEVICE_STATE_AVAILABLE = 0; +constexpr int32_t CAMERA_DEVICE_STATE_UNAVAILABLE = 1; +/** + * + * @brief Provides functions to response to device changes. + * + * + * @since 1.0 + * @version 1.0 + */ +class CameraDeviceCallback { +public: + /** + * @brief A constructor used to create a CameraDeviceCallback instance. + * + */ + CameraDeviceCallback() = default; + + /** + * @brief A destructor used to delete the CameraDeviceCallback instance. + * + */ + virtual ~CameraDeviceCallback() = default; + + /** + * @brief Called when the camera state changes. + * + * @param cameraId Indicates the camera ID. + * @param status Indicates the camera state. + */ + virtual void OnCameraStatus(std::string cameraId, int32_t status) {} +}; +} // namespace Media +} // namespace OHOS +#endif diff --git a/interfaces/kits/camera_kit.h b/interfaces/kits/camera_kit.h new file mode 100755 index 0000000..ce93c80 --- /dev/null +++ b/interfaces/kits/camera_kit.h @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @addtogroup MultiMedia_CameraKit + * @{ + * + * @brief Defines the CameraKit class for using camera functionalities. + * @since 1.0 + * @version 1.0 + */ + +/** + * @file camera_kit.h + * + * @brief Declares functions in the CameraKit class. + * + * + * @since 1.0 + * @version 1.0 + */ + +#ifndef OHOS_CAMERA_KIT_H +#define OHOS_CAMERA_KIT_H + +#include +#include + +#include "camera_ability.h" +#include "camera_device_callback.h" +#include "camera_state_callback.h" +#include "event_handler.h" + +namespace OHOS { +namespace Media { +/** + * + * @brief Provides functions in the CameraKit class. + * + * + * @since 1.0 + * @version 1.0 + */ +class CameraKit { +public: + /** + * @brief A destructor used to delete the CameraKit instance. + * + */ + ~CameraKit(); + /** + * @brief Obtains a single instance of the CameraKit. + * @return Returns the CameraKit instance if obtained; returns NULL otherwise. + */ + static CameraKit *GetInstance(); + + /** + * @brief Obtains IDs of cameras that are currently available. + * + * @return Returns the camera IDs if obtained; returns NULL otherwise. + */ + std::list GetCameraIds(); + + /** + * @brief Obtains the camera capability, including the resolutions and frame rates. + * + * @param cameraId Indicates the camera ID. + * @return Returns the CameraAbility object. + */ + const CameraAbility *GetCameraAbility(std::string cameraId); + + /** + * @brief Registers a camera callback for camera status changes + * and an event callback to respond to a triggered event. + * + * @param callback Indicates the camera callback to register. + * @param handler Indicates the event callback to register. + */ + void RegisterCameraDeviceCallback(CameraDeviceCallback &callback, EventHandler &handler); + + /** + * @brief Unregisters a camera callback. + * + * @param callback Indicates the camera callback to unregister. + */ + void UnregisterCameraDeviceCallback(CameraDeviceCallback &callback); + + /** + * @brief Creates a camera object. + * + * @param cameraId Indicates the camera ID. + * @param callback Indicates the camera callback. + * @param handler Indicates the event callback to register. + */ + void CreateCamera(const std::string &cameraId, CameraStateCallback &callback, EventHandler &handler); + +private: + /** + * @brief A constructor used to create a CameraDeviceCallback instance. + * + */ + CameraKit(); +}; +} // namespace Media +} // namespace OHOS + +#endif // OHOS_CAMERA_KIT_H diff --git a/interfaces/kits/camera_state_callback.h b/interfaces/kits/camera_state_callback.h new file mode 100755 index 0000000..b32fb07 --- /dev/null +++ b/interfaces/kits/camera_state_callback.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** + * @addtogroup MultiMedia_CameraStateCallback + * @{ + * + * @brief Provides callbacks for camera states to configure responses to the states. + * + * @since 1.0 + * @version 1.0 + */ + /** + * @file camera_state_callback.h + * + * @brief Declares functions in the CameraStateCallback class. + * + * @since 1.0 + * @version 1.0 + */ +#ifndef OHOS_CAMERA_STATE_CALLBACK_H +#define OHOS_CAMERA_STATE_CALLBACK_H + +#include +#include "camera.h" + +namespace OHOS { +namespace Media { +/** +* +* @brief Provides functions to response to camera states. +* +* @since 1.0 +* @version 1.0 +*/ +class CameraStateCallback { +public: + /** + * @brief A constructor used to create a CameraStateCallback instance. + * + */ + CameraStateCallback() = default; + /** + * @brief A destructor used to delete the CameraStateCallback instance. + * + */ + virtual ~CameraStateCallback() {} + /** + * @brief Called when the camera is successfully created. + * + * @param c Indicates the Camera object. + */ + virtual void OnCreated(Camera &c) {} + /** + * @brief Called when the camera fails to be created. + * + * @param cameraId Indicates the camera ID. + * @param errorCode Indicates the error code. + */ + virtual void OnCreateFailed(const std::string cameraId, int32_t errorCode) {} + /** + * @brief Called when the camera is released. + * + * @param c Indicates the Camera object. + */ + virtual void OnReleased(Camera &c) {} + /** + * @brief Called when the camera is configured. + * @param c camera Indicates the Camera object. + */ + virtual void OnConfigured(Camera &c) {} + /** + * @brief Called when the camera fails to be configured. + * + * @param c Indicates the Camera object. + * @param errorCode Indicates the error code. + */ + virtual void OnConfigureFailed(const std::string cameraId, int32_t errorCode) {} +}; +} // namespace Media +} // namespace OHOS +#endif // OHOS_CAMERA_STATE_CALLBACK_H diff --git a/interfaces/kits/event_handler.h b/interfaces/kits/event_handler.h new file mode 100755 index 0000000..906bc1c --- /dev/null +++ b/interfaces/kits/event_handler.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_EVENTHANDLER_H +#define OHOS_EVENTHANDLER_H + +#include +#include +#include +#include + +namespace OHOS { +namespace Media { +class EventHandler { +public: + EventHandler(); + virtual ~EventHandler(); + /* After construct the event handler, user should check whether the thread is running before post or + * destroy this handler */ + bool IsRunning(); + + template + void Post(const F &f) + { + auto task = new PostTask(f); + std::unique_lock lock(mtx_); + msgQ_.emplace(task); + cv_.notify_all(); + } + +private: + struct EventObj { + EventObj() = default; + virtual ~EventObj(){}; + virtual void Exec(){}; + }; + + std::queue msgQ_; + std::thread *hdlThrd_; + bool running_; + std::condition_variable cv_; + std::mutex mtx_; + + template + struct PostTask : public EventObj { + PostTask(const F &f) : f_(f) {} + const F f_; + void Exec() override + { + f_(); + } + }; + + static void EventDispatch(EventHandler *hdl); +}; +} // namespace Media +} // namespace OHOS + +#endif // OHOS_EVENTHANDLER_H diff --git a/interfaces/kits/frame_config.h b/interfaces/kits/frame_config.h new file mode 100755 index 0000000..d80a0bf --- /dev/null +++ b/interfaces/kits/frame_config.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @addtogroup MultiMedia_FrameConfig + * @{ + * + * @brief Defines the FrameConfig class for operations related to frame + * configurations. + * + * @since 1.0 + * @version 1.0 + */ + +/** + * @file frame_config.h + * + * @brief Declares APIs of the FrameConfig class. + * + * + * @since 1.0 + * @version 1.0 + */ + +#ifndef OHOS_FRAME_CONFIG_H +#define OHOS_FRAME_CONFIG_H + +#include "meta_data.h" +#include "surface.h" +#include +#include + +namespace OHOS { +namespace Media { +constexpr int32_t FRAME_CONFIG_PREVIEW = 0; +constexpr int32_t FRAME_CONFIG_RECORD = 1; +constexpr int32_t FRAME_CONFIG_CAPTURE = 2; +/** + * @brief Provides functions to configure frames. + * + * + * @since 1.0 + * @version 1.0 + */ +class FrameConfig { +public: + /** + * @brief A constructor used to create a FrameConfig instance. + * + */ + FrameConfig() = delete; + /** + * @brief A constructor used to create a FrameConfig instance based on the configuration mode. + * + * @param type Indicates the frame configuration mode, which can be FRAME_CONFIG_PREVIEW, + * @FRAME_CONFIG_RECORD, or FRAME_CONFIG_CAPTURE. + */ + FrameConfig(int32_t type); + + /** + * @brief A destructor used to delete the FrameConfig instance. + * + */ + ~FrameConfig() {} + + /** + * @brief Obtains the frame configuration type. + * + * @return Returns the frame configuration type if obtained; returns -1 + * otherwise. + */ + int32_t GetFrameConfigType(); + + /** + * @brief Obtains a list of shared memories (surface objects). + * + * @return Returns the list of shared memories if obtained; returns + * NULL otherwise. + * + */ + std::list GetSurfaces(); + + /** + * @brief Adds a surface (an object of shared memory). + * + * @param surface Indicates the surface to add. + */ + void AddSurface(Surface &surface); + + /** + * @brief Removes a surface (an object of shared memory). + * You can call this function to release the surface when your + * application does not need to obtain data. + * + * @param surface Indicates the surface to remove. + */ + void RemoveSurface(Surface &surface); + + /** + * @brief Sets the common parameter. + * @param key Indicates the common parameter key to set. + * @param value Indicates the common parameter value to set. + */ + template void SetParameter(uint32_t key, const T value) + { + SetValue(key, static_cast(&value)); + } + + /** + * @brief Obtains the value of a common parameter based on its key. For + * details, see {@link CAMERA_FUC_KEY}. + * @param key Indicates the common parameter key. + */ + template void GetParameter(uint32_t key, T &value) + { + T *pvalue = static_cast(GetValue(key)); + if (pvalue != nullptr) { + value = *pvalue; + } + } +private: + int32_t type_; + std::list surfaceList_; + std::map keyMap_; + void *GetValue(uint32_t key); + void SetValue(uint32_t key, const void *value); +}; +} // namespace Media +} // namespace OHOS +#endif // OHOS_FRAME_CONFIG_H diff --git a/interfaces/kits/frame_state_callback.h b/interfaces/kits/frame_state_callback.h new file mode 100755 index 0000000..6ec605a --- /dev/null +++ b/interfaces/kits/frame_state_callback.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +/** + * @addtogroup MultiMedia_FrameStateCallback + * @{ + * + * @brief Provides callbacks for frame state changes, in which you can implement operations to response to the changes. + * + * @since 1.0 + * @version 1.0 + */ + +/** + * @file camera_kit.h + * + * @brief Declares functions in the FrameStateCallback class. + * + * + * @since 1.0 + * @version 1.0 + */ + +#ifndef OHOS_FRAME_STATE_CALLBACK_H +#define OHOS_FRAME_STATE_CALLBACK_H + +namespace OHOS { +namespace Media { +class Camera; +class FrameConfig; +class FrameResult {}; +/** + * @brief Provides functions to listen for frame states and response to the state changes. + * + * + * @since 1.0 + * @version 1.0 + */ +class FrameStateCallback { +public: + /** + * @brief A constructor used to create a FrameStateCallback instance. + * + */ + FrameStateCallback() = default; + + /** + * @brief A destructor used to delete the FrameStateCallback instance. + * + */ + ~FrameStateCallback() = default; + + /** + * @brief Called when the frame capture is finished. + * + * @param camera Indicates the camera. + * @param frameConfig Indicates the frame configuration. + * @param frameResult Indicates the capture results. + */ + virtual void OnFrameFinished(Camera &camera, FrameConfig &frameConfig, FrameResult &frameResult) {} + + /** + * @brief Called when the frame capture fails. + * + * @param camera Indicates the camera. + * @param frameConfig Indicates the frame configuration. + * @param errorCode Indicates the error code. + * @param frameResult Indicates the capture results. + */ + virtual void OnFrameError(Camera &camera, FrameConfig &frameConfig, int32_t errorCode, FrameResult &frameResult) {} +}; +} // namespace Media +} // namespace OHOS +#endif // OHOS_FRAME_STATE_CALLBACK_H diff --git a/interfaces/kits/meta_data.h b/interfaces/kits/meta_data.h new file mode 100755 index 0000000..1bf350f --- /dev/null +++ b/interfaces/kits/meta_data.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2020-2021 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef OHOS_META_DATA_H +#define OHOS_META_DATA_H + +#include "stdint.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif /* End of #ifdef __cplusplus */ + +typedef struct { + int32_t x; + int32_t y; + int32_t w; + int32_t h; +} CameraRect; + +typedef struct { + uint32_t width; + uint32_t height; +} CameraPicSize; + +typedef enum { + /* Frame rate */ + CAM_FRAME_FPS = 0, + /* Auto exposure mode */ + CAM_AE_MODE, + /* Auto exposure time */ + CAM_AE_EXPO_TIME, + /* Auto exposure compensation value */ + CAM_AE_COMPENSATION, + /* Auto exposure lock */ + CAM_AE_LOCK, + /* Auto exposure region */ + CAM_AE_REGIONS, + /* White balance mode */ + CAM_AWB_MODE, + /* White balance lock */ + CAM_AWB_LOCK, + /* White balance region */ + CAM_AWB_REGION, + /* Video stabilization feature */ + CAM_VIDEO_STABILIZATION_NABLE, + /* Image luminance */ + CAM_IMAGE_LUMA, + /* Image contrast */ + CAM_IMAGE_CONTRAST, + /* Image hue */ + CAM_IMAGE_HUE, + /* Image saturation */ + CAM_IMAGE_SATURATION, + /* Hot pixel correction */ + CAM_HOT_PIXEL_ENABLE, + /* Level of hot pixel correction */ + CAM_HOT_PIXEL_LEVEL, + /* Image denoising mode */ + CAM_IMAGE_DENOISE_MODE, + /* Image denoising level */ + CAM_IMAGE_DENOISE_LEVEL, +} CameraFuncKey; + +/** + @brief Enumerates parameters for image rotation and mirroring. + */ +typedef enum { + CAM_CENTER_MIRROR = 0, /**< Central mirroring */ + CAM_HORIZONTAL_MIRROR = 1, /**< Horizontal mirroring */ + CAM_VETICALLY_MIRROR = 2, /**< Vertical mirroring */ + CAM_ROTATION_90 = 3, /**< 90-degree rotation */ + CAM_ROTATION_180 = 4, /**< 180-degree rotation */ +} CameraInvertMode; + +#define PARAM_KEY_SIZE 0 +#define PARAM_KEY_IMAGE_ENCODE_QFACTOR 1 + +#define ENCODER_TYPE 0 +typedef enum { CAM_ENCODE_JPEG, CAM_ENCODE_H264, CAM_ENCODE_H265, CAM_ENCODE_FORMAT_BUTT } CameraEncodeFormat; + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif /* End of #ifdef __cplusplus */ +#endif // OHOS_META_DATA_H \ No newline at end of file diff --git a/readme.md b/readme.md deleted file mode 100755 index 4f96f73..0000000 --- a/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -详见:https://gitee.com/openharmony/docs/blob/master/readme/媒体子系统README.md - -see: https://gitee.com/openharmony/docs/blob/master/docs-en/readme/media-subsystem.md \ No newline at end of file