diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000000000000000000000000000000000000..4947287f7b5ccb5d1e8b7b2d3aa5d89f322c160d --- /dev/null +++ b/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/OAT.xml b/OAT.xml new file mode 100755 index 0000000000000000000000000000000000000000..5c2643786ecfd65c083b689a61aef1aaa80b063a --- /dev/null +++ b/OAT.xml @@ -0,0 +1,108 @@ + + + + + + LICENSE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hardware/BUILD.gn b/hardware/BUILD.gn new file mode 100755 index 0000000000000000000000000000000000000000..a134d34f00ffe6af1f054b239184a46f7ca10617 --- /dev/null +++ b/hardware/BUILD.gn @@ -0,0 +1,22 @@ +# Copyright (C) 2021 HiHope Open Source Organization . +# 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. + +import("//build/ohos.gni") + +group("hardware_group") { + deps = [ + "//device/soc/rockchip/hardware/isp:isp", + "//device/soc/rockchip/hardware/mpp:mpp", + "//device/soc/rockchip/hardware/wifi:ap6xxx", + ] +} diff --git a/hardware/README.en.md b/hardware/README.en.md new file mode 100644 index 0000000000000000000000000000000000000000..6dd5fcd548bae504026ef2223c23d2862755ffed --- /dev/null +++ b/hardware/README.en.md @@ -0,0 +1,14 @@ +# rockchip hardware + +## Introduction +Media and wifi southbound interface implementation, framework and docking layer library directory。 +## Constraints + +Currently, rk3568 are supported. +## Repositories Involved +1. device_soc_rockchip/hardware/display +2. device_soc_rockchip/hardware/gpu +3. device_soc_rockchip/hardware/isp +4. device_soc_rockchip/hardware/mpp +5. device_soc_rockchip/hardware/rga +6. device_soc_rockchip/hardware/wifi diff --git a/hardware/README.zh.md b/hardware/README.zh.md new file mode 100644 index 0000000000000000000000000000000000000000..d9e1468affb8f2f2df34af6ab75d5c42222b5c2d --- /dev/null +++ b/hardware/README.zh.md @@ -0,0 +1,14 @@ +# rockchip hardware组件 + +#### 简介 +媒体及wifi南向接口实现、框架及对接层库目录。 +#### 约束 +目前支持rk3568 +#### 对应仓库 + +1. device_soc_rockchip/hardware/display +2. device_soc_rockchip/hardware/gpu +3. device_soc_rockchip/hardware/isp +4. device_soc_rockchip/hardware/mpp +5. device_soc_rockchip/hardware/rga +6. device_soc_rockchip/hardware/wifi diff --git a/hardware/display/BUILD.gn b/hardware/display/BUILD.gn new file mode 100644 index 0000000000000000000000000000000000000000..c66724712d856b48d560816dcc66958b3cdee9ba --- /dev/null +++ b/hardware/display/BUILD.gn @@ -0,0 +1,165 @@ +# Copyright (C) 2021 HiHope Open Source Organization . +# 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. + +import("//build/ohos.gni") + +group("display_group") { + deps = [ + ":display_device", + ":display_gfx", + ":display_gralloc", + ":higbm", + ] +} + +ohos_static_library("higbm") { + sources = [ "src/display_gralloc/hi_gbm.c" ] + include_dirs = [ + "include", + "//utils/native/base/include", + "//base/hiviewdfx/interfaces/innerkits/libhilog/include", + ] + output_name = "higbm" + cflags = [ + "-DGRALLOC_GBM_SUPPORT", + "-Wno-macro-redefined", + ] + deps = [ + "//third_party/libdrm:libdrm", + "//utils/native/base:utils", + ] + external_deps = [ "hiviewdfx_hilog_native:libhilog" ] +} + +ohos_shared_library("display_gralloc") { + sources = [ + "src/display_gralloc/display_gralloc.c", + "src/display_gralloc/display_gralloc_gbm.c", + "src/display_gralloc/wayland_drm_auth_client.c", + ] + include_dirs = [ + "include", + "//drivers/peripheral/display/interfaces/include", + "//drivers/peripheral/base", + "//drivers/framework/include/utils", + "//drivers/adapter/uhdf2/osal/include", + "//utils/native/base/include", + "//foundation/graphic/standard/utils/include", + "//foundation/graphic/standard/prebuilts/librarys/drm/include", + "//base/hiviewdfx/interfaces/innerkits/libhilog/include", + ] + output_name = "display_gralloc" + cflags = [ + "-DGRALLOC_GBM_SUPPORT", + "-Wno-macro-redefined", + ] + deps = [ + ":higbm", + "//third_party/libdrm:libdrm", + "//third_party/wayland_standard:libwayland_client", + "//third_party/weston:drm_auth_protocol", + "//utils/native/base:utils", + ] + + external_deps = [ "hiviewdfx_hilog_native:libhilog" ] + + install_enable = true + install_images = [ chipset_base_dir ] + subsystem_name = "hdf" + part_name = "display_device_driver" +} + +ohos_shared_library("display_gfx") { + sources = [ "src/display_gfx/display_gfx.c" ] + include_dirs = [ + "include", + "//drivers/peripheral/display/interfaces/include", + "//drivers/peripheral/base", + "//drivers/framework/include/utils", + "//drivers/adapter/uhdf2/adapter/osal/include/", + "//utils/native/base/include", + "//foundation/graphic/standard/utils/include", + "//device/soc/rockchip/hardware/rga/include/", + "//base/hiviewdfx/interfaces/innerkits/libhilog/include", + ] + output_name = "display_gfx" + cflags = [ "-Wno-macro-redefined" ] + deps = [ + ":display_gralloc", + "//device/soc/rockchip/hardware/rga:librga", + "//utils/native/base:utils", + ] + + external_deps = [ "hiviewdfx_hilog_native:libhilog" ] + + install_enable = true + install_images = [ chipset_base_dir ] + subsystem_name = "hdf" + part_name = "display_device_driver" +} + +ohos_shared_library("display_device") { + sources = [ + "src/display_device/drm_connector.cpp", + "src/display_device/drm_crtc.cpp", + "src/display_device/drm_device.cpp", + "src/display_device/drm_display.cpp", + "src/display_device/drm_encoder.cpp", + "src/display_device/drm_plane.cpp", + "src/display_device/drm_vsync_worker.cpp", + "src/display_device/hdi_composer.cpp", + "src/display_device/hdi_device_interface.cpp", + "src/display_device/hdi_display.cpp", + "src/display_device/hdi_drm_composition.cpp", + "src/display_device/hdi_drm_layer.cpp", + "src/display_device/hdi_gfx_composition.cpp", + "src/display_device/hdi_layer.cpp", + "src/display_device/hdi_netlink_monitor.cpp", + "src/display_device/hdi_session.cpp", + ] + output_name = "display_device" + include_dirs = [ + "src/display_device", + "include", + "//drivers/peripheral/display/interfaces/include", + "//drivers/peripheral/base", + "//drivers/framework/include/utils", + "//drivers/adapter/uhdf2/osal/include", + "//utils/native/base/include", + "//foundation/graphic/standard/utils/include", + "//foundation/graphic/standard/prebuilts/librarys/drm/include", + "//base/hiviewdfx/interfaces/innerkits/libhilog/include", + ] + deps = [ + ":display_gfx", + ":display_gralloc", + "//third_party/libdrm:libdrm", + "//utils/native/base:utils", + ] + cflags = [ "-Wno-unused-function" ] + external_deps = [ "hiviewdfx_hilog_native:libhilog" ] + + install_enable = true + install_images = [ chipset_base_dir ] + subsystem_name = "hdf" + part_name = "display_device_driver" +} + +group("display_layer") { + deps = [ + ":display_device", + ":display_gfx", + ":display_gralloc", + ":higbm", + ] +} diff --git a/hardware/display/include/display_common.h b/hardware/display/include/display_common.h new file mode 100644 index 0000000000000000000000000000000000000000..ae6fefa945f5a4d1e68d57a0d73d380de765731d --- /dev/null +++ b/hardware/display/include/display_common.h @@ -0,0 +1,120 @@ +/* + * Copyright (c) 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 DISP_COMMON_H +#define DISP_COMMON_H +#include +#include +#include "hilog/log.h" +#include "stdio.h" +#ifdef HDF_LOG_TAG +#undef HDF_LOG_TAG +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +#undef LOG_TAG +#undef LOG_DOMAIN +#define LOG_TAG "DISP" +#define LOG_DOMAIN 0xD001400 + +#ifndef DISPLAY_UNUSED +#define DISPLAY_UNUSED(x) (void)(x) +#endif + +#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1) : __FILE__) + +#ifndef DISPLAY_DEBUGLOG +#define DISPLAY_DEBUGLOG(format, ...) \ + do { \ + HILOG_DEBUG(LOG_CORE, "[%{public}s@%{public}s:%{public}d] " format "\n", __FUNCTION__, __FILENAME__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#endif + +#ifndef DISPLAY_LOGI +#define DISPLAY_LOGI(format, ...) \ + do { \ + HILOG_INFO(LOG_CORE, "[%{public}s@%{public}s:%{public}d] " format "\n", __FUNCTION__, __FILENAME__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#endif + +#ifndef DISPLAY_LOGW +#define DISPLAY_LOGW(format, ...) \ + do { \ + HILOG_WARN(LOG_CORE, "[%{public}s@%{public}s:%{public}d] " format "\n", __FUNCTION__, __FILENAME__, __LINE__, \ + ##__VA_ARGS__); \ + } while (0) +#endif + +#ifndef DISPLAY_LOGE +#define DISPLAY_LOGE(format, ...) \ + do { \ + HILOG_ERROR(LOG_CORE, \ + "\033[0;32;31m" \ + "[%{public}s@%{public}s:%{public}d] " format "\033[m" \ + "\n", \ + __FUNCTION__, __FILENAME__, __LINE__, ##__VA_ARGS__); \ + } while (0) +#endif + +#ifndef CHECK_NULLPOINTER_RETURN_VALUE +#define CHECK_NULLPOINTER_RETURN_VALUE(pointer, ret) \ + do { \ + if ((pointer) == NULL) { \ + DISPLAY_LOGE("pointer is null and return ret\n"); \ + return (ret); \ + } \ + } while (0) +#endif + +#ifndef CHECK_NULLPOINTER_RETURN +#define CHECK_NULLPOINTER_RETURN(pointer) \ + do { \ + if ((pointer) == NULL) { \ + DISPLAY_LOGE("pointer is null and return\n"); \ + return; \ + } \ + } while (0) +#endif + +#ifndef DISPLAY_CHK_RETURN +#define DISPLAY_CHK_RETURN(val, ret, ...) \ + do { \ + if (val) { \ + __VA_ARGS__; \ + return (ret); \ + } \ + } while (0) +#endif + +#ifndef DISPLAY_CHK_RETURN_NOT_VALUE +#define DISPLAY_CHK_RETURN_NOT_VALUE(val, ret, ...) \ + do { \ + if (val) { \ + __VA_ARGS__; \ + return; \ + } \ + } while (0) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* DISP_COMMON_H */ diff --git a/hardware/display/include/display_gralloc_private.h b/hardware/display/include/display_gralloc_private.h new file mode 100644 index 0000000000000000000000000000000000000000..e5ce9e0cefa946019050cd4a37de2c428dad1a50 --- /dev/null +++ b/hardware/display/include/display_gralloc_private.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 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 DISPLAY_GRALLOC_INTERNAL_H +#define DISPLAY_GRALLOC_INTERNAL_H +#include "display_type.h" +#ifdef __cplusplus +extern "C" { +#endif +#define GRALLOC_NUM_FDS 1 +#define GRALLOC_NUM_INTS ((sizeof(struct PrivBufferHandle) - sizeof(BufferHandle)) / sizeof(int) - GRALLOC_NUM_FDS) + +#define INVALID_PIXEL_FMT 0 + +typedef struct { + BufferHandle hdl; +} PriBufferHandle; + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/hardware/display/src/display_device/drm_connector.cpp b/hardware/display/src/display_device/drm_connector.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3e13595a1ee1a277cd94b4a8f0e74af4e08d29f3 --- /dev/null +++ b/hardware/display/src/display_device/drm_connector.cpp @@ -0,0 +1,352 @@ +/* + * Copyright (c) 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. + */ + +#include "drm_connector.h" +#include +#include +#include "drm_device.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +void DrmMode::ConvertToHdiMode(DisplayModeInfo &hdiMode) +{ + hdiMode.height = mModeInfo.vdisplay; + hdiMode.width = mModeInfo.hdisplay; + hdiMode.freshRate = mModeInfo.vrefresh; + hdiMode.id = mId; +} + +DrmConnector::DrmConnector(drmModeConnector c, FdPtr &fd) + : mId(c.connector_id), + mPhyWidth(c.mmWidth), + mPhyHeight(c.mmHeight), + mEncoderId(c.encoder_id), + mConnectState(c.connection), + mDrmFdPtr(fd) +{ + DISPLAY_DEBUGLOG("encoder_id %{public}d", mEncoderId); + DISPLAY_DEBUGLOG("the connect state is %{public}d", mConnectState); + + for (int i = 0; i < c.count_encoders; i++) { + mPossibleEncoders.push_back(c.encoders[i]); + DISPLAY_DEBUGLOG("add possible encoder id %{public}d", c.encoders[i]); + } + + ConvertToHdiType(c.connector_type, mType); + ConvertTypeToName(mType, mName); + InitModes(c); + DISPLAY_DEBUGLOG("name %{public}s", mName.c_str()); +} + +void DrmConnector::InitModes(drmModeConnector c) +{ + DISPLAY_DEBUGLOG("id %{public}d", mId); + mModes.clear(); + mPreferenceId = INVALID_MODE_ID; + for (int i = 0; i < c.count_modes; i++) { + drmModeModeInfoPtr mode = c.modes + i; + DISPLAY_DEBUGLOG("mode: hdisplay %{public}d, vdisplay %{public}d vrefresh %{public}d type %{public}d", + mode->hdisplay, mode->vdisplay, mode->vrefresh, mode->type); + if ((mPreferenceId == INVALID_MODE_ID) && (mode->type & DRM_MODE_TYPE_PREFERRED)) { + DISPLAY_DEBUGLOG("set it to prefernce id %{public}d", i); + mPreferenceId = i; + } + mModes.emplace(i, DrmMode { *mode, i }); + } + DISPLAY_DEBUGLOG("mode count %{public}zd", mModes.size()); +} + +int32_t DrmConnector::Init(DrmDevice &drmDevice) +{ + int32_t ret; + DrmProperty prop; + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((mDrmFdPtr == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("the mDrmFdPtr is NULL")); + DISPLAY_CHK_RETURN((mDrmFdPtr->GetFd() == -1), DISPLAY_FAILURE, DISPLAY_LOGE("the drm fd is -1")); + // find dpms prop + ret = drmDevice.GetConnectorProperty(*this, PROP_DPMS, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("can not get mode prop id")); + mPropDpmsId = prop.propId; + mDpmsState = prop.value; + DISPLAY_DEBUGLOG("dpms state : %{public}" PRIu64 "", mDpmsState); + // find the crtcid + ret = drmDevice.GetConnectorProperty(*this, PROP_CRTCID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get out fence prop id")); + mPropCrtcId = prop.propId; + DISPLAY_DEBUGLOG("encoder_id %{public}d", mEncoderId); + DISPLAY_DEBUGLOG("mPropCrtcId %{public}d", mPropCrtcId); + // find the brightness + ret = drmDevice.GetConnectorProperty(*this, PROP_BRIGHTNESS, prop); + if (ret == DISPLAY_SUCCESS) { + mPropBrightnessId = prop.propId; + mBrightnessLevel = static_cast(prop.value); + DISPLAY_DEBUGLOG("prop brightness is %{public}d, level is %{public}d", mPropBrightnessId, mBrightnessLevel); + } else { + DISPLAY_LOGW("can not get the brightness prop, can not set the brightness"); + } + return DISPLAY_SUCCESS; +} + +int32_t DrmConnector::GetBrightness(uint32_t& level) +{ + if (mPropBrightnessId == DRM_INVALID_ID) { + DISPLAY_LOGE("the prop id of brightness is invalid"); + return DISPLAY_NOT_SUPPORT; + } + level = mBrightnessLevel; + return DISPLAY_SUCCESS; +} + +const int BACKLIGHT_MIN = 10; +int32_t DrmConnector::SetBrightness(uint32_t level) +{ + static int32_t brFd = 0; + const int32_t buffer_size = 10; /* buffer size */ + char buffer[buffer_size]; + + DISPLAY_DEBUGLOG("set %{public}d", level); + if (mPropBrightnessId == DRM_INVALID_ID) { + DISPLAY_LOGE("the prop id of brightness is invalid"); + return DISPLAY_NOT_SUPPORT; + } + if (brFd <= 0) { + brFd = open("/sys/class/backlight/backlight/brightness", O_RDWR); + if (brFd < 0) { + DISPLAY_LOGE("oepn Brightness file failed\n"); + return DISPLAY_NOT_SUPPORT; + } + } + errno_t ret = memset_s(buffer, sizeof(buffer), 0, sizeof(buffer)); + if (ret != EOK) { + DISPLAY_LOGE("memset_s failed\n"); + return DISPLAY_FAILURE; + } + if (level < BACKLIGHT_MIN) { + level = BACKLIGHT_MIN; + } + int bytes = sprintf_s(buffer, sizeof(buffer), "%d\n", level); + if (bytes < 0) { + DISPLAY_LOGE("change failed\n"); + return DISPLAY_FAILURE; + } + write(brFd, buffer, bytes); + mBrightnessLevel = level; + return DISPLAY_SUCCESS; +} + +void DrmConnector::GetDisplayCap(DisplayCapability &cap) +{ + cap.phyHeight = mPhyHeight; + cap.phyWidth = mPhyWidth; + cap.type = mType; + memcpy_s(cap.name, sizeof(cap.name), mName.c_str(), mName.size()); + if (mName.size() >= sizeof(cap.name)) { + cap.name[sizeof(cap.name) - 1] = 0; + } else { + cap.name[mName.size()] = 0; + } + cap.supportLayers = mSupportLayers; + cap.virtualDispCount = mVirtualDispCount; + cap.supportWriteBack = mSupportWriteBack; + cap.propertyCount = mPropertyCount; +} + +void DrmConnector::ConvertTypeToName(uint32_t type, std::string &name) +{ + DISPLAY_DEBUGLOG("type %{public}d", type); + switch (type) { + case DISP_INTF_VGA: + name = "VGA"; + break; + case DISP_INTF_HDMI: + name = "HDMI"; + break; + case DISP_INTF_MIPI: + name = "MIPI"; + break; + default: + name = "Unknown"; + break; + } +} + +void DrmConnector::ConvertToHdiType(uint32_t type, InterfaceType &hdiType) +{ + switch (type) { + case DRM_MODE_CONNECTOR_VGA: + hdiType = DISP_INTF_VGA; + break; + case DRM_MODE_CONNECTOR_DSI: + hdiType = DISP_INTF_MIPI; + break; + case DRM_MODE_CONNECTOR_HDMIA: + case DRM_MODE_CONNECTOR_HDMIB: + hdiType = DISP_INTF_HDMI; + break; + default: + hdiType = DISP_INTF_BUTT; + break; + } +} +int32_t DrmConnector::TryPickEncoder(IdMapPtr &encoders, uint32_t encoderId, IdMapPtr &crtcs, + uint32_t &crtcId) +{ + int ret; + auto encoderIter = encoders.find(encoderId); + if (encoderIter == encoders.end()) { + DISPLAY_LOGW("can not find encoder for id : %{public}d", encoderId); + return DISPLAY_FAILURE; + } + + auto &encoder = encoderIter->second; + DISPLAY_DEBUGLOG("connector : %{public}d encoder : %{public}d", mId, encoder->GetId()); + ret = encoder->PickIdleCrtcId(crtcs, crtcId); + DISPLAY_CHK_RETURN((ret == DISPLAY_SUCCESS), DISPLAY_SUCCESS, + DISPLAY_DEBUGLOG("connector : %{public}d pick encoder : %{public}d", mId, encoder->GetId())); + return DISPLAY_FAILURE; +} + +int32_t DrmConnector::PickIdleCrtcId(IdMapPtr &encoders, IdMapPtr &crtcs, uint32_t &crtcId) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_DEBUGLOG("encoder_id %{public}d", mEncoderId); + int ret = TryPickEncoder(encoders, mEncoderId, crtcs, crtcId); + DISPLAY_CHK_RETURN((ret == DISPLAY_SUCCESS), DISPLAY_SUCCESS, + DISPLAY_DEBUGLOG("connector : %{public}d pick endcoder : %{public}d crtcId : %{public}d", + mId, mEncoderId, crtcId)); + + for (auto encoder : mPossibleEncoders) { + ret = TryPickEncoder(encoders, encoder, crtcs, crtcId); + DISPLAY_CHK_RETURN((ret == DISPLAY_SUCCESS), DISPLAY_SUCCESS, + DISPLAY_DEBUGLOG("connector : %{public}d pick endcoder : %{public}d crtcId : %{public}d", mId, mEncoderId, + crtcId)); + } + + DISPLAY_LOGW("can not pick a crtc for connector"); + return DISPLAY_FAILURE; +} + +int32_t DrmConnector::UpdateModes() +{ + int drmFd = mDrmFdPtr->GetFd(); + drmModeConnectorPtr c = drmModeGetConnector(drmFd, mId); + DISPLAY_CHK_RETURN((c == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("can not get connector")); + mConnectState = c->connection; + // init the modes + InitModes(*c); + drmModeFreeConnector(c); + return DISPLAY_SUCCESS; +} + +bool DrmConnector::HandleHotplug() +{ + int drmFd = mDrmFdPtr->GetFd(); + drmModeConnectorPtr c = drmModeGetConnector(drmFd, mId); + DISPLAY_CHK_RETURN((c == nullptr), false, DISPLAY_LOGE("can not get connector")); + if (mConnectState == c->connection) { + drmModeFreeConnector(c); + return false; + } else { + mConnectState = c->connection; + InitModes(*c); + drmModeFreeConnector(c); + return true; + } +} +int32_t DrmConnector::GetDisplaySupportedModes(uint32_t *num, DisplayModeInfo *modes) +{ + DISPLAY_CHK_RETURN((num == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("num is nullptr")); + *num = static_cast(mModes.size()); + if (modes != nullptr) { + int i = 0; + for (const auto &modeMap : mModes) { + DrmMode mode = modeMap.second; + mode.ConvertToHdiMode(*(modes + i)); + i++; + } + } + return DISPLAY_SUCCESS; +} + +int32_t DrmConnector::SetDpmsState(uint64_t dmps) +{ + DISPLAY_DEBUGLOG("dmps %{public}" PRIu64 "", dmps); + int ret = drmModeConnectorSetProperty(mDrmFdPtr->GetFd(), mId, mPropDpmsId, dmps); + DISPLAY_CHK_RETURN((ret != 0), DISPLAY_FAILURE, DISPLAY_LOGE("can not set dpms")); + mDpmsState = dmps; + return DISPLAY_SUCCESS; +} + +bool DrmConnector::IsConnected() +{ + return (mConnectState == DRM_MODE_CONNECTED); +} + +int32_t DrmConnector::GetModeFromId(int32_t id, DrmMode &mode) +{ + DISPLAY_DEBUGLOG(); + auto iter = mModes.find(id); + if (iter == mModes.end()) { + return DISPLAY_FAILURE; + } + mode = mModes[id]; + return DISPLAY_SUCCESS; +} + +std::unique_ptr DrmConnector::GetModeBlockFromId(int32_t id) +{ + DISPLAY_DEBUGLOG("id %{public}d", id); + auto iter = mModes.find(id); + DISPLAY_CHK_RETURN((iter == mModes.end()), nullptr, DISPLAY_LOGE("can not the mode %{public}d", id)); + return std::make_unique(mModes[id]); +} + +DrmModeBlock::DrmModeBlock(DrmMode &mode) +{ + DISPLAY_DEBUGLOG(); + Init(mode); +} + +int32_t DrmModeBlock::Init(DrmMode &mode) +{ + int ret; + int drmFd; + drmFd = DrmDevice::GetDrmFd(); + DISPLAY_CHK_RETURN((drmFd < 0), DISPLAY_FAILURE, DISPLAY_LOGE("the drm fd is invalid")); + drmModeModeInfo modeInfo = *(mode.GetModeInfoPtr()); + ret = drmModeCreatePropertyBlob(drmFd, static_cast(&modeInfo), sizeof(modeInfo), &mBlockId); + DISPLAY_CHK_RETURN((ret != 0), DISPLAY_FAILURE, DISPLAY_LOGE("create property blob failed")); + DISPLAY_DEBUGLOG("mBlockId %{public}d", mBlockId); + return DISPLAY_SUCCESS; +} + +DrmModeBlock::~DrmModeBlock() +{ + DISPLAY_DEBUGLOG("mBlockId %{public}d", mBlockId); + int drmFd; + drmFd = DrmDevice::GetDrmFd(); + if ((mBlockId != DRM_INVALID_ID) && (drmFd >= 0)) { + int ret = drmModeDestroyPropertyBlob(drmFd, mBlockId); + if (ret != 0) { + DISPLAY_LOGE("destroy property blob failed errno %{public}d", errno); + } + } else { + DISPLAY_LOGE("can not destruct the block id %{public}d drmFd %{public}d", mBlockId, drmFd); + } +} +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY diff --git a/hardware/display/src/display_device/drm_connector.h b/hardware/display/src/display_device/drm_connector.h new file mode 100644 index 0000000000000000000000000000000000000000..b282a755d19446c3930e6f2d8eb7a0f9d6df697f --- /dev/null +++ b/hardware/display/src/display_device/drm_connector.h @@ -0,0 +1,138 @@ +/* + * Copyright (c) 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 DRM_CONNECTOR_H +#define DRM_CONNECTOR_H +#include +#include +#include +#include +#include +#include "display_type.h" +#include "drm_encoder.h" +#include "hdi_device_common.h" +#include "hdi_shared_fd.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +const std::string PROP_DPMS = "DPMS"; +const std::string PROP_CRTCID = "CRTC_ID"; +const std::string PROP_BRIGHTNESS = "brightness"; +class DrmDevice; +class DrmModeBlock; + +class DrmMode { +public: + DrmMode() {}; + DrmMode(drmModeModeInfo &modeInfo, uint32_t id) : mModeInfo(modeInfo), mId(id) {} + virtual ~DrmMode() {}; + drmModeModeInfoPtr GetModeInfoPtr() + { + return &mModeInfo; + } + void ConvertToHdiMode(DisplayModeInfo &hdiMode); + +private: + drmModeModeInfo mModeInfo = { 0 }; + int32_t mId = -1; +}; + +class DrmModeBlock { +public: + explicit DrmModeBlock(DrmMode &mode); + virtual ~DrmModeBlock(); + int32_t Init(DrmMode &mode); + uint32_t GetBlockId() const + { + return mBlockId; + } + +private: + uint32_t mBlockId = DRM_INVALID_ID; +}; + +class DrmConnector { +public: + DrmConnector(drmModeConnector c, FdPtr &fd); + virtual ~DrmConnector() {}; + uint32_t GetId() const + { + return mId; + } + uint32_t GetEncoderId() const + { + return mEncoderId; + } + void GetDisplayCap(DisplayCapability &cap); + int32_t Init(DrmDevice &drmDevice); + int32_t PickIdleCrtcId(IdMapPtr &encoders, IdMapPtr &crtcs, uint32_t &crtcId); + int32_t GetDisplaySupportedModes(uint32_t *num, DisplayModeInfo *modes); + int32_t GetPreferenceId() const + { + return mPreferenceId; + } + uint32_t GetPropCrtcId() const + { + return mPropCrtcId; + } + int32_t TryPickEncoder(IdMapPtr &encoders, uint32_t encoderId, IdMapPtr &crtcs, + uint32_t &crtcId); + // update modes will reset the preference mode id and active mode id + int32_t UpdateModes(); + std::unique_ptr GetModeBlockFromId(int32_t id); + int32_t GetModeFromId(int32_t id, DrmMode &mode); + uint64_t GetDpmsState() const + { + return mDpmsState; + } + int32_t SetDpmsState(uint64_t dmps); + bool IsConnected(); + bool HandleHotplug(); + + int32_t GetBrightness(uint32_t& level); + int32_t SetBrightness(uint32_t level); + +private: + static void ConvertTypeToName(uint32_t type, std::string &name); + static void ConvertToHdiType(uint32_t type, InterfaceType &hdiType); + + void InitModes(drmModeConnector c); + uint32_t mId; + InterfaceType mType; + uint32_t mPhyWidth; + uint32_t mPhyHeight; + uint32_t mSupportLayers = 0; + uint32_t mVirtualDispCount = 0; + bool mSupportWriteBack = false; + uint32_t mPropertyCount = 0; + uint32_t mEncoderId; + std::vector mPossibleEncoders; + std::string mName; + drmModeConnection mConnectState; + uint32_t mPropDpmsId = DRM_INVALID_ID; + uint64_t mDpmsState = 0; + uint32_t mPropCrtcId = DRM_INVALID_ID; + uint32_t mPropBrightnessId = DRM_INVALID_ID; + uint32_t mBrightnessLevel = 0; + std::unordered_map mModes; + int32_t mPreferenceId = INVALID_MODE_ID; + + FdPtr mDrmFdPtr; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY +#endif // DRM_CONNECTOR_H diff --git a/hardware/display/src/display_device/drm_crtc.cpp b/hardware/display/src/display_device/drm_crtc.cpp new file mode 100755 index 0000000000000000000000000000000000000000..42a4c8551d8633029657c2dd720658dcf557758a --- /dev/null +++ b/hardware/display/src/display_device/drm_crtc.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (c) 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. + */ + +#include "drm_crtc.h" +#include "display_common.h" +#include "drm_device.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +struct PlaneMaskName planeMaskNames[] = { + { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER0_MASK, "Cluster0" }, + { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER1_MASK, "Cluster1" }, + { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_MASK, "Esmart0" }, + { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_MASK, "Esmart1" }, + { DrmPlaneType::DRM_PLANE_TYPE_SMART0_MASK, "Smart0" }, + { DrmPlaneType::DRM_PLANE_TYPE_SMART1_MASK, "Smart1" }, + { DrmPlaneType::DRM_PLANE_TYPE_Unknown, "unknown" }, +}; + +DrmCrtc::DrmCrtc(drmModeCrtcPtr c, uint32_t pipe) : mId(c->crtc_id), mPipe(pipe), mPlaneMask(0) +{ +} + +int32_t DrmCrtc::Init(DrmDevice &drmDevice) +{ + DISPLAY_DEBUGLOG(); + int32_t ret; + DrmProperty prop; + ret = drmDevice.GetCrtcProperty(*this, PROP_MODEID, prop); + mModePropId = prop.propId; + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("can not get mode prop id")); + + ret = drmDevice.GetCrtcProperty(*this, PROP_OUTFENCE, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get out fence prop id")); + mOutFencePropId = prop.propId; + + ret = drmDevice.GetCrtcProperty(*this, PROP_ACTIVE, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get out fence prop id")); + mActivePropId = prop.propId; + + // Plane mask + mPlaneMask = 0; + ret = drmDevice.GetCrtcProperty(*this, "PLANE_MASK", prop); + if (ret != DISPLAY_SUCCESS) { + DISPLAY_LOGE("Failed to get plane_mask property"); + } else { + for (int i = 0; i < static_cast(ARRAY_SIZE(planeMaskNames)); i++) { + for (auto &drmEnum : prop.enums) { + if (!strncmp(drmEnum.name.c_str(), (const char*)planeMaskNames[i].name, + strlen(drmEnum.name.c_str())) && (prop.value & (1LL << drmEnum.value)) > 0) { + mPlaneMask |= static_cast(planeMaskNames[i].mask); + DISPLAY_LOGI("crtc id %{public}d, plane name %{public}s value %{public}llx", + GetId(), (const char*)planeMaskNames[i].name, + (long long)planeMaskNames[i].mask); + } + } + } + } + return DISPLAY_SUCCESS; +} + +int32_t DrmCrtc::BindToDisplay(uint32_t id) +{ + DISPLAY_CHK_RETURN((mDisplayId != INVALIDE_DISPLAY_ID), DISPLAY_FAILURE, + DISPLAY_LOGE("the crtc has bind to %{public}d", mDisplayId)); + mDisplayId = id; + return DISPLAY_SUCCESS; +} + +void DrmCrtc::UnBindDisplay(uint32_t id) +{ + DISPLAY_DEBUGLOG(); + if (mDisplayId == id) { + mDisplayId = INVALIDE_DISPLAY_ID; + } else { + DISPLAY_LOGE("can not unbind"); + } +} + +bool DrmCrtc::CanBind() +{ + return (mDisplayId == INVALIDE_DISPLAY_ID); +} + +int32_t DrmCrtc::SetActivieMode(int32_t id) +{ + DISPLAY_DEBUGLOG("set activie modeid to %{public}d", id); + DISPLAY_CHK_RETURN((id > 0), DISPLAY_PARAM_ERR, DISPLAY_LOGE("id %{public}d is invalid ", id)); + if (mActiveModeId != id) { + mNeedModeSet = true; + } + mActiveModeId = id; + return DISPLAY_SUCCESS; +} +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY diff --git a/hardware/display/src/display_device/drm_crtc.h b/hardware/display/src/display_device/drm_crtc.h new file mode 100755 index 0000000000000000000000000000000000000000..8f923326860ea4b04c8c21d073c525f203ae543e --- /dev/null +++ b/hardware/display/src/display_device/drm_crtc.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 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 DRM_CRTC_H +#define DRM_CRTC_H +#include +#include +#include +#include +#include "hdi_device_common.h" +#include "hdi_display.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +const std::string PROP_ACTIVE = "ACTIVE"; +const std::string PROP_MODEID = "MODE_ID"; +const std::string PROP_OUTFENCE = "OUT_FENCE_PTR"; + +class DrmDevice; + +class DrmCrtc { +public: + DrmCrtc(drmModeCrtcPtr c, uint32_t pipe); + virtual ~DrmCrtc() {}; + int32_t BindToDisplay(uint32_t id); + void UnBindDisplay(uint32_t id); + bool CanBind(); + uint32_t GetId() const + { + return mId; + } + uint32_t GetModePropId() const + { + return mModePropId; + } + uint32_t GetOutFencePropId() const + { + return mOutFencePropId; + } + uint32_t GetActivePropId() const + { + return mActivePropId; + } + uint32_t GetPipe() const + { + return mPipe; + } + int32_t Init(DrmDevice &drmDevice); + int32_t SetActivieMode(int32_t id); + int32_t GetActiveModeId() const + { + return mActiveModeId; + } + bool NeedModeSet() + { + return mNeedModeSet; + } + uint32_t GetPlaneMask() + { + return mPlaneMask; + } +private: + uint32_t mId = 0; + uint32_t mModePropId = 0; + uint32_t mOutFencePropId = 0; + uint32_t mActivePropId = 0; + uint32_t mDisplayId = INVALIDE_DISPLAY_ID; + uint32_t mPipe = 0; + int32_t mActiveModeId = INVALID_MODE_ID; + bool mNeedModeSet = false; + uint32_t mPlaneMask = 0; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // DRM_CRTC_H \ No newline at end of file diff --git a/hardware/display/src/display_device/drm_device.cpp b/hardware/display/src/display_device/drm_device.cpp new file mode 100755 index 0000000000000000000000000000000000000000..fafe456f24b849392d5797f513810558b35152c6 --- /dev/null +++ b/hardware/display/src/display_device/drm_device.cpp @@ -0,0 +1,360 @@ +/* + * Copyright (c) 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. + */ + +#include "drm_device.h" +#include +#include +#include +#include +#include +#include "display_common.h" +#include "drm_display.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +FdPtr DrmDevice::mDrmFd = nullptr; +std::shared_ptr DrmDevice::mInstance; + +std::shared_ptr DrmDevice::Create() +{ + DISPLAY_DEBUGLOG(); + if (mDrmFd == nullptr) { + const std::string name("rockchip"); + int drmFd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); // drmOpen(name.c_str(), nullptr); + if (drmFd < 0) { + DISPLAY_LOGE("drm file:%{public}s open failed %{public}s", name.c_str(), strerror(errno)); + return nullptr; + } + DISPLAY_DEBUGLOG("the drm fd is %{public}d", drmFd); + mDrmFd = std::make_shared(drmFd); + } + if (mInstance == nullptr) { + mInstance = std::make_shared(); + } + return mInstance; +} + +int DrmDevice::GetDrmFd() +{ + if (mDrmFd == nullptr) { + DISPLAY_LOGE("the drmfd is null not open"); + return -1; + } + return mDrmFd->GetFd(); +} + +using PixelFormatConvertTbl = struct PixFmtConvertTbl { + uint32_t drmFormat; + PixelFormat pixFormat; +}; + +uint32_t DrmDevice::ConvertToDrmFormat(PixelFormat fmtIn) +{ + static const PixelFormatConvertTbl convertTable[] = { + {DRM_FORMAT_XBGR8888, PIXEL_FMT_RGBX_8888}, {DRM_FORMAT_ABGR8888, PIXEL_FMT_RGBA_8888}, + {DRM_FORMAT_RGB888, PIXEL_FMT_RGB_888}, {DRM_FORMAT_RGB565, PIXEL_FMT_BGR_565}, + {DRM_FORMAT_BGRX4444, PIXEL_FMT_BGRX_4444}, {DRM_FORMAT_BGRA4444, PIXEL_FMT_BGRA_4444}, + {DRM_FORMAT_RGBA4444, PIXEL_FMT_RGBA_4444}, {DRM_FORMAT_RGBX4444, PIXEL_FMT_RGBX_4444}, + {DRM_FORMAT_BGRX5551, PIXEL_FMT_BGRX_5551}, {DRM_FORMAT_BGRA5551, PIXEL_FMT_BGRA_5551}, + {DRM_FORMAT_BGRX8888, PIXEL_FMT_BGRX_8888}, {DRM_FORMAT_ARGB8888, PIXEL_FMT_BGRA_8888}, + {DRM_FORMAT_NV12, PIXEL_FMT_YCBCR_420_SP}, {DRM_FORMAT_NV21, PIXEL_FMT_YCRCB_420_SP}, + {DRM_FORMAT_YUV420, PIXEL_FMT_YCBCR_420_P}, {DRM_FORMAT_YVU420, PIXEL_FMT_YCRCB_420_P}, + {DRM_FORMAT_NV16, PIXEL_FMT_YCBCR_422_SP}, {DRM_FORMAT_NV61, PIXEL_FMT_YCRCB_422_SP}, + {DRM_FORMAT_YUV422, PIXEL_FMT_YCBCR_422_P}, {DRM_FORMAT_YVU422, PIXEL_FMT_YCRCB_422_P}, + }; + uint32_t fmtOut = 0; + for (uint32_t i = 0; i < sizeof(convertTable) / sizeof(convertTable[0]); i++) { + if (convertTable[i].pixFormat == fmtIn) { + fmtOut = convertTable[i].drmFormat; + } + } + DISPLAY_DEBUGLOG("fmtIn %{public}d, outFmt %{public}d", fmtIn, fmtOut); + return fmtOut; +} + +DrmDevice::DrmDevice() {} + +int32_t DrmDevice::GetCrtcProperty(const DrmCrtc &crtc, const std::string &name, DrmProperty &prop) +{ + return GetProperty(crtc.GetId(), DRM_MODE_OBJECT_CRTC, name, prop); +} + +int32_t DrmDevice::GetConnectorProperty(const DrmConnector &connector, const std::string &name, DrmProperty &prop) +{ + return GetProperty(connector.GetId(), DRM_MODE_OBJECT_CONNECTOR, name, prop); +} + +int32_t DrmDevice::GetPlaneProperty(const DrmPlane &plane, const std::string &name, DrmProperty &prop) +{ + return GetProperty(plane.GetId(), DRM_MODE_OBJECT_PLANE, name, prop); +} + +int32_t DrmDevice::GetProperty(uint32_t objId, uint32_t objType, const std::string &name, DrmProperty &prop) +{ + drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(GetDrmFd(), objId, objType); + DISPLAY_CHK_RETURN((!props), DISPLAY_FAILURE, DISPLAY_LOGE("can not get properties")); + bool found = false; + for (uint32_t i = 0; i < props->count_props; i++) { + drmModePropertyPtr p = drmModeGetProperty(GetDrmFd(), props->props[i]); + if (strcmp(p->name, name.c_str()) == 0) { + found = true; + prop.propId = p->prop_id; + prop.value = props->prop_values[i]; + prop.name = p->name; + prop.flags = p->flags; + + for (int i = 0; i < p->count_values; ++i) { + prop.values.push_back(p->values[i]); + } + for (int i = 0; i < p->count_enums; ++i) { + prop.enums.push_back(DrmPropertyEnum(&p->enums[i])); + } + + for (int i = 0; i < p->count_blobs; ++i) { + prop.blob_ids.push_back(p->blob_ids[i]); + } + if (prop.flags & DRM_MODE_PROP_RANGE) { + prop.type = static_cast(DrmPropertyType::DRM_PROPERTY_TYPE_INT); + } else if (prop.flags & DRM_MODE_PROP_ENUM) { + prop.type = static_cast(DrmPropertyType::DRM_PROPERTY_TYPE_ENUM); + } else if (prop.flags & DRM_MODE_PROP_OBJECT) { + prop.type = static_cast(DrmPropertyType::DRM_PROPERTY_TYPE_OBJECT); + } else if (prop.flags & DRM_MODE_PROP_BLOB) { + prop.type = static_cast(DrmPropertyType::DRM_PROPERTY_TYPE_BLOB); + } else if (prop.flags & DRM_MODE_PROP_BITMASK) { + prop.type = static_cast(DrmPropertyType::DRM_PROPERTY_TYPE_BITMASK); + } + } + drmModeFreeProperty(p); + } + drmModeFreeObjectProperties(props); + return found ? DISPLAY_SUCCESS : DISPLAY_NOT_SUPPORT; +} + +int32_t DrmDevice::Init() +{ + int ret = drmSetClientCap(GetDrmFd(), DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); + DISPLAY_CHK_RETURN((ret), DISPLAY_FAILURE, + DISPLAY_LOGE("DRM_CLIENT_CAP_UNIVERSAL_PLANES set failed %{public}s", strerror(errno))); + ret = drmSetClientCap(GetDrmFd(), DRM_CLIENT_CAP_ATOMIC, 1); + DISPLAY_CHK_RETURN((ret), DISPLAY_FAILURE, + DISPLAY_LOGE("DRM_CLIENT_CAP_ATOMIC set failed %{public}s", strerror(errno))); + + ret = drmSetMaster(GetDrmFd()); + DISPLAY_CHK_RETURN((ret), DISPLAY_FAILURE, DISPLAY_LOGE("can not set to master errno : %{public}d", errno)); + DISPLAY_LOGE("chenyf master"); + ret = drmIsMaster(GetDrmFd()); + DISPLAY_CHK_RETURN((!ret), DISPLAY_FAILURE, DISPLAY_LOGE("is not master : %{public}d", errno)); + + return DISPLAY_SUCCESS; +} + +void DrmDevice::DeInit() +{ + mDisplays.clear(); + mCrtcs.clear(); +} + +void DrmDevice::FindAllCrtc(const drmModeResPtr &res) +{ + DISPLAY_CHK_RETURN_NOT_VALUE((res == nullptr), DISPLAY_LOGE("the res is null")); + mCrtcs.clear(); + for (int i = 0; i < res->count_crtcs; i++) { + drmModeCrtcPtr crtc = drmModeGetCrtc(GetDrmFd(), res->crtcs[i]); + if (!crtc) { + DISPLAY_LOGE("can not get crtc %{public}d", i); + continue; + } + uint32_t crtc_id = crtc->crtc_id; + std::shared_ptr drmCrtc = std::make_shared(crtc, i); + int ret = drmCrtc->Init(*this); + drmModeFreeCrtc(crtc); + if (ret != DISPLAY_SUCCESS) { + DISPLAY_LOGE("crtc %{public}d init failed", i); + continue; + } + mCrtcs.emplace(crtc_id, std::move(drmCrtc)); + } +} + +void DrmDevice::FindAllEncoder(const drmModeResPtr &res) +{ + DISPLAY_CHK_RETURN_NOT_VALUE((res == nullptr), DISPLAY_LOGE("the res is null")); + mEncoders.clear(); + for (int i = 0; i < res->count_encoders; i++) { + drmModeEncoderPtr encoder = drmModeGetEncoder(GetDrmFd(), res->encoders[i]); + if (!encoder) { + DISPLAY_LOGE("can not get encoder %{public}d", i); + continue; + } + std::shared_ptr drmEncoder = std::make_shared(*encoder); + mEncoders.emplace(encoder->encoder_id, std::move(drmEncoder)); + drmModeFreeEncoder(encoder); + } + DISPLAY_DEBUGLOG("find encoder count %{public}zd", mEncoders.size()); +} + +void DrmDevice::FindAllConnector(const drmModeResPtr &res) +{ + DISPLAY_CHK_RETURN_NOT_VALUE((res == nullptr), DISPLAY_LOGE("the res is null")); + mConnectors.clear(); + int ret; + for (int i = 0; i < res->count_connectors; i++) { + drmModeConnectorPtr connector = drmModeGetConnector(GetDrmFd(), res->connectors[i]); + if (!connector) { + DISPLAY_LOGE("can not get connector mode %{public}d", i); + continue; + } + std::shared_ptr drmConnector = std::make_shared(*connector, mDrmFd); + ret = drmConnector->Init(*this); + drmModeFreeConnector(connector); + if (ret != DISPLAY_SUCCESS) { + continue; + } + int connectorId = drmConnector->GetId(); + mConnectors.emplace(connectorId, std::move(drmConnector)); + } + DISPLAY_DEBUGLOG("find connector count %{public}zd", mConnectors.size()); +} + +void DrmDevice::FindAllPlane() +{ + mPlanes.clear(); + int ret; + drmModePlaneResPtr planeRes = drmModeGetPlaneResources(GetDrmFd()); + DISPLAY_CHK_RETURN_NOT_VALUE((planeRes == nullptr), DISPLAY_LOGE("can not get plane resource")); + DISPLAY_DEBUGLOG("count_planes %{public}d", planeRes->count_planes); + for (uint32_t i = 0; i < planeRes->count_planes; i++) { + drmModePlanePtr p = drmModeGetPlane(GetDrmFd(), planeRes->planes[i]); + if (!p) { + DISPLAY_LOGE("can not get plane %{public}d", i); + continue; + } + std::shared_ptr drmPlane = std::make_shared(*p); + DISPLAY_DEBUGLOG(); + ret = drmPlane->Init(*this); + DISPLAY_DEBUGLOG(); + drmModeFreePlane(p); + if (ret != DISPLAY_SUCCESS) { + DISPLAY_LOGE("drm plane %{public}d init failed", i); + continue; + } + mPlanes.emplace_back(std::move(drmPlane)); + } + DISPLAY_DEBUGLOG("find plane count %{public}zd", mPlanes.size()); +} + +std::shared_ptr DrmDevice::GetDrmEncoderFromId(uint32_t id) +{ + return nullptr; +} + +std::shared_ptr DrmDevice::GetDrmConnectorFromId(uint32_t id) +{ + return nullptr; +} + +std::shared_ptr DrmDevice::GetDrmCrtcFromId(uint32_t id) +{ + return nullptr; +} + +std::vector> DrmDevice::GetDrmPlane(uint32_t pipe, uint32_t type) +{ + std::vector> planes; + for (const auto &plane : mPlanes) { + if (plane->IsIdle() && ((1 << pipe) & plane->GetPossibleCrtcs()) && (type == plane->GetType())) { + planes.push_back(plane); + } + } + DISPLAY_DEBUGLOG("the planes count %{public}zd", planes.size()); + return planes; +} + +bool DrmDevice::HandleHotplug(uint32_t dispId, bool plugIn) +{ + uint32_t find = 0; + uint32_t connectorId; + + for (auto &dispConnectorIdMap : dispConnectorIdMaps_) { + if (dispConnectorIdMap.first == dispId) { + connectorId = dispConnectorIdMap.second; + find = 1; + break; + } + } + if (find) { + for (auto &connectorPair : mConnectors) { + auto connector = connectorPair.second; + if (connectorId == connector->GetId()) { + if (connector->HandleHotplug() == true) { + connector->Init(*this); + return true; + } + } + } + } + return false; +} + +std::unordered_map> DrmDevice::DiscoveryDisplay() +{ + uint32_t dispId; + uint32_t connectorId; + + dispConnectorIdMaps_.clear(); + mDisplays.clear(); + drmModeResPtr res = drmModeGetResources(GetDrmFd()); + DISPLAY_CHK_RETURN((res == nullptr), mDisplays, DISPLAY_LOGE("can not get drm resource")); + // discovery all drm resource + FindAllCrtc(res); + FindAllEncoder(res); + FindAllConnector(res); + FindAllPlane(); + DISPLAY_DEBUGLOG(); + // travel all connector + for (auto &connectorPair : mConnectors) { + auto connector = connectorPair.second; + uint32_t crtcId = 0; + int32_t ret = connector->PickIdleCrtcId(mEncoders, mCrtcs, crtcId); + if (ret != DISPLAY_SUCCESS) { + continue; + } + DISPLAY_DEBUGLOG(); + + auto crtcIter = mCrtcs.find(crtcId); + if (crtcIter == mCrtcs.end()) { + DISPLAY_LOGE("can not find crtc for the id %{public}d", connector->GetId()); + continue; + } + DISPLAY_DEBUGLOG(); + auto crtc = crtcIter->second; + DISPLAY_DEBUGLOG("crtc %{public}p", crtc.get()); + // create the display + std::shared_ptr display = std::make_shared(connector, crtc, mInstance); + DISPLAY_DEBUGLOG(); + display->Init(); + dispId = display->GetId(); + connectorId = connector->GetId(); + mDisplays.emplace(dispId, std::move(display)); + dispConnectorIdMaps_.emplace(dispId, connectorId); + } + DISPLAY_DEBUGLOG("find display size %{public}zd", mDisplays.size()); + return mDisplays; +} +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY diff --git a/hardware/display/src/display_device/drm_device.h b/hardware/display/src/display_device/drm_device.h new file mode 100755 index 0000000000000000000000000000000000000000..875cacb5c9b22a6f079b9ba4397955e30139c7e7 --- /dev/null +++ b/hardware/display/src/display_device/drm_device.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 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 DRM_DEVICE_H +#define DRM_DEVICE_H +#include +#include +#include +#include +#include "drm_connector.h" +#include "drm_crtc.h" +#include "drm_encoder.h" +#include "drm_plane.h" +#include "hdi_device_common.h" +#include "hdi_device_interface.h" +#include "hdi_display.h" +#include "hdi_shared_fd.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +class DrmPropertyEnum { +public: + explicit DrmPropertyEnum(drm_mode_property_enum *e) : value(e->value), name(e->name) { + } + ~DrmPropertyEnum() {}; + + uint64_t value; + std::string name; +}; + +struct DrmProperty { + uint32_t propId; + uint64_t value; + uint32_t type; + uint32_t flags; + std::string name; + std::vector values; + std::vector enums; + std::vector blob_ids; +}; + +class DrmDevice : public HdiDeviceInterface, std::enable_shared_from_this { +public: + static std::shared_ptr Create(); + static uint32_t ConvertToDrmFormat(PixelFormat fmtIn); + static int GetDrmFd(); + DrmDevice(); + ~DrmDevice() override {} + + std::vector> GetDrmPlane(uint32_t pipe, uint32_t type); + + int32_t GetCrtcProperty(const DrmCrtc &crtc, const std::string &name, DrmProperty &prop); + int32_t GetConnectorProperty(const DrmConnector &connector, const std::string &name, DrmProperty &prop); + int32_t GetPlaneProperty(const DrmPlane &plane, const std::string &name, DrmProperty &prop); + + int32_t GetProperty(uint32_t objId, uint32_t objType, const std::string &name, DrmProperty &prop); + std::shared_ptr GetDrmEncoderFromId(uint32_t id); + std::shared_ptr GetDrmConnectorFromId(uint32_t id); + std::shared_ptr GetDrmCrtcFromId(uint32_t id); + void CreateCrtc(drmModeCrtcPtr c); + std::unordered_map> DiscoveryDisplay() override; + int32_t Init() override; + void DeInit() override; + bool HandleHotplug(uint32_t dispId, bool plugIn) override; + +private: + static FdPtr mDrmFd; + static std::shared_ptr mInstance; + void FindAllCrtc(const drmModeResPtr &drmRes); + void FindAllEncoder(const drmModeResPtr &drmRes); + void FindAllConnector(const drmModeResPtr &drmRes); + void FindAllPlane(); + int InitNetLink(); + IdMapPtr mDisplays; + IdMapPtr mCrtcs; + IdMapPtr mEncoders; + IdMapPtr mConnectors; + std::vector> mPlanes; + std::unordered_map dispConnectorIdMaps_; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // DRM_DEVICE_H diff --git a/hardware/display/src/display_device/drm_display.cpp b/hardware/display/src/display_device/drm_display.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b0d794449d731586984f565595eba8c4e0fdb6b2 --- /dev/null +++ b/hardware/display/src/display_device/drm_display.cpp @@ -0,0 +1,289 @@ +/* + * Copyright (c) 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. + */ + +#include "drm_display.h" +#include +#include +#include +#include +#include +#include "display_gralloc.h" +#include "display_common.h" +#include "drm_device.h" +#include "drm_vsync_worker.h" +#include "hdi_drm_composition.h" +#include "hdi_gfx_composition.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +DrmDisplay::DrmDisplay(std::shared_ptr connector, std::shared_ptr crtc, + std::shared_ptr drmDevice) + : mDrmDevice(drmDevice), mConnector(connector), mCrtc(crtc) +{} + +DrmDisplay::~DrmDisplay() +{ + if (mCrtc != nullptr) { + mCrtc->UnBindDisplay(GetId()); + } +} + +int32_t DrmDisplay::Init() +{ + int ret; + DISPLAY_CHK_RETURN((mCrtc == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("crtc is null")); + DISPLAY_CHK_RETURN((mConnector == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("connector is null")); + DISPLAY_CHK_RETURN((mDrmDevice == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("drmDevice is null")); + + ret = HdiDisplay::Init(); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("init failed")); + auto preComp = std::make_unique(); + DISPLAY_CHK_RETURN((preComp == nullptr), DISPLAY_FAILURE, + DISPLAY_LOGE("can not new HdiGfxComposition errno %{public}d", errno)); + ret = preComp->Init(); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("can not init HdiGfxComposition")); + + auto postComp = std::make_unique(mConnector, mCrtc, mDrmDevice); + DISPLAY_CHK_RETURN((postComp == nullptr), DISPLAY_FAILURE, + DISPLAY_LOGE("can not new HdiDrmComposition errno %{public}d", errno)); + ret = postComp->Init(); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("can not init HdiDrmComposition")); + mComposer = std::make_unique(std::move(preComp), std::move(postComp)); + ret = mCrtc->BindToDisplay(GetId()); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("bind crtc failed")); + + ret = ChosePreferenceMode(); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("choose preference mode fialed")); + return DISPLAY_SUCCESS; +} + +int32_t DrmDisplay::GetDisplayCapability(DisplayCapability *info) +{ + mConnector->GetDisplayCap(*info); + return DISPLAY_SUCCESS; +} + +int32_t DrmDisplay::GetDisplaySupportedModes(uint32_t *num, DisplayModeInfo *modes) +{ + mConnector->GetDisplaySupportedModes(num, modes); + return DISPLAY_SUCCESS; +} + +int32_t DrmDisplay::GetDisplayMode(uint32_t *modeId) +{ + DISPLAY_CHK_RETURN((modeId == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("the in modeId is nullptr")); + *modeId = mCrtc->GetActiveModeId(); + return DISPLAY_SUCCESS; +} + +int32_t DrmDisplay::SetDisplayMode(uint32_t modeId) +{ + return mCrtc->SetActivieMode(modeId); +} + +int32_t DrmDisplay::GetDisplayPowerStatus(DispPowerStatus *status) +{ + DISPLAY_CHK_RETURN((status == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("status is nullptr")); + return ConvertToHdiPowerState(mConnector->GetDpmsState(), *status); +} + +int32_t DrmDisplay::SetDisplayPowerStatus(DispPowerStatus status) +{ + static int32_t fb_fd = -1; + int32_t err = -1; + const uint32_t FBIOBLANK = 0x4611; /* arg: 0 or vesa level + 1 */ + const uint32_t FB_BLANK_UNBLANK = 0; /* screen: unblanked, hsync: on, vsync: on */ + const uint32_t FB_BLANK_POWERDOWN = 4; /* screen: blanked, hsync: off, vsync: off */ + + DISPLAY_DEBUGLOG("SetDisplayPowerStatus power state %{public}u", status); + if (fb_fd < 0) { + fb_fd = open("/dev/graphics/fb0", O_RDWR); + if (fb_fd < 0) { + DISPLAY_LOGE("oepn fb0 file failed\n"); + return DISPLAY_NOT_SUPPORT; + } + } + switch (status) { + case POWER_STATUS_OFF: + case POWER_STATUS_STANDBY: + case POWER_STATUS_SUSPEND: + err = ioctl(fb_fd, FBIOBLANK, FB_BLANK_POWERDOWN); + break; + case POWER_STATUS_ON: + err = ioctl(fb_fd, FBIOBLANK, FB_BLANK_UNBLANK); + break; + default: + err = DISPLAY_FAILURE; + break; + } + if (err < 0) { + DISPLAY_LOGE("ioctl fb0 failed\n"); + return DISPLAY_FAILURE; + } + + return DISPLAY_SUCCESS; +} + +int32_t DrmDisplay::ConvertToHdiPowerState(uint32_t drmPowerState, DispPowerStatus &hdiPowerState) +{ + int32_t ret = DISPLAY_SUCCESS; + switch (drmPowerState) { + case DRM_MODE_DPMS_OFF: + hdiPowerState = POWER_STATUS_OFF; + break; + case DRM_MODE_DPMS_ON: + hdiPowerState = POWER_STATUS_ON; + break; + case DRM_MODE_DPMS_STANDBY: + hdiPowerState = POWER_STATUS_STANDBY; + break; + case DRM_MODE_DPMS_SUSPEND: + hdiPowerState = POWER_STATUS_SUSPEND; + break; + default: + hdiPowerState = POWER_STATUS_BUTT; + ret = DISPLAY_FAILURE; + break; + } + DISPLAY_DEBUGLOG("hdi power state %{public}u", hdiPowerState); + return ret; +} + +int32_t DrmDisplay::ConvertToDrmPowerState(DispPowerStatus hdiPowerState, uint32_t &drmPowerState) +{ + int32_t ret = DISPLAY_SUCCESS; + switch (hdiPowerState) { + case POWER_STATUS_OFF: + drmPowerState = DRM_MODE_DPMS_OFF; + break; + case POWER_STATUS_ON: + drmPowerState = DRM_MODE_DPMS_ON; + break; + case POWER_STATUS_STANDBY: + drmPowerState = DRM_MODE_DPMS_STANDBY; + break; + case POWER_STATUS_SUSPEND: + drmPowerState = DRM_MODE_DPMS_SUSPEND; + break; + default: + ret = DISPLAY_FAILURE; + break; + } + return ret; +} + +std::unique_ptr DrmDisplay::CreateHdiLayer(LayerType type) +{ + DISPLAY_DEBUGLOG(); + return std::make_unique(type); +} + +int32_t DrmDisplay::WaitForVBlank(uint64_t *ns) +{ + int ret; + constexpr uint64_t nPerS = 1000000000; + constexpr uint64_t nPerUS = 1000; + drmVBlank vbl = { + .request.type = DRM_VBLANK_RELATIVE, + .request.sequence = 0, + .request.signal = 0, + }; + DISPLAY_CHK_RETURN((ns == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("in ns is nullptr")); + ret = drmWaitVBlank(mDrmDevice->GetDrmFd(), &vbl); + DISPLAY_CHK_RETURN((ret != 0), DISPLAY_FAILURE, DISPLAY_LOGE("wait vblank failed errno %{public}d", errno)); + *ns = static_cast(vbl.reply.tval_sec * nPerS + vbl.reply.tval_usec * nPerUS); + return DISPLAY_SUCCESS; +} + +bool DrmDisplay::IsConnected() +{ + DISPLAY_DEBUGLOG("conneted %{public}d", mConnector->IsConnected()); + return mConnector->IsConnected(); +} + +int32_t DrmDisplay::PushFirstFrame() +{ + GrallocFuncs *grallocFucs = nullptr; + int ret = GrallocInitialize(&grallocFucs); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("Gralloc init failed")); + DrmMode mode; + ret = mConnector->GetModeFromId(mCrtc->GetActiveModeId(), mode); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, + DISPLAY_LOGE("can not get the mode from id %{public}d", mCrtc->GetActiveModeId())); + AllocInfo info = { + .width = mode.GetModeInfoPtr()->hdisplay, + .height = mode.GetModeInfoPtr()->vdisplay, + .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, + .format = PIXEL_FMT_BGRA_8888 + }; + + BufferHandle *buffer = nullptr; + ret = grallocFucs->AllocMem(&info, &buffer); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("can not alloc memory")); + mClientLayer->SetLayerBuffer(buffer, -1); + + std::vector layers; + HdiDrmComposition *drmComp = static_cast(mComposer->GetPostCompostion()); + drmComp->SetLayers(layers, *mClientLayer); + drmComp->Apply(true); + return DISPLAY_SUCCESS; +} + +int32_t DrmDisplay::ChosePreferenceMode() +{ + int32_t ret; + int32_t modeId = mConnector->GetPreferenceId(); + if (modeId == INVALID_MODE_ID) { + uint32_t num = 0; + ret = GetDisplaySupportedModes(&num, nullptr); + DISPLAY_CHK_RETURN((num == 0) && (ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("can not get modes")); + modeId = 0; + } + ret = SetDisplayMode(modeId); + // Push first frame to the drm, for that the vblank must init all the componet. + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("set display mode failed")); + return PushFirstFrame(); +} + +int32_t DrmDisplay::RegDisplayVBlankCallback(VBlankCallback cb, void *data) +{ + DISPLAY_DEBUGLOG("the VBlankCallback %{public}p ", cb); + (void)data; + std::shared_ptr vsyncCb = std::make_shared(cb, nullptr, mCrtc->GetPipe()); + DrmVsyncWorker::GetInstance().ReqesterVBlankCb(vsyncCb); + return DISPLAY_SUCCESS; +} + +int32_t DrmDisplay::SetDisplayVsyncEnabled(bool enabled) +{ + DISPLAY_DEBUGLOG("enable %{public}d", enabled); + DrmVsyncWorker::GetInstance().EnableVsync(enabled); + return DISPLAY_SUCCESS; +} + +int32_t DrmDisplay::GetDisplayBacklight(uint32_t *value) +{ + DISPLAY_CHK_RETURN((value == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("value is nullptr")); + return mConnector->GetBrightness(*value); +} + +int32_t DrmDisplay::SetDisplayBacklight(uint32_t value) +{ + return mConnector->SetBrightness(value); +} +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY diff --git a/hardware/display/src/display_device/drm_display.h b/hardware/display/src/display_device/drm_display.h new file mode 100644 index 0000000000000000000000000000000000000000..31b3bb40b4276598721b3f9d7a34b0ba32e88458 --- /dev/null +++ b/hardware/display/src/display_device/drm_display.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 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 DRM_DISPLAY_H +#define DRM_DISPLAY_H +#include +#include +#include "drm_connector.h" +#include "drm_crtc.h" +#include "drm_device.h" +#include "drm_plane.h" +#include "hdi_composer.h" +#include "hdi_drm_composition.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +class DrmDisplay : public HdiDisplay { +public: + DrmDisplay(std::shared_ptr connector, std::shared_ptr crtc, + std::shared_ptr drmDevice); + + ~DrmDisplay() override; + + int32_t Init() override; + int32_t GetDisplayCapability(DisplayCapability *info) override; + int32_t GetDisplaySupportedModes(uint32_t *num, DisplayModeInfo *modes) override; + int32_t GetDisplayMode(uint32_t *modeId) override; + int32_t SetDisplayMode(uint32_t modeId) override; + int32_t GetDisplayPowerStatus(DispPowerStatus *status) override; + int32_t SetDisplayPowerStatus(DispPowerStatus status) override; + int32_t GetDisplayBacklight(uint32_t *value) override; + int32_t SetDisplayBacklight(uint32_t value) override; + int32_t ChosePreferenceMode(); + int32_t RegDisplayVBlankCallback(VBlankCallback cb, void *data) override; + int32_t WaitForVBlank(uint64_t *ns) override; + bool IsConnected() override; + int32_t SetDisplayVsyncEnabled(bool enabled) override; + HdiDrmComposition *GetDrmComposition(); + +protected: + std::unique_ptr CreateHdiLayer(LayerType type) override; + +private: + int32_t PushFirstFrame(); + int32_t ConvertToHdiPowerState(uint32_t drmPowerState, DispPowerStatus &hdiPowerState); + int32_t ConvertToDrmPowerState(DispPowerStatus hdiPowerState, uint32_t &drmPowerState); + std::shared_ptr mDrmDevice; + std::shared_ptr mConnector; + std::shared_ptr mCrtc; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // HDI_DISPLAY_H diff --git a/hardware/display/src/display_device/drm_encoder.cpp b/hardware/display/src/display_device/drm_encoder.cpp new file mode 100755 index 0000000000000000000000000000000000000000..c69882a5b3aba33f74639fd9bbf539a527922142 --- /dev/null +++ b/hardware/display/src/display_device/drm_encoder.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (c) 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. + */ + +#include "drm_encoder.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +DrmEncoder::DrmEncoder(drmModeEncoder e) +{ + mEncoderId = e.encoder_id; + mCrtcId = e.crtc_id; + mPossibleCrtcs = e.possible_crtcs; +} + +int32_t DrmEncoder::PickIdleCrtcId(IdMapPtr &crtcs, uint32_t &crtcId) +{ + // find the crtc id; + DISPLAY_DEBUGLOG("crtcs szie %{public}zu", crtcs.size()); + std::shared_ptr crtc; + auto crtcIter = crtcs.find(mCrtcId); + if (crtcIter == crtcs.end()) { + DISPLAY_LOGW("can not find crtc for id %{public}d", mCrtcId); + crtcIter = crtcs.begin(); + return DISPLAY_FAILURE; + } + DISPLAY_CHK_RETURN((crtcIter == crtcs.end()), DISPLAY_FAILURE, + DISPLAY_LOGE("have no crtc %{public}zu ", crtcs.size())); + crtc = crtcIter->second; + DISPLAY_CHK_RETURN((crtc == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("crtc is null")); + + if (!crtc->CanBind()) { + crtc = nullptr; + for (const auto &posCrtcPair : crtcs) { + auto &posCrts = posCrtcPair.second; + DISPLAY_DEBUGLOG("try crtc id : %{public}d", posCrts->GetId()); + if (posCrts->CanBind() && ((1 << posCrts->GetPipe()) & mPossibleCrtcs)) { + crtc = posCrts; + } + } + } + DISPLAY_CHK_RETURN((crtc == nullptr), DISPLAY_FAILURE, + DISPLAY_LOGE("encoder %{public}d can not bind to idle crtc", mEncoderId)); + crtcId = crtc->GetId(); + return DISPLAY_SUCCESS; +} +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY diff --git a/hardware/display/src/display_device/drm_encoder.h b/hardware/display/src/display_device/drm_encoder.h new file mode 100644 index 0000000000000000000000000000000000000000..4f35578a54ef9ac26439f1ebf19cf342307fa509 --- /dev/null +++ b/hardware/display/src/display_device/drm_encoder.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 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 DRM_ENCODER_H +#define DRM_ENCODER_H +#include +#include +#include +#include +#include +#include + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +class DrmEncoder { +public: + explicit DrmEncoder(drmModeEncoder e); + virtual ~DrmEncoder() {} + uint32_t GetCrtcId() const + { + return mCrtcId; + } + void SetCrtcId(uint32_t id) + { + mCrtcId = id; + } + uint32_t GetPossibleCrtcs() const + { + return mPossibleCrtcs; + } + int32_t PickIdleCrtcId(IdMapPtr &crtcs, uint32_t &crtcId); + uint32_t GetId() const + { + return mEncoderId; + } + +private: + uint32_t mEncoderId; + uint32_t mCrtcId; + uint32_t mPossibleCrtcs; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // DRM_ENCODER_H \ No newline at end of file diff --git a/hardware/display/src/display_device/drm_plane.cpp b/hardware/display/src/display_device/drm_plane.cpp new file mode 100755 index 0000000000000000000000000000000000000000..8735a3e2671eb966bc1eb62461030dc6d1fcb8f4 --- /dev/null +++ b/hardware/display/src/display_device/drm_plane.cpp @@ -0,0 +1,185 @@ +/* + * Copyright (c) 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. + */ + +#include "drm_plane.h" +#include "drm_device.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +struct PlaneTypeName planeTypeNames[] = { + { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER0_WIN0, "Cluster0-win0" }, + { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER0_WIN1, "Cluster0-win1" }, + { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER1_WIN0, "Cluster1-win0" }, + { DrmPlaneType::DRM_PLANE_TYPE_CLUSTER1_WIN1, "Cluster1-win1" }, + + { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN0, "Esmart0-win0" }, + { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN1, "Esmart0-win1" }, + { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN2, "Esmart0-win2" }, + { DrmPlaneType::DRM_PLANE_TYPE_ESMART0_WIN3, "Esmart0-win3" }, + + { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN0, "Esmart1-win0" }, + { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN1, "Esmart1-win1" }, + { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN2, "Esmart1-win2" }, + { DrmPlaneType::DRM_PLANE_TYPE_ESMART1_WIN3, "Esmart1-win3" }, + + { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN0, "Smart0-win0" }, + { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN1, "Smart0-win1" }, + { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN2, "Smart0-win2" }, + { DrmPlaneType::DRM_PLANE_TYPE_SMART0_WIN3, "Smart0-win3" }, + + { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN0, "Smart1-win0" }, + { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN1, "Smart1-win1" }, + { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN2, "Smart1-win2" }, + { DrmPlaneType::DRM_PLANE_TYPE_SMART1_WIN3, "Smart1-win3" }, + + { DrmPlaneType::DRM_PLANE_TYPE_Unknown, "unknown" }, +}; + +DrmPlane::DrmPlane(drmModePlane &p) + : mId(p.plane_id), mPossibleCrtcs(p.possible_crtcs), mCrtcId(p.crtc_id), + mFormats(p.formats, p.formats + p.count_formats) +{} + +DrmPlane::~DrmPlane() +{ + DISPLAY_DEBUGLOG(); +} + +int DrmPlane::GetCrtcProp(DrmDevice &drmDevice) +{ + int32_t ret; + int32_t crtc_x, crtc_y, crtc_w, crtc_h; + DrmProperty prop; + + ret = drmDevice.GetPlaneProperty(*this, PROP_CRTC_X_ID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc_x prop id")); + mPropCrtc_xId = prop.propId; + crtc_x = prop.value; + + ret = drmDevice.GetPlaneProperty(*this, PROP_CRTC_Y_ID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc_y prop id")); + mPropCrtc_yId = prop.propId; + crtc_y = prop.value; + + ret = drmDevice.GetPlaneProperty(*this, PROP_CRTC_W_ID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc_w prop id")); + mPropCrtc_wId = prop.propId; + crtc_w = prop.value; + + ret = drmDevice.GetPlaneProperty(*this, PROP_CRTC_H_ID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc_h prop id")); + mPropCrtc_hId = prop.propId; + crtc_h = prop.value; + + DISPLAY_LOGE("plane %{public}d crtc_x %{public}d crtc_y %{public}d crtc_w %{public}d crtc_h %{public}d", + GetId(), crtc_x, crtc_y, crtc_w, crtc_h); + + return 0; +} + +int DrmPlane::GetSrcProp(DrmDevice &drmDevice) +{ + int32_t ret; + int32_t src_x, src_y, src_w, src_h; + DrmProperty prop; + + ret = drmDevice.GetPlaneProperty(*this, PROP_SRC_X_ID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane src_x prop id")); + mPropSrc_xId = prop.propId; + src_x = prop.value; + + ret = drmDevice.GetPlaneProperty(*this, PROP_SRC_Y_ID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane src_y prop id")); + mPropSrc_yId = prop.propId; + src_y = prop.value; + + ret = drmDevice.GetPlaneProperty(*this, PROP_SRC_W_ID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane src_w prop id")); + mPropSrc_wId = prop.propId; + src_w = prop.value; + + ret = drmDevice.GetPlaneProperty(*this, PROP_SRC_H_ID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane src_h prop id")); + mPropSrc_hId = prop.propId; + src_h = prop.value; + + DISPLAY_LOGE("plane %{public}d src_x %{public}d src_y %{public}d src_w %{public}d src_h %{public}d", + GetId(), src_x, src_y, src_w, src_h); + + return 0; +} + +int32_t DrmPlane::Init(DrmDevice &drmDevice) +{ + DISPLAY_DEBUGLOG(); + int32_t ret; + uint32_t find_name = 0; + DrmProperty prop; + GetCrtcProp(drmDevice); + GetSrcProp(drmDevice); + ret = drmDevice.GetPlaneProperty(*this, PROP_FBID, prop); + mPropFbId = prop.propId; + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("can not get plane fb id")); + ret = drmDevice.GetPlaneProperty(*this, PROP_IN_FENCE_FD, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get plane in fence prop id")); + mPropFenceInId = prop.propId; + ret = drmDevice.GetPlaneProperty(*this, PROP_CRTC_ID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc prop id")); + mPropCrtcId = prop.propId; + + ret = drmDevice.GetPlaneProperty(*this, PROP_ZPOS_ID, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc prop id")); + mPropZposId = prop.propId; + + ret = drmDevice.GetPlaneProperty(*this, "NAME", prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc prop id")); + + for (int i = 0; i < static_castARRAY_SIZE(planeTypeNames); i++) { + find_name = 0; + + for (auto &drmEnum : prop.enums) { + if (!strncmp(drmEnum.name.c_str(), (const char*)planeTypeNames[i].name, + strlen(planeTypeNames[i].name))) { + find_name = (1LL << drmEnum.value); + } + } + + if (find_name) { + DISPLAY_LOGI("find plane id %{public}d, type %{public}x %{public}s", + GetId(), planeTypeNames[i].type, planeTypeNames[i].name); + mWinType = planeTypeNames[i].type; + mName = planeTypeNames[i].name; + break; + } + } + + ret = drmDevice.GetPlaneProperty(*this, PROP_TYPE, prop); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("cat not get pane crtc prop id")); + switch (prop.value) { + case DRM_PLANE_TYPE_OVERLAY: + case DRM_PLANE_TYPE_PRIMARY: + case DRM_PLANE_TYPE_CURSOR: + mType = static_cast(prop.value); + break; + default: + DISPLAY_LOGE("unknown type value %{public}" PRIu64 "", prop.value); + return DISPLAY_FAILURE; + } + return DISPLAY_SUCCESS; +} +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY diff --git a/hardware/display/src/display_device/drm_plane.h b/hardware/display/src/display_device/drm_plane.h new file mode 100755 index 0000000000000000000000000000000000000000..8b29d3913c913a05c721edaa88f579cd65aa3aaf --- /dev/null +++ b/hardware/display/src/display_device/drm_plane.h @@ -0,0 +1,227 @@ +/* + * Copyright (c) 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 DRM_PLANE_H +#define DRM_PLANE_H +#include +#include +#include +#include +#include + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +enum class DrmPropertyType { + DRM_PROPERTY_TYPE_INT, + DRM_PROPERTY_TYPE_ENUM, + DRM_PROPERTY_TYPE_OBJECT, + DRM_PROPERTY_TYPE_BLOB, + DRM_PROPERTY_TYPE_BITMASK, + DRM_PROPERTY_TYPE_INVALID, +}; + +enum class DrmPlaneType { + DRM_PLANE_TYPE_CLUSTER0_WIN0 = 1 << 0, + DRM_PLANE_TYPE_CLUSTER0_WIN1 = 1 << 1, + + DRM_PLANE_TYPE_CLUSTER1_WIN0 = 1 << 2, + DRM_PLANE_TYPE_CLUSTER1_WIN1 = 1 << 3, + + DRM_PLANE_TYPE_ESMART0_WIN0 = 1 << 4, + DRM_PLANE_TYPE_ESMART0_WIN1 = 1 << 5, + DRM_PLANE_TYPE_ESMART0_WIN2 = 1 << 6, + DRM_PLANE_TYPE_ESMART0_WIN3 = 1 << 7, + + DRM_PLANE_TYPE_ESMART1_WIN0 = 1 << 8, + DRM_PLANE_TYPE_ESMART1_WIN1 = 1 << 9, + DRM_PLANE_TYPE_ESMART1_WIN2 = 1 << 10, + DRM_PLANE_TYPE_ESMART1_WIN3 = 1 << 11, + + DRM_PLANE_TYPE_SMART0_WIN0 = 1 << 12, + DRM_PLANE_TYPE_SMART0_WIN1 = 1 << 13, + DRM_PLANE_TYPE_SMART0_WIN2 = 1 << 14, + DRM_PLANE_TYPE_SMART0_WIN3 = 1 << 15, + + DRM_PLANE_TYPE_SMART1_WIN0 = 1 << 16, + DRM_PLANE_TYPE_SMART1_WIN1 = 1 << 17, + DRM_PLANE_TYPE_SMART1_WIN2 = 1 << 18, + DRM_PLANE_TYPE_SMART1_WIN3 = 1 << 19, + + DRM_PLANE_TYPE_CLUSTER0_MASK = 0x3, + DRM_PLANE_TYPE_CLUSTER1_MASK = 0xc, + DRM_PLANE_TYPE_CLUSTER_MASK = 0xf, + DRM_PLANE_TYPE_ESMART0_MASK = 0xf0, + DRM_PLANE_TYPE_ESMART1_MASK = 0xf00, + DRM_PLANE_TYPE_SMART0_MASK = 0xf000, + DRM_PLANE_TYPE_SMART1_MASK = 0xf0000, + DRM_PLANE_TYPE_Unknown = 0xffffffff, +}; + +struct PlaneMaskName { + DrmPlaneType mask; + const char *name; +}; + +struct PlaneTypeName { + DrmPlaneType type; + const char *name; +}; + +const std::string PROP_FBID = "FB_ID"; +const std::string PROP_IN_FENCE_FD = "IN_FENCE_FD"; +const std::string PROP_CRTC_ID = "CRTC_ID"; +const std::string PROP_TYPE = "type"; + +const std::string PROP_CRTC_X_ID = "CRTC_X"; +const std::string PROP_CRTC_Y_ID = "CRTC_Y"; +const std::string PROP_CRTC_W_ID = "CRTC_W"; +const std::string PROP_CRTC_H_ID = "CRTC_H"; + +const std::string PROP_SRC_X_ID = "SRC_X"; +const std::string PROP_SRC_Y_ID = "SRC_Y"; +const std::string PROP_SRC_W_ID = "SRC_W"; +const std::string PROP_SRC_H_ID = "SRC_H"; + +const std::string PROP_ZPOS_ID = "zpos"; + +class DrmDevice; + +class DrmPlane { +public: + explicit DrmPlane(drmModePlane &p); + virtual ~DrmPlane(); + int32_t Init(DrmDevice &drmDevice); + int GetCrtcProp(DrmDevice &drmDevice); + int GetSrcProp(DrmDevice &drmDevice); + uint32_t GetId() const + { + return mId; + } + uint32_t GetPropFbId() const + { + return mPropFbId; + } + uint32_t GetPropCrtc_xId() const + { + return mPropCrtc_xId; + } + uint32_t GetPropCrtc_yId() const + { + return mPropCrtc_yId; + } + uint32_t GetPropCrtc_wId() const + { + return mPropCrtc_wId; + } + uint32_t GetPropCrtc_hId() const + { + return mPropCrtc_hId; + } + uint32_t GetPropSrc_xId() const + { + return mPropSrc_xId; + } + uint32_t GetPropSrc_yId() const + { + return mPropSrc_yId; + } + uint32_t GetPropSrc_wId() const + { + return mPropSrc_wId; + } + uint32_t GetPropSrc_hId() const + { + return mPropSrc_hId; + } + uint32_t GetPropZposId() const + { + return mPropZposId; + } + uint32_t GetPropFenceInId() const + { + return mPropFenceInId; + } + uint32_t GetPropCrtcId() const + { + return mPropCrtcId; + } + uint32_t GetPossibleCrtcs() const + { + return mPossibleCrtcs; + } + uint32_t GetType() const + { + return mType; + } + void BindToPipe(uint32_t pipe) + { + mPipe = pipe; + } + void UnBindPipe() + { + mPipe = 0; + } + bool IsIdle() const + { + return (mPipe == 0); + } + uint32_t GetCrtcId() + { + return mCrtcId; + } + uint32_t GetPipe() + { + return mPipe; + } + DrmPlaneType GetWinType() + { + return mWinType; + } + std::string GetName() + { + return mName; + } +private: + uint32_t mId = 0; + uint32_t mPossibleCrtcs = 0; + uint32_t mCrtcId = 0; + uint32_t mPropFbId = 0; + uint32_t mPropFenceInId = 0; + uint32_t mPropCrtcId = 0; + DrmPlaneType mWinType = DrmPlaneType::DRM_PLANE_TYPE_Unknown; + std::string mName; + + uint32_t mPropCrtc_xId = 0; + uint32_t mPropCrtc_yId = 0; + uint32_t mPropCrtc_wId = 0; + uint32_t mPropCrtc_hId = 0; + + uint32_t mPropSrc_xId = 0; + uint32_t mPropSrc_yId = 0; + uint32_t mPropSrc_wId = 0; + uint32_t mPropSrc_hId = 0; + + uint32_t mPropZposId = 0; + + uint32_t mPipe = 0; + uint32_t mType = 0; + std::vector mFormats; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // DRM_PLANE_H diff --git a/hardware/display/src/display_device/drm_vsync_worker.cpp b/hardware/display/src/display_device/drm_vsync_worker.cpp new file mode 100644 index 0000000000000000000000000000000000000000..53ddd63aa399e82d047fe3c5981c3f2da607ec3e --- /dev/null +++ b/hardware/display/src/display_device/drm_vsync_worker.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (c) 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. + */ + +#include "drm_vsync_worker.h" +#include +#include "display_common.h" +#include "drm_device.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +DrmVsyncWorker::DrmVsyncWorker() {} + +int32_t DrmVsyncWorker::Init(int fd) +{ + DISPLAY_CHK_RETURN((fd < 0), DISPLAY_FAILURE, DISPLAY_LOGE("the fd is invalid")); + mDrmFd = fd; + DISPLAY_DEBUGLOG("the drm fd is %{public}d", fd); + mThread = std::make_unique([this]() { WorkThread(); }); + DISPLAY_CHK_RETURN((mThread == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("can not create thread")); + mRunning = true; + return DISPLAY_SUCCESS; +} + +DrmVsyncWorker &DrmVsyncWorker::GetInstance() +{ + static DrmVsyncWorker instance; + static std::once_flag once; + std::call_once(once, [&]() { + int ret = instance.Init(DrmDevice::GetDrmFd()); + if (ret != DISPLAY_SUCCESS) { + DISPLAY_LOGE("Vsync Worker Init failed"); + } + }); + return instance; +} + +DrmVsyncWorker::~DrmVsyncWorker() +{ + DISPLAY_DEBUGLOG(); + { + std::lock_guard lg(mMutex); + mRunning = false; + } + DISPLAY_DEBUGLOG(); + mCondition.notify_one(); + if (mThread != nullptr) { + mThread->join(); + } + DISPLAY_DEBUGLOG(); +} + +bool DrmVsyncWorker::WaitSignalAndCheckRuning() +{ + std::unique_lock ul(mMutex); + mCondition.wait(ul, [this]() { return (mEnable || !mRunning); }); + return mRunning; +} + + +uint64_t DrmVsyncWorker::WaitNextVBlank(unsigned int &sq) +{ + constexpr uint64_t SEC_TO_NSEC = 1000 * 1000 * 1000; + constexpr uint64_t USEC_TO_NSEC = 1000; + drmVBlank vblank = { + .request = + drmVBlankReq { + .type = DRM_VBLANK_RELATIVE, + .sequence = 1, + .signal = 0, + } + }; + /* The drmWaitVBlank need set the crtc pipe when there are multi crtcs in the system. */ + if (mCallBack->GetPipe() == 1) + vblank.request.type = drmVBlankSeqType((int)(vblank.request.type) | (int)DRM_VBLANK_SECONDARY); + int ret = drmWaitVBlank(mDrmFd, &vblank); + DISPLAY_CHK_RETURN((ret < 0), 0, + DISPLAY_LOGE("wait vblank failed ret : %{public}d errno %{public}d", ret, errno)); + sq = vblank.reply.sequence; + return (uint64_t)(vblank.reply.tval_sec * SEC_TO_NSEC + vblank.reply.tval_usec * USEC_TO_NSEC); +} + + +void DrmVsyncWorker::EnableVsync(bool enable) +{ + DISPLAY_DEBUGLOG(); + { + std::lock_guard lg(mMutex); + mEnable = enable; + } + mCondition.notify_one(); +} + +void DrmVsyncWorker::WorkThread() +{ + DISPLAY_DEBUGLOG(); + unsigned int seq = 0; + while (WaitSignalAndCheckRuning()) { + // wait the vblank + uint64_t time = WaitNextVBlank(seq); + if (mCallBack != nullptr) { + mCallBack->Vsync(seq, time); + } else { + DISPLAY_LOGE("the callbac is nullptr"); + } + } +} + +void DrmVsyncWorker::ReqesterVBlankCb(std::shared_ptr &cb) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN_NOT_VALUE((cb == nullptr), DISPLAY_LOGE("the VBlankCallback is nullptr ")); + mCallBack = cb; +} +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY \ No newline at end of file diff --git a/hardware/display/src/display_device/drm_vsync_worker.h b/hardware/display/src/display_device/drm_vsync_worker.h new file mode 100644 index 0000000000000000000000000000000000000000..c578e91c49e9fc8722115ef711cfd097fe1a3737 --- /dev/null +++ b/hardware/display/src/display_device/drm_vsync_worker.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 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 DRM_VSYNC_WORKER_H +#define DRM_VSYNC_WORKER_H +#include +#include +#include +#include +#include "display_device.h" +#include "hdi_device_common.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +class DrmVsyncWorker { +public: + DrmVsyncWorker(); + virtual ~DrmVsyncWorker(); + int32_t Init(int fd); + static DrmVsyncWorker &GetInstance(); + + void EnableVsync(bool enable); + void WorkThread(); + uint64_t WaitNextVBlank(unsigned int &sq); + bool WaitSignalAndCheckRuning(); + void ReqesterVBlankCb(std::shared_ptr &cb); + +private: + int mDrmFd = 0; + std::unique_ptr mThread; + bool mEnable = false; + std::mutex mMutex; + std::condition_variable mCondition; + std::shared_ptr mCallBack; + bool mRunning = false; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // DRM_VSYNC_WORKER_H \ No newline at end of file diff --git a/hardware/display/src/display_device/hdi_composer.cpp b/hardware/display/src/display_device/hdi_composer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..04eefdbcf0fefbbd48ede43d5cd37c50150e6d5f --- /dev/null +++ b/hardware/display/src/display_device/hdi_composer.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 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. + */ + +#include "hdi_composer.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +HdiComposer::HdiComposer(std::unique_ptr pre, std::unique_ptr post) +{ + mPreComp = std::move(pre); + mPostComp = std::move(post); +} + +int32_t HdiComposer::Prepare(std::vector &layers, HdiLayer &clientLayer) +{ + int ret = mPreComp->SetLayers(layers, clientLayer); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("pre composition prepare failed")); + ret = mPostComp->SetLayers(layers, clientLayer); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("post composition prepare failed")); + return DISPLAY_SUCCESS; +} + +int32_t HdiComposer::Commit(bool modeSet) +{ + int ret = mPreComp->Apply(modeSet); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("pre composition apply failed")); + ret = mPostComp->Apply(modeSet); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("post composition apply failed")); + return DISPLAY_SUCCESS; +} +} // OHOS +} // HDI +} // DISPLAY diff --git a/hardware/display/src/display_device/hdi_composer.h b/hardware/display/src/display_device/hdi_composer.h new file mode 100644 index 0000000000000000000000000000000000000000..a3b69de50dd58f1af8317533bf1ce9ab4fb23e38 --- /dev/null +++ b/hardware/display/src/display_device/hdi_composer.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 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 HDI_COMPOSER_H +#define HDI_COMPOSER_H +#include +#include +#include "hdi_layer.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +class HdiComposition { +public: + HdiComposition() {} + virtual int32_t Init() + { + return DISPLAY_SUCCESS; + }; + virtual int32_t SetLayers(std::vector &layers, HdiLayer &clientLayer) + { + return DISPLAY_SUCCESS; + } + virtual int32_t Apply(bool modeSet) + { + return DISPLAY_SUCCESS; + } + virtual ~HdiComposition() {} + +protected: + std::vector mCompLayers; +}; + +class HdiComposer { +public: + HdiComposer(std::unique_ptr pre, std::unique_ptr post); + virtual ~HdiComposer() {}; + int32_t Prepare(std::vector &layers, HdiLayer &clientLayer); + int32_t Commit(bool modeSet); + HdiComposition *GetPreCompostion() + { + return mPreComp.get(); + } + HdiComposition *GetPostCompostion() + { + return mPostComp.get(); + } + +private: + std::unique_ptr mPreComp; + std::unique_ptr mPostComp; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // HDI_COMPOSER_H \ No newline at end of file diff --git a/hardware/display/src/display_device/hdi_device_common.h b/hardware/display/src/display_device/hdi_device_common.h new file mode 100644 index 0000000000000000000000000000000000000000..c5ceaf092a29ef909e045ffa8916668e69910c67 --- /dev/null +++ b/hardware/display/src/display_device/hdi_device_common.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 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 HDI_DEVICE_COMMON_H +#define HDI_DEVICE_COMMON_H +#include +#include +#include "display_type.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +const int32_t INVALID_MODE_ID = -1; +const uint32_t DRM_INVALID_ID = 0xFFFFFFFF; +template using IdMapPtr = std::unordered_map>; +class DrmEncoder; +class DrmCrtc; +class DrmPlane; +class DrmDevice; +class DrmConnector; +class VsyncCallBack; +class DrmVsyncWorker; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // HDI_DEVICE_COMMON_H \ No newline at end of file diff --git a/hardware/display/src/display_device/hdi_device_interface.cpp b/hardware/display/src/display_device/hdi_device_interface.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4f79074b9f9516b224afa8b109cdb87a2c37a3be --- /dev/null +++ b/hardware/display/src/display_device/hdi_device_interface.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 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. + */ + +#include "hdi_device_interface.h" +#include +#include "display_common.h" +#include "drm_device.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +std::vector> HdiDeviceInterface::DiscoveryDevice() +{ + DISPLAY_DEBUGLOG(); + int ret; + std::vector> devices; + std::shared_ptr drmDevice = DrmDevice::Create(); + if (!drmDevice) { + DISPLAY_LOGE("can not create drm device"); + } + ret = drmDevice->Init(); + if (ret == DISPLAY_SUCCESS) { + DISPLAY_DEBUGLOG("drm device init success"); + devices.push_back(std::move(drmDevice)); + } else { + DISPLAY_LOGE("drm device init failed"); + } + return devices; +} +} +} +} \ No newline at end of file diff --git a/hardware/display/src/display_device/hdi_device_interface.h b/hardware/display/src/display_device/hdi_device_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..f0bb3cccd4137bf53a02ff7c48d03b77a5ba3eb4 --- /dev/null +++ b/hardware/display/src/display_device/hdi_device_interface.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 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 HDI_DEVICE_INTERFACE_H +#define HDI_DEVICE_INTERFACE_H +#include +#include +#include +#include "hdi_display.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +class HdiDeviceInterface { +public: + static std::vector> DiscoveryDevice(); + virtual std::unordered_map> DiscoveryDisplay() = 0; + virtual bool HandleHotplug(uint32_t dispId, bool plugIn) = 0; + virtual int32_t Init() = 0; + virtual void DeInit() = 0; + virtual ~HdiDeviceInterface() {}; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // HDI_DEVICE_INTERFACE_H \ No newline at end of file diff --git a/hardware/display/src/display_device/hdi_display.cpp b/hardware/display/src/display_device/hdi_display.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cf229c0062b5c979319f374b189e0df7dd673b47 --- /dev/null +++ b/hardware/display/src/display_device/hdi_display.cpp @@ -0,0 +1,233 @@ +/* + * Copyright (c) 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. + */ + +#include "hdi_display.h" +#include +#include "display_common.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +uint32_t HdiDisplay::mIdleId = 0; +std::unordered_set HdiDisplay::mIdSets; + +uint32_t HdiDisplay::GetIdleId() +{ + const uint32_t oldIdleId = mIdleId; + uint32_t id = INVALIDE_DISPLAY_ID; + // ensure the mIdleId not INVALIDE_DISPLAY_ID + mIdleId = mIdleId % INVALIDE_DISPLAY_ID; + do { + auto iter = mIdSets.find(mIdleId); + if (iter == mIdSets.end()) { + id = mIdleId; + break; + } + mIdleId = (mIdleId + 1) % INVALIDE_DISPLAY_ID; + } while (oldIdleId != mIdleId); + mIdSets.emplace(id); + mIdleId++; + return id; +} + + +int32_t HdiDisplay::Init() +{ + DISPLAY_DEBUGLOG(); + uint32_t id = GetIdleId(); + DISPLAY_CHK_RETURN((id == INVALIDE_DISPLAY_ID), DISPLAY_FAILURE, DISPLAY_LOGE("have no id to used")); + mId = id; + auto layer = CreateHdiLayer(LAYER_TYPE_GRAPHIC); + DISPLAY_CHK_RETURN((layer.get() == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("can not create hdi layer for client")); + mClientLayer = std::move(layer); + DISPLAY_DEBUGLOG("the id is %{public}d", id); + return DISPLAY_SUCCESS; +} + + +HdiDisplay::~HdiDisplay() +{ + mIdSets.erase(mId); +} + +int32_t HdiDisplay::SetLayerZorder(uint32_t layerId, uint32_t zorder) +{ + DISPLAY_DEBUGLOG("layerId : %{public}d", layerId); + auto iter = mLayersMap.find(layerId); + DISPLAY_CHK_RETURN((iter == mLayersMap.end()), DISPLAY_FAILURE, + DISPLAY_LOGE("can not find the layer %{public}d", layerId)); + auto layer = mLayersMap[layerId].get(); + if (layer->GetZorder() == zorder) { + DISPLAY_DEBUGLOG("zorder no change layerId %{public}d, zorder %{public}d", layerId, zorder); + return DISPLAY_SUCCESS; + } + // reset to sort + auto zRange = mLayers.equal_range(layer); + DISPLAY_DEBUGLOG("zorder range : zRange.first %{public}p zRange.second %{public}p", *zRange.first, *zRange.second); + for (auto c = zRange.first; c != zRange.second; c++) { + if (*c == layer) { + mLayers.erase(c); + break; + } + } + layer->SetLayerZorder(zorder); + mLayers.emplace(layer); + return DISPLAY_SUCCESS; +} + +int32_t HdiDisplay::CreateLayer(const LayerInfo *layerInfo, uint32_t *layerId) +{ + DISPLAY_DEBUGLOG(); + int ret; + DISPLAY_CHK_RETURN((layerInfo == nullptr), DISPLAY_PARAM_ERR, DISPLAY_LOGE("LayerInfo is null")); + DISPLAY_CHK_RETURN((layerId == nullptr), DISPLAY_PARAM_ERR, DISPLAY_LOGE("layerId is null")); + auto layer = CreateHdiLayer(layerInfo->type); + DISPLAY_CHK_RETURN((layer.get() == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("can not create hdi layer")); + ret = layer->Init(); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("Layer Init failed")); + *layerId = layer->GetId(); + mLayers.insert(layer.get()); + mLayersMap.emplace(layer->GetId(), std::move(layer)); + DISPLAY_DEBUGLOG("mLayers size %{public}zu", mLayers.size()); + DISPLAY_DEBUGLOG("mLayerMap size %{public}zu", mLayersMap.size()); + return DISPLAY_SUCCESS; +} + +std::unique_ptr HdiDisplay::CreateHdiLayer(LayerType type) +{ + DISPLAY_DEBUGLOG(); + return std::make_unique(type); +} + + +int32_t HdiDisplay::CloseLayer(uint32_t layerId) +{ + DISPLAY_DEBUGLOG("layerId %{public}d", layerId); + auto iter = mLayersMap.find(layerId); + DISPLAY_CHK_RETURN((iter == mLayersMap.end()), DISPLAY_FAILURE, + DISPLAY_LOGE("can not find the layer id %{public}d", layerId)); + mLayers.erase(iter->second.get()); + mLayersMap.erase(layerId); + return DISPLAY_SUCCESS; +} + +int32_t HdiDisplay::GetDisplayCompChange(uint32_t *num, uint32_t *layers, int32_t *type) +{ + DISPLAY_CHK_RETURN((num == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("the num is nullptr")); + *num = mChangeLayers.size(); + if ((layers == nullptr) && (type == nullptr)) { + return DISPLAY_SUCCESS; + } + DISPLAY_DEBUGLOG("set the layers and type"); + for (uint32_t i = 0; i < mChangeLayers.size(); i++) { + HdiLayer *layer = mChangeLayers[i]; + if (layers != nullptr) { + *(layers + i) = layer->GetId(); + } + if (type != nullptr) { + *(type + i) = layer->GetCompositionType(); + } + } + return DISPLAY_SUCCESS; +} + +int32_t HdiDisplay::GetDisplayReleaseFence(uint32_t *num, uint32_t *layers, int32_t *fences) +{ + DISPLAY_CHK_RETURN((num == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("the num is nullptr")); + *num = mLayers.size(); + if ((layers == nullptr) && (fences == nullptr)) { + return DISPLAY_SUCCESS; + } + DISPLAY_DEBUGLOG("set the layer fences"); + int i = 0; + for (auto layer : mLayers) { + if (layers != nullptr) { + *(layers + i) = layer->GetId(); + } + if (fences != nullptr) { + *(fences + i) = dup(layer->GetReleaseFenceFd()); + } + DISPLAY_DEBUGLOG("layer id %{public}d fencefd %{public}d", layer->GetId(), layer->GetReleaseFenceFd()); + i++; + } + return DISPLAY_SUCCESS; +} + +int32_t HdiDisplay::PrepareDisplayLayers(bool *needFlushFb) +{ + DISPLAY_DEBUGLOG(); + mChangeLayers.clear(); + std::vector layers; + uint32_t topZpos = 3; + for (auto c : mLayers) { + layers.push_back(c); + } + DISPLAY_DEBUGLOG(" mLayers size %{public}zu layers size %{public}zu", mLayers.size(), layers.size()); + + /* Set the target layer to the top. + * It would not by cover by other layer. + */ + mClientLayer->SetLayerZorder(topZpos); + + mComposer->Prepare(layers, *mClientLayer); + // get the change layers + for (auto &layer : layers) { + if (layer->GetDeviceSelect() != layer->GetCompositionType()) { + DISPLAY_DEBUGLOG("layer change"); + layer->SetLayerCompositionType(layer->GetDeviceSelect()); + } + mChangeLayers.push_back(layer); + } + *needFlushFb = true; + return DISPLAY_SUCCESS; +} + +int32_t HdiDisplay::Commit(int32_t *fence) +{ + DISPLAY_DEBUGLOG(); + mComposer->Commit(false); + *fence = dup(mClientLayer->GetReleaseFenceFd()); + DISPLAY_DEBUGLOG("the release fence is %{public}d", *fence); + return DISPLAY_SUCCESS; +} + +int32_t HdiDisplay::SetDisplayClientBuffer(const BufferHandle *buffer, int32_t fence) +{ + mClientLayer->SetLayerBuffer(buffer, fence); + return DISPLAY_SUCCESS; +} + +HdiLayer *HdiDisplay::GetHdiLayer(uint32_t id) +{ + DISPLAY_DEBUGLOG("id : %{public}d", id); + auto iter = mLayersMap.find(id); + DISPLAY_CHK_RETURN((iter == mLayersMap.end()), nullptr, DISPLAY_LOGE("can not find the layer %{public}d", id)); + return iter->second.get(); +} + +VsyncCallBack::VsyncCallBack(VBlankCallback cb, void *data, uint32_t displayId) : mVBlankCb(cb), + mData(data), mPipe(displayId) +{ + DISPLAY_DEBUGLOG("VsyncCallBack %{public}p", cb); +} + +void VsyncCallBack::Vsync(unsigned int sequence, uint64_t ns) +{ + DISPLAY_CHK_RETURN_NOT_VALUE((mVBlankCb == nullptr), DISPLAY_LOGE("the callback is nullptr")); + mVBlankCb(sequence, ns, mData); +} +} +} +} diff --git a/hardware/display/src/display_device/hdi_display.h b/hardware/display/src/display_device/hdi_display.h new file mode 100644 index 0000000000000000000000000000000000000000..277b55cfbb345ae6db02555dabe5bdee21ba8803 --- /dev/null +++ b/hardware/display/src/display_device/hdi_display.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 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 HDI_DISPLAY_H +#define HDI_DISPLAY_H +#include +#include +#include +#include +#include "display_device.h" +#include "hdi_composer.h" +#include "hdi_layer.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +const uint32_t INVALIDE_DISPLAY_ID = 0xffffffff; +const uint32_t DISPLAY_TYPE_DRM = (1 << 31); + +class VsyncCallBack { +public: + VsyncCallBack(VBlankCallback cb, void *data, uint32_t pipe); + virtual void Vsync(unsigned int sequence, uint64_t ns); + virtual ~VsyncCallBack() {} + uint32_t GetPipe() + { + return mPipe; + } +private: + VBlankCallback mVBlankCb; + void *mData; + uint32_t mPipe; +}; + + +class HdiDisplay { +public: + uint32_t GetId() const + { + return mId; + } + virtual int32_t Init(); + virtual void DeInit() {} + HdiDisplay() {} + virtual ~HdiDisplay(); + virtual int32_t GetDisplayCapability(DisplayCapability *info) + { + return DISPLAY_NOT_SUPPORT; + } + virtual int32_t GetDisplaySupportedModes(uint32_t *num, DisplayModeInfo *modes) + { + return DISPLAY_NOT_SUPPORT; + } + virtual int32_t GetDisplayMode(uint32_t *modeId) + { + return DISPLAY_NOT_SUPPORT; + } + virtual int32_t SetDisplayMode(uint32_t modeId) + { + return DISPLAY_NOT_SUPPORT; + } + virtual int32_t GetDisplayPowerStatus(DispPowerStatus *status) + { + return DISPLAY_NOT_SUPPORT; + } + virtual int32_t SetDisplayPowerStatus(DispPowerStatus status) + { + return DISPLAY_NOT_SUPPORT; + } + virtual int32_t GetDisplayBacklight(uint32_t *value) + { + return DISPLAY_NOT_SUPPORT; + } + virtual int32_t SetDisplayBacklight(uint32_t value) + { + return DISPLAY_NOT_SUPPORT; + } + virtual int32_t CreateLayer(const LayerInfo *layerInfo, uint32_t *layerId); + virtual int32_t CloseLayer(uint32_t layerId); + virtual int32_t PrepareDisplayLayers(bool *needFlushFb); + virtual int32_t Commit(int32_t *fence); + virtual int32_t GetDisplayCompChange(uint32_t *num, uint32_t *layers, int32_t *type); + virtual int32_t SetLayerZorder(uint32_t layerId, uint32_t zorder); + virtual bool IsConnected() + { + return false; + } + virtual int32_t RegDisplayVBlankCallback(VBlankCallback cb, void *data) + { + return DISPLAY_NOT_SUPPORT; + } + virtual int32_t SetDisplayVsyncEnabled(bool enabled) + { + return DISPLAY_NOT_SUPPORT; + } + virtual int32_t GetDisplayReleaseFence(uint32_t *num, uint32_t *layers, int32_t *fences); + virtual int32_t SetDisplayClientBuffer(const BufferHandle *buffer, int32_t fence); + virtual int32_t WaitForVBlank(uint64_t *ns) + { + return DISPLAY_NOT_SUPPORT; + } + HdiLayer *GetHdiLayer(uint32_t id); + +protected: + virtual std::unique_ptr CreateHdiLayer(LayerType type); + std::unique_ptr mComposer; + + static uint32_t GetIdleId(); + static uint32_t mIdleId; + static std::unordered_set mIdSets; + uint32_t mId = INVALIDE_DISPLAY_ID; + std::unordered_map> mLayersMap; + std::multiset mLayers; + std::unique_ptr mClientLayer; + std::vector mChangeLayers; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // HDI_DISPLAY_H diff --git a/hardware/display/src/display_device/hdi_drm_composition.cpp b/hardware/display/src/display_device/hdi_drm_composition.cpp new file mode 100755 index 0000000000000000000000000000000000000000..cfeb1fc5979df28b248dbdd5676cfe44bb7af896 --- /dev/null +++ b/hardware/display/src/display_device/hdi_drm_composition.cpp @@ -0,0 +1,298 @@ +/* + * Copyright (c) 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. + */ + +#include "hdi_drm_composition.h" +#include +#include "hdi_drm_layer.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +HdiDrmComposition::HdiDrmComposition(const std::shared_ptr &connector, + const std::shared_ptr &crtc, + const std::shared_ptr &drmDevice) + : mDrmDevice(drmDevice), mConnector(connector), mCrtc(crtc) +{ + DISPLAY_DEBUGLOG(); +} + +int32_t HdiDrmComposition::Init() +{ + DISPLAY_DEBUGLOG(); + mPrimPlanes.clear(); + mOverlayPlanes.clear(); + mPlanes.clear(); + DISPLAY_CHK_RETURN((mCrtc == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("crtc is null")); + DISPLAY_CHK_RETURN((mConnector == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("connector is null")); + DISPLAY_CHK_RETURN((mDrmDevice == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("drmDevice is null")); + mPrimPlanes = mDrmDevice->GetDrmPlane(mCrtc->GetPipe(), DRM_PLANE_TYPE_PRIMARY); + mOverlayPlanes = mDrmDevice->GetDrmPlane(mCrtc->GetPipe(), DRM_PLANE_TYPE_OVERLAY); + mPlanes.insert(mPlanes.end(), mPrimPlanes.begin(), mPrimPlanes.end()); + mPlanes.insert(mPlanes.end(), mOverlayPlanes.begin(), mOverlayPlanes.end()); + return DISPLAY_SUCCESS; +} + +int32_t HdiDrmComposition::SetLayers(std::vector &layers, HdiLayer &clientLayer) +{ + // now we do not surpport present direct + DISPLAY_DEBUGLOG(); + mCompLayers.clear(); + mCompLayers.push_back(&clientLayer); + return DISPLAY_SUCCESS; +} + +int32_t HdiDrmComposition::SetCrtcProperty(DrmPlane &drmPlane, + drmModeAtomicReqPtr pset, + int32_t bufferW, + int32_t bufferH) +{ + int ret; + + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropCrtc_xId(), 0); + DISPLAY_LOGI("set the fb planeid %{public}d, GetPropCrtc_xId %{public}d, crop.x %{public}d", drmPlane.GetId(), + drmPlane.GetPropCrtc_xId(), 0); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the fb planeid fialed errno : %{public}d", errno)); + + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropCrtc_yId(), 0); + DISPLAY_LOGI("set the fb planeid %{public}d, GetPropCrtc_yId %{public}d, crop.y %{public}d", drmPlane.GetId(), + drmPlane.GetPropCrtc_yId(), 0); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the fb planeid fialed errno : %{public}d", errno)); + + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropCrtc_wId(), bufferW); + DISPLAY_LOGI("set the fb planeid %{public}d, GetPropCrtc_wId %{public}d, crop.w %{public}d", drmPlane.GetId(), + drmPlane.GetPropCrtc_wId(), bufferW); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the fb planeid fialed errno : %{public}d", errno)); + + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropCrtc_hId(), bufferH); + DISPLAY_LOGI("set the fb planeid %{public}d, GetPropCrtc_hId %{public}d, crop.h %{public}d", drmPlane.GetId(), + drmPlane.GetPropCrtc_xId(), bufferH); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the fb planeid fialed errno : %{public}d", errno)); + + return DISPLAY_SUCCESS; +} + +int32_t HdiDrmComposition::SetSrcProperty(DrmPlane &drmPlane, + drmModeAtomicReqPtr pset, + int32_t bufferW, + int32_t bufferH) +{ + int ret; + + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropSrc_xId(), 0<<16); // 16:shift left 16 bits + DISPLAY_LOGI("set the fb planeid %{public}d, GetPropSrc_xId %{public}d, displayRect.x %{public}d", drmPlane.GetId(), + drmPlane.GetPropSrc_xId(), 0); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the fb planeid fialed errno : %{public}d", errno)); + + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropSrc_yId(), 0<<16); // 16:shift left 16 bits + DISPLAY_LOGI("set the fb planeid %{public}d, GetPropSrc_yId %{public}d, displayRect.y %{public}d", drmPlane.GetId(), + drmPlane.GetPropSrc_yId(), 0); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the fb planeid fialed errno : %{public}d", errno)); + + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropSrc_wId(), + bufferW<<16); // 16:shift left 16 bits + DISPLAY_LOGI("set the fb planeid %{public}d, GetPropCrtc_wId %{public}d, displayRect.w %{public}d", + drmPlane.GetId(), drmPlane.GetPropSrc_wId(), bufferW); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the fb planeid fialed errno : %{public}d", errno)); + + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropSrc_hId(), + bufferH<<16); // 16:shift left 16 bits + DISPLAY_LOGI("set the fb planeid %{public}d, GetPropSrc_hId %{public}d, displayRect.h %{public}d", drmPlane.GetId(), + drmPlane.GetPropSrc_hId(), bufferH); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the fb planeid fialed errno : %{public}d", errno)); + + return DISPLAY_SUCCESS; +} + +int32_t HdiDrmComposition::ApplyPlane(HdiDrmLayer &layer, + HdiLayer &hlayer, + DrmPlane &drmPlane, + drmModeAtomicReqPtr pset) +{ + int ret; + int fenceFd = layer.GetAcquireFenceFd(); + int propId = drmPlane.GetPropFenceInId(); + HdiLayerBuffer *layerBuffer = hlayer.GetCurrentBuffer(); + int32_t bufferW = layerBuffer->GetWight(); + int32_t bufferH = layerBuffer->GetHeight(); + + DISPLAY_DEBUGLOG(); + if (propId != 0) { + DISPLAY_LOGI("set the fence in prop"); + if (fenceFd >= 0) { + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), propId, fenceFd); + DISPLAY_DEBUGLOG("set the IfenceProp plane id %{public}d, propId %{public}d, fenceFd %{public}d", + drmPlane.GetId(), propId, fenceFd); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set IN_FENCE_FD failed")); + } + } + + ret = SetCrtcProperty(drmPlane, pset, bufferW, bufferH); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set Crtc fialed errno : %{public}d", errno)); + + ret = SetSrcProperty(drmPlane, pset, bufferW, bufferH); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set Src fialed errno : %{public}d", errno)); + + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropZposId(), layer.GetZorder()); + DISPLAY_LOGI("set the fb planeid %{public}d, GetPropZposId %{public}d, zpos %{public}d", drmPlane.GetId(), + drmPlane.GetPropZposId(), layer.GetZorder()); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the zpos fialed errno : %{public}d", errno)); + + // set fb id + DrmGemBuffer *gemBuffer = layer.GetGemBuffer(); + DISPLAY_CHK_RETURN((gemBuffer == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("current gemBuffer is nullptr")); + DISPLAY_CHK_RETURN((!gemBuffer->IsValid()), DISPLAY_FAILURE, DISPLAY_LOGE("the DrmGemBuffer is invalid")); + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropFbId(), gemBuffer->GetFbId()); + DISPLAY_DEBUGLOG("set the fb planeid %{public}d, propId %{public}d, fbId %{public}d", drmPlane.GetId(), + drmPlane.GetPropFbId(), gemBuffer->GetFbId()); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set fb id fialed errno : %{public}d", errno)); + + // set crtc id + ret = drmModeAtomicAddProperty(pset, drmPlane.GetId(), drmPlane.GetPropCrtcId(), mCrtc->GetId()); + DISPLAY_DEBUGLOG("set the crtc planeId %{public}d, propId %{public}d, crtcId %{public}d", drmPlane.GetId(), + drmPlane.GetPropCrtcId(), mCrtc->GetId()); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set crtc id fialed errno : %{public}d", errno)); + return DISPLAY_SUCCESS; +} + +int32_t HdiDrmComposition::UpdateMode(std::unique_ptr &modeBlock, drmModeAtomicReq &pset) +{ + // set the mode + DISPLAY_LOGI(); + if (mCrtc->NeedModeSet()) { + modeBlock = mConnector->GetModeBlockFromId(mCrtc->GetActiveModeId()); + if ((modeBlock != nullptr) && (modeBlock->GetBlockId() != DRM_INVALID_ID)) { + // set to active + DISPLAY_DEBUGLOG("set crtc to active"); + int ret = drmModeAtomicAddProperty(&pset, mCrtc->GetId(), mCrtc->GetActivePropId(), 1); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, + DISPLAY_LOGE("can not add the active prop errno %{public}d", errno)); + + // set the mode id + DISPLAY_DEBUGLOG("set the mode"); + ret = drmModeAtomicAddProperty(&pset, mCrtc->GetId(), mCrtc->GetModePropId(), modeBlock->GetBlockId()); + DISPLAY_LOGI("set the mode planeId %{public}d, propId %{public}d, GetBlockId: %{public}d", mCrtc->GetId(), + mCrtc->GetModePropId(), modeBlock->GetBlockId()); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, + DISPLAY_LOGE("can not add the mode prop errno %{public}d", errno)); + ret = drmModeAtomicAddProperty(&pset, mConnector->GetId(), mConnector->GetPropCrtcId(), mCrtc->GetId()); + DISPLAY_LOGI("set the connector id: %{public}d, propId %{public}d, crtcId %{public}d", mConnector->GetId(), + mConnector->GetPropCrtcId(), mCrtc->GetId()); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, + DISPLAY_LOGE("can not add the crtc id prop %{public}d", errno)); + } + } + return DISPLAY_SUCCESS; +} + +int32_t HdiDrmComposition::RemoveUnusePlane(drmModeAtomicReqPtr pset) +{ + int ret = 0; + /* Remove useless planes from the drm */ + for (uint32_t j = 0; j < mPlanes.size(); j++) { + auto &drmPlane = mPlanes[j]; + if ((static_cast(drmPlane->GetWinType()) & mCrtc->GetPlaneMask()) && drmPlane->GetPipe() == 0) { + DISPLAY_LOGI("no used plane %{public}s id %{public}d", drmPlane->GetName().c_str(), drmPlane->GetId()); + ret = drmModeAtomicAddProperty(pset, drmPlane->GetId(), drmPlane->GetPropFbId(), 0); + ret = drmModeAtomicAddProperty(pset, drmPlane->GetId(), drmPlane->GetPropFbId(), 0); + drmPlane->UnBindPipe(); + } + } + return DISPLAY_SUCCESS; +} + +int32_t HdiDrmComposition::FindPlaneAndApply(drmModeAtomicReqPtr pset) +{ + int32_t ret = 0; + for (uint32_t i = 0; i < mCompLayers.size(); i++) { + HdiDrmLayer *layer = static_cast(mCompLayers[i]); + HdiLayer *hlayer = mCompLayers[i]; + for (uint32_t j = 0; j < mPlanes.size(); j++) { + auto &drmPlane = mPlanes[j]; + if (drmPlane->GetPipe() != 0 && drmPlane->GetPipe() != (1 << mCrtc->GetPipe())) { + DISPLAY_LOGI("plane %{public}d used pipe %{public}d crtc pipe %{public}d", drmPlane->GetId(), + drmPlane->GetPipe(), mCrtc->GetPipe()); + continue; + } + /* Check whether the plane belond to the crtc */ + if (!(static_cast(drmPlane->GetWinType()) & mCrtc->GetPlaneMask())) { + continue; + } + DISPLAY_LOGI("use plane %{public}d WinType %{public}x crtc %{public}d PlaneMask %{public}x", + drmPlane->GetId(), drmPlane->GetWinType(), mCrtc->GetId(), mCrtc->GetPlaneMask()); + + if (drmPlane->GetCrtcId() == mCrtc->GetId() || drmPlane->GetCrtcId() == 0) { + ret = ApplyPlane(*layer, *hlayer, *drmPlane, pset); + if (ret != DISPLAY_SUCCESS) { + DISPLAY_LOGE("apply plane failed"); + break; + } + /* mark the plane is used by crtc */ + drmPlane->BindToPipe(1 << mCrtc->GetPipe()); + break; + } + } + } + return DISPLAY_SUCCESS; +} + +int32_t HdiDrmComposition::Apply(bool modeSet) +{ + uint64_t crtcOutFence = -1; + int ret = 0; + std::unique_ptr modeBlock; + int drmFd = mDrmDevice->GetDrmFd(); + + DISPLAY_LOGI("mPlane size: %{public}zd mCompLayers size: %{public}zd", mPlanes.size(), mCompLayers.size()); + DISPLAY_CHK_RETURN((mPlanes.size() < mCompLayers.size()), DISPLAY_FAILURE, DISPLAY_LOGE("plane not enough")); + drmModeAtomicReqPtr pset = drmModeAtomicAlloc(); + DISPLAY_CHK_RETURN((pset == nullptr), DISPLAY_NULL_PTR, + DISPLAY_LOGE("drm atomic alloc failed errno %{public}d", errno)); + AtomicReqPtr atomicReqPtr = AtomicReqPtr(pset); + + // set the outFence property + ret = drmModeAtomicAddProperty(atomicReqPtr.Get(), mCrtc->GetId(), mCrtc->GetOutFencePropId(), + (uint64_t)&crtcOutFence); + + DISPLAY_DEBUGLOG("Apply Set OutFence crtc id: %{public}d, fencePropId %{public}d", mCrtc->GetId(), + mCrtc->GetOutFencePropId()); + DISPLAY_CHK_RETURN((ret < 0), DISPLAY_FAILURE, DISPLAY_LOGE("set the outfence property of crtc failed ")); + + // set the plane info. + DISPLAY_LOGI("mCompLayers size %{public}zd", mCompLayers.size()); + DISPLAY_LOGI("crtc id %{public}d connect id %{public}d encoder id %{public}d", mCrtc->GetId(), + mConnector->GetId(), mConnector->GetEncoderId()); + + /* Bind the plane not used by other crtcs to the crtc. */ + FindPlaneAndApply(atomicReqPtr.Get()); + /* Remove useless planes from the drm */ + RemoveUnusePlane(atomicReqPtr.Get()); + + ret = UpdateMode(modeBlock, *(atomicReqPtr.Get())); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("update mode failed")); + uint32_t flags = DRM_MODE_ATOMIC_ALLOW_MODESET; + + ret = drmModeAtomicCommit(drmFd, atomicReqPtr.Get(), flags, nullptr); + DISPLAY_CHK_RETURN((ret != 0), DISPLAY_FAILURE, + DISPLAY_LOGE("drmModeAtomicCommit failed %{public}d errno %{public}d", ret, errno)); + // set the release fence + for (auto layer : mCompLayers) { + layer->SetReleaseFence(static_cast(crtcOutFence)); + } + + return DISPLAY_SUCCESS; +} +} // OHOS +} // HDI +} // DISPLAY diff --git a/hardware/display/src/display_device/hdi_drm_composition.h b/hardware/display/src/display_device/hdi_drm_composition.h new file mode 100755 index 0000000000000000000000000000000000000000..042ff3c49fb38009123a625bbb0a715b0d9cc776 --- /dev/null +++ b/hardware/display/src/display_device/hdi_drm_composition.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 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 HDI_DRM_COMPOSITION_H +#define HDI_DRM_COMPOSITION_H +#include +#include +#include +#include +#include "drm_device.h" +#include "hdi_composer.h" +#include "hdi_device_common.h" +#include "hdi_drm_layer.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +class AtomicReqPtr { +public: + explicit AtomicReqPtr(drmModeAtomicReqPtr ptr) : mPtr(ptr) {} + virtual ~AtomicReqPtr() + { + if (mPtr != nullptr) + drmModeAtomicFree(mPtr); + } + drmModeAtomicReqPtr Get() const + { + return mPtr; + } + +private: + drmModeAtomicReqPtr mPtr; +}; + +class HdiDrmComposition : public HdiComposition { +public: + HdiDrmComposition(const std::shared_ptr &connector, + const std::shared_ptr &crtc, + const std::shared_ptr &drmDevice); + ~HdiDrmComposition() override {} + int32_t Init() override; + int32_t SetLayers(std::vector &layers, HdiLayer &clientLayer) override; + int32_t Apply(bool modeSet) override; + int32_t UpdateMode(std::unique_ptr &modeBlock, drmModeAtomicReq &pset); + +private: + int32_t ApplyPlane(HdiDrmLayer &layer, HdiLayer &hlayer, DrmPlane &drmPlane, drmModeAtomicReqPtr pset); + int32_t SetSrcProperty(DrmPlane &drmPlane, drmModeAtomicReqPtr pset, int32_t bufferW, int32_t bufferH); + int32_t SetCrtcProperty(DrmPlane &drmPlane, drmModeAtomicReqPtr pset, int32_t bufferW, int32_t bufferH); + int32_t RemoveUnusePlane(drmModeAtomicReqPtr pset); + int32_t FindPlaneAndApply(drmModeAtomicReqPtr pset); + std::shared_ptr mDrmDevice; + std::shared_ptr mConnector; + std::shared_ptr mCrtc; + std::vector> mPrimPlanes; + std::vector> mOverlayPlanes; + std::vector> mPlanes; +}; +} // OHOS +} // HDI +} // DISPLAY + +#endif // HDI_DRM_COMPOSITION_H diff --git a/hardware/display/src/display_device/hdi_drm_layer.cpp b/hardware/display/src/display_device/hdi_drm_layer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5cb701fead6d885993de81477d0e5d7c56781b65 --- /dev/null +++ b/hardware/display/src/display_device/hdi_drm_layer.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (c) 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. + */ + +#include "hdi_drm_layer.h" +#include +#include +#include "drm_device.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +DrmGemBuffer::DrmGemBuffer(int drmFd, HdiLayerBuffer &hdl) : mDrmFd(drmFd) +{ + DISPLAY_DEBUGLOG(); + Init(mDrmFd, hdl); +} + +void DrmGemBuffer::Init(int drmFd, HdiLayerBuffer &hdl) +{ + int ret; + const int MAX_COUNT = 4; + uint32_t pitches[MAX_COUNT] = {0}; + uint32_t gemHandles[MAX_COUNT] = {0}; + uint32_t offsets[MAX_COUNT] = {0}; + DISPLAY_DEBUGLOG("hdl %{public}" PRIx64 "", hdl.GetPhysicalAddr()); + DISPLAY_CHK_RETURN_NOT_VALUE((drmFd < 0), DISPLAY_LOGE("can not init drmfd %{public}d", drmFd)); + mDrmFormat = DrmDevice::ConvertToDrmFormat(static_cast(hdl.GetFormat())); + ret = drmPrimeFDToHandle(drmFd, hdl.GetFb(), &mGemHandle); + DISPLAY_CHK_RETURN_NOT_VALUE((ret != 0), DISPLAY_LOGE("can not get handle errno %{public}d", errno)); + + pitches[0] = hdl.GetStride(); + gemHandles[0] = mGemHandle; + offsets[0] = 0; + ret = drmModeAddFB2(drmFd, hdl.GetWight(), hdl.GetHeight(), mDrmFormat, gemHandles, pitches, offsets, &mFdId, 0); + DISPLAY_DEBUGLOG("mGemHandle %{public}d mFdId %{public}d", mGemHandle, mFdId); + DISPLAY_DEBUGLOG("w: %{public}d h: %{public}d mDrmFormat : %{public}d gemHandles: %{public}d pitches: %{public}d " + "offsets: %{public}d", + hdl.GetWight(), hdl.GetHeight(), mDrmFormat, gemHandles[0], pitches[0], offsets[0]); + DISPLAY_CHK_RETURN_NOT_VALUE((ret != 0), DISPLAY_LOGE("can not add fb errno %{public}d", errno)); +} + +DrmGemBuffer::~DrmGemBuffer() +{ + DISPLAY_DEBUGLOG(); + if (mFdId) { + if (drmModeRmFB(mDrmFd, mFdId)) { + DISPLAY_LOGE("can not free fdid %{public}d errno %{public}d", mFdId, errno); + } + } + + if (mGemHandle) { + struct drm_gem_close gemClose = { 0 }; + gemClose.handle = mGemHandle; + if (drmIoctl(mDrmFd, DRM_IOCTL_GEM_CLOSE, &gemClose)) { + DISPLAY_LOGE("can not free gem handle %{public}d errno : %{public}d", mGemHandle, errno); + } + } +} + +bool DrmGemBuffer::IsValid() +{ + DISPLAY_DEBUGLOG(); + return (mGemHandle != INVALID_DRM_ID) && (mFdId != INVALID_DRM_ID); +} + +DrmGemBuffer *HdiDrmLayer::GetGemBuffer() +{ + DISPLAY_DEBUGLOG(); + std::unique_ptr ptr = std::make_unique(DrmDevice::GetDrmFd(), *GetCurrentBuffer()); + mLastBuffer = std::move(mCurrentBuffer); + mCurrentBuffer = std::move(ptr); + return mCurrentBuffer.get(); +} +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY diff --git a/hardware/display/src/display_device/hdi_drm_layer.h b/hardware/display/src/display_device/hdi_drm_layer.h new file mode 100644 index 0000000000000000000000000000000000000000..43ad767b4ef42a6f8921cb1f71c3e9cbe8c74630 --- /dev/null +++ b/hardware/display/src/display_device/hdi_drm_layer.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 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 HDI_DRM_LAYER_H +#define HDI_DRM_LAYER_H +#include +#include +#include "buffer_handle.h" +#include "display_common.h" +#include "drm_fourcc.h" +#include "hdi_layer.h" +#include "hdi_device_common.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +const int INVALID_DRM_ID = 0; +class DrmGemBuffer { +public: + DrmGemBuffer(int drmFd, HdiLayerBuffer &hdl); + virtual ~DrmGemBuffer(); + uint32_t GetFbId() const + { + return mFdId; + } + bool IsValid(); + +private: + void Init(int drmFd, HdiLayerBuffer &hdl); + uint32_t mGemHandle = 0; + uint32_t mFdId = 0; + int mDrmFd = -1; // the fd can not close. the other module will close it. + uint32_t mDrmFormat = DRM_FORMAT_INVALID; +}; + +class HdiDrmLayer : public HdiLayer { +public: + explicit HdiDrmLayer(LayerType type) : HdiLayer(type) {} + ~HdiDrmLayer() override {} + // Return value optimization + DrmGemBuffer *GetGemBuffer(); + +private: + std::unique_ptr mCurrentBuffer; + std::unique_ptr mLastBuffer; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // HDI_DRM_LAYER_H diff --git a/hardware/display/src/display_device/hdi_gfx_composition.cpp b/hardware/display/src/display_device/hdi_gfx_composition.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5b53fef257bb8745b8c7a173ac1bf9bc58bd8e0f --- /dev/null +++ b/hardware/display/src/display_device/hdi_gfx_composition.cpp @@ -0,0 +1,200 @@ +/* + * Copyright (c) 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. + */ + +#include +#include +#include +#include "display_gfx.h" +#include "hdi_gfx_composition.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +int32_t HdiGfxComposition::Init(void) +{ + DISPLAY_DEBUGLOG(); + int32_t ret = GfxModuleInit(); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS) || (mGfxFuncs == nullptr), DISPLAY_FAILURE, + DISPLAY_LOGE("GfxModuleInit failed")); + ret = mGfxFuncs->InitGfx(); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("gfx init failed")); + return DISPLAY_SUCCESS; +} + +int32_t HdiGfxComposition::GfxModuleInit(void) +{ + DISPLAY_DEBUGLOG(); + mGfxModule = dlopen("libdisplay_gfx.z.so", RTLD_NOW | RTLD_NOLOAD); + if (mGfxModule != nullptr) { + DISPLAY_LOGI("Module '%{public}s' already loaded", "libdisplay_gfx.z.so"); + } else { + DISPLAY_LOGI("Loading module '%{public}s'", "libdisplay_gfx.z.so"); + mGfxModule = dlopen("libdisplay_gfx.z.so", RTLD_NOW); + if (mGfxModule == nullptr) { + DISPLAY_LOGE("Failed to load module: %{public}s", dlerror()); + return DISPLAY_FAILURE; + } + } + + using InitFunc = int32_t (*)(GfxFuncs **funcs); + InitFunc func = reinterpret_cast(dlsym(mGfxModule, "GfxInitialize")); + if (func == nullptr) { + DISPLAY_LOGE("Failed to lookup %{public}s function: %s", "GfxInitialize", dlerror()); + dlclose(mGfxModule); + return DISPLAY_FAILURE; + } + return func(&mGfxFuncs); +} + +int32_t HdiGfxComposition::GfxModuleDeinit(void) +{ + DISPLAY_DEBUGLOG(); + int32_t ret = DISPLAY_SUCCESS; + if (mGfxModule == nullptr) { + using DeinitFunc = int32_t (*)(GfxFuncs *funcs); + DeinitFunc func = reinterpret_cast(dlsym(mGfxModule, "GfxUninitialize")); + if (func == nullptr) { + DISPLAY_LOGE("Failed to lookup %{public}s function: %s", "GfxUninitialize", dlerror()); + } else { + ret = func(mGfxFuncs); + } + dlclose(mGfxModule); + } + return ret; +} + +bool HdiGfxComposition::CanHandle(HdiLayer &hdiLayer) +{ + DISPLAY_DEBUGLOG(); + (void)hdiLayer; + return true; +} + +int32_t HdiGfxComposition::SetLayers(std::vector &layers, HdiLayer &clientLayer) +{ + DISPLAY_DEBUGLOG("layers size %{public}zd", layers.size()); + mClientLayer = &clientLayer; + mCompLayers.clear(); + for (auto &layer : layers) { + if (CanHandle(*layer)) { + if ((layer->GetCompositionType() != COMPOSITION_VIDEO) && + (layer->GetCompositionType() != COMPOSITION_CURSOR)) { + layer->SetDeviceSelect(COMPOSITION_DEVICE); + } else { + layer->SetDeviceSelect(layer->GetCompositionType()); + } + mCompLayers.push_back(layer); + } + } + DISPLAY_DEBUGLOG("composer layers size %{public}zd", mCompLayers.size()); + return DISPLAY_SUCCESS; +} + +void HdiGfxComposition::InitGfxSurface(ISurface &iSurface, HdiLayerBuffer &buffer) +{ + iSurface.width = buffer.GetWight(); + iSurface.height = buffer.GetHeight(); + iSurface.phyAddr = buffer.GetFb(); // buffer.GetPhysicalAddr(); + iSurface.enColorFmt = (PixelFormat)buffer.GetFormat(); + iSurface.stride = buffer.GetStride(); + iSurface.bAlphaExt1555 = true; + iSurface.bAlphaMax255 = true; + iSurface.alpha0 = 0XFF; + iSurface.alpha1 = 0XFF; + DISPLAY_DEBUGLOG("iSurface fd %{public}d w:%{public}d h:%{public}d addr:0x%{public}" \ + PRIx64 " fmt:%{public}d stride:%{public}d", + buffer.GetFb(), iSurface.width, iSurface.height, + buffer.GetPhysicalAddr(), iSurface.enColorFmt, iSurface.stride); +} + +// now not handle the alpha of layer +int32_t HdiGfxComposition::BlitLayer(HdiLayer &src, HdiLayer &dst) +{ + ISurface srcSurface = { 0 }; + ISurface dstSurface = { 0 }; + GfxOpt opt = { 0 }; + DISPLAY_DEBUGLOG(); + HdiLayerBuffer *srcBuffer = src.GetCurrentBuffer(); + DISPLAY_CHK_RETURN((srcBuffer == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("the srcbuffer is null")); + DISPLAY_DEBUGLOG("init the src iSurface"); + InitGfxSurface(srcSurface, *srcBuffer); + + HdiLayerBuffer *dstBuffer = dst.GetCurrentBuffer(); + DISPLAY_CHK_RETURN((dstBuffer == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("can not get client layer buffer")); + DISPLAY_DEBUGLOG("init the dst iSurface"); + InitGfxSurface(dstSurface, *dstBuffer); + + opt.blendType = src.GetLayerBlenType(); + DISPLAY_DEBUGLOG("blendType %{public}d", opt.blendType); + opt.enPixelAlpha = true; + opt.enableScale = true; + + if (src.GetAlpha().enGlobalAlpha) { // is alpha is 0xff we not set it + opt.enGlobalAlpha = true; + srcSurface.alpha0 = src.GetAlpha().gAlpha; + DISPLAY_DEBUGLOG("src alpha %{public}x", src.GetAlpha().gAlpha); + } + opt.rotateType = src.GetTransFormType(); + DISPLAY_DEBUGLOG(" the roate type is %{public}d", opt.rotateType); + IRect crop = src.GetLayerCrop(); + IRect displayRect = src.GetLayerDisplayRect(); + DISPLAY_DEBUGLOG("crop x: %{public}d y : %{public}d w : %{public}d h: %{public}d", crop.x, crop.y, crop.w, crop.h); + DISPLAY_DEBUGLOG("displayRect x: %{public}d y : %{public}d w : %{public}d h : %{public}d", + displayRect.x, displayRect.y, displayRect.w, displayRect.h); + DISPLAY_CHK_RETURN(mGfxFuncs == nullptr, DISPLAY_FAILURE, DISPLAY_LOGE("Blit: mGfxFuncs is null")); + return mGfxFuncs->Blit(&srcSurface, &crop, &dstSurface, &displayRect, &opt); +} + +int32_t HdiGfxComposition::ClearRect(HdiLayer &src, HdiLayer &dst) +{ + ISurface dstSurface = { 0 }; + GfxOpt opt = { 0 }; + DISPLAY_DEBUGLOG(); + HdiLayerBuffer *dstBuffer = dst.GetCurrentBuffer(); + DISPLAY_CHK_RETURN((dstBuffer == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("can not get client layer buffer")); + InitGfxSurface(dstSurface, *dstBuffer); + IRect rect = src.GetLayerDisplayRect(); + DISPLAY_CHK_RETURN(mGfxFuncs == nullptr, DISPLAY_FAILURE, DISPLAY_LOGE("Rect: mGfxFuncs is null")); + return mGfxFuncs->FillRect(&dstSurface, &rect, 0, &opt); +} + +int32_t HdiGfxComposition::Apply(bool modeSet) +{ + int32_t ret; + DISPLAY_DEBUGLOG("composer layers size %{public}zd", mCompLayers.size()); + for (uint32_t i = 0; i < mCompLayers.size(); i++) { + HdiLayer *layer = mCompLayers[i]; + CompositionType compType = layer->GetCompositionType(); + switch (compType) { + case COMPOSITION_VIDEO: + ret = ClearRect(*layer, *mClientLayer); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, + DISPLAY_LOGE("clear layer %{public}d failed", i)); + break; + case COMPOSITION_DEVICE: + ret = BlitLayer(*layer, *mClientLayer); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, + DISPLAY_LOGE("blit layer %{public}d failed ", i)); + break; + default: + DISPLAY_LOGE("the gfx composition can not surpport the type %{public}d", compType); + break; + } + } + return DISPLAY_SUCCESS; +} +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY diff --git a/hardware/display/src/display_device/hdi_gfx_composition.h b/hardware/display/src/display_device/hdi_gfx_composition.h new file mode 100644 index 0000000000000000000000000000000000000000..d9654461d39a806aa9952be86d8a4ac327c90d60 --- /dev/null +++ b/hardware/display/src/display_device/hdi_gfx_composition.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 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 HDI_GFX_COMPOSITION_H +#define HDI_GFX_COMPOSITION_H +#include "display_gfx.h" +#include "hdi_composer.h" +namespace OHOS { +namespace HDI { +namespace DISPLAY { +class HdiGfxComposition : public HdiComposition { +public: + int32_t Init(void) override; + int32_t SetLayers(std::vector &layers, HdiLayer &clientLayer) override; + int32_t Apply(bool modeSet) override; + ~HdiGfxComposition() override + { + (void)GfxModuleDeinit(); + } + +private: + bool CanHandle(HdiLayer &hdiLayer); + void InitGfxSurface(ISurface &iSurface, HdiLayerBuffer &buffer); + int32_t BlitLayer(HdiLayer &src, HdiLayer &dst); + int32_t ClearRect(HdiLayer &src, HdiLayer &dst); + int32_t GfxModuleInit(void); + int32_t GfxModuleDeinit(void); + void *mGfxModule = nullptr; + GfxFuncs *mGfxFuncs = nullptr; + HdiLayer *mClientLayer; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // HDI_GFX_COMPOSITION_H diff --git a/hardware/display/src/display_device/hdi_layer.cpp b/hardware/display/src/display_device/hdi_layer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..20808a91be0de4c6061b362b46dea65cd104b6ad --- /dev/null +++ b/hardware/display/src/display_device/hdi_layer.cpp @@ -0,0 +1,204 @@ +/* + * Copyright (c) 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. + */ + +#include "hdi_layer.h" +#include +#include + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +uint32_t HdiLayer::mIdleId = 0; +std::unordered_set HdiLayer::mIdSets; + +HdiLayerBuffer::HdiLayerBuffer(const BufferHandle &hdl) + : mPhyAddr(hdl.phyAddr), mHeight(hdl.height), mWidth(hdl.width), mStride(hdl.stride), mFormat(hdl.format) +{ + DISPLAY_DEBUGLOG(); + mFd = dup(hdl.fd); + mHandle = hdl; + if (mFd < 0) { + DISPLAY_LOGE("the fd : %{public}d dup failed errno %{public}d", hdl.fd, errno); + } +} + +HdiLayerBuffer::~HdiLayerBuffer() +{ + DISPLAY_DEBUGLOG(); + if (mFd >= 0) { + close(mFd); + } +} + +HdiLayerBuffer &HdiLayerBuffer::operator = (const BufferHandle &right) +{ + DISPLAY_DEBUGLOG(); + if (mFd >= 0) { + close(mFd); + } + mFd = dup(right.fd); + mPhyAddr = right.phyAddr; + mWidth = right.width; + mHeight = right.height; + mStride = right.stride; + mFormat = right.format; + return *this; +} + +uint32_t HdiLayer::GetIdleId() +{ + const uint32_t oldIdleId = mIdleId; + uint32_t id = INVALIDE_LAYER_ID; + // ensure the mIdleId not INVALIDE_LAYER_ID + mIdleId = mIdleId % INVALIDE_LAYER_ID; + do { + auto iter = mIdSets.find(mIdleId); + if (iter == mIdSets.end()) { + id = mIdleId; + break; + } + mIdleId = (mIdleId + 1) % INVALIDE_LAYER_ID; + } while (oldIdleId != mIdleId); + mIdSets.emplace(id); + mIdleId++; + DISPLAY_DEBUGLOG("id %{public}d mIdleId %{public}d", id, mIdleId); + return id; +} + +int32_t HdiLayer::Init() +{ + DISPLAY_DEBUGLOG(); + uint32_t id = GetIdleId(); + DISPLAY_CHK_RETURN((id == INVALIDE_LAYER_ID), DISPLAY_FAILURE, DISPLAY_LOGE("have no id to used")); + mId = id; + return DISPLAY_SUCCESS; +} + +int32_t HdiLayer::SetLayerSize(IRect *rect) +{ + DISPLAY_CHK_RETURN((rect == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("in rect is nullptr")); + DISPLAY_DEBUGLOG(" displayRect x: %{public}d y : %{public}d w : %{public}d h : %{public}d", rect->x, rect->y, + rect->w, rect->h); + mDisplayRect = *rect; + return DISPLAY_SUCCESS; +} + +int32_t HdiLayer::SetLayerCrop(IRect *rect) +{ + DISPLAY_CHK_RETURN((rect == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("in rect is nullptr")); + DISPLAY_DEBUGLOG("id : %{public}d crop x: %{public}d y : %{public}d w : %{public}d h : %{public}d", mId, + rect->x, rect->y, rect->w, rect->h); + mCrop = *rect; + return DISPLAY_SUCCESS; +} + +void HdiLayer::SetLayerZorder(uint32_t zorder) +{ + DISPLAY_DEBUGLOG("id : %{public}d zorder : %{public}d ", mId, zorder); + mZorder = zorder; +} + +int32_t HdiLayer::SetLayerPreMulti(bool preMul) +{ + DISPLAY_DEBUGLOG(); + mPreMul = preMul; + return DISPLAY_SUCCESS; +} + +int32_t HdiLayer::SetLayerAlpha(LayerAlpha *alpha) +{ + DISPLAY_CHK_RETURN((alpha == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("in alpha is nullptr")); + DISPLAY_DEBUGLOG("enable alpha %{public}d galpha 0x%{public}x", alpha->enGlobalAlpha, alpha->gAlpha); + mAlpha = *alpha; + return DISPLAY_SUCCESS; +} + +int32_t HdiLayer::SetTransformMode(TransformType type) +{ + DISPLAY_DEBUGLOG("TransformType %{public}d", type); + mTransformType = type; + return DISPLAY_SUCCESS; +} + +int32_t HdiLayer::SetLayerDirtyRegion(IRect *region) +{ + DISPLAY_CHK_RETURN((region == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("the in rect is null")); + DISPLAY_DEBUGLOG("id : %{public}d DirtyRegion x: %{public}d y : %{public}d w : %{public}d h : %{public}d", mId, + region->x, region->y, region->w, region->h); + return DISPLAY_SUCCESS; +} + +int32_t HdiLayer::SetLayerVisibleRegion(uint32_t num, IRect *rect) +{ + DISPLAY_DEBUGLOG("id : %{public}d DirtyRegion x: %{public}d y : %{public}d w : %{public}d h : %{public}d", mId, rect->x, + rect->y, rect->w, rect->h); + return DISPLAY_SUCCESS; +} + +int32_t HdiLayer::SetLayerBuffer(const BufferHandle *buffer, int32_t fence) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((buffer == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("buffer is nullptr")); + std::unique_ptr layerbuffer = std::make_unique(*buffer); + mHdiBuffer = std::move(layerbuffer); + mAcquireFence = fence; + return DISPLAY_SUCCESS; +} + +int32_t HdiLayer::SetLayerCompositionType(CompositionType type) +{ + DISPLAY_DEBUGLOG("CompositionType type %{public}d", type); + mCompositionType = type; + return DISPLAY_SUCCESS; +} + +int32_t HdiLayer::SetLayerBlendType(BlendType type) +{ + DISPLAY_DEBUGLOG("BlendType type %{public}d", type); + mBlendType = type; + return DISPLAY_SUCCESS; +} + +void HdiLayer::SetPixel(const BufferHandle &handle, int x, int y, uint32_t color) +{ + const int32_t pixelBytes = 4; + DISPLAY_CHK_RETURN_NOT_VALUE((handle.format <= 0), + DISPLAY_LOGE("CheckPixel do not support format %{public}d", handle.format)); + DISPLAY_CHK_RETURN_NOT_VALUE((handle.virAddr == nullptr), DISPLAY_LOGE("CheckPixel viraddr is null must map it")); + DISPLAY_CHK_RETURN_NOT_VALUE((x < 0 || x >= handle.width), + DISPLAY_LOGE("CheckPixel invalid parameter x:%{public}d width:%{public}d", x, handle.width)); + DISPLAY_CHK_RETURN_NOT_VALUE((y < 0 || y >= handle.height), + DISPLAY_LOGE("CheckPixel invalid parameter y:%{public}d height:%{public}d", y, handle.height)); + int32_t position = y * handle.width + x; + if ((position * pixelBytes) > handle.size) { + DISPLAY_LOGE("the pixel postion outside\n"); + } + uint32_t *pixel = reinterpret_cast(handle.virAddr) + position; + *pixel = color; +} + +void HdiLayer::ClearColor(uint32_t color) +{ + DISPLAY_DEBUGLOG(); + BufferHandle &handle = mHdiBuffer->mHandle; + for (int32_t x = 0; x < handle.width; x++) { + for (int32_t y = 0; y < handle.height; y++) { + SetPixel(handle, x, y, color); + } + } +} +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY diff --git a/hardware/display/src/display_device/hdi_layer.h b/hardware/display/src/display_device/hdi_layer.h new file mode 100644 index 0000000000000000000000000000000000000000..88803ce8e6086713bd9a33162bcdab8481f9f2ae --- /dev/null +++ b/hardware/display/src/display_device/hdi_layer.h @@ -0,0 +1,191 @@ +/* + * Copyright (c) 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 HDI_LAYER_H +#define HDI_LAYER_H +#include +#include +#include "buffer_handle.h" +#include "display_common.h" +#include "hdi_device_common.h" +#include "hdi_shared_fd.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +const uint32_t INVALIDE_LAYER_ID = 0xffffffff; +struct HdiLayerBuffer { +public: + explicit HdiLayerBuffer(const BufferHandle &hdl); + virtual ~HdiLayerBuffer(); + HdiLayerBuffer &operator = (const BufferHandle &right); + uint64_t GetPhysicalAddr() const + { + return mPhyAddr; + } + int32_t GetHeight() const + { + return mHeight; + } + int32_t GetWight() const + { + return mWidth; + } + int32_t GetStride() const + { + return mStride; + } + int32_t GetFormat() const + { + return mFormat; + } + int GetFb() const + { + return mFd; + } + BufferHandle mHandle; + +private: + uint64_t mPhyAddr = 0; + int32_t mHeight = 0; + int32_t mWidth = 0; + int32_t mStride = 0; + int32_t mFormat = 0; + int mFd = -1; +}; + +class HdiLayer { +public: + explicit HdiLayer(LayerType type) : mType(type) {} + int32_t Init(); + uint32_t GetId() const + { + return mId; + } + uint32_t GetZorder() const + { + return mZorder; + } + const IRect &GetLayerDisplayRect() const + { + return mDisplayRect; + } + const IRect &GetLayerCrop() const + { + return mCrop; + } + bool GetLayerPreMulti() const + { + return mPreMul; + } + const LayerAlpha &GetAlpha() const + { + return mAlpha; + } + LayerType GetType() const + { + return mType; + } + TransformType GetTransFormType() const + { + return mTransformType; + } + BlendType GetLayerBlenType() const + { + return mBlendType; + } + CompositionType GetCompositionType() const + { + return mCompositionType; + } + void SetDeviceSelect(CompositionType type) + { + DISPLAY_DEBUGLOG("%{public}d", type); + mDeviceSelect = type; + } + CompositionType GetDeviceSelect() const + { + return mDeviceSelect; + } + + int GetAcquireFenceFd() + { + return mAcquireFence.GetFd(); + } + int GetReleaseFenceFd() + { + return mReleaseFence.GetFd(); + } + void SetReleaseFence(int fd) + { + mReleaseFence = fd; + }; + void ClearColor(uint32_t color); + + void SetPixel(const BufferHandle &handle, int x, int y, uint32_t color); + + virtual int32_t SetLayerSize(IRect *rect); + virtual int32_t SetLayerCrop(IRect *rect); + virtual void SetLayerZorder(uint32_t zorder); + virtual int32_t SetLayerPreMulti(bool preMul); + virtual int32_t SetLayerAlpha(LayerAlpha *alpha); + virtual int32_t SetTransformMode(TransformType type); + virtual int32_t SetLayerDirtyRegion(IRect *region); + virtual int32_t SetLayerVisibleRegion(uint32_t num, IRect *rect); + virtual int32_t SetLayerBuffer(const BufferHandle *buffer, int32_t fence); + virtual int32_t SetLayerCompositionType(CompositionType type); + virtual int32_t SetLayerBlendType(BlendType type); + virtual HdiLayerBuffer *GetCurrentBuffer() + { + return mHdiBuffer.get(); + } + virtual ~HdiLayer() {} + +private: + static uint32_t GetIdleId(); + static uint32_t mIdleId; + static std::unordered_set mIdSets; + + uint32_t mId = 0; + HdiFd mAcquireFence; + HdiFd mReleaseFence; + LayerType mType; + + IRect mDisplayRect; + IRect mCrop; + uint32_t mZorder = -1; + bool mPreMul = false; + LayerAlpha mAlpha; + TransformType mTransformType = ROTATE_BUTT; + CompositionType mCompositionType = COMPOSITION_CLIENT; + CompositionType mDeviceSelect = COMPOSITION_CLIENT; + BlendType mBlendType; + std::unique_ptr mHdiBuffer; +}; + +struct SortLayersByZ { + bool operator () (const HdiLayer *lhs, const HdiLayer *rhs) const + { + if (lhs == nullptr || rhs == nullptr) { + return (lhs == nullptr) && (rhs == nullptr); + } + return lhs->GetZorder() < rhs->GetZorder(); + } +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // HDI_LAYER_H \ No newline at end of file diff --git a/hardware/display/src/display_device/hdi_netlink_monitor.cpp b/hardware/display/src/display_device/hdi_netlink_monitor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..003275d3928543ba6ec6d2158e86fdea091b2bda --- /dev/null +++ b/hardware/display/src/display_device/hdi_netlink_monitor.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (c) 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. + */ + +#include "hdi_netlink_monitor.h" +#include +#include +#include +#include +#include +#include +#include "display_common.h" +#include "display_device.h" +#include "display_layer.h" +#include "hdi_session.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +HdiNetLinkMonitor::HdiNetLinkMonitor() +{ + DISPLAY_DEBUGLOG(); +} + +int HdiNetLinkMonitor::Init() +{ + DISPLAY_DEBUGLOG(); + mThread = std::make_unique(std::bind(&HdiNetLinkMonitor::MonitorThread, this)); + mThread->detach(); + mRunning = true; + return DISPLAY_SUCCESS; +} + +HdiNetLinkMonitor::~HdiNetLinkMonitor() +{ + DISPLAY_DEBUGLOG(); + if (mScoketFd >= 0) { + close(mScoketFd); + } +} + +static int ThreadInit() +{ + int ret; + int fd = -1; + const int32_t bufferSize = 1024; + struct sockaddr_nl snl; + + bzero(&snl, sizeof(struct sockaddr_nl)); + snl.nl_family = AF_NETLINK; + snl.nl_pid = getpid(); + snl.nl_groups = 1; + fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); + DISPLAY_CHK_RETURN(fd < 0, DISPLAY_FAILURE, DISPLAY_LOGE("socket fail")); + ret = setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); + if (ret == -1) { + DISPLAY_LOGE("setsockopt fail"); + close(fd); + return DISPLAY_FAILURE; + } + ret = bind(fd, (struct sockaddr *)&snl, sizeof(struct sockaddr_nl)); + if (ret < 0) { + DISPLAY_LOGE("bind fail"); + close(fd); + return DISPLAY_FAILURE; + } + return fd; +} + +static void ParseUeventMessage(const char *buf, uint32_t len) +{ + uint32_t num; + + for (num = 0; num < len;) { + const char *event = buf + num; + if (strcmp(event, "STATE=HDMI=0") == 0) { + HdiSession::GetInstance().HandleHotplug(false); + break; + } else if (strcmp(event, "STATE=HDMI=1") == 0) { + HdiSession::GetInstance().HandleHotplug(true); + break; + } + num += strlen(event) + 1; + } +} + +void HdiNetLinkMonitor::MonitorThread() +{ + constexpr int BUFFER_SIZE = 2048; /* buffer for the variables */ + int len; + int fd = -1; + + fd = ThreadInit(); + DISPLAY_CHK_RETURN_NOT_VALUE(fd < 0, DISPLAY_LOGE("socket fail")); + mScoketFd = fd; + while (mRunning) { + char buf[BUFFER_SIZE] = { 0 }; + len = read(fd, &buf, sizeof(buf)); + if (len < 0) { + DISPLAY_LOGE("read uevent message fail"); + break; + } + ParseUeventMessage(buf, len); + } +} +} // DISPLAY +} // HDI +} // OHOS diff --git a/hardware/display/src/display_device/hdi_netlink_monitor.h b/hardware/display/src/display_device/hdi_netlink_monitor.h new file mode 100644 index 0000000000000000000000000000000000000000..12b83182b9c9f90b31e7a41b8ef5faec6042928c --- /dev/null +++ b/hardware/display/src/display_device/hdi_netlink_monitor.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 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 HDI_NETLINK_NONITOR_H +#define HDI_NETLINK_NONITOR_H +#include + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +class HdiNetLinkMonitor { +public: + HdiNetLinkMonitor(); + int Init(); + virtual ~HdiNetLinkMonitor(); + +private: + void MonitorThread(); + volatile bool mRunning = false; + int mScoketFd = -1; + std::unique_ptr mThread; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // HDI_NETLINK_NONITOR_H \ No newline at end of file diff --git a/hardware/display/src/display_device/hdi_session.cpp b/hardware/display/src/display_device/hdi_session.cpp new file mode 100644 index 0000000000000000000000000000000000000000..352d27c7f31ddf3b3b7ac32352826df4e638448f --- /dev/null +++ b/hardware/display/src/display_device/hdi_session.cpp @@ -0,0 +1,415 @@ +/* + * Copyright (c) 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. + */ + +#include +#include +#include +#include "display_common.h" +#include "display_device.h" +#include "display_layer.h" +#include "hdi_netlink_monitor.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +HdiSession &HdiSession::GetInstance() +{ + static HdiSession instance; + static std::once_flag once; + std::call_once(once, [&]() { instance.Init(); }); + return instance; +} + +void HdiSession::Init() +{ + DISPLAY_DEBUGLOG(); + mHdiDevices = HdiDeviceInterface::DiscoveryDevice(); + DISPLAY_DEBUGLOG("devices size %{public}zd", mHdiDevices.size()); + mHdiDisplays.clear(); + for (auto device : mHdiDevices) { + auto displays = device->DiscoveryDisplay(); + /* Register the connectors instead of display device. + * There are several connectors in one display device + * in rockchip platform. + */ + for (auto display : displays) { + mHdiDisplays[display.first] = display.second; + } + } + std::shared_ptr mNetLinkMonitor = std::make_shared(); + mNetLinkMonitor->Init(); +} + +void HdiSession::HandleHotplug(bool plugIn) +{ + for (auto device : mHdiDevices) { + for (auto displayMap : mHdiDisplays) { + auto display = displayMap.second; + auto isSuccess = device->HandleHotplug(display->GetId(), plugIn); + if (isSuccess == true) { + DoHotPlugCallback(display->GetId(), plugIn); + } + } + } +} + +int32_t HdiSession::RegHotPlugCallback(HotPlugCallback callback, void *data) +{ + DISPLAY_CHK_RETURN((callback == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("the callback is nullptr")); + mHotPlugCallBacks.emplace(callback, data); + for (auto displayMap : mHdiDisplays) { + auto display = displayMap.second; + if (display->IsConnected()) { + DoHotPlugCallback(display->GetId(), true); + } + } + return DISPLAY_SUCCESS; +} + +void HdiSession::DoHotPlugCallback(uint32_t devId, bool connect) +{ + DISPLAY_DEBUGLOG(); + for (const auto &callback : mHotPlugCallBacks) { + callback.first(devId, connect, callback.second); + } +} +} // OHOS +} // HDI +} // DISPLAY + +using namespace OHOS::HDI::DISPLAY; +static int32_t RegHotPlugCallback(HotPlugCallback callback, void *data) +{ + DISPLAY_DEBUGLOG(); + HdiSession::GetInstance().RegHotPlugCallback(callback, data); + return DISPLAY_SUCCESS; +} + +static int32_t GetDisplayCapability(uint32_t devId, DisplayCapability *info) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN(info == nullptr, DISPLAY_NULL_PTR, DISPLAY_LOGE("info is nullptr")); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayCapability, info); +} + +static int32_t GetDisplaySupportedModes(uint32_t devId, uint32_t *num, DisplayModeInfo *modes) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN(num == nullptr, DISPLAY_NULL_PTR, DISPLAY_LOGE("num is nullptr")); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplaySupportedModes, num, modes); +} + +static int32_t GetDisplayMode(uint32_t devId, uint32_t *mode) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((mode == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("mode is nullptr")); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayMode, mode); +} + +static int32_t SetDisplayMode(uint32_t devId, uint32_t mode) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayMode, mode); +} + +static int32_t GetDisplayPowerStatus(uint32_t devId, DispPowerStatus *status) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((status == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("status is nullptr")); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayPowerStatus, status); +} + +static int32_t SetDisplayPowerStatus(uint32_t devId, DispPowerStatus status) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayPowerStatus, status); +} + +static int32_t GetDisplayBacklight(uint32_t devId, uint32_t *value) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((value == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("value is nullptr")); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayBacklight, value); +} + +static int32_t SetDisplayBacklight(uint32_t devId, uint32_t value) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayBacklight, value); +} + +static int32_t GetDisplayProperty(uint32_t devId, uint32_t id, uint64_t *value) +{ + DISPLAY_DEBUGLOG(); + (void)id; + DISPLAY_CHK_RETURN((value == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("value is nullptr")); + return DISPLAY_NOT_SUPPORT; +} + +static int32_t SetDisplayProperty(uint32_t devId, uint32_t id, uint64_t value) +{ + DISPLAY_DEBUGLOG(); + (void)id; + return DISPLAY_NOT_SUPPORT; +} + +static int32_t PrepareDisplayLayers(uint32_t devId, bool *needFlushFb) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((needFlushFb == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("needFlushFb is nullptr")); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::PrepareDisplayLayers, needFlushFb); +} + +static int32_t GetDisplayCompChange(uint32_t devId, uint32_t *num, uint32_t *layers, int32_t *type) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((num == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("num is nullptr")); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayCompChange, num, layers, type); +} + +static int32_t SetDisplayClientCrop(uint32_t devId, IRect *rect) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((rect == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr")); + return DISPLAY_NOT_SUPPORT; +} + +static int32_t SetDisplayClientDestRect(uint32_t devId, IRect *rect) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((rect == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr")); + return DISPLAY_NOT_SUPPORT; +} + +static int32_t SetDisplayClientBuffer(uint32_t devId, const BufferHandle *buffer, int32_t fence) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayClientBuffer, buffer, fence); +} + +static int32_t SetDisplayClientDamage(uint32_t devId, uint32_t num, IRect *rect) +{ + DISPLAY_DEBUGLOG(); + (void)num; + DISPLAY_CHK_RETURN((rect == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr")); + return DISPLAY_NOT_SUPPORT; +} + +static int32_t SetDisplayVsyncEnabled(uint32_t devId, bool enabled) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetDisplayVsyncEnabled, enabled); +} + +static int32_t RegDisplayVBlankCallback(uint32_t devId, VBlankCallback callback, void *data) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::RegDisplayVBlankCallback, callback, data); +} + +static int32_t GetDisplayReleaseFence(uint32_t devId, uint32_t *num, uint32_t *layers, int32_t *fences) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::GetDisplayReleaseFence, num, layers, + fences); +} + +static int32_t Commit(uint32_t devId, int32_t *fence) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((fence == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("fence is nullptr")); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::Commit, fence); +} + +static int32_t CreateVirtualDisplay(uint32_t width, uint32_t height, int32_t *format, uint32_t *devId) +{ + DISPLAY_DEBUGLOG(); + return DISPLAY_NOT_SUPPORT; +} +static int32_t DestroyVirtualDisplay(uint32_t devId) +{ + DISPLAY_DEBUGLOG(); + return DISPLAY_NOT_SUPPORT; +} +static int32_t SetVirtualDisplayBuffer(uint32_t devId, BufferHandle *buffer, int32_t releaseFence) +{ + DISPLAY_DEBUGLOG(); + return DISPLAY_NOT_SUPPORT; +} + + +// Layer function +static int32_t CreateLayer(uint32_t devId, const LayerInfo *layerInfo, uint32_t *layerId) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((layerId == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("layerId is nullptr")); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::CreateLayer, layerInfo, layerId); +} + +static int32_t CloseLayer(uint32_t devId, uint32_t layerId) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::CloseLayer, layerId); +} + +static int32_t SetLayerSize(uint32_t devId, uint32_t layerId, IRect *rect) +{ + DISPLAY_CHK_RETURN((rect == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr")); + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerSize, rect); +} + +static int32_t SetLayerCrop(uint32_t devId, uint32_t layerId, IRect *rect) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((rect == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr")); + return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerCrop, rect); +} + +static int32_t SetLayerZorder(uint32_t devId, uint32_t layerId, uint32_t zorder) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallDisplayFunction(devId, &HdiDisplay::SetLayerZorder, layerId, zorder); +} + +static int32_t SetLayerPreMulti(uint32_t devId, uint32_t layerId, bool preMul) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerPreMulti, preMul); +} + +static int32_t SetLayerAlpha(uint32_t devId, uint32_t layerId, LayerAlpha *alpha) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((alpha == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("alpha is nullptr")); + return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerAlpha, alpha); +} + +static int32_t SetTransformMode(uint32_t devId, uint32_t layerId, TransformType type) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetTransformMode, type); +} + +static int32_t SetLayerDirtyRegion(uint32_t devId, uint32_t layerId, IRect *region) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((region == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("region is nullptr")); + return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerDirtyRegion, region); +} + +static int32_t SetLayerVisibleRegion(uint32_t devId, uint32_t layerId, uint32_t num, IRect *rect) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((rect == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("rect is nullptr")); + return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerVisibleRegion, num, rect); +} + +static int32_t SetLayerBuffer(uint32_t devId, uint32_t layerId, const BufferHandle *buffer, int32_t fence) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerBuffer, buffer, fence); +} + +static int32_t SetLayerCompositionType(uint32_t devId, uint32_t layerId, CompositionType type) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerCompositionType, type); +} + +static int32_t SetLayerBlendType(uint32_t devId, uint32_t layerId, BlendType type) +{ + DISPLAY_DEBUGLOG(); + return HdiSession::GetInstance().CallLayerFunction(devId, layerId, &HdiLayer::SetLayerBlendType, type); +} + + +extern "C" { +int32_t DeviceInitialize(DeviceFuncs **funcs) +{ + DISPLAY_CHK_RETURN((funcs == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("in funcs is null")); + DeviceFuncs *dFuncs = (DeviceFuncs *)calloc(1, sizeof(DeviceFuncs)); + DISPLAY_CHK_RETURN((dFuncs == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("can not calloc")); + + dFuncs->RegHotPlugCallback = RegHotPlugCallback; + dFuncs->GetDisplayCapability = GetDisplayCapability; + dFuncs->GetDisplaySupportedModes = GetDisplaySupportedModes; + dFuncs->GetDisplayMode = GetDisplayMode; + dFuncs->SetDisplayMode = SetDisplayMode; + dFuncs->GetDisplayPowerStatus = GetDisplayPowerStatus; + dFuncs->SetDisplayPowerStatus = SetDisplayPowerStatus; + dFuncs->PrepareDisplayLayers = PrepareDisplayLayers; + dFuncs->GetDisplayBacklight = GetDisplayBacklight; + dFuncs->SetDisplayBacklight = SetDisplayBacklight; + dFuncs->GetDisplayProperty = GetDisplayProperty; + dFuncs->GetDisplayCompChange = GetDisplayCompChange; + dFuncs->SetDisplayClientCrop = SetDisplayClientCrop; + dFuncs->SetDisplayClientDestRect = SetDisplayClientDestRect; + dFuncs->SetDisplayClientBuffer = SetDisplayClientBuffer; + dFuncs->SetDisplayClientDamage = SetDisplayClientDamage; + dFuncs->SetDisplayVsyncEnabled = SetDisplayVsyncEnabled; + dFuncs->RegDisplayVBlankCallback = RegDisplayVBlankCallback; + dFuncs->GetDisplayReleaseFence = GetDisplayReleaseFence; + dFuncs->CreateVirtualDisplay = CreateVirtualDisplay; + dFuncs->DestroyVirtualDisplay = DestroyVirtualDisplay; + dFuncs->SetVirtualDisplayBuffer = SetVirtualDisplayBuffer; + dFuncs->SetDisplayProperty = SetDisplayProperty; + dFuncs->Commit = Commit; + *funcs = dFuncs; + DISPLAY_DEBUGLOG("%{public}s: device initialize success", __func__); + HdiSession::GetInstance(); + return DISPLAY_SUCCESS; +} + +int32_t DeviceUninitialize(DeviceFuncs *funcs) +{ + DISPLAY_CHK_RETURN((funcs == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("in funcs is null")); + free(funcs); + return DISPLAY_SUCCESS; +} + + +int32_t LayerInitialize(LayerFuncs **funcs) +{ + DISPLAY_CHK_RETURN((funcs == nullptr), DISPLAY_NULL_PTR, DISPLAY_LOGE("the in funcs is nullptr")); + LayerFuncs *lFuncs = (LayerFuncs *)calloc(1, sizeof(LayerFuncs)); + DISPLAY_CHK_RETURN((lFuncs == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("can not calloc errno: %{public}d", errno)); + lFuncs->SetLayerAlpha = SetLayerAlpha; + lFuncs->CreateLayer = CreateLayer; + lFuncs->CloseLayer = CloseLayer; + lFuncs->SetLayerSize = SetLayerSize; + lFuncs->SetLayerCrop = SetLayerCrop; + lFuncs->SetLayerZorder = SetLayerZorder; + lFuncs->SetLayerPreMulti = SetLayerPreMulti; + lFuncs->SetTransformMode = SetTransformMode; + lFuncs->SetLayerDirtyRegion = SetLayerDirtyRegion; + lFuncs->SetLayerVisibleRegion = SetLayerVisibleRegion; + lFuncs->SetLayerBuffer = SetLayerBuffer; + lFuncs->SetLayerCompositionType = SetLayerCompositionType; + lFuncs->SetLayerBlendType = SetLayerBlendType; + + *funcs = lFuncs; + DISPLAY_DEBUGLOG("%{public}s: layer initialize success", __func__); + return DISPLAY_SUCCESS; +} + +int32_t LayerUninitialize(LayerFuncs *funcs) +{ + DISPLAY_CHK_RETURN((funcs == nullptr), DISPLAY_FAILURE, DISPLAY_LOGE("the funcs is nullptr")); + free(funcs); + DISPLAY_DEBUGLOG("%{public}s: layer uninitialize success", __func__); + return DISPLAY_SUCCESS; +} +} diff --git a/hardware/display/src/display_device/hdi_session.h b/hardware/display/src/display_device/hdi_session.h new file mode 100644 index 0000000000000000000000000000000000000000..eb040db883243d5796ca99f07d084c51ab56cdd2 --- /dev/null +++ b/hardware/display/src/display_device/hdi_session.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 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 HDI_SESSION_H +#define HDI_SESSION_H +#include +#include +#include +#include "display_device.h" +#include "hdi_device_interface.h" +#include "hdi_display.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +class HdiSession { +public: + void Init(); + static HdiSession &GetInstance(); + + template + int32_t CallDisplayFunction(uint32_t devId, int32_t (HdiDisplay::*member)(Args...), Args... args) + { + DISPLAY_DEBUGLOG("device Id : %{public}d", devId); + DISPLAY_CHK_RETURN((devId == INVALIDE_DISPLAY_ID), DISPLAY_FAILURE, DISPLAY_LOGE("invalide device id")); + auto iter = mHdiDisplays.find(devId); + DISPLAY_CHK_RETURN((iter == mHdiDisplays.end()), DISPLAY_FAILURE, + DISPLAY_LOGE("can not find display %{public}d", devId)); + auto display = iter->second.get(); + return (display->*member)(std::forward(args)...); + } + + template + int32_t CallLayerFunction(uint32_t devId, uint32_t layerId, int32_t (HdiLayer::*member)(Args...), Args... args) + { + DISPLAY_DEBUGLOG("device Id : %{public}d", devId); + DISPLAY_CHK_RETURN((devId == INVALIDE_DISPLAY_ID), DISPLAY_FAILURE, DISPLAY_LOGE("invalide device id")); + auto iter = mHdiDisplays.find(devId); + DISPLAY_CHK_RETURN((iter == mHdiDisplays.end()), DISPLAY_FAILURE, + DISPLAY_LOGE("can not find display %{public}d", devId)); + auto display = iter->second.get(); + auto layer = display->GetHdiLayer(layerId); + DISPLAY_CHK_RETURN((layer == nullptr), DISPLAY_FAILURE, + DISPLAY_LOGE("can not find the layer %{public}d", layerId)); + return (layer->*member)(std::forward(args)...); + } + + int32_t RegHotPlugCallback(HotPlugCallback callback, void *data); + void DoHotPlugCallback(uint32_t devId, bool connect); + void HandleHotplug(bool plugIn); + +private: + std::unordered_map> mHdiDisplays; + std::vector> mHdiDevices; + std::unordered_map mHotPlugCallBacks; +}; +} // namespace OHOS +} // namespace HDI +} // namespace DISPLAY + +#endif // HDI_SESSION_H \ No newline at end of file diff --git a/hardware/display/src/display_device/hdi_shared_fd.h b/hardware/display/src/display_device/hdi_shared_fd.h new file mode 100644 index 0000000000000000000000000000000000000000..d21cfb940efe5e4896b2085436cf1a8aeb758670 --- /dev/null +++ b/hardware/display/src/display_device/hdi_shared_fd.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 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 HDI_SHARED_FD +#define HDI_SHARED_FD +#include +#include +#include "display_common.h" + +namespace OHOS { +namespace HDI { +namespace DISPLAY { +class HdiFd { +public: + HdiFd() + { + DISPLAY_DEBUGLOG(); + } + explicit HdiFd(int fd) : mFd(fd) + { + DISPLAY_DEBUGLOG("mFd %{public}d", mFd); + } + int GetFd() const + { + return mFd; + }; + + HdiFd &operator = (int fd) + { + if (mFd >= 0) { + close(mFd); + } + mFd = fd; + return *this; + } + + virtual ~HdiFd() + { + if (mFd >= 0) { + close(mFd); + } + } + +private: + int mFd = -1; +}; + +using FdPtr = std::shared_ptr; +} // OHOS +} // HDIO +} // DISPLAY + +#endif // HDI_SHARED_FD \ No newline at end of file diff --git a/hardware/display/src/display_gfx/display_gfx.c b/hardware/display/src/display_gfx/display_gfx.c new file mode 100644 index 0000000000000000000000000000000000000000..e6105d726f06a8575da0661460164867f7c220f6 --- /dev/null +++ b/hardware/display/src/display_gfx/display_gfx.c @@ -0,0 +1,515 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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. + */ + +#include +#include +#include "im2d.h" +#include "rga.h" +#include "display_common.h" +#include "display_gralloc.h" +#include "securec.h" +#include "display_gfx.h" + +#define ALIGN_UP(x, a) ((((x) + ((a)-1)) / (a)) * (a)) +GrallocFuncs *grallocFucs = NULL; +int32_t rkInitGfx() +{ + DISPLAY_LOGE("%s\n", querystring(RGA_ALL)); + return DISPLAY_SUCCESS; +} + +int32_t rkDeinitGfx() +{ + return DISPLAY_SUCCESS; +} + +RgaSURF_FORMAT colorSpaceModeChange(PixelFormat color, uint8_t *isYuv) +{ + RgaSURF_FORMAT rkFormat; + switch (color) { + case PIXEL_FMT_RGB_565: /**< RGB565 format */ + rkFormat = RK_FORMAT_RGB_565; + *isYuv = 0; + break; + case PIXEL_FMT_RGBA_4444: /**< RGBA4444 format */ + rkFormat = RK_FORMAT_RGBA_4444; + *isYuv = 0; + break; + case PIXEL_FMT_RGBA_5551: /**< RGBA5551 format */ + rkFormat = RK_FORMAT_RGBA_5551; + *isYuv = 0; + break; + case PIXEL_FMT_RGBX_8888: /**< RGBX8888 format */ + rkFormat = RK_FORMAT_RGBX_8888; + *isYuv = 0; + break; + case PIXEL_FMT_RGBA_8888: /**< RGBA8888 format */ + rkFormat = RK_FORMAT_RGBA_8888; + *isYuv = 0; + break; + case PIXEL_FMT_RGB_888: /**< RGB888 format */ + rkFormat = RK_FORMAT_RGB_888; + *isYuv = 0; + break; + case PIXEL_FMT_BGR_565: /**< BGR565 format */ + rkFormat = RK_FORMAT_BGR_565; + *isYuv = 0; + break; + case PIXEL_FMT_BGRA_4444: /**< BGRA4444 format */ + rkFormat = RK_FORMAT_BGRA_4444; + *isYuv = 0; + break; + case PIXEL_FMT_BGRA_5551: /**< BGRA5551 format */ + rkFormat = RK_FORMAT_BGRA_5551; + *isYuv = 0; + break; + case PIXEL_FMT_BGRX_8888: /**< BGRX8888 format */ + rkFormat = RK_FORMAT_BGRX_8888; + *isYuv = 0; + break; + case PIXEL_FMT_BGRA_8888: /**< BGRA8888 format */ + rkFormat = RK_FORMAT_BGRA_8888; + *isYuv = 0; + break; + case PIXEL_FMT_YCBCR_422_SP: /**< YCBCR422 semi-planar format */ + rkFormat = RK_FORMAT_YCbCr_420_SP; + *isYuv = 1; + break; + case PIXEL_FMT_YCRCB_422_SP: /**< YCRCB422 semi-planar format */ + rkFormat = RK_FORMAT_YCrCb_422_SP; + *isYuv = 1; + break; + case PIXEL_FMT_YCBCR_420_SP: /**< YCBCR420 semi-planar format */ + rkFormat = RK_FORMAT_YCbCr_420_SP; + *isYuv = 1; + break; + case PIXEL_FMT_YCRCB_420_SP: /**< YCRCB420 semi-planar format */ + rkFormat = RK_FORMAT_YCrCb_420_SP; + *isYuv = 1; + break; + case PIXEL_FMT_YCBCR_422_P: /**< YCBCR422 planar format */ + rkFormat = RK_FORMAT_YCbCr_422_P; + *isYuv = 1; + break; + case PIXEL_FMT_YCRCB_422_P: /**< YCRCB422 planar format */ + rkFormat = RK_FORMAT_YCrCb_422_P; + *isYuv = 1; + break; + case PIXEL_FMT_YCBCR_420_P: /**< YCBCR420 planar format */ + rkFormat = RK_FORMAT_YCbCr_420_P; + *isYuv = 1; + break; + case PIXEL_FMT_YCRCB_420_P: /**< YCRCB420 planar format */ + rkFormat = RK_FORMAT_YCrCb_420_P; + *isYuv = 1; + break; + case PIXEL_FMT_YUYV_422_PKG: /**< YUYV422 packed format */ + rkFormat = RK_FORMAT_YUYV_422; + *isYuv = 1; + break; + case PIXEL_FMT_UYVY_422_PKG: /**< UYVY422 packed format */ + rkFormat = RK_FORMAT_UYVY_422; + *isYuv = 1; + break; + case PIXEL_FMT_YVYU_422_PKG: /**< YVYU422 packed format */ + rkFormat = RK_FORMAT_YUYV_422; + *isYuv = 1; + break; + case PIXEL_FMT_VYUY_422_PKG: /**< VYUY422 packed format */ + rkFormat = RK_FORMAT_VYUY_422; + *isYuv = 1; + break; + default: +// PIXEL_FMT_CLUT8: /**< CLUT8 format */ +// PIXEL_FMT_CLUT1, /**< CLUT1 format */ +// PIXEL_FMT_CLUT4, /**< CLUT4 format */ +// PIXEL_FMT_RGBA_5658, /**< RGBA5658 format */ +// PIXEL_FMT_RGBX_4444, /**< RGBX4444 format */ +// PIXEL_FMT_RGB_444, /**< RGB444 format */ +// PIXEL_FMT_RGBX_5551, /**< RGBX5551 format */ +// PIXEL_FMT_RGB_555, /**< RGB555 format */ +// PIXEL_FMT_BGRX_4444, /**< BGRX4444 format */ +// PIXEL_FMT_BGRX_5551, /**< BGRX5551 format */ +// PIXEL_FMT_YUV_422_I, /**< YUV422 interleaved format */ + rkFormat = RK_FORMAT_UNKNOWN; + break; + } + return rkFormat; +} + +int32_t rkFillRect(ISurface *iSurface, IRect *rect, uint32_t color, GfxOpt *opt) +{ + rga_buffer_t dst; + im_rect imRect; + IM_STATUS ret; + uint8_t isYuv; + + errno_t eok = memset_s((void *)&imRect, sizeof(imRect), 0, sizeof(imRect)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + return false; + } + imRect.x = rect->x; + imRect.y = rect->y; + imRect.width = rect->w; + imRect.height = rect->h; + + eok = memset_s((void *)&dst, sizeof(dst), 0, sizeof(dst)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + return false; + } + dst.phy_addr = 0; // (void*)iSurface->phyAddr; + dst.vir_addr = 0; // iSurface->virAddr; + dst.fd = (int32_t)iSurface->phyAddr; + if ((int)dst.phy_addr == 0 && dst.fd == 0 && dst.vir_addr == NULL) { + DISPLAY_LOGE("source iSurface address error"); + return DISPLAY_PARAM_ERR; + } + DISPLAY_LOGE("gfx vir %{public}p phy 0x%{public}x fd %{public}d", dst.vir_addr, (int32_t)dst.phy_addr, dst.fd); + dst.width = iSurface->width; + dst.height = iSurface->height; + dst.wstride = ALIGN_UP(iSurface->width, 16); + dst.hstride = ALIGN_UP(iSurface->height, 16); + dst.format = colorSpaceModeChange(iSurface->enColorFmt, &isYuv); + dst.color_space_mode = IM_COLOR_SPACE_DEFAULT; + dst.color = color; + if (opt->enGlobalAlpha) + dst.global_alpha = opt->globalAlpha; + ret = imfill(dst, imRect, color); + if (ret != IM_STATUS_SUCCESS) + return DISPLAY_FAILURE; + else + return DISPLAY_SUCCESS; +} + +int32_t blendTypeChange(BlendType blendType) +{ + int32_t rkBlendType; + switch (blendType) { + case BLEND_SRC: /**< SRC blending */ + rkBlendType = IM_ALPHA_BLEND_SRC; + break; + case BLEND_DST: /**< SRC blending */ + rkBlendType = IM_ALPHA_BLEND_DST; + break; + case BLEND_SRCOVER: /**< SRC_OVER blending */ + rkBlendType = IM_ALPHA_BLEND_SRC_OVER; + break; + case BLEND_DSTOVER: /**< DST_OVER blending */ + rkBlendType = IM_ALPHA_BLEND_DST_OVER; + break; + default: + /* Fix up later */ +// BLEND_NONE /**< No blending */ +// BLEND_CLEAR: /**< CLEAR blending */ +// BLEND_SRCIN: /**< SRC_IN blending */ +// BLEND_DSTIN: /**< DST_IN blending */ +// BLEND_SRCOUT: /**< SRC_OUT blending */ +// BLEND_DSTOUT: /**< DST_OUT blending */ +// BLEND_SRCATOP: /**< SRC_ATOP blending */ +// BLEND_DSTATOP: /**< DST_ATOP blending */ +// BLEND_ADD: /**< ADD blending */ +// BLEND_XOR: /**< XOR blending */ +// BLEND_DST: /**< DST blending */ +// BLEND_AKS: /**< AKS blending */ +// BLEND_AKD: /**< AKD blending */ +// BLEND_BUTT: /**< Null operation */ + rkBlendType = IM_STATUS_NOT_SUPPORTED; + break; + } + return rkBlendType; +} + +int32_t TransformTypeChange(TransformType type) +{ + int32_t rkRotateType; + switch (type) { + case ROTATE_90: /**< Rotation by 90 degrees */ + rkRotateType = IM_HAL_TRANSFORM_ROT_90; + break; + case ROTATE_180: /**< Rotation by 180 degrees */ + rkRotateType = IM_HAL_TRANSFORM_ROT_180; + break; + case ROTATE_270: /**< Rotation by 270 degrees */ + rkRotateType = IM_HAL_TRANSFORM_ROT_270; + break; + default: + rkRotateType = 0; /**< No rotation */ + break; + } + return rkRotateType; +} + +int32_t mirrorTypeChange(MirrorType type) +{ + int32_t rkMirrorType; + switch (type) { + case MIRROR_LR: /**< Left and right mirrors */ + rkMirrorType = IM_HAL_TRANSFORM_FLIP_H; + break; + case MIRROR_TB: /**< Top and bottom mirrors */ + rkMirrorType = IM_HAL_TRANSFORM_FLIP_V; + break; + default: + rkMirrorType = 0; + break; + } + return rkMirrorType; +} + +int32_t doFlit(ISurface *srcSurface, IRect *srcRect, ISurface *dstSurface, IRect *dstRect, GfxOpt *opt) +{ + int32_t usage = 0; + uint8_t isYuv = 0; + rga_buffer_t dstRgaBuffer, srcRgaBuffer, bRgbBuffer; + IM_STATUS ret = 0; + im_rect srect; + im_rect drect; + im_rect prect; + int32_t rkBlendType = 0; + int32_t rkRotateType = 0; + int32_t rkMirrorType = 0; + + errno_t eok = memset_s(&dstRgaBuffer, sizeof(dstRgaBuffer), 0, sizeof(dstRgaBuffer)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + return false; + } + eok = memset_s(&srcRgaBuffer, sizeof(srcRgaBuffer), 0, sizeof(srcRgaBuffer)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + return false; + } + eok = memset_s(&bRgbBuffer, sizeof(bRgbBuffer), 0, sizeof(bRgbBuffer)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + return false; + } + eok = memset_s(&srect, sizeof(srect), 0, sizeof(srect)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + return false; + } + eok = memset_s(&drect, sizeof(drect), 0, sizeof(drect)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + return false; + } + eok = memset_s(&prect, sizeof(prect), 0, sizeof(prect)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + return false; + } + if (opt->enGlobalAlpha) { + dstRgaBuffer.global_alpha = opt->globalAlpha; + srcRgaBuffer.global_alpha = opt->globalAlpha; + } + dstRgaBuffer.width = dstSurface->width; + dstRgaBuffer.height = dstSurface->height; + dstRgaBuffer.wstride = ALIGN_UP(dstSurface->width, 16); + dstRgaBuffer.hstride = ALIGN_UP(dstSurface->height, 16); + dstRgaBuffer.format = colorSpaceModeChange(dstSurface->enColorFmt, &isYuv); + dstRgaBuffer.phy_addr = 0; // (void *)dstSurface->phyAddr; + dstRgaBuffer.vir_addr = 0; // dstSurface->virAddr; + dstRgaBuffer.color_space_mode = IM_COLOR_SPACE_DEFAULT; + dstRgaBuffer.fd = (int32_t)dstSurface->phyAddr; + if (isYuv == 1) { + DISPLAY_LOGE("rk gfx do not support dst buffer is yuv format"); + return DISPLAY_PARAM_ERR; + } + + srcRgaBuffer.width = srcSurface->width; + srcRgaBuffer.height = srcSurface->height; + srcRgaBuffer.wstride = ALIGN_UP(srcSurface->width, 16); + srcRgaBuffer.hstride = ALIGN_UP(srcSurface->height, 16); + srcRgaBuffer.phy_addr = 0; // (void *)srcSurface->phyAddr; + srcRgaBuffer.vir_addr = 0; // srcSurface->virAddr; + srcRgaBuffer.format = colorSpaceModeChange(srcSurface->enColorFmt, &isYuv); + srcRgaBuffer.color_space_mode = IM_COLOR_SPACE_DEFAULT; + srcRgaBuffer.fd = (int32_t)srcSurface->phyAddr; + + if ((int)srcRgaBuffer.phy_addr == 0 && srcRgaBuffer.fd == 0 && srcRgaBuffer.vir_addr == NULL) { + DISPLAY_LOGE("source iSurface address error"); + return DISPLAY_PARAM_ERR; + } + + DISPLAY_LOGE("gfx src fd %{public}d, w %{public}d, h %{publuc}d, sw %{public}d sh %{public}d vir %{public}p", + (int32_t)srcSurface->phyAddr, srcSurface->width, srcSurface->height, ALIGN_UP(srcSurface->width, 16), + ALIGN_UP(srcSurface->height, 16), srcRgaBuffer.vir_addr); + DISPLAY_LOGE("gfx dst fd %{public}d, w %{public}d, h %{public}d, sw %{public}d sh %{public}d vir %{public}p", + (int32_t)dstSurface->phyAddr, dstSurface->width, dstSurface->height, ALIGN_UP(dstSurface->width, 16), + ALIGN_UP(dstSurface->height, 16), dstRgaBuffer.vir_addr); + + srect.x = srcRect->x; + srect.y = srcRect->y; + srect.height = srcRect->h; + srect.width = srcRect->w; + drect.x = dstRect->x; + drect.y = dstRect->y; + drect.height = dstRect->h; + drect.width = dstRect->w; + + if (opt->blendType) { + rkBlendType = blendTypeChange(opt->blendType); + if (rkBlendType > 0) { + usage |= rkBlendType; + if (rkBlendType == IM_ALPHA_BLEND_DST_OVER || rkBlendType == IM_ALPHA_BLEND_SRC_OVER) + usage |= IM_ALPHA_BLEND_PRE_MUL; + } else if (rkBlendType == IM_STATUS_NOT_SUPPORTED) { + return DISPLAY_NOT_SUPPORT; + } + } + if (opt->rotateType) { + rkRotateType = TransformTypeChange(opt->rotateType); + if (rkRotateType != 0) + usage |= rkRotateType; + } + if (opt->mirrorType == MIRROR_LR || opt->mirrorType == MIRROR_TB) { + rkMirrorType = mirrorTypeChange(opt->mirrorType); + if (rkMirrorType != 0) + usage |= rkMirrorType; + } + if (opt->enableScale) { + DISPLAY_LOGE("gfx scale from (%{puhblic}d, %{public}d) to (%{public}d, %{public}d)", srcRgaBuffer.width, srcRgaBuffer.height, dstRgaBuffer.width, + dstRgaBuffer.height); + } + usage |= IM_SYNC; + if (isYuv == 1) { + if (rkBlendType == IM_ALPHA_BLEND_SRC_OVER || rkBlendType == IM_ALPHA_BLEND_SRC) { + usage = 0; + if (opt->enableScale == 0) { + eok = memset_s(&srect, sizeof(srect), 0, sizeof(srect)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + return false; + } + srect.width = srcRgaBuffer.width; + srect.height = srcRgaBuffer.height; + + eok = memset_s(&drect, sizeof(drect), 0, sizeof(drect)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + return false; + } + drect.x = dstRgaBuffer.width - srcRgaBuffer.width; + drect.y = dstRgaBuffer.height - srcRgaBuffer.height; + drect.width = srcRgaBuffer.width; + drect.height = srcRgaBuffer.height; + } + usage = rkRotateType | rkMirrorType | IM_SYNC; + ret = improcess(srcRgaBuffer, dstRgaBuffer, bRgbBuffer, srect, drect, prect, usage); + if (ret != IM_STATUS_SUCCESS) { + DISPLAY_LOGE("gfx improcess %{public}s", imStrError(ret)); + } + } else if (rkBlendType == IM_ALPHA_BLEND_DST_OVER) { + if (grallocFucs == NULL) { + ret = GrallocInitialize(&grallocFucs); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("Gralloc init failed")); + } + AllocInfo info = { + .width = dstRgaBuffer.width, + .height = dstRgaBuffer.height, + .usage = HBM_USE_MEM_DMA | HBM_USE_CPU_READ | HBM_USE_CPU_WRITE, + .format = PIXEL_FMT_RGBA_8888, // srcSurface->enColorFmt, + }; + BufferHandle *buffer = NULL; + + ret = grallocFucs->AllocMem(&info, &buffer); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("can not alloc memory")); + + bRgbBuffer.width = dstRgaBuffer.width; + bRgbBuffer.height = dstRgaBuffer.height; + bRgbBuffer.wstride = dstRgaBuffer.wstride; + bRgbBuffer.hstride = dstRgaBuffer.hstride; + bRgbBuffer.format = RK_FORMAT_RGBA_8888; // srcRgaBuffer.format; + bRgbBuffer.phy_addr = 0; // (void *) buffer->phyAddr; + bRgbBuffer.vir_addr = 0; // buffer->virAddr; + bRgbBuffer.color_space_mode = dstRgaBuffer.color_space_mode; + bRgbBuffer.fd = (int32_t)buffer->phyAddr; + int ret = memcpy_s(&prect, sizeof(drect), &drect, sizeof(drect)); + if (!ret) { + printf("memcpy_s failed!\n"); + } + ret = improcess(srcRgaBuffer, bRgbBuffer, dstRgaBuffer, srect, prect, drect, usage); + if (ret != IM_STATUS_SUCCESS) { + DISPLAY_LOGE("gfx improcess %{public}s", imStrError(ret)); + } else { + ret = imcopy(bRgbBuffer, dstRgaBuffer); + if (ret != IM_STATUS_SUCCESS) { + DISPLAY_LOGE("gfx improcess %{public}s", imStrError(ret)); + } + } + grallocFucs->FreeMem(buffer); + } + } else { + ret = improcess(srcRgaBuffer, dstRgaBuffer, bRgbBuffer, srect, drect, prect, usage); + if (ret != IM_STATUS_SUCCESS) { + DISPLAY_LOGE("gfx improcess %{public}s", imStrError(ret)); + } + } + if (ret != IM_STATUS_SUCCESS) + return DISPLAY_FAILURE; + else + return DISPLAY_SUCCESS; +} + +int32_t rkBlit(ISurface *srcSurface, IRect *srcRect, ISurface *dstSurface, IRect *dstRect, GfxOpt *opt) +{ + CHECK_NULLPOINTER_RETURN_VALUE(srcSurface, DISPLAY_NULL_PTR); + CHECK_NULLPOINTER_RETURN_VALUE(srcRect, DISPLAY_NULL_PTR); + CHECK_NULLPOINTER_RETURN_VALUE(dstSurface, DISPLAY_NULL_PTR); + CHECK_NULLPOINTER_RETURN_VALUE(dstRect, DISPLAY_NULL_PTR); + CHECK_NULLPOINTER_RETURN_VALUE(opt, DISPLAY_NULL_PTR); + + if (doFlit(srcSurface, srcRect, dstSurface, dstRect, opt) < 0) + return DISPLAY_FAILURE; + else + return DISPLAY_SUCCESS; +} + +int32_t rkSync(int32_t timeOut) +{ + return DISPLAY_SUCCESS; +} + +int32_t GfxInitialize(GfxFuncs **funcs) +{ + DISPLAY_CHK_RETURN((funcs == NULL), DISPLAY_PARAM_ERR, DISPLAY_LOGE("info is null")); + GfxFuncs *gfxFuncs = (GfxFuncs *)malloc(sizeof(GfxFuncs)); + DISPLAY_CHK_RETURN((gfxFuncs == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("gfxFuncs is nullptr")); + errno_t eok = memset_s((void *)gfxFuncs, sizeof(GfxFuncs), 0, sizeof(GfxFuncs)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + free(gfxFuncs); + return DISPLAY_FAILURE; + } + gfxFuncs->InitGfx = rkInitGfx; + gfxFuncs->DeinitGfx = rkDeinitGfx; + gfxFuncs->FillRect = rkFillRect; + gfxFuncs->Blit = rkBlit; + gfxFuncs->Sync = rkSync; + *funcs = gfxFuncs; + + return DISPLAY_SUCCESS; +} + +int32_t GfxUninitialize(GfxFuncs *funcs) +{ + CHECK_NULLPOINTER_RETURN_VALUE(funcs, DISPLAY_NULL_PTR); + free(funcs); + DISPLAY_LOGI("%s: gfx uninitialize success", __func__); + return DISPLAY_SUCCESS; +} diff --git a/hardware/display/src/display_gralloc/display_gralloc.c b/hardware/display/src/display_gralloc/display_gralloc.c new file mode 100644 index 0000000000000000000000000000000000000000..2be67aa2f58057fcca76082f1b3cbcc0f9b22716 --- /dev/null +++ b/hardware/display/src/display_gralloc/display_gralloc.c @@ -0,0 +1,125 @@ +/* + * Copyright (c) 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. + */ + +#include "display_gralloc.h" +#include +#include +#include "display_common.h" +#include "display_gralloc_gbm.h" + +int32_t AllocMem(const AllocInfo *info, BufferHandle **handle) +{ + DISPLAY_CHK_RETURN((info == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("info is null")); + DISPLAY_CHK_RETURN((handle == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("handle is null")); +#ifdef GRALLOC_GBM_SUPPORT + if (info->usage & HBM_USE_MEM_DMA) { + return GbmAllocMem(info, handle); + } +#endif + DISPLAY_LOGE("the usage is not support 0x%{public}" PRIx64 "", info->usage); + return DISPLAY_NOT_SUPPORT; +} + +void FreeMem(BufferHandle *handle) +{ + DISPLAY_CHK_RETURN_NOT_VALUE((handle == NULL), DISPLAY_LOGE("handle is null")); +#ifdef GRALLOC_GBM_SUPPORT + if (handle->usage & HBM_USE_MEM_DMA) { + GbmFreeMem(handle); + return; + } +#endif +} + +void *Mmap(BufferHandle *handle) +{ + DISPLAY_CHK_RETURN((handle == NULL), NULL, DISPLAY_LOGE("handle is null")); +#ifdef GRALLOC_GBM_SUPPORT + if (handle->usage & HBM_USE_MEM_DMA) { + return GbmMmap(handle); + } +#endif + return NULL; +} + +int32_t Unmap(BufferHandle *handle) +{ + DISPLAY_CHK_RETURN((handle == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("handle is null")); +#ifdef GRALLOC_GBM_SUPPORT + if (handle->usage & HBM_USE_MEM_DMA) { + return GbmUnmap(handle); + } +#endif + return DISPLAY_NOT_SUPPORT; +} + +int32_t FlushCache(BufferHandle *handle) +{ + DISPLAY_CHK_RETURN((handle == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("handle is null")); +#ifdef GRALLOC_GBM_SUPPORT + if (handle->usage & HBM_USE_MEM_DMA) { + return GbmFlushCache(handle); + } +#endif + return DISPLAY_NOT_SUPPORT; +} + +int32_t InvalidateCache(BufferHandle *handle) +{ + DISPLAY_CHK_RETURN((handle == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("handle is null")); +#ifdef GRALLOC_GBM_SUPPORT + if (handle->usage & HBM_USE_MEM_DMA) { + return GbmInvalidateCache(handle); + } +#endif + return DISPLAY_NOT_SUPPORT; +} + +int32_t GrallocUninitialize(GrallocFuncs *funcs) +{ + DISPLAY_CHK_RETURN(funcs == NULL, DISPLAY_PARAM_ERR, DISPLAY_LOGE("funcs is null")); + DISPLAY_DEBUGLOG(); +#ifdef GRALLOC_GBM_SUPPORT + if (GbmGrallocUninitialize() != DISPLAY_SUCCESS) { + DISPLAY_LOGE("gbm uninit failed"); + } +#endif + free(funcs); + return DISPLAY_SUCCESS; +} + +int32_t GrallocInitialize(GrallocFuncs **funcs) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN((funcs == NULL), DISPLAY_PARAM_ERR, DISPLAY_LOGE("funcs is null")); + GrallocFuncs *grallocFuncs = (GrallocFuncs *)malloc(sizeof(GrallocFuncs)); + DISPLAY_CHK_RETURN((grallocFuncs == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("memset_s failed")); + errno_t eok = memset_s(grallocFuncs, sizeof(GrallocFuncs), 0, sizeof(GrallocFuncs)); + DISPLAY_CHK_RETURN((eok != EOK), DISPLAY_FAILURE, DISPLAY_LOGE("memset_s failed")); + // initialize gbm gralloc +#ifdef GRALLOC_GBM_SUPPORT + int ret = GbmGrallocInitialize(); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), ret, DISPLAY_LOGE("gbm initial"); + free(grallocFuncs)); +#endif + grallocFuncs->AllocMem = AllocMem; + grallocFuncs->FreeMem = FreeMem; + grallocFuncs->Mmap = Mmap; + grallocFuncs->Unmap = Unmap; + grallocFuncs->InvalidateCache = InvalidateCache; + grallocFuncs->FlushCache = FlushCache; + *funcs = grallocFuncs; + return DISPLAY_SUCCESS; +} diff --git a/hardware/display/src/display_gralloc/display_gralloc_gbm.c b/hardware/display/src/display_gralloc/display_gralloc_gbm.c new file mode 100644 index 0000000000000000000000000000000000000000..872a54d71e4d7cdc4b5283f28e3467cf2d2f7d25 --- /dev/null +++ b/hardware/display/src/display_gralloc/display_gralloc_gbm.c @@ -0,0 +1,432 @@ +/* + * Copyright (c) 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. + */ + +#include "display_gralloc_gbm.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "wayland_drm_auth_client.h" +#include "drm_fourcc.h" +#include "hisilicon_drm.h" +#include "hi_gbm.h" +#include "hdf_dlist.h" +#include "display_gralloc_private.h" +#include "display_common.h" + +const char *g_drmFileNode = "/dev/dri/renderD128"; +static GrallocManager *g_grallocManager = NULL; +static pthread_mutex_t g_lock; + +typedef struct { + uint32_t drmFormat; + PixelFormat pixFormat; +} PixelFormatConvertTbl; + +typedef struct { + uint32_t value; + const char *str; +} ValueStrMap; + +static GrallocManager *GetGrallocManager(void) +{ + if (g_grallocManager == NULL) { + g_grallocManager = (GrallocManager *)malloc(sizeof(GrallocManager)); + errno_t eok = memset_s(g_grallocManager, sizeof(GrallocManager), 0, sizeof(GrallocManager)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + } + if (g_grallocManager == NULL) { + DISPLAY_LOGE("gralloc manager malloc failed"); + } + } + return g_grallocManager; +} + +const char *GetPixelFmtStr(PixelFormat format) +{ + static const ValueStrMap pixelStrMaps[] = { + {PIXEL_FMT_CLUT8, "PIXEL_FMT_CLUT8"}, {PIXEL_FMT_CLUT1, "PIXEL_FMT_CLUT1"}, + {PIXEL_FMT_CLUT4, "PIXEL_FMT_CLUT4"}, {PIXEL_FMT_RGB_565, "PIXEL_FMT_RGB_565"}, + {PIXEL_FMT_RGBA_5658, "IXEL_FMT_RGBA_5658"}, {PIXEL_FMT_RGBX_4444, "PIXEL_FMT_RGBX_4444"}, + {PIXEL_FMT_RGBA_4444, "PIXEL_FMT_RGBA_4444"}, {PIXEL_FMT_RGB_444, "PIXEL_FMT_RGB_444"}, + {PIXEL_FMT_RGBX_5551, "PIXEL_FMT_RGBX_5551"}, {PIXEL_FMT_RGBA_5551, "PIXEL_FMT_RGBA_5551"}, + {PIXEL_FMT_RGB_555, "PIXEL_FMT_RGB_555"}, {PIXEL_FMT_RGBX_8888, "PIXEL_FMT_RGBX_8888"}, + {PIXEL_FMT_RGBA_8888, "PIXEL_FMT_RGBA_8888"}, {PIXEL_FMT_RGB_888, "PIXEL_FMT_RGB_888"}, + {PIXEL_FMT_BGR_565, "PIXEL_FMT_BGR_565"}, {PIXEL_FMT_BGRX_4444, "PIXEL_FMT_BGRX_4444"}, + {PIXEL_FMT_BGRA_4444, "PIXEL_FMT_BGRA_4444"}, {PIXEL_FMT_BGRX_5551, "PIXEL_FMT_BGRX_5551"}, + {PIXEL_FMT_BGRA_5551, "PIXEL_FMT_BGRA_5551"}, {PIXEL_FMT_BGRX_8888, "PIXEL_FMT_BGRX_8888"}, + {PIXEL_FMT_BGRA_8888, "PIXEL_FMT_BGRA_8888"}, {PIXEL_FMT_YUV_422_I, "PIXEL_FMT_YUV_422_I"}, + {PIXEL_FMT_YUV_422_I, "PIXEL_FMT_YUV_422_I"}, {PIXEL_FMT_YCBCR_422_SP, "PIXEL_FMT_YCBCR_422_SP"}, + {PIXEL_FMT_YCRCB_422_SP, "PIXEL_FMT_YCRCB_422_SP"}, {PIXEL_FMT_YCBCR_420_SP, "PIXEL_FMT_YCBCR_420_SP"}, + {PIXEL_FMT_YCRCB_420_SP, "PIXEL_FMT_YCRCB_420_SP"}, {PIXEL_FMT_YCBCR_422_P, "PIXEL_FMT_YCBCR_422_P"}, + {PIXEL_FMT_YCRCB_422_P, "PIXEL_FMT_YCRCB_422_P"}, {PIXEL_FMT_YCBCR_420_P, "PIXEL_FMT_YCBCR_420_P"}, + {PIXEL_FMT_YCRCB_420_P, "PIXEL_FMT_YCRCB_420_P"}, {PIXEL_FMT_YUYV_422_PKG, "PIXEL_FMT_YUYV_422_PKG"}, + {PIXEL_FMT_UYVY_422_PKG, "PIXEL_FMT_UYVY_422_PKG"}, {PIXEL_FMT_YVYU_422_PKG, "PIXEL_FMT_YVYU_422_PKG"}, + {PIXEL_FMT_VYUY_422_PKG, "PIXEL_FMT_VYUY_422_PKG"}, {PIXEL_FMT_BUTT, "PIXEL_FMT_BUTT"}, + }; + static const char *unknown = "unknown format"; + for (uint32_t i = 0; i < sizeof(pixelStrMaps) / sizeof(pixelStrMaps[0]); i++) { + if (pixelStrMaps[i].value == format) { + return pixelStrMaps[i].str; + } + } + DISPLAY_LOGE("GetPixelFmtStr unknown format %{public}d", format); + return unknown; +} + +const char *GetDrmFmtStr(uint32_t format) +{ + static const ValueStrMap formatStrMaps[] = { + {DRM_FORMAT_C8, "DRM_FORMAT_C8" }, {DRM_FORMAT_R8, "DRM_FORMAT_R8" }, + {DRM_FORMAT_R16, "DRM_FORMAT_R16"}, {DRM_FORMAT_RG88, "DRM_FORMAT_RG88"}, + {DRM_FORMAT_GR88, "DRM_FORMAT_GR88"}, {DRM_FORMAT_RG1616, "DRM_FORMAT_RG1616"}, + {DRM_FORMAT_GR1616, "DRM_FORMAT_GR1616"}, {DRM_FORMAT_RGB332, "DRM_FORMAT_RGB332"}, + {DRM_FORMAT_BGR233, "DRM_FORMAT_BGR233"}, {DRM_FORMAT_XRGB4444, "DRM_FORMAT_XRGB4444"}, + {DRM_FORMAT_XBGR4444, "DRM_FORMAT_XBGR4444"}, {DRM_FORMAT_RGBX4444, "DRM_FORMAT_RGBX4444"}, + {DRM_FORMAT_BGRX4444, "DRM_FORMAT_BGRX4444"}, {DRM_FORMAT_ARGB4444, "DRM_FORMAT_ARGB4444"}, + {DRM_FORMAT_ABGR4444, "DRM_FORMAT_ABGR4444"}, {DRM_FORMAT_RGBA4444, "DRM_FORMAT_RGBA4444"}, + {DRM_FORMAT_BGRA4444, "DRM_FORMAT_BGRA4444"}, {DRM_FORMAT_XRGB1555, "DRM_FORMAT_XRGB1555"}, + {DRM_FORMAT_XBGR1555, "DRM_FORMAT_XBGR1555"}, {DRM_FORMAT_RGBX5551, "DRM_FORMAT_RGBX5551"}, + {DRM_FORMAT_BGRX5551, "DRM_FORMAT_BGRX5551"}, {DRM_FORMAT_ARGB1555, "DRM_FORMAT_ARGB1555"}, + {DRM_FORMAT_ABGR1555, "DRM_FORMAT_ABGR1555"}, {DRM_FORMAT_RGBA5551, "DRM_FORMAT_RGBA5551"}, + {DRM_FORMAT_BGRA5551, "DRM_FORMAT_BGRA5551"}, {DRM_FORMAT_RGB565, "DRM_FORMAT_RGB565"}, + {DRM_FORMAT_BGR565, "DRM_FORMAT_BGR565"}, {DRM_FORMAT_RGB888, "DRM_FORMAT_RGB888"}, + {DRM_FORMAT_BGR888, "DRM_FORMAT_BGR888"}, {DRM_FORMAT_XRGB8888, "DRM_FORMAT_XRGB8888"}, + {DRM_FORMAT_XBGR8888, "DRM_FORMAT_XBGR8888"}, {DRM_FORMAT_RGBX8888, "DRM_FORMAT_RGBX8888"}, + {DRM_FORMAT_BGRX8888, "DRM_FORMAT_BGRX8888"}, {DRM_FORMAT_ARGB8888, "DRM_FORMAT_ARGB8888"}, + {DRM_FORMAT_ABGR8888, "DRM_FORMAT_ABGR8888"}, {DRM_FORMAT_RGBA8888, "DRM_FORMAT_RGBA8888"}, + {DRM_FORMAT_BGRA8888, "DRM_FORMAT_BGRA8888"}, {DRM_FORMAT_XRGB2101010, "DRM_FORMAT_XRGB2101010"}, + {DRM_FORMAT_BGRX1010102, "DRM_FORMAT_BGRX1010102"}, {DRM_FORMAT_ARGB2101010, "DRM_FORMAT_ARGB2101010"}, + {DRM_FORMAT_ABGR2101010, "DRM_FORMAT_ABGR2101010"}, {DRM_FORMAT_RGBA1010102, "DRM_FORMAT_RGBA1010102"}, + {DRM_FORMAT_YVYU, "DRM_FORMAT_YVYU"}, {DRM_FORMAT_UYVY, "DRM_FORMAT_UYVY"}, + {DRM_FORMAT_VYUY, "DRM_FORMAT_VYUY"}, {DRM_FORMAT_AYUV, "DRM_FORMAT_AYUV"}, + {DRM_FORMAT_NV12, "DRM_FORMAT_NV12"}, {DRM_FORMAT_NV21, "DRM_FORMAT_NV21"}, + {DRM_FORMAT_NV16, "DRM_FORMAT_NV16"}, {DRM_FORMAT_NV61, "DRM_FORMAT_NV61"}, + {DRM_FORMAT_NV24, "DRM_FORMAT_NV24"}, {DRM_FORMAT_NV42, "DRM_FORMAT_NV42"}, + {DRM_FORMAT_YUV410, "DRM_FORMAT_YUV410"}, {DRM_FORMAT_YVU410, "DRM_FORMAT_YVU410"}, + {DRM_FORMAT_YUV411, "DRM_FORMAT_YUV411"}, {DRM_FORMAT_YVU411, "DRM_FORMAT_YVU411"}, + {DRM_FORMAT_YUV420, "DRM_FORMAT_YUV420"}, {DRM_FORMAT_YVU420, "DRM_FORMAT_YVU420"}, + {DRM_FORMAT_YUV422, "DRM_FORMAT_YUV422"}, {DRM_FORMAT_YVU422, "DRM_FORMAT_YVU422"}, + {DRM_FORMAT_YUV444, "DRM_FORMAT_YUV444"}, {DRM_FORMAT_YVU444, "DRM_FORMAT_YVU444"}, + }; + + static const char *unknown = "unknown drm format"; + for (uint32_t i = 0; i < sizeof(formatStrMaps) / sizeof(formatStrMaps[0]); i++) { + if (formatStrMaps[i].value == format) { + return formatStrMaps[i].str; + } + } + DISPLAY_LOGE("GetDrmFmtStr unknown format %{public}d", format); + return unknown; +} + +static uint32_t ConvertFormatToDrm(PixelFormat fmtIn) +{ + static const PixelFormatConvertTbl convertTable[] = { + {DRM_FORMAT_RGBX8888, PIXEL_FMT_RGBX_8888}, {DRM_FORMAT_RGBA8888, PIXEL_FMT_RGBA_8888}, + {DRM_FORMAT_RGB888, PIXEL_FMT_RGB_888}, {DRM_FORMAT_RGB565, PIXEL_FMT_BGR_565}, + {DRM_FORMAT_BGRX4444, PIXEL_FMT_BGRX_4444}, {DRM_FORMAT_BGRA4444, PIXEL_FMT_BGRA_4444}, + {DRM_FORMAT_RGBA4444, PIXEL_FMT_RGBA_4444}, {DRM_FORMAT_RGBX4444, PIXEL_FMT_RGBX_4444}, + {DRM_FORMAT_BGRX5551, PIXEL_FMT_BGRX_5551}, {DRM_FORMAT_BGRA5551, PIXEL_FMT_BGRA_5551}, + {DRM_FORMAT_BGRX8888, PIXEL_FMT_BGRX_8888}, {DRM_FORMAT_BGRA8888, PIXEL_FMT_BGRA_8888}, + {DRM_FORMAT_NV12, PIXEL_FMT_YCBCR_420_SP}, {DRM_FORMAT_NV21, PIXEL_FMT_YCRCB_420_SP}, + {DRM_FORMAT_YUV420, PIXEL_FMT_YCBCR_420_P}, {DRM_FORMAT_YVU420, PIXEL_FMT_YCRCB_420_P}, + {DRM_FORMAT_NV16, PIXEL_FMT_YCBCR_422_SP}, {DRM_FORMAT_NV61, PIXEL_FMT_YCRCB_422_SP}, + {DRM_FORMAT_YUV422, PIXEL_FMT_YCBCR_422_P}, {DRM_FORMAT_YVU422, PIXEL_FMT_YCRCB_422_P}, + }; + uint32_t fmtOut = 0; + for (uint32_t i = 0; i < sizeof(convertTable) / sizeof(convertTable[0]); i++) { + if (convertTable[i].pixFormat == fmtIn) { + fmtOut = convertTable[i].drmFormat; + } + } + DISPLAY_DEBUGLOG("fmtIn %{public}d : %{public}s, outFmt %{public}d : %{public}s", fmtIn, GetPixelFmtStr(fmtIn), fmtOut, + GetDrmFmtStr(fmtOut)); + return fmtOut; +} + +static uint64_t ConvertUsageToGbm(uint64_t inUsage) +{ + uint64_t outUsage = GBM_BO_USE_TEXTURING; + if (inUsage & HBM_USE_CPU_READ) { + outUsage |= GBM_BO_USE_SW_READ_OFTEN; + } + if (inUsage & HBM_USE_CPU_WRITE) { + outUsage |= GBM_BO_USE_SW_WRITE_OFTEN; + } + DISPLAY_DEBUGLOG("outUsage 0x%{public}" PRIx64 "", outUsage); + return outUsage; +} + +static int32_t InitGbmDevice(const char *drmFile, GrallocManager *grallocManager) +{ + DISPLAY_DEBUGLOG(); + if (grallocManager->gbmDevice == NULL) { + char path[PATH_MAX] = {0}; + if (realpath(drmFile, path) == NULL) { + DISPLAY_LOGE(" drm File : %{public}s is not a realpath, errno: %{public}s", drmFile, strerror(errno)); + return DISPLAY_PARAM_ERR; + } + int drmFd = open(path, O_RDWR); + if (drmFd < 0) { + DISPLAY_LOGE("drm file:%{public}s open failed %{public}s", drmFile, strerror(errno)); + return DISPLAY_FD_ERR; + } + /* + if (WaylandDrmAuth(drmFd) != AUTH_SCUCCESS) { + DISPLAY_LOGE("drm authentication failed, may have no permission to allocate memory"); + } + */ + drmDropMaster(drmFd); + struct gbm_device *gbmDevice = hdi_gbm_create_device(drmFd); + grallocManager->drmFd = drmFd; + if (gbmDevice == NULL) { + close(drmFd); + grallocManager->drmFd = -1; + DISPLAY_LOGE("gbm device create failed"); + return DISPLAY_FAILURE; + } + grallocManager->gbmDevice = gbmDevice; + grallocManager->drmFd = drmFd; + DListHeadInit(&grallocManager->gbmBoHead); + } + return DISPLAY_SUCCESS; +} + +static void DeInitGbmDevice(GrallocManager *grallocManager) +{ + DISPLAY_DEBUGLOG(); + hdi_gbm_device_destroy(grallocManager->gbmDevice); + if (grallocManager->drmFd > 0) { + close(grallocManager->drmFd); + grallocManager->drmFd = -1; + } + grallocManager->gbmDevice = NULL; +} + +static int32_t DmaBufferSync(const BufferHandle *handle, bool start) +{ + DISPLAY_DEBUGLOG(); + struct dma_buf_sync syncPrm; + errno_t eok = memset_s(&syncPrm, sizeof(syncPrm), 0, sizeof(syncPrm)); + DISPLAY_CHK_RETURN((eok != EOK), DISPLAY_PARAM_ERR, DISPLAY_LOGE("dma buffer sync memset_s failed")); + + if (handle->usage & HBM_USE_CPU_WRITE) { + syncPrm.flags |= DMA_BUF_SYNC_WRITE; + } + + if (handle->usage & HBM_USE_CPU_READ) { + syncPrm.flags |= DMA_BUF_SYNC_READ; + } + + if (start) { + syncPrm.flags |= DMA_BUF_SYNC_START; + } else { + syncPrm.flags |= DMA_BUF_SYNC_END; + } + int retry = 6; + int ret; + do { + ret = ioctl(handle->fd, DMA_BUF_IOCTL_SYNC, &syncPrm); + } while ((retry--) && (ret != -EAGAIN) && (ret != -EINTR)); + + if (ret < 0) { + DISPLAY_LOGE("sync failed"); + return DISPLAY_SYS_BUSY; + } + return DISPLAY_SUCCESS; +} + +static void InitBufferHandle(struct gbm_bo *bo, int fd, const AllocInfo *info, PriBufferHandle *buffer) +{ + BufferHandle *bufferHandle = &(buffer->hdl); + bufferHandle->fd = fd; + bufferHandle->reserveFds = 0; + bufferHandle->reserveInts = 0; + bufferHandle->stride = hdi_gbm_bo_get_stride(bo); + bufferHandle->width = hdi_gbm_bo_get_width(bo); + bufferHandle->height = hdi_gbm_bo_get_height(bo); + bufferHandle->usage = info->usage; + bufferHandle->format = info->format; + bufferHandle->virAddr = NULL; + bufferHandle->size = hdi_gbm_bo_get_stride(bo) * hdi_gbm_bo_get_height(bo); +} + +int32_t GbmAllocMem(const AllocInfo *info, BufferHandle **buffer) +{ + DISPLAY_CHK_RETURN((info == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("info is null")); + DISPLAY_CHK_RETURN((buffer == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("buffer is null")); + PriBufferHandle *priBuffer = NULL; + uint32_t drmFmt = ConvertFormatToDrm(info->format); + DISPLAY_CHK_RETURN((drmFmt == INVALID_PIXEL_FMT), DISPLAY_NOT_SUPPORT, + DISPLAY_LOGE("format %{public}d can not support", info->format)); + DISPLAY_DEBUGLOG("requeset width %{public}d, heigt %{public}d, format %{public}d", + info->width, info->height, drmFmt); + + GRALLOC_LOCK(); + GrallocManager *grallocManager = GetGrallocManager(); + DISPLAY_CHK_RETURN((grallocManager == NULL), DISPLAY_PARAM_ERR, DISPLAY_LOGE("gralloc manager failed"); + GRALLOC_UNLOCK()); + struct gbm_bo *bo = + hdi_gbm_bo_create(grallocManager->gbmDevice, info->width, info->height, drmFmt, ConvertUsageToGbm(info->usage)); + DISPLAY_CHK_RETURN((bo == NULL), DISPLAY_NOMEM, DISPLAY_LOGE("gbm create bo failed"); GRALLOC_UNLOCK()); + + int fd = hdi_gbm_bo_get_fd(bo); + DISPLAY_CHK_RETURN((fd < 0), DISPLAY_FD_ERR, DISPLAY_LOGE("gbm can not get fd"); hdi_gbm_bo_destroy(bo); \ + GRALLOC_UNLOCK()); + + priBuffer = (PriBufferHandle *)malloc(sizeof(PriBufferHandle)); + DISPLAY_CHK_RETURN((priBuffer == NULL), DISPLAY_NULL_PTR, DISPLAY_LOGE("bufferhandle malloc failed"); goto error); + + errno_t eok = memset_s(priBuffer, sizeof(PriBufferHandle), 0, sizeof(PriBufferHandle)); + if (eok != EOK) { + DISPLAY_LOGE("memset_s failed"); + } + DISPLAY_CHK_RETURN((eok != EOK), DISPLAY_PARAM_ERR, DISPLAY_LOGE("memset_s failed"); goto error); + + InitBufferHandle(bo, fd, info, priBuffer); + *buffer = &priBuffer->hdl; + hdi_gbm_bo_destroy(bo); + GRALLOC_UNLOCK(); + return DISPLAY_SUCCESS; +error: + close(fd); + hdi_gbm_bo_destroy(bo); + if (priBuffer != NULL) { + free(priBuffer); + } + GRALLOC_UNLOCK(); + return DISPLAY_FAILURE; +} + +static void CloseBufferHandle(BufferHandle *handle) +{ + DISPLAY_CHK_RETURN_NOT_VALUE((handle == NULL), DISPLAY_LOGE("buffer is null")); + if (handle->fd >= 0) { + close(handle->fd); + handle->fd = -1; + } + const uint32_t reserveFds = handle->reserveFds; + for (uint32_t i = 0; i < reserveFds; i++) { + if (handle->reserve[i] >= 0) { + close(handle->reserve[i]); + handle->reserve[i] = -1; + } + } +} + +void GbmFreeMem(BufferHandle *buffer) +{ + DISPLAY_DEBUGLOG(); + DISPLAY_CHK_RETURN_NOT_VALUE((buffer == NULL), DISPLAY_LOGE("buffer is null")); + if ((buffer->virAddr != NULL) && (GbmUnmap(buffer) != DISPLAY_SUCCESS)) { + DISPLAY_LOGE("freeMem unmap buffer failed"); + } + CloseBufferHandle(buffer); + free(buffer); +} + +void *GbmMmap(BufferHandle *buffer) +{ + void *virAddr = NULL; + DISPLAY_DEBUGLOG(); + if (buffer == NULL) { + DISPLAY_LOGE("gbmmap the buffer handle is NULL"); + return NULL; + } + if (buffer->virAddr != NULL) { + DISPLAY_DEBUGLOG("the buffer has virtual addr"); + return buffer->virAddr; + } + virAddr = mmap(NULL, buffer->size, PROT_READ | PROT_WRITE, MAP_SHARED, buffer->fd, 0); + if (virAddr == MAP_FAILED) { + DISPLAY_LOGE("mmap failed errno %{public}s, fd : %{public}d", strerror(errno), buffer->fd); + } + buffer->virAddr = virAddr; + return virAddr; +} + +int32_t GbmUnmap(BufferHandle *buffer) +{ + DISPLAY_DEBUGLOG(); + if (buffer == NULL) { + DISPLAY_LOGE("gbmumap the buffer handle is null"); + return DISPLAY_NULL_PTR; + } + + if (buffer->virAddr == NULL) { + DISPLAY_LOGE("virAddr is NULL , has not map the buffer"); + return DISPLAY_PARAM_ERR; + } + int ret = munmap(buffer->virAddr, buffer->size); + if (ret != 0) { + DISPLAY_LOGE("munmap failed err: %{public}s", strerror(errno)); + return DISPLAY_FAILURE; + } + buffer->virAddr = NULL; + return DISPLAY_SUCCESS; +} + +int32_t GbmInvalidateCache(BufferHandle *buffer) +{ + DISPLAY_DEBUGLOG(); + return DmaBufferSync(buffer, true); +} + +int32_t GbmFlushCache(BufferHandle *buffer) +{ + DISPLAY_DEBUGLOG(); + return DmaBufferSync(buffer, false); +} + +int32_t GbmGrallocUninitialize(void) +{ + DISPLAY_DEBUGLOG(); + GRALLOC_LOCK(); + GrallocManager *grallocManager = GetGrallocManager(); + DISPLAY_CHK_RETURN((grallocManager == NULL), DISPLAY_PARAM_ERR, DISPLAY_LOGE("gralloc manager failed"); \ + GRALLOC_UNLOCK()); + grallocManager->referCount--; + if (grallocManager->referCount < 0) { + DeInitGbmDevice(grallocManager); + free(g_grallocManager); + g_grallocManager = NULL; + } + GRALLOC_UNLOCK(); + return DISPLAY_SUCCESS; +} + +int32_t GbmGrallocInitialize(void) +{ + DISPLAY_DEBUGLOG(); + GRALLOC_LOCK(); + GrallocManager *grallocManager = GetGrallocManager(); + DISPLAY_CHK_RETURN((grallocManager == NULL), DISPLAY_PARAM_ERR, DISPLAY_LOGE("gralloc manager failed"); \ + GRALLOC_UNLOCK()); + int ret = InitGbmDevice(g_drmFileNode, grallocManager); + DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), ret, DISPLAY_LOGE("gralloc manager failed"); GRALLOC_UNLOCK()); + grallocManager->referCount++; + GRALLOC_UNLOCK(); + return DISPLAY_SUCCESS; +} \ No newline at end of file diff --git a/hardware/display/src/display_gralloc/display_gralloc_gbm.h b/hardware/display/src/display_gralloc/display_gralloc_gbm.h new file mode 100644 index 0000000000000000000000000000000000000000..c41252fe6bda23663f1c09c358f03c58919d0b56 --- /dev/null +++ b/hardware/display/src/display_gralloc/display_gralloc_gbm.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 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 DISPLAY_GRALLOC_GBM_H +#define DISPLAY_GRALLOC_GBM_H +#include "display_type.h" +#include "hdf_dlist.h" +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + struct gbm_device *gbmDevice; + int drmFd; + struct DListHead gbmBoHead; + int32_t referCount; +} GrallocManager; + +typedef struct { + struct DListHead entry; + struct gbm_bo *bo; + int fd; +} GbmBoList; + +int32_t GbmAllocMem(const AllocInfo *info, BufferHandle **buffer); +void GbmFreeMem(BufferHandle *buffer); +void *GbmMmap(BufferHandle *buffer); +int32_t GbmUnmap(BufferHandle *buffer); +int32_t GbmInvalidateCache(BufferHandle *buffer); +int32_t GbmFlushCache(BufferHandle *buffer); +int32_t GbmGrallocUninitialize(void); +int32_t GbmGrallocInitialize(void); + +#ifdef GRALLOC_LOCK_DEBUG +#define GRALLOC_LOCK(format, ...) \ + do { \ + HDF_LOGE("[%{public}s@%{public}s:%{public}d]" format "\n", __FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); \ + pthread_mutex_lock(&g_lock); \ + } while (0) + +#define GRALLOC_UNLOCK(format, ...) \ + do { \ + HDF_LOGE("[%{public}s@%{public}s:%{public}d]" format "\n", __FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__); \ + pthread_mutex_unlock(&g_lock); \ + } while (0) +#else +#define GRALLOC_LOCK(format, ...) \ + do { \ + pthread_mutex_lock(&g_lock); \ + } while (0) + +#define GRALLOC_UNLOCK(format, ...) \ + do { \ + pthread_mutex_unlock(&g_lock); \ + } while (0) +#endif + +#ifdef __cplusplus +} +#endif + +#endif // DISPLAY_GRALLOC_GBM_H diff --git a/hardware/display/src/display_gralloc/hi_gbm.c b/hardware/display/src/display_gralloc/hi_gbm.c new file mode 100644 index 0000000000000000000000000000000000000000..0c3c790c3668cb76116b84577afcd6a38e309b4d --- /dev/null +++ b/hardware/display/src/display_gralloc/hi_gbm.c @@ -0,0 +1,195 @@ +/* + * Copyright (c) 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. + */ + +#include "hi_gbm.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "display_common.h" +#include "hi_gbm_internal.h" +#ifdef ROCKCHIP_CMA +#define ROCKCHIP_BO_CONTIG (1 << 0) +#endif + +typedef struct { + uint32_t numPlanes; + uint32_t radio[MAX_PLANES]; +} PlaneLayoutInfo; + +typedef struct { + uint32_t format; + uint32_t bitsPerPixel; // bits per pixel for first plane + const PlaneLayoutInfo *planes; +} FormatInfo; + +static const PlaneLayoutInfo g_yuv420SPLayout = { + .numPlanes = 2, + .radio = { 4, 2 }, +}; + +static const PlaneLayoutInfo g_yuv420PLayout = { + .numPlanes = 3, + .radio = { 4, 1, 1 }, +}; + +static const PlaneLayoutInfo g_yuv422SPLayout = { + .numPlanes = 2, + .radio = { 4, 4 }, +}; + +static const PlaneLayoutInfo g_yuv422PLayout = { + .numPlanes = 3, + .radio = { 4, 2, 2 }, +}; + +static const FormatInfo *GetFormatInfo(uint32_t format) +{ + static const FormatInfo fmtInfos[] = { + {DRM_FORMAT_RGBX8888, 32, NULL}, {DRM_FORMAT_RGBA8888, 32, NULL}, + {DRM_FORMAT_BGRX8888, 32, NULL}, {DRM_FORMAT_BGRA8888, 32, NULL}, + {DRM_FORMAT_RGB888, 24, NULL}, {DRM_FORMAT_RGB565, 16, NULL}, + {DRM_FORMAT_BGRX4444, 16, NULL}, {DRM_FORMAT_BGRA4444, 16, NULL}, + {DRM_FORMAT_RGBA4444, 16, NULL}, {DRM_FORMAT_RGBX4444, 16, NULL}, + {DRM_FORMAT_BGRX5551, 16, NULL}, {DRM_FORMAT_BGRA5551, 16, NULL}, + {DRM_FORMAT_NV12, 8, &g_yuv420SPLayout}, {DRM_FORMAT_NV21, 8, &g_yuv420SPLayout}, + {DRM_FORMAT_NV16, 8, &g_yuv422SPLayout}, {DRM_FORMAT_NV61, 8, &g_yuv422SPLayout}, + {DRM_FORMAT_YUV420, 8, &g_yuv420PLayout}, {DRM_FORMAT_YVU420, 8, &g_yuv420PLayout}, + {DRM_FORMAT_YUV422, 8, &g_yuv422PLayout}, {DRM_FORMAT_YVU422, 8, &g_yuv422PLayout}, + }; + + for (uint32_t i = 0; i < sizeof(fmtInfos) / sizeof(FormatInfo); i++) { + if (fmtInfos[i].format == format) { + return &fmtInfos[i]; + } + } + DISPLAY_LOGE("the format can not support"); + return NULL; +} + +void InitGbmBo(struct gbm_bo *bo, const struct drm_mode_create_dumb *dumb) +{ + DISPLAY_CHK_RETURN_NOT_VALUE((dumb == NULL), DISPLAY_LOGE("dumb is null")); + DISPLAY_CHK_RETURN_NOT_VALUE((bo == NULL), DISPLAY_LOGE("bo is null")); + bo->stride = dumb->pitch; + bo->size = dumb->size; + bo->handle = dumb->handle; +} + +static uint32_t AdjustStrideFromFormat(uint32_t format, uint32_t height) +{ + uint32_t tmpHeight = height; + const FormatInfo *fmtInfo = GetFormatInfo(format); + if ((fmtInfo != NULL) && (fmtInfo->planes != NULL)) { + uint32_t sum = fmtInfo->planes->radio[0]; + for (uint32_t i = 1; (i < fmtInfo->planes->numPlanes) && (i < MAX_PLANES); i++) { + sum += fmtInfo->planes->radio[i]; + } + if (sum > 0) { + tmpHeight = DIV_ROUND_UP((height * sum), fmtInfo->planes->radio[0]); + } + DISPLAY_DEBUGLOG("height adjust to : %{public}d", tmpHeight); + } + return tmpHeight; +} + +struct gbm_bo *hdi_gbm_bo_create(struct gbm_device *gbm, uint32_t width, uint32_t height, uint32_t format, + uint32_t usage) +{ + DISPLAY_UNUSED(usage); + int ret; + struct gbm_bo *bo; + struct drm_mode_create_dumb dumb = { 0 }; + const FormatInfo *fmtInfo = GetFormatInfo(format); + DISPLAY_CHK_RETURN((fmtInfo == NULL), NULL, DISPLAY_LOGE("formt: 0x%{public}x can not get layout info", format)); + bo = (struct gbm_bo *)calloc(1, sizeof(struct gbm_bo)); + DISPLAY_CHK_RETURN((bo == NULL), NULL, DISPLAY_LOGE("gbm bo create fialed no memery")); + (void)memset_s(bo, sizeof(struct gbm_bo), 0, sizeof(struct gbm_bo)); + bo->width = width; + bo->height = height; + bo->gbm = gbm; + bo->format = format; + // init create_dumb + dumb.height = ALIGN_UP(height, HEIGHT_ALIGN); + dumb.width = ALIGN_UP(AdjustStrideFromFormat(format, width), WIDTH_ALIGN); + dumb.flags = 0; + dumb.bpp = fmtInfo->bitsPerPixel; + ret = drmIoctl(gbm->fd, DRM_IOCTL_MODE_CREATE_DUMB, &dumb); + DISPLAY_LOGI("fmt 0x%{public}x create dumb width: %{public}d height: %{public}d bpp: %{public}u pitch %{public}d " + "size %{public}llu", + format, dumb.width, dumb.height, dumb.bpp, dumb.pitch, dumb.size); + DISPLAY_CHK_RETURN((ret != 0), NULL, DISPLAY_LOGE("DRM_IOCTL_MODE_CREATE_DUMB failed errno %{public}d", errno)); + InitGbmBo(bo, &dumb); + DISPLAY_LOGI( + "fmt 0x%{public}x create dumb width: %{public}d height: %{public}d stride %{public}d size %{public}u", format, + bo->width, bo->height, bo->stride, bo->size); + return bo; +} + +struct gbm_device *hdi_gbm_create_device(int fd) +{ + struct gbm_device *gbm; + gbm = (struct gbm_device *)calloc(1, sizeof(struct gbm_device)); + DISPLAY_CHK_RETURN((gbm == NULL), NULL, DISPLAY_LOGE("memory calloc failed")); + gbm->fd = fd; + return gbm; +} + +void hdi_gbm_device_destroy(struct gbm_device *gbm) +{ + free(gbm); +} + +uint32_t hdi_gbm_bo_get_stride(struct gbm_bo *bo) +{ + DISPLAY_CHK_RETURN((bo == NULL), 0, DISPLAY_LOGE("the bo is null")); + return bo->stride; +} + +uint32_t hdi_gbm_bo_get_width(struct gbm_bo *bo) +{ + DISPLAY_CHK_RETURN((bo == NULL), 0, DISPLAY_LOGE("the bo is null")); + return bo->width; +} + +uint32_t hdi_gbm_bo_get_height(struct gbm_bo *bo) +{ + DISPLAY_CHK_RETURN((bo == NULL), 0, DISPLAY_LOGE("the bo is null")); + return bo->height; +} + +void hdi_gbm_bo_destroy(struct gbm_bo *bo) +{ + int ret; + DISPLAY_CHK_RETURN_NOT_VALUE((bo == NULL), DISPLAY_LOGE("the bo is null")); + struct drm_mode_destroy_dumb dumb = { 0 }; + dumb.handle = bo->handle; + ret = drmIoctl(bo->gbm->fd, DRM_IOCTL_MODE_DESTROY_DUMB, &dumb); + DISPLAY_CHK_RETURN_NOT_VALUE((ret), DISPLAY_LOGE("dumb buffer destroy failed errno %{public}d", errno)); + free(bo); +} + +int hdi_gbm_bo_get_fd(struct gbm_bo *bo) +{ + int fd, ret; + ret = drmPrimeHandleToFD(bo->gbm->fd, bo->handle, DRM_CLOEXEC | DRM_RDWR, &fd); + DISPLAY_CHK_RETURN((ret), -1, + DISPLAY_LOGE("drmPrimeHandleToFD failed ret: %{public}d errno: %{public}d", ret, errno)); + return fd; +} diff --git a/hardware/display/src/display_gralloc/hi_gbm.h b/hardware/display/src/display_gralloc/hi_gbm.h new file mode 100644 index 0000000000000000000000000000000000000000..906e286949d85c6fafb5fed7e5b14e8b9473c431 --- /dev/null +++ b/hardware/display/src/display_gralloc/hi_gbm.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 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 HI_GBM_H +#define HI_GBM_H +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +struct gbm_device; +struct gbm_bo; + +enum gbm_bo_flags { + /* * + * Buffer is going to be presented to the screen using an API such as KMS + */ + GBM_BO_USE_SCANOUT = (1 << 0), + /* * + * Buffer is going to be used as cursor + */ + GBM_BO_USE_CURSOR = (1 << 1), + /* * + * Deprecated + */ + GBM_BO_USE_CURSOR_64X64 = GBM_BO_USE_CURSOR, + /* * + * Buffer is to be used for rendering - for example it is going to be used + * as the storage for a color buffer + */ + GBM_BO_USE_RENDERING = (1 << 2), + /* * + * Deprecated + */ + GBM_BO_USE_WRITE = (1 << 3), + /* * + * Buffer is guaranteed to be laid out linearly in memory. That is, the + * buffer is laid out as an array with 'height' blocks, each block with + * length 'stride'. Each stride is in the same order as the rows of the + * buffer. This is intended to be used with buffers that will be accessed + * via dma-buf mmap(). + */ + GBM_BO_USE_LINEAR = (1 << 4), + /* * + * The buffer will be used as a texture that will be sampled from. + */ + GBM_BO_USE_TEXTURING = (1 << 5), + /* * + * The buffer will be written to by a camera subsystem. + */ + GBM_BO_USE_CAMERA_WRITE = (1 << 6), + /* * + * The buffer will be read from by a camera subsystem. + */ + GBM_BO_USE_CAMERA_READ = (1 << 7), + /* * + * Buffer inaccessible to unprivileged users. + */ + GBM_BO_USE_PROTECTED = (1 << 8), + /* * + * These flags specify the frequency of software access. These flags do not + * guarantee the buffer is linear, but do guarantee gbm_bo_map(..) will + * present a linear view. + */ + GBM_BO_USE_SW_READ_OFTEN = (1 << 9), + GBM_BO_USE_SW_READ_RARELY = (1 << 10), + GBM_BO_USE_SW_WRITE_OFTEN = (1 << 11), + GBM_BO_USE_SW_WRITE_RARELY = (1 << 12), + /* * + * The buffer will be written by a video decode accelerator. + */ + GBM_BO_USE_HW_VIDEO_DECODER = (1 << 13), +}; + +struct gbm_device *hdi_gbm_create_device(int fd); +void hdi_gbm_device_destroy(struct gbm_device *gbm); +struct gbm_bo *hdi_gbm_bo_create(struct gbm_device *gbm, uint32_t width, uint32_t height, + uint32_t format, uint32_t usage); +uint32_t hdi_gbm_bo_get_stride(struct gbm_bo *bo); +uint32_t hdi_gbm_bo_get_width(struct gbm_bo *bo); +uint32_t hdi_gbm_bo_get_height(struct gbm_bo *bo); +void hdi_gbm_bo_destroy(struct gbm_bo *bo); +int hdi_gbm_bo_get_fd(struct gbm_bo *bo); + +#if defined(__cplusplus) +} +#endif +#endif // HI_GBM_H diff --git a/hardware/display/src/display_gralloc/hi_gbm_internal.h b/hardware/display/src/display_gralloc/hi_gbm_internal.h new file mode 100644 index 0000000000000000000000000000000000000000..3155bb669334833f45da03be5db37f6b47d59653 --- /dev/null +++ b/hardware/display/src/display_gralloc/hi_gbm_internal.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 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 HI_GBM_INTERNEL_H +#define HI_GBM_INTERNEL_H + +#define DIV_ROUND_UP(n, d) (((n) + (d)-1) / (d)) +#define ALIGN_UP(x, a) ((((x) + ((a)-1)) / (a)) * (a)) +#define HEIGHT_ALIGN 2U +#define WIDTH_ALIGN 8U + +#define MAX_PLANES 3 + +struct gbm_device { + int fd; +}; + +struct gbm_bo { + struct gbm_device *gbm; + uint32_t width; + uint32_t height; + uint32_t format; + uint32_t handle; + uint32_t stride; + uint32_t size; +}; + +#endif // HI_GBM_INTERNEL_H \ No newline at end of file diff --git a/hardware/display/src/display_gralloc/hisilicon_drm.h b/hardware/display/src/display_gralloc/hisilicon_drm.h new file mode 100644 index 0000000000000000000000000000000000000000..eed389e88acc3154ba29a3d0010f3a463b18f7b1 --- /dev/null +++ b/hardware/display/src/display_gralloc/hisilicon_drm.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 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 HISILICON_DRM_H +#define HISILICON_DRM_H + +#include "drm.h" + +#if defined(__cplusplus) +extern "C" { +#endif +#define DRM_HISILICON_GEM_FD_TO_PHYADDR 0x1 + +struct DrmHisiliconPhyaddr { + /* * return the physical address */ + __u64 phyaddr; + /* * dmabuf file descriptor */ + __s32 fd; +}; + +#define DRM_IOCTL_HISILICON_GEM_FD_TO_PHYADDR \ + DRM_IOWR(DRM_COMMAND_BASE + DRM_HISILICON_GEM_FD_TO_PHYADDR, struct DrmHisiliconPhyaddr) + +#if defined(__cplusplus) +} +#endif + +#endif // HISILICON_DRM_H diff --git a/hardware/display/src/display_gralloc/wayland_drm_auth_client.c b/hardware/display/src/display_gralloc/wayland_drm_auth_client.c new file mode 100644 index 0000000000000000000000000000000000000000..d5b1cda395ed9826bc310d0004f96548b5836b5c --- /dev/null +++ b/hardware/display/src/display_gralloc/wayland_drm_auth_client.c @@ -0,0 +1,113 @@ +/* + * Copyright (c) 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. + */ + +#include "wayland_drm_auth_client.h" +#include +#include +#include "xf86drm.h" +#include "wayland-client.h" +#include "drm-auth-client-protocol.h" +#include "display_common.h" + +typedef struct { + struct wl_display *display; + struct wl_registry *registry; + struct wl_drm_auth *drmAuth; + enum wl_drm_auth_status authStatus; +} WaylandDisplay; + +const char *AUTH_INTERFACE_NAME = "wl_drm_auth"; + +static void AuthenticationStatus(void *data, struct wl_drm_auth *wlDrmAuth, uint32_t status) +{ + (void)wlDrmAuth; + DISPLAY_DEBUGLOG("AuthenticationStatus the status %{public}d", status); + WaylandDisplay *display = data; + display->authStatus = status; +} + +static const struct wl_drm_auth_listener g_drmAuthListener = { AuthenticationStatus }; + +static void RegistryHandleGlobal(void *data, struct wl_registry *registry, uint32_t id, const char *interface, + uint32_t version) +{ + WaylandDisplay *display = data; + DISPLAY_DEBUGLOG("interface global : %{public}s", interface); + if (strcmp(interface, wl_drm_auth_interface.name) == 0) { + display->drmAuth = wl_registry_bind(registry, id, &wl_drm_auth_interface, 1); + wl_drm_auth_add_listener(display->drmAuth, &g_drmAuthListener, display); + } +} + +static void RegistryHandleGlobalRemove(void *data, struct wl_registry *registry, uint32_t name) +{ + DISPLAY_DEBUGLOG("RegistryHandleGlobalRemove %{publuc}d name ", name); +} + +static const struct wl_registry_listener g_registrListener = { RegistryHandleGlobal, RegistryHandleGlobalRemove }; + +void DeInitWaylandClient(WaylandDisplay *display) +{ + DISPLAY_DEBUGLOG("DeInitWaylandClient"); + DISPLAY_CHK_RETURN_NOT_VALUE((display == NULL), DISPLAY_DEBUGLOG("display is NULL")); + if (display->registry != NULL) { + wl_registry_destroy(display->registry); + } + + if (display->display != NULL) { + wl_display_flush(display->display); + wl_display_disconnect(display->display); + } + free(display); +} + +WaylandDisplay *InitWaylandClient(void) +{ + WaylandDisplay *dsp; + int ret; + dsp = calloc(1, sizeof(WaylandDisplay)); + DISPLAY_CHK_RETURN((dsp == NULL), NULL, DISPLAY_LOGE("can not alloc memory errno : %{public}d", errno)); + dsp->display = wl_display_connect(NULL); + DISPLAY_CHK_RETURN((dsp->display == NULL), NULL, DISPLAY_LOGE("display connect failed, errno: %{public}d", errno); + DeInitWaylandClient(dsp)); + dsp->registry = wl_display_get_registry(dsp->display); + DISPLAY_CHK_RETURN((dsp->registry == NULL), NULL, DISPLAY_LOGE("can not get registry"); + DeInitWaylandClient(dsp)); + ret = wl_registry_add_listener(dsp->registry, &g_registrListener, dsp); + DISPLAY_CHK_RETURN((ret < 0), NULL, DISPLAY_LOGE("add listener failed")); + wl_display_roundtrip(dsp->display); // for get registry + wl_display_roundtrip(dsp->display); // for the listener will bind the service + return dsp; +} + +int32_t WaylandDrmAuth(int drmFd) +{ + WaylandDisplay *dsp; + drm_magic_t magic; + int ret; + dsp = InitWaylandClient(); + DISPLAY_CHK_RETURN((dsp == NULL), AUTH_FAILED, DISPLAY_LOGE("init wayland client failed")); + ret = drmGetMagic(drmFd, &magic); + DISPLAY_CHK_RETURN((ret != 0), AUTH_FAILED, DISPLAY_LOGE("can not get magic")); + DISPLAY_CHK_RETURN((dsp->drmAuth == NULL), AUTH_FAILED, DISPLAY_LOGE("drm auth service no find")); + wl_drm_auth_authenticate(dsp->drmAuth, magic); + wl_display_roundtrip(dsp->display); // wait for authenticate status return + DISPLAY_DEBUGLOG("the status of authenticate is %{public}d", dsp->authStatus); + if (dsp->authStatus == WL_DRM_AUTH_STATUS_SUCCESS) { + ret = AUTH_SCUCCESS; + } + DeInitWaylandClient(dsp); + return ret; +} diff --git a/hardware/display/src/display_gralloc/wayland_drm_auth_client.h b/hardware/display/src/display_gralloc/wayland_drm_auth_client.h new file mode 100644 index 0000000000000000000000000000000000000000..69be0fa04193612989e7fb62f207faf385455bf6 --- /dev/null +++ b/hardware/display/src/display_gralloc/wayland_drm_auth_client.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 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 WAYLAND_DRM_AUTH_CLIENT_H +#define WAYLAND_DRM_AUTH_CLIENT_H +#include + +typedef enum { + AUTH_SCUCCESS = 0, /* * authenticate sucess */ + AUTH_FAILED = 1 /* * authenticate failed */ +} AuthStatus; + +/* * + * @brief authenticate the drm fd + * + * it will connect to the wayland server, and will block to authenticate the drm fd, then disconnect the wayland + * + * @param display Indicates the pointer of wayland display + * + * @param drmFd Indicates the file descriptor of drm device + * + * @return Returns AUTH_SCUCCESS if the operation is successful else returns AUTH_FAILED + * otherwise. + * @since 1.0 + * @version 1.0 + */ +int32_t WaylandDrmAuth(int drmFd); + +#endif // WAYLAND_DRM_AUTH_CLIENT_H diff --git a/hardware/gpu/BUILD.gn b/hardware/gpu/BUILD.gn new file mode 100755 index 0000000000000000000000000000000000000000..b6da2d6ef2e1663fa092bfa3cda0d15a1380bf4b --- /dev/null +++ b/hardware/gpu/BUILD.gn @@ -0,0 +1,46 @@ +# Copyright (C) 2021 HiHope Open Source Organization . +# 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. + +import("//build/ohos.gni") +import("//build/ohos/ndk/ndk.gni") + +config("libmali-bifrost-g52-g2p0-ohos") { + include_dirs = [ "include" ] + cflags = [ + "-Wno-incompatible-pointer-types", + "-Werror", + "-Wimplicit-function-declaration", + "-Wno-error=unused-variable", + ] + cflags = [] +} + +ohos_prebuilt_shared_library("mali-bifrost-g52-g2p0-ohos") { + if (target_cpu == "arm") { + source = "lib/libmali-bifrost-g52-g2p0-ohos.so" + } else if (target_cpu == "arm64") { + source = "lib64/libmali-bifrost-g52-g2p0-wayland.so" + } + install_images = [ chipset_base_dir ] + subsystem_name = "hdf" + part_name = "display_device_driver" + install_enable = true + symlink_target_name = [ + "libEGL.so", + "libGLESv1.so", + "libGLESv2.so", + "libGLESv3.so", + "libmali.so.0", + "libmali.so.1", + ] +} diff --git a/hardware/gpu/include/gbm.h b/hardware/gpu/include/gbm.h new file mode 100644 index 0000000000000000000000000000000000000000..1e8bc46f881ddca09ad721e11ebd5a8055da0d9d --- /dev/null +++ b/hardware/gpu/include/gbm.h @@ -0,0 +1,355 @@ +/* + * Copyright (c) 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 _GBM_H_ +#define _GBM_H_ + +#define __GBM__ 1 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * \file gbm.h + * \brief Generic Buffer Manager + */ + +struct gbm_device; +struct gbm_bo; +struct gbm_iSurface; + +/** + * \mainpage The Generic Buffer Manager + * + * This module provides an abstraction that the caller can use to request a + * buffer from the underlying memory management system for the platform. + * + * This allows the creation of portable code whilst still allowing access to + * the underlying memory manager. + */ + +/** + * Abstraction representing the handle to a buffer allocated by the + * manager + */ +union gbm_bo_handle { + void *ptr; + int32_t s32; + uint32_t u32; + int64_t s64; + uint64_t u64; +}; + +/** Format of the allocated buffer */ +enum gbm_bo_format { + /** RGB with 8 bits per channel in a 32 bit value */ + GBM_BO_FORMAT_XRGB8888, + /** ARGB with 8 bits per channel in a 32 bit value */ + GBM_BO_FORMAT_ARGB8888 +}; + + +/** + * The FourCC format codes are taken from the drm_fourcc.h definition, and + * re-namespaced. New GBM formats must not be added, unless they are + * identical ports from drm_fourcc. + */ +#define __gbm_fourcc_code(a, b, c, d) ((uint32_t)(a) | ((uint32_t)(b) << 8) | \ + ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24)) + +#define GBM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */ + +/* color index */ +#define GBM_FORMAT_C8 __gbm_fourcc_code('C', '8', ' ', ' ') /* [7:0] C */ + +/* 8 bpp Red */ +#define GBM_FORMAT_R8 __gbm_fourcc_code('R', '8', ' ', ' ') /* [7:0] R */ + +/* 16 bpp RG */ +#define GBM_FORMAT_GR88 __gbm_fourcc_code('G', 'R', '8', '8') /* [15:0] G:R 8:8 little endian */ + +/* 8 bpp RGB */ +#define GBM_FORMAT_RGB332 __gbm_fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */ +#define GBM_FORMAT_BGR233 __gbm_fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */ + +/* 16 bpp RGB */ +#define GBM_FORMAT_XRGB4444 __gbm_fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */ +#define GBM_FORMAT_XBGR4444 __gbm_fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */ +#define GBM_FORMAT_RGBX4444 __gbm_fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */ +#define GBM_FORMAT_BGRX4444 __gbm_fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */ + +#define GBM_FORMAT_ARGB4444 __gbm_fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */ +#define GBM_FORMAT_ABGR4444 __gbm_fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */ +#define GBM_FORMAT_RGBA4444 __gbm_fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */ +#define GBM_FORMAT_BGRA4444 __gbm_fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */ + +#define GBM_FORMAT_XRGB1555 __gbm_fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */ +#define GBM_FORMAT_XBGR1555 __gbm_fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */ +#define GBM_FORMAT_RGBX5551 __gbm_fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */ +#define GBM_FORMAT_BGRX5551 __gbm_fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */ + +#define GBM_FORMAT_ARGB1555 __gbm_fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */ +#define GBM_FORMAT_ABGR1555 __gbm_fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */ +#define GBM_FORMAT_RGBA5551 __gbm_fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */ +#define GBM_FORMAT_BGRA5551 __gbm_fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */ + +#define GBM_FORMAT_RGB565 __gbm_fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */ +#define GBM_FORMAT_BGR565 __gbm_fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */ + +/* 24 bpp RGB */ +#define GBM_FORMAT_RGB888 __gbm_fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */ +#define GBM_FORMAT_BGR888 __gbm_fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */ + +/* 32 bpp RGB */ +#define GBM_FORMAT_XRGB8888 __gbm_fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */ +#define GBM_FORMAT_XBGR8888 __gbm_fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */ +#define GBM_FORMAT_RGBX8888 __gbm_fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */ +#define GBM_FORMAT_BGRX8888 __gbm_fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */ + +#define GBM_FORMAT_ARGB8888 __gbm_fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */ +#define GBM_FORMAT_ABGR8888 __gbm_fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */ +#define GBM_FORMAT_RGBA8888 __gbm_fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */ +#define GBM_FORMAT_BGRA8888 __gbm_fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */ + +#define GBM_FORMAT_XRGB2101010 __gbm_fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */ +#define GBM_FORMAT_XBGR2101010 __gbm_fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */ +#define GBM_FORMAT_RGBX1010102 __gbm_fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */ +#define GBM_FORMAT_BGRX1010102 __gbm_fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */ + +#define GBM_FORMAT_ARGB2101010 __gbm_fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */ +#define GBM_FORMAT_ABGR2101010 __gbm_fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */ +#define GBM_FORMAT_RGBA1010102 __gbm_fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */ +#define GBM_FORMAT_BGRA1010102 __gbm_fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */ + +/* packed YCbCr */ +#define GBM_FORMAT_YUYV __gbm_fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */ +#define GBM_FORMAT_YVYU __gbm_fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */ +#define GBM_FORMAT_UYVY __gbm_fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */ +#define GBM_FORMAT_VYUY __gbm_fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ + +#define GBM_FORMAT_AYUV __gbm_fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ + +/* + * 2 plane YCbCr + * index 0 = Y plane, [7:0] Y + * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian + * or + * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian + */ +#define GBM_FORMAT_NV12 __gbm_fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */ +#define GBM_FORMAT_NV21 __gbm_fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */ +#define GBM_FORMAT_NV16 __gbm_fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */ +#define GBM_FORMAT_NV61 __gbm_fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */ + +/* + * 3 plane YCbCr + * index 0: Y plane, [7:0] Y + * index 1: Cb plane, [7:0] Cb + * index 2: Cr plane, [7:0] Cr + * or + * index 1: Cr plane, [7:0] Cr + * index 2: Cb plane, [7:0] Cb + */ +#define GBM_FORMAT_YUV410 __gbm_fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */ +#define GBM_FORMAT_YVU410 __gbm_fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */ +#define GBM_FORMAT_YUV411 __gbm_fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */ +#define GBM_FORMAT_YVU411 __gbm_fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */ +#define GBM_FORMAT_YUV420 __gbm_fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */ +#define GBM_FORMAT_YVU420 __gbm_fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */ +#define GBM_FORMAT_YUV422 __gbm_fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */ +#define GBM_FORMAT_YVU422 __gbm_fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */ +#define GBM_FORMAT_YUV444 __gbm_fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */ +#define GBM_FORMAT_YVU444 __gbm_fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */ + + +/** + * Flags to indicate the intended use for the buffer - these are passed into + * gbm_bo_create(). The caller must set the union of all the flags that are + * appropriate + * + * \sa Use gbm_device_is_format_supported() to check if the combination of format + * and use flags are supported + */ +enum gbm_bo_flags { + /** + * Buffer is going to be presented to the screen using an API such as KMS + */ + GBM_BO_USE_SCANOUT = (1 << 0), + /** + * Buffer is going to be used as cursor + */ + GBM_BO_USE_CURSOR = (1 << 1), + /** + * Deprecated + */ + GBM_BO_USE_CURSOR_64X64 = GBM_BO_USE_CURSOR, + /** + * Buffer is to be used for rendering - for example it is going to be used + * as the storage for a color buffer + */ + GBM_BO_USE_RENDERING = (1 << 2), + /** + * Buffer can be used for gbm_bo_write. This is guaranteed to work + * with GBM_BO_USE_CURSOR, but may not work for other combinations. + */ + GBM_BO_USE_WRITE = (1 << 3), + /** + * Buffer is linear, i.e. not tiled. + */ + GBM_BO_USE_LINEAR = (1 << 4), +}; + +int gbm_device_get_fd(struct gbm_device *gbm); + +const char *gbm_device_get_backend_name(struct gbm_device *gbm); + +int gbm_device_is_format_supported(struct gbm_device *gbm, uint32_t format, uint32_t usage); + +int gbm_device_get_format_modifier_plane_count(struct gbm_device *gbm, uint32_t format, uint64_t modifier); + +void gbm_device_destroy(struct gbm_device *gbm); + +struct gbm_device *gbm_create_device(int fd); + +struct gbm_bo *gbm_bo_create(struct gbm_device *gbm, uint32_t width, uint32_t height, uint32_t format, uint32_t flags); + +struct gbm_bo *gbm_bo_create_with_modifiers(struct gbm_device *gbm, + uint32_t width, + uint32_t height, + uint32_t format, + const uint64_t *modifiers, + const unsigned int count); + +#define GBM_BO_IMPORT_WL_BUFFER 0x5501 +#define GBM_BO_IMPORT_EGL_IMAGE 0x5502 +#define GBM_BO_IMPORT_FD 0x5503 +#define GBM_BO_IMPORT_FD_MODIFIER 0x5504 + +struct gbm_import_fd_data { + int fd; + uint32_t width; + uint32_t height; + uint32_t stride; + uint32_t format; +}; + +struct gbm_import_fd_modifier_data { + uint32_t width; + uint32_t height; + uint32_t format; + uint32_t num_fds; + int fds[4]; + int strides[4]; + int offsets[4]; + uint64_t modifier; +}; + +struct gbm_bo *bm_bo_import(struct gbm_device *gbm, uint32_t type, void *buffer, uint32_t usage); + +/** + * Flags to indicate the type of mapping for the buffer - these are + * passed into gbm_bo_map(). The caller must set the union of all the + * flags that are appropriate. + * + * These flags are independent of the GBM_BO_USE_* creation flags. However, + * mapping the buffer may require copying to/from a staging buffer. + * + * See also: pipe_transfer_usage + */ +enum gbm_bo_transfer_flags { + /** + * Buffer contents read back (or accessed directly) at transfer + * create time. + */ + GBM_BO_TRANSFER_READ = (1 << 0), + /** + * Buffer contents will be written back at unmap time + * (or modified as a result of being accessed directly). + */ + GBM_BO_TRANSFER_WRITE = (1 << 1), + /** + * Read/modify/write + */ + GBM_BO_TRANSFER_READ_WRITE = (GBM_BO_TRANSFER_READ | GBM_BO_TRANSFER_WRITE), +}; + +void *gbm_bo_map(struct gbm_bo *bo, + uint32_t x, uint32_t y, uint32_t width, uint32_t height, + uint32_t flags, uint32_t *stride, void **map_data); + +void gbm_bo_unmap(struct gbm_bo *bo, void *map_data); + +uint32_t gbm_bo_get_width(struct gbm_bo *bo); + +uint32_t gbm_bo_get_height(struct gbm_bo *bo); + +uint32_t gbm_bo_get_stride(struct gbm_bo *bo); + +uint32_t gbm_bo_get_stride_for_plane(struct gbm_bo *bo, int plane); + +uint32_t gbm_bo_get_format(struct gbm_bo *bo); + +uint32_t gbm_bo_get_bpp(struct gbm_bo *bo); + +uint32_t gbm_bo_get_offset(struct gbm_bo *bo, int plane); + +struct gbm_device *gbm_bo_get_device(struct gbm_bo *bo); + +union gbm_bo_handle gbm_bo_get_handle(struct gbm_bo *bo); + +int gbm_bo_get_fd(struct gbm_bo *bo); + +uint64_t gbm_bo_get_modifier(struct gbm_bo *bo); + +int gbm_bo_get_plane_count(struct gbm_bo *bo); + +union gbm_bo_handle gbm_bo_get_handle_for_plane(struct gbm_bo *bo, int plane); + +int gbm_bo_write(struct gbm_bo *bo, const void *buf, size_t count); + +void gbm_bo_set_user_data(struct gbm_bo *bo, void *data, void (*destroy_user_data)(struct gbm_bo *, void *)); + +void *gbm_bo_get_user_data(struct gbm_bo *bo); + +void gbm_bo_destroy(struct gbm_bo *bo); + +struct gbm_iSurface *gbm_iSurface_create(struct gbm_device *gbm, + uint32_t width, uint32_t height, + uint32_t format, uint32_t flags); + +struct gbm_iSurface *gbm_iSurface_create_with_modifiers(struct gbm_device *gbm, + uint32_t width, uint32_t height, + uint32_t format, + const uint64_t *modifiers, + const unsigned int count); + +struct gbm_bo *gbm_iSurface_lock_front_buffer(struct gbm_iSurface *iSurface); + +void gbm_iSurface_release_buffer(struct gbm_iSurface *iSurface, struct gbm_bo *bo); + +int gbm_iSurface_has_free_buffers(struct gbm_iSurface *iSurface); + +void gbm_iSurface_destroy(struct gbm_iSurface *iSurface); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/hardware/gpu/lib/libmali-bifrost-g52-g2p0-ohos.so b/hardware/gpu/lib/libmali-bifrost-g52-g2p0-ohos.so new file mode 100644 index 0000000000000000000000000000000000000000..58f435e31ab2cb655f0b0a6d7691b52606161000 Binary files /dev/null and b/hardware/gpu/lib/libmali-bifrost-g52-g2p0-ohos.so differ diff --git a/hardware/gpu/lib64/libmali-bifrost-g52-g2p0-wayland.so b/hardware/gpu/lib64/libmali-bifrost-g52-g2p0-wayland.so new file mode 100644 index 0000000000000000000000000000000000000000..fb647f46aeb1443ff0ea00845e37509392b6017b Binary files /dev/null and b/hardware/gpu/lib64/libmali-bifrost-g52-g2p0-wayland.so differ diff --git a/hardware/isp/BUILD.gn b/hardware/isp/BUILD.gn new file mode 100755 index 0000000000000000000000000000000000000000..2690b6e5df7d58a2753d8c1386f3bcb3f6ffecf3 --- /dev/null +++ b/hardware/isp/BUILD.gn @@ -0,0 +1,62 @@ +# Copyright (C) 2021 HiHope Open Source Organization . +# 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. +import("//build/ohos.gni") + +ISP_DIR = "//device/soc/rockchip/hardware/isp" + +ohos_prebuilt_shared_library("librkaiq") { + if (target_cpu == "arm") { + source = "$ISP_DIR/lib/librkaiq.z.so" + } else { + source = "$ISP_DIR/lib64/librkaiq.z.so" + } + install_images = [ chipset_base_dir ] + subsystem_name = "rockchip_products" + install_enable = true +} + +ohos_prebuilt_etc("gc8034_RK-CMK-8M-2-v1_CK8401") { + source = "$ISP_DIR/etc/iqfiles/gc8034_RK-CMK-8M-2-v1_CK8401.json" + relative_install_dir = "iqfiles" + install_images = [ chipset_base_dir ] + part_name = "rockchip_products" + install_enable = true +} + +ohos_prebuilt_etc("iqfil") { + source = "$ISP_DIR/etc/iqfil.json" + relative_install_dir = "" + install_images = [ chipset_base_dir ] + part_name = "rockchip_products" + install_enable = true +} + +ohos_prebuilt_executable("ispserver") { + if (target_cpu == "arm") { + source = "$ISP_DIR/bin/ispserver" + } else { + source = "$ISP_DIR/bin64/ispserver" + } + install_images = [ chipset_base_dir ] + part_name = "rockchip_products" + install_enable = true +} + +group("isp") { + deps = [ + ":gc8034_RK-CMK-8M-2-v1_CK8401", + ":iqfil", + ":ispserver", + ":librkaiq", + ] +} diff --git a/hardware/isp/bin/ispserver b/hardware/isp/bin/ispserver new file mode 100644 index 0000000000000000000000000000000000000000..ed2444235148e77713aad68c79a4599215fc2772 Binary files /dev/null and b/hardware/isp/bin/ispserver differ diff --git a/hardware/isp/bin64/ispserver b/hardware/isp/bin64/ispserver new file mode 100644 index 0000000000000000000000000000000000000000..c59ad612fea6974e54ec6c6fa3aa34ac53e4c83b Binary files /dev/null and b/hardware/isp/bin64/ispserver differ diff --git a/hardware/isp/etc/iqfil.json b/hardware/isp/etc/iqfil.json new file mode 100644 index 0000000000000000000000000000000000000000..6d892a2b54a877e2676802749c9c4b79dc80e57e --- /dev/null +++ b/hardware/isp/etc/iqfil.json @@ -0,0 +1,4650 @@ +{ + "sensor_calib": { + "resolution": { + "width": 3264, + "height": 2448 + }, + "Gain2Reg": { + "GainMode": "EXPGAIN_MODE_LINEAR", + "GainRange": [1, 16, 64, 0, 1, 64, 1024], + "GainRange_len": 7 + }, + "Time2Reg": { + "fCoeff": [0, 0, 1, 0.5] + }, + "CISGainSet": { + "CISAgainRange": { + "Min": 1, + "Max": 16 + }, + "CISExtraAgainRange": { + "Min": 1, + "Max": 1 + }, + "CISDgainRange": { + "Min": 1, + "Max": 1 + }, + "CISIspDgainRange": { + "Min": 1, + "Max": 1 + }, + "CISHdrGainIndSetEn": 1 + }, + "CISTimeSet": { + "Linear": { + "CISTimeRegMin": 4, + "CISLinTimeRegMaxFac": { + "fCoeff": [1, 4] + }, + "CISTimeRegOdevity": { + "fCoeff": [1, 0] + } + }, + "Hdr": [{ + "name": "HDR_TWO_FRAME", + "CISTimeRegUnEqualEn": 1, + "CISTimeRegMin": 4, + "CISHdrTimeRegSumFac": { + "fCoeff": [1, 4] + }, + "CISTimeRegMax": { + "Coeff": [0, 0, 0] + }, + "CISTimeRegOdevity": { + "fCoeff": [1, 0] + } + }, { + "name": "HDR_THREE_FRAME", + "CISTimeRegUnEqualEn": 1, + "CISTimeRegMin": 4, + "CISHdrTimeRegSumFac": { + "fCoeff": [1, 4] + }, + "CISTimeRegMax": { + "Coeff": [0, 0, 0] + }, + "CISTimeRegOdevity": { + "fCoeff": [1, 0] + } + }] + }, + "CISHdrSet": { + "hdr_en": 0, + "hdr_mode": "RK_AIQ_ISP_HDR_MODE_2_LINE_HDR", + "line_mode": "RK_AIQ_SENSOR_HDR_LINE_MODE_STAGGER" + }, + "CISDcgSet": { + "Linear": { + "support_en": 0, + "dcg_optype": "RK_AIQ_OP_MODE_AUTO", + "dcg_mode": { + "Coeff": [0, 0, 0] + }, + "dcg_ratio": 1, + "sync_switch": 0, + "lcg2hcg_gain_th": 32, + "hcg2lcg_gain_th": 16 + }, + "Hdr": { + "support_en": 0, + "dcg_optype": "RK_AIQ_OP_MODE_AUTO", + "dcg_mode": { + "Coeff": [0, 0, 0] + }, + "dcg_ratio": 3.5, + "sync_switch": 1, + "lcg2hcg_gain_th": 32, + "hcg2lcg_gain_th": 16 + } + }, + "CISExpUpdate": { + "Linear": { + "time_update": 2, + "gain_update": 2, + "dcg_update": 2 + }, + "Hdr": { + "time_update": 2, + "gain_update": 2, + "dcg_update": 1 + } + }, + "CISMinFps": 10, + "CISFlip": 3 + }, + "module_calib": { + "sensor_module": { + "FNumber": 1.6, + "EFL": 5.2, + "LensT": 90, + "IRCutT": 90 + } + }, + "main_scene": [{ + "name": "normal", + "sub_scene": [{ + "name": "day", + "scene_isp21": { + "ae_calib": { + "CommCtrl": { + "Enable": 1, + "AecRunInterval": 0, + "AecOpType": "RK_AIQ_OP_MODE_AUTO", + "HistStatsMode": "CAM_HISTV2_MODE_Y", + "RawStatsMode": "CAM_RAWSTATSV2_MODE_Y", + "YRangeMode": "CAM_YRANGEV2_MODE_FULL", + "AecGridWeight": [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 1, 1, 2, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 2, 1, 1, 2, 5, 8, 10, 10, 10, 10, 10, 10, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 13, 13, 13, 13, 13, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 13, 15, 15, 15, 13, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 13, 15, 15, 15, 13, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 13, 15, 15, 15, 13, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 13, 13, 13, 13, 13, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 10, 10, 10, 10, 10, 10, 8, 5, 2, 1, 1, 2, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 2, 1, 1, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + "AecManualCtrl": { + "LinearAE": { + "ManualTimeEn": 1, + "ManualGainEn": 1, + "ManualIspDgainEn": 1, + "TimeValue": 0.02, + "GainValue": 6, + "IspDGainValue": 1 + }, + "HdrAE": { + "ManualTimeEn": 1, + "ManualGainEn": 1, + "ManualIspDgainEn": 1, + "TimeValue": [0.01, 0.02, 0.03], + "GainValue": [1, 1, 1], + "IspDGainValue": [1, 1, 1] + } + }, + "AecSpeed": { + "DampOver": 0.15, + "DampUnder": 0.45, + "DampDark2Bright": 0.15, + "DampBright2Dark": 0.45 + }, + "AecDelayFrmNum": { + "BlackDelay": 2, + "WhiteDelay": 2 + }, + "AecFrameRateMode": { + "isFpsFix": 1, + "FpsValue": 25 + }, + "AecAntiFlicker": { + "enable": 1, + "Frequency": "AECV2_FLICKER_FREQUENCY_50HZ", + "Mode": "AECV2_ANTIFLICKER_AUTO_MODE" + }, + "AecEnvLvCalib": { + "CalibFNumber": 1.6, + "CurveCoeff": [0.02859, 0.5972] + }, + "AecWinScale": { + "InRawWinScale": { + "h_offs": 0, + "v_offs": 0, + "h_size": 1, + "v_size": 1 + }, + "TmoRawWinScale": { + "h_offs": 0.1, + "v_offs": 0.1, + "h_size": 0.9, + "v_size": 0.9 + }, + "YuvWinScale": { + "h_offs": 0, + "v_offs": 0, + "h_size": 1, + "v_size": 1 + } + } + }, + "LinearAeCtrl": { + "RawStatsEn": 1, + "ToleranceIn": 10, + "ToleranceOut": 15, + "Evbias": 0, + "StrategyMode": "AECV2_STRATEGY_MODE_LOWLIGHT_PRIOR", + "InitExp": { + "InitTimeValue": 0.003, + "InitGainValue": 1, + "InitIspDGainValue": 1, + "InitPIrisGainValue": 512, + "InitDCIrisDutyValue": 100 + }, + "Route": { + "TimeDot": [0, 0.04, 0.04, 0.04, 0.04, 0.04], + "TimeDot_len": 6, + "GainDot": [1, 1, 4, 8, 15.5, 16], + "GainDot_len": 6, + "IspDGainDot": [1, 1, 1, 1, 1, 2], + "IspDGainDot_len": 6, + "PIrisDot": [512, 512, 512, 512, 512, 512], + "PIrisDot_len": 6 + }, + "DySetpoint": { + "ExpLevel": [0, 0.032, 0.064, 0.192, 0.32, 0.448], + "ExpLevel_len": 6, + "DySetpoint": [45, 45, 40, 38, 33, 30], + "DySetpoint_len": 6 + }, + "BackLightCtrl": { + "Enable": 0, + "StrBias": 0, + "MeasArea": "AECV2_MEASURE_AREA_AUTO", + "OEROILowTh": 150, + "LumaDistTh": 10, + "LvLowTh": 0.3125, + "LvHighTh": 7.5, + "BacklitSetPoint": { + "ExpLevel": [0.032, 0.064, 0.128, 0.192, 0.32, 0.448], + "ExpLevel_len": 6, + "NonOEPdfTh": [0.4, 0.45, 0.55, 0.65, 0.75, 1], + "NonOEPdfTh_len": 6, + "LowLightPdfTh": [0.2, 0.2, 0.22, 0.25, 0.3, 0.35], + "LowLightPdfTh_len": 6, + "TargetLLLuma": [25, 22, 20, 18, 15, 12], + "TargetLLLuma_len": 6 + } + }, + "OverExpCtrl": { + "Enable": 0, + "StrBias": 0, + "MaxWeight": 8, + "HighLightTh": 150, + "LowLightTh": 30, + "OverExpSetPoint": { + "OEpdf": [0.01, 0.02, 0.03, 0.04, 0.05, 0.07], + "OEpdf_len": 6, + "LowLightWeight": [1, 1, 1, 1, 1, 1], + "LowLightWeight_len": 6, + "HighLightWeight": [4, 3, 3, 3, 2, 2], + "HighLightWeight_len": 6 + } + } + }, + "HdrAeCtrl": { + "ToleranceIn": 10, + "ToleranceOut": 15, + "Evbias": 0, + "StrategyMode": "AECV2_STRATEGY_MODE_LOWLIGHT_PRIOR", + "LumaDistTh": 10, + "InitExp": { + "InitTimeValue": [0.0005, 0.003, 0.003], + "InitGainValue": [1, 1, 1], + "InitIspDGainValue": [1, 1, 1], + "InitPIrisGainValue": 512, + "InitDCIrisDutyValue": 100 + }, + "Route": { + "Frm0TimeDot": [0, 0.003, 0.003, 0.003, 0.003, 0.003], + "Frm0TimeDot_len": 6, + "Frm0GainDot": [1, 1, 4, 8, 15.5, 32], + "Frm0GainDot_len": 6, + "Frm0IspDGainDot": [1, 1, 1, 1, 1, 1], + "Frm0IspDGainDot_len": 6, + "Frm1TimeDot": [0, 0.03, 0.03, 0.03, 0.03, 0.03], + "Frm1TimeDot_len": 6, + "Frm1GainDot": [1, 1, 4, 8, 15.5, 64], + "Frm1GainDot_len": 6, + "Frm1IspDGainDot": [1, 1, 1, 1, 1, 1], + "Frm1IspDGainDot_len": 6, + "Frm2TimeDot": [0, 0.03, 0.03, 0.03, 0.03, 0.03], + "Frm2TimeDot_len": 6, + "Frm2GainDot": [1, 1, 4, 8, 15.5, 64], + "Frm2GainDot_len": 6, + "Frm2IspDGainDot": [1, 1, 1, 1, 1, 1], + "Frm2IspDGainDot_len": 6, + "PIrisDot": [512, 512, 512, 512, 512, 512], + "PIrisDot_len": 6 + }, + "ExpRatioCtrl": { + "ExpRatioType": "AECV2_HDR_RATIOTYPE_MODE_AUTO", + "ExpRatio": { + "RatioExpDot": [0, 0.1, 0.3, 0.5, 0.7, 1], + "RatioExpDot_len": 6, + "M2SRatioFix": [4, 4, 4, 4, 4, 4], + "M2SRatioFix_len": 6, + "L2MRatioFix": [4, 4, 4, 4, 4, 4], + "L2MRatioFix_len": 6, + "M2SRatioMax": [64, 64, 64, 64, 64, 64], + "M2SRatioMax_len": 6, + "L2MRatioMax": [32, 32, 30, 28, 26, 24], + "L2MRatioMax_len": 6 + } + }, + "LongFrmMode": { + "mode": "AECV2_HDR_LONGFRMMODE_NORMAL", + "SfrmMinLine": 2, + "LfrmModeExpTh": 0.62 + }, + "LframeCtrl": { + "OEROILowTh": 150, + "LvLowTh": 0.3125, + "LvHighTh": 7.5, + "LfrmSetPoint": { + "LExpLevel": [0, 0.0192, 0.0576, 0.096, 0.192, 0.384], + "LExpLevel_len": 6, + "NonOEPdfTh": [0.4, 0.45, 0.55, 0.65, 0.75, 1], + "NonOEPdfTh_len": 6, + "LowLightPdfTh": [0.2, 0.22, 0.25, 0.3, 0.35, 0.4], + "LowLightPdfTh_len": 6, + "LSetPoint": [75, 70, 65, 60, 45, 40], + "LSetPoint_len": 6, + "TargetLLLuma": [35, 32, 30, 28, 25, 20], + "TargetLLLuma_len": 6 + } + }, + "MframeCtrl": { + "MExpLevel": [0.096, 0.192, 0.384, 0.96, 1.344, 1.92], + "MExpLevel_len": 6, + "MSetPoint": [60, 60, 55, 50, 45, 40], + "MSetPoint_len": 6 + }, + "SframeCtrl": { + "HLROIExpandEn": 0, + "HLLumaTolerance": 12, + "SfrmSetPoint": { + "SExpLevel": [0, 0.0048, 0.0144, 0.024, 0.0384, 0.0576], + "SExpLevel_len": 6, + "SSetPoint": [18, 18, 15, 12, 12, 12], + "SSetPoint_len": 6, + "TargetHLLuma": [100, 100, 100, 90, 80, 70], + "TargetHLLuma_len": 6 + } + } + }, + "IrisCtrl": { + "Enable": 0, + "IrisType": "IRISV2_DC_TYPE", + "ManualEn": 0, + "ManualAttr": { + "PIrisGainValue": 1, + "DCIrisHoldValue": 30 + }, + "InitAttr": { + "PIrisGainValue": 512, + "DCIrisHoldValue": 100 + }, + "PIrisAttr": { + "TotalStep": 81, + "EffcStep": 44, + "ZeroIsMax": 1, + "StepTable": [512, 511, 506, 499, 491, 483, 474, 465, 456, 446, 437, 427, 417, 408, 398, 388, 378, 368, 359, 349, 339, 329, 319, 309, 300, 290, 280, 271, 261, 252, 242, 233, 224, 214, 205, 196, 187, 178, 170, 161, 153, 144, 136, 128, 120, 112, 105, 98, 90, 83, 77, 70, 64, 58, 52, 46, 41, 36, 31, 27, 23, 19, 16, 13, 10, 8, 6, 4, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "DCIrisAttr": { + "Kp": 0.5, + "Ki": 0.2, + "Kd": 0.3, + "MinPwmDuty": 0, + "MaxPwmDuty": 100, + "OpenPwmDuty": 40, + "ClosePwmDuty": 22 + } + }, + "SyncTest": { + "Enable": 0, + "IntervalFrm": 60, + "AlterExp": { + "LinearAE": [{ + "TimeValue": 0.02, + "GainValue": 1, + "IspDGainValue": 1, + "PIrisGainValue": 1, + "DcgMode": 0 + }, { + "TimeValue": 0.02, + "GainValue": 6, + "IspDGainValue": 1, + "PIrisGainValue": 29, + "DcgMode": 0 + }], + "LinearAE_len": 2, + "HdrAE": [{ + "TimeValue": [0.01, 0.02, 0.03], + "GainValue": [1, 1, 1], + "IspDGainValue": [1, 1, 1], + "PIrisGainValue": 1, + "DcgMode": [0, 0, 0] + }, { + "TimeValue": [0.01, 0.02, 0.03], + "GainValue": [6, 6, 1], + "IspDGainValue": [1, 1, 1], + "PIrisGainValue": 29, + "DcgMode": [0, 0, 0] + }], + "HdrAE_len": 2 + } + } + }, + "wb_v21": { + "control": { + "byPass": 0, + "mode": "CALIB_WB_MODE_AUTO" + }, + "manualPara": { + "mode": "CALIB_MWB_MODE_SCENE", + "cfg": { + "mwbGain": [1.31933, 1, 1, 2.50981], + "scene": "CALIB_WB_SCENE_CLOUDY_DAYLIGHT", + "cct": { + "CCT": 5000, + "CCRI": 0 + } + } + }, + "autoPara": { + "hdrPara": { + "frameChooseMode": "CALIB_AWB_HDR_FRAME_CHOOSE_MODE_MANUAL", + "frameChoose": 1 + }, + "lscBypassEnable": 0, + "uvDetectionEnable": 1, + "xyDetectionEnable": 1, + "yuvDetectionEnable": 1, + "lsUsedForYuvDet": ["A", "CWF", "D65", "TL84", "D50", "HZ", "D75"], + "lsUsedForYuvDet_len": 7, + "blkStatisticsEnable": 1, + "downScaleMode": "CALIB_AWB_DS_8X8", + "blkMeasureMode": "CALIB_AWB_BLK_STAT_MODE_ALL_V201", + "mainWindow": { + "mode": "CALIB_AWB_WINDOW_CFG_FIXED", + "window": [0, 0, 1, 1] + }, + "limitRange": { + "lumaValue": [0], + "lumaValue_len": 1, + "maxR": [230], + "maxR_len": 1, + "minR": [6], + "minR_len": 1, + "maxG": [230], + "maxG_len": 1, + "minG": [9], + "minG_len": 1, + "maxB": [230], + "maxB_len": 1, + "minB": [6], + "minB_len": 1, + "maxY": [210], + "maxY_len": 1, + "minY": [9], + "minY_len": 1 + }, + "rgb2TcsPara": { + "pseudoLuminanceWeight": [0.372935, 0.37602, 0.251045], + "rotationMat": [-0.589702, 0.807621, -0.326631, 0.807621, 0.589702, 0.560524, 0, 0, 1] + }, + "rgb2RotationYuvMat": [0.0351562, 0.136719, 0.0136719, 34.875, -0.0839844, 0.00195312, 0.0703125, 134.875, 0.046875, -0.0566406, 0.0507812, 109.812, 0, 0, 0, 1], + "extraWpRange": [{ + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_UV", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [244, 249, 228, 211] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_XY", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [-1096, -985, 140, 65] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_XY", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [-40, 158, 121, 16] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_XY", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [-235, -40, 237, 80] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_UV", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [0, 0, 0, 0] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_UV", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [0, 0, 0, 0] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_UV", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [0, 0, 0, 0] + }], + "wpDiffLumaWeight": { + "enable": 1, + "wpDiffWeiEnableTh": { + "wpDiffWeiNoTh": 0.004, + "wpDiffWeiLvValueTh": 64 + }, + "wpDiffwei_y": [0, 16, 32, 64, 96, 128, 192, 224, 240], + "perfectBin": [0, 0, 0, 1, 1, 1, 1, 0], + "wpDiffWeightLvSet": [{ + "LvValue": 256, + "ratioSet": [{ + "ratioValue": 0, + "weight": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "ratioValue": 0.01, + "weight": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "ratioValue": 0.1, + "weight": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }], + "ratioSet_len": 3 + }, { + "LvValue": 8192, + "ratioSet": [{ + "ratioValue": 0, + "weight": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "ratioValue": 0.01, + "weight": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "ratioValue": 0.1, + "weight": [0, 0, 0.2, 0.5, 1, 1, 1, 0.5, 0] + }], + "ratioSet_len": 3 + }], + "wpDiffWeightLvSet_len": 2 + }, + "wpDiffBlkWeiEnable": 1, + "wpDiffBlkWeight": [6, 6, 6, 8, 8, 8, 8, 10, 8, 8, 8, 8, 6, 6, 6, 6, 6, 8, 8, 10, 10, 12, 12, 12, 10, 10, 8, 8, 6, 6, 6, 8, 10, 12, 14, 16, 18, 20, 18, 16, 14, 12, 10, 8, 6, 8, 8, 12, 16, 22, 26, 30, 32, 30, 26, 22, 16, 12, 8, 8, 8, 10, 14, 22, 28, 36, 42, 46, 42, 36, 28, 22, 14, 10, 8, 8, 10, 16, 26, 36, 46, 54, 58, 54, 46, 36, 26, 16, 10, 8, 8, 12, 18, 30, 42, 54, 63, 63, 63, 54, 42, 30, 18, 12, 8, 10, 12, 20, 32, 46, 58, 63, 63, 63, 58, 46, 32, 20, 12, 10, 8, 12, 18, 30, 42, 54, 63, 63, 63, 54, 42, 30, 18, 12, 8, 8, 10, 16, 26, 36, 46, 54, 58, 54, 46, 36, 26, 16, 10, 8, 8, 10, 14, 22, 28, 36, 42, 46, 42, 36, 28, 22, 14, 10, 8, 8, 8, 12, 16, 22, 26, 30, 32, 30, 26, 22, 16, 12, 8, 8, 6, 8, 10, 12, 14, 16, 18, 20, 18, 16, 14, 12, 10, 8, 6, 6, 6, 8, 8, 10, 10, 12, 12, 12, 10, 10, 8, 8, 6, 6, 6, 6, 6, 8, 8, 8, 8, 10, 8, 8, 8, 8, 6, 6, 6], + "lightSources": [{ + "name": "A", + "doorType": "CALIB_AWB_DOOR_TYPE_INDOOR", + "standardGainValue": [1.31933, 1, 1, 2.50981], + "uvRegion": { + "u": [124.5, 54.5, 58.5, 125], + "v": [128, 114.5, 90.5, 127] + }, + "xyRegion": { + "normal": [-1.225, -0.73125, 0.0729253, -0.0435484], + "big": [-1.22875, -0.745, 0.092997, -0.0761649] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.1875, 1.1875, 1.75, 2, 4], + "lineVector": [10, 140.875, 109.375, 186.688, 101.625, 110.5], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 75], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "CWF", + "doorType": "CALIB_AWB_DOOR_TYPE_INDOOR", + "standardGainValue": [1.76901, 1, 1, 2.15255], + "uvRegion": { + "u": [68.5, 74.5, 124, 123], + "v": [73.5, 60.5, 125, 125.5] + }, + "xyRegion": { + "normal": [-0.732778, -0.438333, 0.000487089, -0.0845602], + "big": [-0.737593, -0.43537, 0.0435897, -0.1] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.125, 1.1875, 1.1875, 1.75, 2, 4], + "lineVector": [10, 137.812, 110.75, 190, 119.812, 103.938], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 70, 60, 50, 40], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "D50", + "doorType": "CALIB_AWB_DOOR_TYPE_AMBIGUITY", + "standardGainValue": [1.9499, 1, 1, 1.66695], + "uvRegion": { + "u": [74, 94, 126, 124.5], + "v": [59.5, 53.5, 124.5, 125.5] + }, + "xyRegion": { + "normal": [-0.426481, -0.171667, 0.0682934, -0.0644886], + "big": [-0.427963, -0.179074, 0.088365, -0.0845602] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.3125, 1.375, 1.75, 2, 4], + "lineVector": [10, 135.75, 110, 191, 132.938, 108.5], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "D65", + "doorType": "CALIB_AWB_DOOR_TYPE_OUTDOOR", + "standardGainValue": [2.18207, 1, 1, 1.45549], + "uvRegion": { + "u": [94, 112.5, 127.5, 126], + "v": [53.5, 48.5, 121, 124] + }, + "xyRegion": { + "normal": [-0.176111, 0.0712963, 0.0875931, -0.104632], + "big": [-0.186481, 0.0801852, 0.136228, -0.171023] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.5, 1.5, 1.8125, 2, 4], + "lineVector": [10, 133.812, 109.625, 190.75, 143.812, 109.625], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 80, 70], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "D75", + "doorType": "CALIB_AWB_DOOR_TYPE_OUTDOOR", + "standardGainValue": [2.32318, 1, 1, 1.35032], + "uvRegion": { + "u": [131.5, 127, 112.5, 129.5], + "v": [121, 122.5, 48.5, 43.5] + }, + "xyRegion": { + "normal": [0.0835185, 0.369074, 0.0962136, -0.0938241], + "big": [0.0787037, 0.375, 0.142404, -0.181831] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.3125, 1.5, 1.75, 2, 4], + "lineVector": [10, 132.688, 109.875, 190.25, 149.625, 110.688], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 80, 70, 50], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "HZ", + "doorType": "CALIB_AWB_DOOR_TYPE_INDOOR", + "standardGainValue": [1.05376, 1, 1, 2.97437], + "uvRegion": { + "u": [123.5, 57.5, 55.5, 124.5], + "v": [130.5, 140, 113.5, 128] + }, + "xyRegion": { + "normal": [-1.96056, -1.23625, 0.089909, -0.0310036], + "big": [-1.96278, -1.22944, 0.100717, -0.0837883] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.3125, 1.3125, 1.75, 2, 4], + "lineVector": [10, 143.625, 108.562, 181.688, 86.5625, 115.438], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 75, 50], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "TL84", + "doorType": "CALIB_AWB_DOOR_TYPE_INDOOR", + "standardGainValue": [1.71132, 1, 1, 2.14938], + "uvRegion": { + "u": [124, 58, 68.5, 124.5], + "v": [126.5, 90, 73.5, 125.5] + }, + "xyRegion": { + "normal": [-0.728333, -0.433889, 0.0529823, -0.038241], + "big": [-0.73875, -0.433889, 0.088365, -0.066129] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.1875, 1.3125, 1.75, 2, 4], + "lineVector": [10, 138.062, 110.062, 189.875, 118.312, 106.188], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 80, 70, 60, 60], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }], + "lightSources_len": 7 + }, + "autoExtPara": { + "lightSourceForFirstFrame": "D50", + "tolerance": { + "lumaValue": [256, 512, 32768, 131072], + "lumaValue_len": 4, + "toleranceValue": [0, 0, 0, 0], + "toleranceValue_len": 4 + }, + "runInterval": { + "lumaValue": [256, 512, 32768, 131072], + "lumaValue_len": 4, + "intervalValue": [0, 0, 0, 0], + "intervalValue_len": 4 + }, + "dampFactor": { + "dFStep": 0.05, + "dFMin": 0.7, + "dFMax": 0.9, + "lvIIRsize": 4, + "lvVarTh": 0.04 + }, + "wbGainAdjust": { + "enable": 0, + "lutAll": [{ + "lumaValue": 128, + "ct_grid_num": 7, + "cri_grid_num": 9, + "ct_in_range": [2000, 8000], + "cri_in_range": [-1, 1], + "ct_lut_out": [2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000], + "ct_lut_out_len": 63, + "cri_lut_out": [-1, -1, -1, -1, -1, -1, -1, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 1, 1, 1, 1, 1, 1, 1], + "cri_lut_out_len": 63 + }, { + "lumaValue": 8192, + "ct_grid_num": 7, + "cri_grid_num": 9, + "ct_in_range": [2000, 8000], + "cri_in_range": [-1, 1], + "ct_lut_out": [2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000], + "ct_lut_out_len": 63, + "cri_lut_out": [-1, -1, -1, -1, -1, -1, -1, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 1, 1, 1, 1, 1, 1, 1], + "cri_lut_out_len": 63 + }, { + "lumaValue": 65536, + "ct_grid_num": 7, + "cri_grid_num": 9, + "ct_in_range": [2000, 8000], + "cri_in_range": [-1, 1], + "ct_lut_out": [2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000], + "ct_lut_out_len": 63, + "cri_lut_out": [-1, -1, -1, -1, -1, -1, -1, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 1, 1, 1, 1, 1, 1, 1], + "cri_lut_out_len": 63 + }], + "lutAll_len": 3 + }, + "wbGainDaylightClip": { + "enable": 0, + "outdoor_cct_min": 5000 + }, + "wbGainClip": { + "enable": 0, + "cct": [1000, 2856, 4100, 6500, 7500], + "cct_len": 5, + "cri_bound_up": [0.091, 0.091, 0.18, 0.12, 0.12], + "cri_bound_up_len": 5, + "cri_bound_low": [0.07, 0.07, 0.16, 0.16, 0.16], + "cri_bound_low_len": 5 + }, + "division": { + "lumaValThLow": 110, + "lumaValThLow2": 200, + "lumaValThHigh": 65536, + "lumaValThHigh2": 65600, + "wpNumTh": { + "lumaValue": [0], + "lumaValue_len": 1, + "low": [50], + "low_len": 1, + "high": [80], + "high_len": 1 + } + }, + "defaultNightGain": [1.31933, 1, 1, 2.50981], + "lumaValueMatrix": [0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144], + "defaultNightGainWeight": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "probCalcDis": { + "proDis_THH": 4.6124, + "proDis_THL": 0.0269 + }, + "probCalcLv": { + "outdoorLumaValThLow": 30000, + "outdoorLumaValThHigh": 45745 + }, + "probCalcWp": { + "wpNumPercTh": 0.031, + "wpNumPercTh2": 0.2 + }, + "converged": { + "varThforUnDamp": 0.005, + "varThforDamp": 0.005 + }, + "xyRegionStableSelection": { + "enable": 1, + "wpNumTh": { + "lumaValue": [0], + "lumaValue_len": 1, + "forBigType": [80], + "forBigType_len": 1, + "forExtraType": [80], + "forExtraType_len": 1 + }, + "xyTypeListSize": 50, + "varianceLumaTh": 0.06 + }, + "weightForNightGainCalc": [25, 25, 25, 25], + "weightForNightGainCalc_len": 4, + "singleColorProces": { + "enable": 1, + "colorBlock": [{ + "index": 15, + "meanC": 26.1455, + "meanH": 30.4796 + }, { + "index": 13, + "meanC": 24.607, + "meanH": -75.964 + }, { + "index": 5, + "meanC": 10.9565, + "meanH": -67.7098 + }, { + "index": 10, + "meanC": 11.9595, + "meanH": -41.2431 + }, { + "index": 14, + "meanC": 19.0206, + "meanH": 144.275 + }, { + "index": 16, + "meanC": 30.264, + "meanH": 88.699 + }], + "colorBlock_len": 6, + "lsUsedForEstimation": [{ + "name": "A", + "RGain": 1.31933, + "BGain": 2.50981 + }, { + "name": "TL84", + "RGain": 1.9499, + "BGain": 1.66695 + }, { + "name": "D50", + "RGain": 1.71132, + "BGain": 2.14938 + }], + "lsUsedForEstimation_len": 3, + "alpha": 0.9 + }, + "lineRgBg": [-0.8395, -0.5434, -2.741], + "lineRgProjCCT": [1, -0.0003, 0.4559], + "chrAdpttAdj": { + "enable": 0, + "targetGain": [2.2099, 1, 1, 1.6302], + "laCalcFactor": 40 + }, + "remosaicCfg": { + "enable": 0, + "applyInvWbGainEnable": 1, + "sensorWbGain": [1, 1, 1, 1] + }, + "wbGainOffset": { + "enable": 0, + "offset": [0, 0, 0, 0] + } + } + }, + "agamma_calib": { + "GammaTuningPara": { + "Gamma_en": 1, + "Gamma_out_segnum": "GAMMATYPE_LOG", + "Gamma_out_offset": 0, + "Gamma_curve": [0, 6, 11, 17, 22, 28, 33, 39, 44, 55, 66, 77, 88, 109, 130, 150, 170, 210, 248, 286, 323, 393, 460, 525, 586, 702, 809, 909, 1002, 1172, 1325, 1462, 1588, 1811, 2004, 2174, 2327, 2590, 2813, 3006, 3177, 3467, 3708, 3915, 4095] + } + }, + "ablc_calib": { + "BlcTuningPara": { + "enable": 1, + "BLC_Data": { + "ISO": [50, 100, 200, 400, 800, 1600, 3200, 10000, 12800, 25600, 51200, 102400, 204800], + "ISO_len": 13, + "R_Channel": [255, 253, 255, 255, 254, 256, 256, 256, 256, 256, 256, 256, 256], + "R_Channel_len": 13, + "Gr_Channel": [256, 254, 256, 256, 257, 256, 256, 256, 256, 256, 256, 256, 256], + "Gr_Channel_len": 13, + "Gb_Channel": [256, 254, 256, 256, 257, 256, 256, 256, 256, 256, 256, 256, 256], + "Gb_Channel_len": 13, + "B_Channel": [255, 253, 255, 254, 254, 256, 256, 256, 256, 256, 256, 256, 256], + "B_Channel_len": 13 + } + } + }, + "adegamma_calib": { + "DegammaTuningPara": { + "degamma_en": 0, + "X_axis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "curve_R": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "curve_G": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "curve_B": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + } + }, + "agic_calib_v21": { + "GicTuningPara": { + "enable": 0, + "gr_ration": 0, + "GicData": { + "ISO": [50, 100, 200, 400, 800, 1600, 3200, 6400, 12800], + "ISO_len": 9, + "min_busy_thre": [40, 40, 40, 40, 40, 40, 40, 40, 40], + "min_busy_thre_len": 9, + "min_grad_thr1": [16, 16, 16, 16, 16, 16, 16, 16, 16], + "min_grad_thr1_len": 9, + "min_grad_thr2": [8, 8, 8, 8, 8, 8, 8, 8, 8], + "min_grad_thr2_len": 9, + "k_grad1": [64, 64, 64, 64, 64, 64, 64, 64, 64], + "k_grad1_len": 9, + "k_grad2": [2, 2, 2, 2, 2, 2, 2, 2, 2], + "k_grad2_len": 9, + "gb_thre": [32, 32, 32, 32, 32, 32, 32, 32, 32], + "gb_thre_len": 9, + "maxCorV": [10, 10, 10, 10, 10, 10, 10, 10, 10], + "maxCorV_len": 9, + "maxCorVboth": [20, 20, 20, 20, 20, 20, 20, 20, 20], + "maxCorVboth_len": 9, + "dark_thre": [120, 120, 120, 120, 120, 120, 120, 120, 120], + "dark_thre_len": 9, + "dark_threHi": [240, 240, 240, 240, 240, 240, 240, 240, 240], + "dark_threHi_len": 9, + "k_grad1_dark": [64, 64, 64, 64, 64, 64, 64, 64, 64], + "k_grad1_dark_len": 9, + "k_grad2_dark": [2, 2, 2, 2, 2, 2, 2, 2, 2], + "k_grad2_dark_len": 9, + "min_grad_thr_dark1": [16, 16, 16, 16, 16, 16, 16, 16, 16], + "min_grad_thr_dark1_len": 9, + "min_grad_thr_dark2": [8, 8, 8, 8, 8, 8, 8, 8, 8], + "min_grad_thr_dark2_len": 9, + "noiseCurve_0": [0, 0, 0, 0, 0, 0, 0, 0, 0], + "noiseCurve_0_len": 9, + "noiseCurve_1": [0, 0, 0, 0, 0, 0, 0, 0, 0], + "noiseCurve_1_len": 9, + "NoiseScale": [0, 0, 0, 0, 0, 0, 0, 0, 0], + "NoiseScale_len": 9, + "NoiseBase": [0, 0, 0, 0, 0, 0, 0, 0, 0], + "NoiseBase_len": 9, + "globalStrength": [1, 1, 1, 1, 1, 1, 1, 1, 1], + "globalStrength_len": 9, + "diff_clip": [32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767], + "diff_clip_len": 9 + } + } + }, + "adehaze_calib_v21": { + "DehazeTuningPara": { + "Enable": 1, + "cfg_alpha": 0, + "ByPassThr": 0, + "dehaze_setting": { + "en": 0, + "air_lc_en": 1, + "stab_fnum": 8, + "sigma": 6, + "wt_sigma": 8, + "air_sigma": 120, + "tmax_sigma": 0.01, + "pre_wet": 0.01, + "DehazeData": { + "EnvLv": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1], + "EnvLv_len": 9, + "dc_min_th": [64, 64, 64, 64, 64, 64, 64, 64, 64], + "dc_min_th_len": 9, + "dc_max_th": [192, 192, 192, 192, 192, 192, 192, 192, 192], + "dc_max_th_len": 9, + "yhist_th": [249, 249, 249, 249, 249, 249, 249, 249, 249], + "yhist_th_len": 9, + "yblk_th": [0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002], + "yblk_th_len": 9, + "dark_th": [250, 250, 250, 250, 250, 250, 250, 250, 250], + "dark_th_len": 9, + "bright_min": [180, 180, 180, 180, 180, 180, 180, 180, 180], + "bright_min_len": 9, + "bright_max": [240, 240, 240, 240, 240, 240, 240, 240, 240], + "bright_max_len": 9, + "wt_max": [0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9], + "wt_max_len": 9, + "air_min": [200, 200, 200, 200, 200, 200, 200, 200, 200], + "air_min_len": 9, + "air_max": [250, 250, 250, 250, 250, 250, 250, 250, 250], + "air_max_len": 9, + "tmax_base": [125, 125, 125, 125, 125, 125, 125, 125, 125], + "tmax_base_len": 9, + "tmax_off": [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], + "tmax_off_len": 9, + "tmax_max": [0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8], + "tmax_max_len": 9, + "cfg_wt": [0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8], + "cfg_wt_len": 9, + "cfg_air": [210, 210, 210, 210, 210, 210, 210, 210, 210], + "cfg_air_len": 9, + "cfg_tmax": [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2], + "cfg_tmax_len": 9, + "dc_weitcur": [1, 1, 1, 1, 1, 1, 1, 1, 1], + "dc_weitcur_len": 9, + "bf_weight": [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], + "bf_weight_len": 9, + "range_sigma": [0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14], + "range_sigma_len": 9, + "space_sigma_pre": [0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14], + "space_sigma_pre_len": 9, + "space_sigma_cur": [0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14], + "space_sigma_cur_len": 9 + } + }, + "enhance_setting": { + "en": 1, + "enhance_curve": [0, 64, 128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1023], + "EnhanceData": { + "EnvLv": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1], + "EnvLv_len": 9, + "enhance_value": [1.15, 1.15, 1.15, 1.12, 1.12, 1.12, 1.1, 1.1, 1], + "enhance_value_len": 9, + "enhance_chroma": [1.5, 1.4, 1.3, 1.2, 1.2, 1.2, 1.1, 1.1, 1], + "enhance_chroma_len": 9 + } + }, + "hist_setting": { + "en": 0, + "hist_para_en": 1, + "HistData": { + "EnvLv": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1], + "EnvLv_len": 9, + "hist_gratio": [2, 2, 2, 2, 2, 2, 2, 2, 2], + "hist_gratio_len": 9, + "hist_th_off": [64, 64, 64, 64, 64, 64, 64, 64, 64], + "hist_th_off_len": 9, + "hist_k": [2, 2, 2, 2, 2, 2, 2, 2, 2], + "hist_k_len": 9, + "hist_min": [0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015], + "hist_min_len": 9, + "hist_scale": [0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09], + "hist_scale_len": 9, + "cfg_gratio": [2, 2, 2, 2, 2, 2, 2, 2, 2], + "cfg_gratio_len": 9 + } + } + } + }, + "adpcc_calib": { + "DpccTuningPara": { + "Enable": 1, + "Fast_Mode": { + "Fast_mode_en": 0, + "Single_enable": 0, + "Double_enable": 0, + "Triple_enable": 0, + "Fast_Data": { + "ISO": [50, 100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800], + "ISO_len": 13, + "Single_level": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "Single_level_len": 13, + "Double_level": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "Double_level_len": 13, + "Triple_level": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "Triple_level_len": 13 + } + }, + "Expert_Mode": { + "stage1_Enable": 1, + "grayscale_mode": 0, + "dpcc_out_sel": 1, + "stage1_g_3x3": 0, + "stage1_rb_3x3": 0, + "stage1_inc_rb_center": 1, + "stage1_inc_g_center": 1, + "rk_out_sel": 1, + "SetEnable": { + "ISO": [50, 100, 200, 400, 800, 1500, 1507, 1510, 3200, 6400, 12800, 102400, 204800], + "fix_set": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "set1": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "set2": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "set3": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "set1": { + "RK": { + "RK_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "g_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_min": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_max": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "LC": { + "LC_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_line_thr": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "g_line_thr": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "rb_line_mad_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_line_mad_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] + }, + "PG": { + "PG_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_pg_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_pg_fac": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + }, + "RND": { + "RND_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_rnd_thr": [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10], + "g_rnd_thr": [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10], + "rb_rnd_offs": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + "g_rnd_offs": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + }, + "RG": { + "RG_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_rg_fac": [32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32], + "g_rg_fac": [32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32] + }, + "RO": { + "RO_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_ro_lim": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + "g_ro_lim": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + } + }, + "set2": { + "RK": { + "RK_enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "rb_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "g_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_min": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_max": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "LC": { + "LC_enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "rb_line_thr": [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], + "g_line_thr": [24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24], + "rb_line_mad_fac": [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], + "g_line_mad_fac": [12, 12, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, + "PG": { + "PG_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_pg_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_pg_fac": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + }, + "RND": { + "RND_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_rnd_thr": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "g_rnd_thr": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "rb_rnd_offs": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "g_rnd_offs": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "RG": { + "RG_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_rg_fac": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "g_rg_fac": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8] + }, + "RO": { + "RO_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_ro_lim": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "g_ro_lim": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + } + }, + "set3": { + "RK": { + "RK_enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "rb_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "g_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_min": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_max": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "LC": { + "LC_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_line_thr": [32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32], + "g_line_thr": [32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32], + "rb_line_mad_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_line_mad_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] + }, + "PG": { + "PG_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_pg_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_pg_fac": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + }, + "RND": { + "RND_enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "rb_rnd_thr": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "g_rnd_thr": [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], + "rb_rnd_offs": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + "g_rnd_offs": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + }, + "RG": { + "RG_enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "rb_rg_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_rg_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] + }, + "RO": { + "RO_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_ro_lim": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + "g_ro_lim": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + } + } + }, + "Dpcc_pdaf": { + "en": 0, + "point_en": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "offsetx": 0, + "offsety": 0, + "wrapx": 0, + "wrapy": 0, + "wrapx_num": 0, + "wrapy_num": 0, + "point_x": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "point_y": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "forward_med": 0 + }, + "Sensor_dpcc": { + "sensor_dpcc_auto_en": 0, + "max_level": 20, + "SensorDpcc_Data": { + "ISO": [50, 100, 200, 400, 800, 1500, 1507, 1510, 3200, 6400, 12800, 102400, 204800], + "ISO_len": 13, + "level_single": [19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19], + "level_single_len": 13, + "level_multiple": [19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19], + "level_multiple_len": 13 + } + } + } + }, + "amerge_calib": { + "MergeTuningPara": { + "OECurve": { + "EnvLv": [0, 0.005, 0.01, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1], + "EnvLv_len": 13, + "Smooth": [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4], + "Smooth_len": 13, + "Offset": [210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210], + "Offset_len": 13 + }, + "MDCurve": { + "MoveCoef": [0, 0.005, 0.01, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1], + "MoveCoef_len": 13, + "LM_smooth": [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4], + "LM_smooth_len": 13, + "LM_offset": [0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38], + "LM_offset_len": 13, + "MS_smooth": [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4], + "MS_smooth_len": 13, + "MS_offset": [0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38], + "MS_offset_len": 13 + }, + "ByPassThr": 0, + "OECurve_damp": 0.3, + "MDCurveLM_damp": 0.3, + "MDCurveMS_damp": 0.3 + } + }, + "adrc_calib": { + "DrcTuningPara": { + "Enable": 0, + "DrcGain": { + "EnvLv": [0, 0.005, 0.01, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1], + "EnvLv_len": 13, + "DrcGain": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "DrcGain_len": 13, + "Alpha": [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2], + "Alpha_len": 13, + "Clip": [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], + "Clip_len": 13 + }, + "HiLight": { + "EnvLv": [0, 0.005, 0.01, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1], + "EnvLv_len": 13, + "Strength": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "Strength_len": 13 + }, + "LocalTMOSetting": { + "LocalTMOData": { + "EnvLv": [0, 0.005, 0.01, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1], + "EnvLv_len": 13, + "LocalWeit": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "LocalWeit_len": 13, + "GlobalContrast": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "GlobalContrast_len": 13, + "LoLitContrast": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "LoLitContrast_len": 13 + }, + "curPixWeit": 0.376471, + "preFrameWeit": 1, + "Range_force_sgm": 0, + "Range_sgm_cur": 0.125015, + "Range_sgm_pre": 0.125015, + "Space_sgm_cur": 4068, + "Space_sgm_pre": 3968 + }, + "CompressSetting": { + "Mode": "COMPRESS_AUTO", + "Manual_curve": [0, 558, 1087, 1588, 2063, 2515, 2944, 3353, 3744, 4473, 5139, 5751, 6316, 6838, 7322, 7772, 8192] + }, + "Scale_y": [0, 2, 20, 76, 193, 381, 631, 772, 919, 1066, 1211, 1479, 1700, 1863, 1968, 2024, 2048], + "ByPassThr": 0, + "Edge_Weit": 0.0627451, + "OutPutLongFrame": 0, + "IIR_frame": 16, + "Tolerance": 0, + "damp": 0.9 + } + }, + "cpsl": { + "param": { + "enable": 1, + "mode": "RK_AIQ_OP_MODE_AUTO", + "force_gray": 1, + "light_src": "LED", + "auto_adjust_sens": 50, + "auto_on2off_th": 3000, + "auto_off2on_th": 100, + "auto_sw_interval": 0, + "manual_on": 0, + "manual_strength": 100 + } + }, + "orb": { + "param": { + "orb_en": 0 + } + }, + "debayer": { + "param": { + "debayer_en": 1, + "debayer_filter1": [2, -6, 0, 6, -2], + "debayer_filter2": [2, -4, 4, -4, 2], + "debayer_gain_offset": 4, + "debayer_offset": 1, + "debayer_clip_en": 1, + "debayer_filter_g_en": 1, + "debayer_filter_c_en": 1, + "debayer_thed0": 3, + "debayer_thed1": 6, + "debayer_dist_scale": 8, + "debayer_cnr_strength": 5, + "debayer_shift_num": 2, + "array": { + "ISO": [50, 100, 200, 400, 800, 1600, 3200, 6400, 12800], + "sharp_strength": [4, 4, 4, 4, 4, 4, 4, 4, 4], + "debayer_hf_offset": [1, 1, 1, 1, 1, 1, 1, 1, 1] + } + } + }, + "cproc": { + "param": { + "enable": 1, + "brightness": 128, + "contrast": 128, + "saturation": 128, + "hue": 128 + } + }, + "ie": { + "param": { + "enable": 0, + "mode": 0 + } + }, + "lsc_v2": { + "common": { + "enable": 1, + "resolutionAll": [{ + "name": "3264x2448", + "lsc_sect_size_x": [204, 204, 204, 204, 204, 204, 204, 204], + "lsc_sect_size_y": [153, 153, 153, 153, 153, 153, 153, 153] + }], + "resolutionAll_len": 1 + }, + "alscCoef": { + "damp_enable": 1, + "illAll": [{ + "usedForCase": 0, + "name": "A", + "wbGain": [1.2422, 2.5859], + "tableUsed": [{ + "name": "A_100" + }, { + "name": "A_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [100, 100, 90, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "CWF", + "wbGain": [1.7163, 2.2709], + "tableUsed": [{ + "name": "CWF_100" + }, { + "name": "CWF_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [100, 100, 90, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "D50", + "wbGain": [2.0413, 1.565], + "tableUsed": [{ + "name": "D50_100" + }, { + "name": "D50_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [100, 100, 80, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "D65", + "wbGain": [2.1927, 1.4514], + "tableUsed": [{ + "name": "D65_100" + }, { + "name": "D65_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [90, 85, 80, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "D75", + "wbGain": [2.3467, 1.323], + "tableUsed": [{ + "name": "D75_100" + }, { + "name": "D75_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [90, 85, 80, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "HZ", + "wbGain": [0.9985, 3.0212], + "tableUsed": [{ + "name": "HZ_100" + }, { + "name": "HZ_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [100, 100, 90, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "TL84", + "wbGain": [1.622, 2.3057], + "tableUsed": [{ + "name": "TL84_100" + }, { + "name": "TL84_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [100, 100, 90, 70], + "vig_len": 4 + }, { + "usedForCase": 2, + "name": "GRAY", + "wbGain": [1, 1], + "tableUsed": [{ + "name": "GRAY_0" + }], + "tableUsed_len": 1, + "gains": [1, 10, 31, 64], + "gains_len": 4, + "vig": [90, 60, 25, 0], + "vig_len": 4 + }], + "illAll_len": 8 + }, + "tbl": { + "tableAll": [{ + "name": "3264x2448_A_100", + "resolution": "3264x2448", + "illumination": "A", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [4126, 3298, 2812, 2502, 2280, 2072, 1924, 1846, 1834, 1846, 1936, 2044, 2254, 2420, 2746, 3157, 4070, 3621, 3012, 2601, 2334, 2080, 1887, 1737, 1645, 1614, 1645, 1732, 1869, 2037, 2263, 2534, 2880, 3513, 3316, 2785, 2430, 2147, 1881, 1688, 1567, 1473, 1448, 1470, 1559, 1678, 1869, 2072, 2353, 2696, 3191, 3140, 2613, 2280, 1975, 1748, 1550, 1403, 1322, 1298, 1319, 1407, 1542, 1717, 1943, 2195, 2545, 3012, 3027, 2471, 2179, 1869, 1627, 1430, 1298, 1223, 1189, 1216, 1293, 1427, 1597, 1846, 2117, 2410, 2894, 2894, 2410, 2058, 1785, 1526, 1337, 1201, 1130, 1108, 1119, 1211, 1337, 1526, 1748, 2009, 2316, 2825, 2812, 2334, 2002, 1712, 1451, 1271, 1149, 1076, 1057, 1074, 1141, 1284, 1455, 1673, 1949, 2271, 2672, 2812, 2289, 1969, 1678, 1434, 1249, 1115, 1055, 1031, 1049, 1128, 1231, 1427, 1650, 1918, 2271, 2672, 2825, 2325, 1982, 1683, 1437, 1236, 1117, 1044, 1024, 1044, 1119, 1236, 1427, 1650, 1956, 2254, 2660, 2825, 2334, 2002, 1712, 1462, 1273, 1147, 1080, 1049, 1074, 1132, 1265, 1459, 1693, 1949, 2271, 2708, 2866, 2381, 2065, 1774, 1530, 1334, 1211, 1125, 1100, 1113, 1191, 1316, 1499, 1748, 2002, 2334, 2785, 3027, 2471, 2163, 1875, 1627, 1434, 1279, 1194, 1186, 1198, 1282, 1403, 1588, 1840, 2102, 2430, 2937, 3226, 2601, 2298, 1956, 1742, 1530, 1397, 1313, 1284, 1313, 1400, 1538, 1702, 1943, 2237, 2567, 3075, 3432, 2825, 2430, 2109, 1875, 1688, 1542, 1459, 1430, 1462, 1538, 1669, 1834, 2094, 2362, 2672, 3261, 3666, 2982, 2590, 2325, 2051, 1875, 1737, 1645, 1610, 1645, 1722, 1863, 2016, 2280, 2545, 2894, 3452, 4070, 3279, 2825, 2523, 2280, 2065, 1930, 1869, 1817, 1840, 1924, 2065, 2212, 2460, 2759, 3174, 4042, 5511, 3712, 3174, 2838, 2590, 2353, 2220, 2163, 2124, 2132, 2179, 2325, 2513, 2772, 3140, 3534, 5313] + }, + "lsc_samples_greenR": { + "uCoeff": [3693, 2996, 2530, 2306, 2054, 1929, 1805, 1724, 1696, 1708, 1801, 1879, 2025, 2196, 2421, 2834, 3566, 3264, 2749, 2366, 2107, 1899, 1753, 1654, 1576, 1559, 1569, 1636, 1737, 1865, 2031, 2271, 2611, 3059, 3021, 2530, 2202, 1976, 1770, 1618, 1507, 1434, 1401, 1417, 1486, 1593, 1720, 1889, 2089, 2405, 2890, 2812, 2351, 2071, 1837, 1650, 1486, 1385, 1315, 1278, 1303, 1359, 1459, 1618, 1779, 2003, 2264, 2649, 2649, 2257, 1976, 1733, 1542, 1398, 1274, 1203, 1183, 1201, 1256, 1369, 1504, 1681, 1904, 2157, 2556, 2593, 2163, 1889, 1654, 1451, 1289, 1191, 1128, 1099, 1118, 1189, 1292, 1434, 1614, 1837, 2071, 2437, 2521, 2150, 1856, 1600, 1398, 1254, 1141, 1080, 1054, 1072, 1120, 1231, 1385, 1556, 1770, 2042, 2437, 2462, 2132, 1814, 1576, 1380, 1229, 1120, 1050, 1024, 1046, 1109, 1217, 1354, 1542, 1762, 2020, 2328, 2495, 2125, 1823, 1572, 1374, 1217, 1109, 1052, 1027, 1037, 1104, 1219, 1354, 1542, 1766, 2025, 2336, 2574, 2138, 1837, 1614, 1403, 1256, 1139, 1075, 1054, 1075, 1120, 1231, 1382, 1569, 1796, 2083, 2389, 2630, 2189, 1904, 1669, 1462, 1292, 1181, 1116, 1101, 1116, 1177, 1296, 1431, 1632, 1860, 2132, 2478, 2749, 2271, 2003, 1724, 1552, 1385, 1263, 1206, 1168, 1185, 1263, 1364, 1504, 1704, 1934, 2202, 2574, 2913, 2397, 2083, 1837, 1654, 1495, 1377, 1306, 1272, 1306, 1359, 1480, 1621, 1801, 2014, 2285, 2749, 3034, 2556, 2250, 1965, 1779, 1618, 1498, 1425, 1409, 1442, 1504, 1603, 1745, 1939, 2157, 2454, 2867, 3339, 2834, 2374, 2157, 1945, 1779, 1650, 1589, 1569, 1593, 1636, 1762, 1904, 2089, 2314, 2639, 3138, 3730, 3046, 2649, 2314, 2101, 1950, 1832, 1762, 1733, 1766, 1823, 1929, 2071, 2271, 2521, 2924, 3602, 5113, 3401, 2913, 2556, 2314, 2132, 2025, 1976, 1934, 1987, 2065, 2157, 2314, 2512, 2823, 3264, 4974] + }, + "lsc_samples_greenB": { + "uCoeff": [3964, 3072, 2671, 2333, 2095, 1945, 1834, 1751, 1743, 1760, 1811, 1935, 2095, 2276, 2499, 2926, 3781, 3367, 2814, 2425, 2162, 1982, 1777, 1679, 1606, 1579, 1610, 1664, 1760, 1920, 2107, 2326, 2681, 3192, 3111, 2587, 2255, 2020, 1820, 1642, 1514, 1446, 1423, 1437, 1514, 1613, 1781, 1956, 2168, 2482, 2973, 2926, 2441, 2143, 1876, 1679, 1520, 1407, 1326, 1300, 1326, 1388, 1514, 1635, 1839, 2065, 2348, 2731, 2772, 2341, 2037, 1777, 1582, 1412, 1287, 1221, 1205, 1225, 1284, 1410, 1565, 1739, 1966, 2234, 2652, 2681, 2241, 1961, 1699, 1489, 1331, 1221, 1143, 1122, 1141, 1201, 1326, 1466, 1672, 1895, 2162, 2542, 2551, 2201, 1910, 1646, 1446, 1280, 1148, 1095, 1065, 1081, 1152, 1267, 1418, 1603, 1834, 2089, 2482, 2569, 2168, 1871, 1610, 1399, 1245, 1129, 1061, 1040, 1052, 1122, 1241, 1396, 1589, 1807, 2083, 2417, 2534, 2137, 1867, 1613, 1407, 1237, 1127, 1065, 1024, 1061, 1112, 1231, 1376, 1572, 1811, 2071, 2402, 2569, 2168, 1895, 1638, 1423, 1265, 1145, 1079, 1061, 1081, 1133, 1254, 1391, 1599, 1830, 2107, 2482, 2633, 2221, 1971, 1687, 1486, 1310, 1183, 1114, 1104, 1117, 1183, 1296, 1460, 1661, 1890, 2168, 2499, 2761, 2297, 2014, 1760, 1542, 1383, 1262, 1189, 1172, 1189, 1260, 1365, 1511, 1719, 1950, 2227, 2643, 2914, 2433, 2107, 1857, 1642, 1486, 1363, 1280, 1265, 1280, 1360, 1469, 1631, 1820, 2042, 2333, 2731, 3151, 2569, 2214, 1982, 1777, 1603, 1480, 1407, 1381, 1410, 1480, 1599, 1731, 1940, 2201, 2482, 2949, 3321, 2772, 2402, 2119, 1910, 1747, 1631, 1575, 1536, 1555, 1631, 1735, 1895, 2089, 2326, 2643, 3151, 3742, 3009, 2560, 2290, 2065, 1900, 1785, 1723, 1687, 1723, 1777, 1910, 2037, 2241, 2508, 2914, 3579, 5016, 3367, 2937, 2560, 2326, 2150, 2020, 1935, 1935, 1966, 2009, 2125, 2318, 2474, 2836, 3248, 5016] + }, + "lsc_samples_blue": { + "uCoeff": [3507, 2733, 2331, 2107, 1884, 1823, 1704, 1617, 1654, 1654, 1704, 1767, 1896, 2138, 2331, 2707, 3422, 2930, 2516, 2154, 1948, 1778, 1654, 1538, 1506, 1514, 1522, 1572, 1635, 1767, 1896, 2138, 2472, 2930, 2787, 2293, 2017, 1847, 1654, 1530, 1437, 1388, 1362, 1388, 1430, 1514, 1635, 1789, 1989, 2275, 2682, 2494, 2204, 1909, 1704, 1538, 1444, 1324, 1276, 1265, 1265, 1336, 1437, 1538, 1683, 1884, 2138, 2584, 2451, 2076, 1835, 1617, 1459, 1324, 1248, 1181, 1162, 1201, 1254, 1324, 1459, 1635, 1801, 2032, 2369, 2331, 1989, 1735, 1563, 1395, 1254, 1171, 1121, 1121, 1130, 1167, 1259, 1395, 1555, 1735, 1948, 2204, 2239, 1935, 1724, 1514, 1330, 1216, 1125, 1086, 1058, 1095, 1130, 1222, 1355, 1506, 1693, 1909, 2222, 2204, 1909, 1674, 1498, 1312, 1191, 1099, 1062, 1024, 1062, 1116, 1191, 1324, 1482, 1664, 1884, 2138, 2204, 1909, 1664, 1467, 1306, 1176, 1091, 1047, 1024, 1043, 1108, 1186, 1324, 1444, 1664, 1884, 2222, 2204, 1909, 1683, 1498, 1324, 1181, 1108, 1078, 1028, 1050, 1108, 1211, 1330, 1467, 1664, 1884, 2154, 2257, 1989, 1745, 1530, 1355, 1254, 1134, 1082, 1082, 1078, 1143, 1227, 1336, 1506, 1683, 1935, 2171, 2389, 2003, 1801, 1581, 1423, 1300, 1201, 1130, 1108, 1162, 1181, 1276, 1430, 1589, 1778, 2032, 2331, 2516, 2122, 1859, 1674, 1506, 1381, 1265, 1216, 1191, 1222, 1271, 1375, 1498, 1664, 1847, 2076, 2430, 2707, 2293, 1975, 1745, 1589, 1459, 1381, 1312, 1300, 1330, 1375, 1452, 1572, 1724, 1909, 2154, 2584, 2787, 2430, 2107, 1871, 1693, 1589, 1506, 1452, 1416, 1437, 1482, 1581, 1683, 1835, 2017, 2331, 2871, 3382, 2632, 2312, 2003, 1823, 1724, 1617, 1563, 1522, 1563, 1607, 1704, 1801, 1975, 2222, 2516, 3157, 4435, 2930, 2584, 2138, 1962, 1884, 1778, 1704, 1704, 1704, 1724, 1859, 1935, 2154, 2472, 2842, 4301] + } + }, { + "name": "3264x2448_A_70", + "resolution": "3264x2448", + "illumination": "A", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [3195, 2722, 2425, 2228, 2080, 1926, 1812, 1751, 1743, 1751, 1822, 1902, 2058, 2161, 2373, 2617, 3156, 2914, 2556, 2297, 2123, 1937, 1788, 1666, 1589, 1563, 1589, 1662, 1772, 1900, 2063, 2243, 2454, 2835, 2740, 2417, 2188, 1990, 1784, 1627, 1525, 1443, 1421, 1440, 1518, 1618, 1773, 1925, 2125, 2347, 2647, 2646, 2309, 2087, 1859, 1679, 1511, 1381, 1308, 1286, 1305, 1385, 1504, 1651, 1831, 2015, 2254, 2548, 2588, 2215, 2018, 1779, 1579, 1407, 1287, 1217, 1184, 1210, 1282, 1404, 1552, 1758, 1965, 2165, 2484, 2505, 2181, 1926, 1713, 1492, 1323, 1196, 1128, 1107, 1117, 1206, 1323, 1492, 1679, 1883, 2102, 2450, 2454, 2128, 1885, 1653, 1426, 1262, 1146, 1075, 1057, 1073, 1139, 1275, 1430, 1617, 1839, 2075, 2342, 2462, 2096, 1861, 1625, 1412, 1242, 1114, 1055, 1031, 1049, 1126, 1225, 1406, 1599, 1816, 2081, 2350, 2476, 2129, 1874, 1631, 1416, 1230, 1116, 1044, 1024, 1044, 1118, 1230, 1406, 1600, 1851, 2068, 2343, 2473, 2134, 1890, 1656, 1439, 1265, 1145, 1080, 1049, 1074, 1130, 1258, 1436, 1639, 1843, 2081, 2379, 2497, 2167, 1941, 1709, 1500, 1323, 1207, 1124, 1099, 1112, 1188, 1305, 1471, 1686, 1885, 2128, 2432, 2610, 2232, 2018, 1794, 1587, 1415, 1272, 1191, 1183, 1195, 1274, 1386, 1550, 1763, 1964, 2197, 2539, 2743, 2322, 2121, 1857, 1685, 1501, 1381, 1304, 1276, 1304, 1384, 1508, 1648, 1845, 2068, 2294, 2625, 2869, 2481, 2214, 1977, 1794, 1639, 1512, 1438, 1412, 1441, 1508, 1622, 1757, 1964, 2156, 2357, 2738, 3002, 2573, 2321, 2143, 1935, 1797, 1682, 1603, 1572, 1603, 1668, 1786, 1904, 2104, 2284, 2504, 2842, 3240, 2762, 2478, 2281, 2110, 1946, 1840, 1793, 1748, 1766, 1835, 1946, 2052, 2229, 2425, 2681, 3220, 4165, 3031, 2709, 2502, 2340, 2168, 2071, 2031, 2000, 2004, 2035, 2144, 2275, 2448, 2682, 2898, 4026] + }, + "lsc_samples_greenR": { + "uCoeff": [2892, 2497, 2204, 2068, 1890, 1803, 1708, 1643, 1620, 1629, 1704, 1760, 1865, 1979, 2119, 2376, 2803, 2654, 2353, 2107, 1932, 1781, 1670, 1591, 1526, 1512, 1520, 1575, 1656, 1751, 1869, 2031, 2247, 2505, 2519, 2216, 2000, 1843, 1685, 1563, 1470, 1406, 1377, 1390, 1450, 1541, 1641, 1768, 1906, 2117, 2421, 2394, 2097, 1910, 1738, 1591, 1452, 1364, 1301, 1267, 1290, 1340, 1427, 1562, 1687, 1852, 2027, 2269, 2293, 2039, 1843, 1657, 1501, 1376, 1264, 1197, 1178, 1195, 1246, 1349, 1466, 1611, 1782, 1957, 2220, 2266, 1974, 1779, 1594, 1422, 1277, 1186, 1126, 1098, 1116, 1184, 1280, 1406, 1558, 1733, 1898, 2143, 2221, 1973, 1757, 1550, 1376, 1246, 1139, 1079, 1054, 1071, 1118, 1223, 1364, 1510, 1681, 1882, 2154, 2181, 1963, 1724, 1531, 1361, 1223, 1119, 1050, 1024, 1046, 1108, 1211, 1336, 1500, 1678, 1868, 2073, 2210, 1959, 1733, 1529, 1356, 1211, 1108, 1052, 1027, 1037, 1103, 1213, 1337, 1501, 1682, 1874, 2082, 2271, 1968, 1744, 1566, 1383, 1249, 1137, 1075, 1054, 1075, 1119, 1225, 1363, 1525, 1708, 1922, 2122, 2308, 2006, 1799, 1613, 1436, 1282, 1178, 1115, 1100, 1115, 1174, 1286, 1407, 1580, 1760, 1958, 2187, 2390, 2065, 1878, 1658, 1517, 1369, 1256, 1202, 1166, 1182, 1256, 1349, 1472, 1640, 1818, 2007, 2251, 2499, 2154, 1936, 1750, 1604, 1468, 1362, 1297, 1265, 1297, 1345, 1454, 1574, 1718, 1876, 2062, 2371, 2564, 2263, 2061, 1851, 1708, 1574, 1471, 1406, 1392, 1422, 1476, 1561, 1677, 1828, 1983, 2181, 2436, 2758, 2456, 2142, 1998, 1841, 1709, 1602, 1551, 1534, 1554, 1589, 1694, 1804, 1940, 2092, 2302, 2607, 2993, 2582, 2336, 2106, 1956, 1844, 1752, 1695, 1671, 1699, 1744, 1826, 1930, 2070, 2233, 2488, 2900, 3886, 2799, 2504, 2272, 2108, 1978, 1900, 1866, 1832, 1876, 1935, 1999, 2108, 2236, 2434, 2697, 3789] + }, + "lsc_samples_greenB": { + "uCoeff": [3082, 2553, 2314, 2090, 1924, 1817, 1733, 1667, 1662, 1675, 1713, 1808, 1924, 2044, 2180, 2444, 2954, 2729, 2403, 2155, 1979, 1853, 1691, 1614, 1554, 1531, 1557, 1600, 1676, 1799, 1932, 2075, 2301, 2602, 2587, 2261, 2044, 1881, 1730, 1585, 1476, 1417, 1397, 1409, 1476, 1559, 1695, 1826, 1971, 2178, 2484, 2482, 2170, 1971, 1772, 1617, 1484, 1385, 1311, 1288, 1311, 1367, 1478, 1577, 1740, 1905, 2095, 2332, 2389, 2108, 1896, 1697, 1538, 1390, 1276, 1215, 1200, 1219, 1273, 1388, 1522, 1663, 1835, 2020, 2295, 2336, 2040, 1841, 1635, 1458, 1317, 1215, 1141, 1120, 1139, 1196, 1312, 1436, 1611, 1784, 1974, 2226, 2245, 2016, 1804, 1592, 1421, 1271, 1145, 1094, 1065, 1080, 1149, 1258, 1395, 1553, 1737, 1921, 2190, 2267, 1994, 1774, 1563, 1379, 1238, 1127, 1061, 1040, 1052, 1121, 1234, 1376, 1543, 1718, 1922, 2145, 2241, 1969, 1772, 1566, 1387, 1231, 1126, 1065, 1024, 1061, 1111, 1225, 1358, 1529, 1722, 1913, 2135, 2267, 1994, 1796, 1588, 1402, 1258, 1143, 1079, 1061, 1081, 1131, 1247, 1372, 1552, 1738, 1942, 2197, 2311, 2033, 1858, 1630, 1459, 1300, 1180, 1113, 1103, 1116, 1180, 1286, 1435, 1606, 1787, 1988, 2204, 2399, 2086, 1888, 1690, 1507, 1367, 1255, 1186, 1170, 1186, 1253, 1350, 1478, 1653, 1832, 2028, 2306, 2499, 2184, 1956, 1768, 1593, 1459, 1349, 1272, 1258, 1272, 1346, 1443, 1583, 1735, 1900, 2102, 2357, 2654, 2274, 2031, 1865, 1706, 1561, 1454, 1388, 1365, 1391, 1454, 1557, 1664, 1829, 2020, 2203, 2499, 2744, 2407, 2165, 1966, 1810, 1680, 1584, 1538, 1503, 1519, 1584, 1669, 1796, 1940, 2102, 2305, 2617, 3002, 2554, 2264, 2086, 1925, 1800, 1709, 1660, 1629, 1660, 1702, 1809, 1900, 2045, 2222, 2480, 2883, 3818, 2774, 2523, 2275, 2118, 1993, 1896, 1830, 1832, 1857, 1886, 1972, 2112, 2205, 2444, 2685, 3818] + }, + "lsc_samples_blue": { + "uCoeff": [2762, 2300, 2048, 1906, 1747, 1712, 1619, 1548, 1583, 1581, 1619, 1664, 1757, 1932, 2048, 2281, 2703, 2411, 2174, 1936, 1799, 1676, 1582, 1487, 1463, 1471, 1477, 1518, 1565, 1667, 1755, 1923, 2140, 2411, 2344, 2028, 1846, 1732, 1583, 1483, 1405, 1363, 1340, 1363, 1399, 1469, 1566, 1682, 1823, 2014, 2266, 2151, 1978, 1773, 1621, 1489, 1413, 1307, 1264, 1254, 1253, 1318, 1407, 1489, 1603, 1752, 1925, 2220, 2138, 1890, 1722, 1554, 1425, 1307, 1239, 1176, 1158, 1195, 1244, 1307, 1425, 1570, 1693, 1854, 2074, 2059, 1829, 1644, 1512, 1370, 1244, 1167, 1119, 1119, 1128, 1163, 1248, 1370, 1505, 1644, 1795, 1958, 1996, 1792, 1641, 1472, 1312, 1209, 1123, 1085, 1058, 1094, 1128, 1215, 1336, 1464, 1613, 1770, 1982, 1973, 1774, 1600, 1460, 1297, 1186, 1098, 1062, 1024, 1062, 1115, 1186, 1308, 1445, 1591, 1753, 1920, 1975, 1775, 1592, 1432, 1292, 1172, 1090, 1047, 1024, 1043, 1107, 1181, 1309, 1411, 1592, 1754, 1990, 1973, 1774, 1608, 1460, 1308, 1176, 1107, 1078, 1028, 1050, 1107, 1205, 1314, 1431, 1591, 1753, 1933, 2010, 1837, 1659, 1486, 1336, 1246, 1132, 1081, 1082, 1077, 1141, 1220, 1318, 1464, 1604, 1792, 1941, 2105, 1841, 1702, 1528, 1396, 1288, 1196, 1128, 1107, 1159, 1176, 1265, 1403, 1536, 1682, 1865, 2059, 2189, 1928, 1743, 1605, 1468, 1360, 1255, 1210, 1186, 1216, 1261, 1355, 1460, 1596, 1732, 1890, 2122, 2314, 2050, 1829, 1657, 1536, 1427, 1360, 1298, 1288, 1315, 1355, 1421, 1520, 1639, 1773, 1938, 2220, 2344, 2137, 1921, 1752, 1617, 1537, 1469, 1423, 1391, 1409, 1447, 1530, 1608, 1722, 1846, 2058, 2407, 2740, 2263, 2064, 1845, 1715, 1644, 1558, 1514, 1479, 1514, 1549, 1626, 1696, 1822, 1991, 2174, 2576, 3412, 2447, 2246, 1932, 1812, 1764, 1684, 1625, 1627, 1625, 1637, 1743, 1790, 1945, 2158, 2382, 3318] + } + }, { + "name": "3264x2448_CWF_100", + "resolution": "3264x2448", + "illumination": "CWF", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [3843, 2836, 2410, 2174, 2021, 1861, 1718, 1682, 1654, 1740, 1740, 1861, 1961, 2163, 2469, 2739, 3569, 3224, 2721, 2273, 2021, 1853, 1696, 1595, 1545, 1499, 1499, 1614, 1696, 1803, 1961, 2210, 2532, 3076, 2877, 2410, 2106, 1879, 1740, 1576, 1466, 1390, 1376, 1405, 1450, 1545, 1682, 1853, 2021, 2367, 2836, 2739, 2286, 1991, 1763, 1614, 1435, 1348, 1291, 1255, 1275, 1339, 1450, 1557, 1755, 1952, 2248, 2667, 2667, 2174, 1906, 1696, 1493, 1362, 1263, 1188, 1171, 1181, 1243, 1348, 1477, 1661, 1861, 2084, 2485, 2516, 2106, 1853, 1601, 1435, 1300, 1177, 1106, 1088, 1121, 1181, 1287, 1435, 1563, 1811, 2052, 2395, 2485, 2041, 1779, 1557, 1395, 1239, 1125, 1076, 1065, 1076, 1134, 1243, 1395, 1516, 1763, 2021, 2312, 2410, 2041, 1779, 1563, 1362, 1209, 1094, 1032, 1024, 1040, 1097, 1199, 1348, 1510, 1718, 1961, 2367, 2469, 2021, 1787, 1576, 1366, 1202, 1103, 1048, 1037, 1040, 1112, 1199, 1362, 1534, 1718, 1991, 2326, 2395, 2052, 1827, 1576, 1390, 1251, 1125, 1076, 1054, 1062, 1134, 1220, 1380, 1545, 1740, 1991, 2395, 2532, 2106, 1853, 1614, 1419, 1279, 1160, 1112, 1097, 1112, 1177, 1287, 1419, 1582, 1803, 2052, 2410, 2631, 2210, 1906, 1696, 1516, 1376, 1251, 1171, 1167, 1167, 1239, 1352, 1466, 1661, 1879, 2140, 2469, 2836, 2312, 2021, 1779, 1640, 1466, 1362, 1255, 1243, 1300, 1348, 1445, 1563, 1763, 1952, 2235, 2667, 2962, 2367, 2084, 1879, 1732, 1595, 1450, 1376, 1390, 1380, 1450, 1545, 1682, 1861, 2073, 2367, 2962, 3224, 2667, 2235, 2041, 1853, 1682, 1601, 1534, 1516, 1510, 1582, 1710, 1827, 1981, 2198, 2532, 3007, 3569, 2877, 2469, 2210, 2011, 1906, 1732, 1674, 1682, 1710, 1755, 1827, 1933, 2140, 2410, 2739, 3476, 4992, 3224, 2721, 2439, 2286, 2073, 1952, 1933, 1879, 1879, 1981, 2073, 2198, 2395, 2580, 3148, 4931] + }, + "lsc_samples_greenR": { + "uCoeff": [3573, 2847, 2513, 2213, 2018, 1875, 1764, 1665, 1626, 1653, 1750, 1810, 1983, 2124, 2407, 2778, 3555, 3104, 2619, 2264, 2036, 1864, 1715, 1603, 1528, 1491, 1528, 1570, 1653, 1796, 1983, 2213, 2532, 2983, 2847, 2459, 2092, 1906, 1737, 1559, 1444, 1386, 1364, 1386, 1444, 1531, 1669, 1820, 2036, 2334, 2733, 2800, 2295, 2018, 1764, 1581, 1444, 1335, 1295, 1264, 1271, 1324, 1426, 1549, 1707, 1955, 2213, 2532, 2570, 2164, 1922, 1682, 1501, 1353, 1254, 1187, 1165, 1165, 1247, 1327, 1466, 1626, 1834, 2105, 2513, 2504, 2092, 1834, 1614, 1409, 1290, 1175, 1127, 1108, 1116, 1159, 1257, 1397, 1570, 1791, 2024, 2366, 2459, 2054, 1782, 1592, 1378, 1230, 1132, 1079, 1047, 1059, 1114, 1206, 1353, 1518, 1737, 1983, 2287, 2416, 2060, 1764, 1528, 1353, 1206, 1105, 1056, 1036, 1043, 1100, 1199, 1324, 1501, 1715, 1983, 2310, 2407, 2079, 1764, 1549, 1353, 1204, 1103, 1052, 1024, 1047, 1105, 1193, 1324, 1508, 1715, 1983, 2295, 2477, 2079, 1806, 1577, 1378, 1230, 1132, 1075, 1056, 1079, 1116, 1216, 1361, 1528, 1750, 1989, 2366, 2486, 2164, 1880, 1626, 1418, 1275, 1171, 1100, 1086, 1119, 1165, 1261, 1403, 1599, 1806, 2042, 2416, 2629, 2213, 1955, 1702, 1488, 1356, 1247, 1169, 1159, 1171, 1236, 1353, 1472, 1653, 1875, 2144, 2532, 2766, 2318, 2054, 1791, 1622, 1454, 1353, 1268, 1261, 1268, 1335, 1435, 1570, 1750, 1966, 2264, 2570, 2945, 2504, 2171, 1922, 1728, 1581, 1447, 1397, 1348, 1378, 1457, 1570, 1677, 1875, 2073, 2390, 2744, 3104, 2701, 2318, 2092, 1849, 1728, 1622, 1549, 1511, 1549, 1603, 1707, 1810, 2036, 2264, 2570, 2932, 3573, 2970, 2541, 2228, 2018, 1859, 1782, 1702, 1694, 1694, 1741, 1864, 1983, 2192, 2450, 2800, 3465, 4699, 3299, 2847, 2513, 2287, 2105, 2006, 1927, 1864, 1955, 1983, 2036, 2206, 2450, 2733, 3191, 4866] + }, + "lsc_samples_greenB": { + "uCoeff": [3658, 2936, 2478, 2207, 2012, 1874, 1763, 1660, 1636, 1697, 1758, 1854, 1994, 2178, 2383, 2826, 3437, 3167, 2725, 2335, 2048, 1884, 1714, 1610, 1537, 1507, 1534, 1594, 1689, 1844, 2030, 2243, 2562, 3040, 2923, 2469, 2158, 1949, 1745, 1562, 1458, 1393, 1365, 1374, 1449, 1551, 1685, 1844, 2098, 2359, 2838, 2792, 2288, 2012, 1791, 1621, 1443, 1349, 1283, 1267, 1279, 1341, 1425, 1555, 1723, 1977, 2228, 2611, 2611, 2280, 1949, 1710, 1523, 1365, 1253, 1188, 1165, 1188, 1251, 1336, 1474, 1664, 1874, 2138, 2552, 2533, 2165, 1874, 1617, 1434, 1283, 1188, 1118, 1116, 1116, 1161, 1267, 1413, 1583, 1791, 2018, 2400, 2443, 2098, 1829, 1555, 1390, 1239, 1148, 1077, 1070, 1065, 1121, 1209, 1368, 1534, 1736, 2012, 2335, 2409, 2054, 1791, 1555, 1349, 1196, 1101, 1057, 1030, 1040, 1105, 1200, 1341, 1513, 1702, 1960, 2303, 2409, 2054, 1772, 1565, 1341, 1200, 1105, 1048, 1024, 1044, 1105, 1188, 1331, 1494, 1723, 1977, 2288, 2478, 2073, 1814, 1576, 1376, 1230, 1118, 1056, 1040, 1062, 1116, 1219, 1360, 1534, 1723, 2048, 2383, 2524, 2124, 1869, 1617, 1422, 1253, 1150, 1094, 1081, 1086, 1159, 1257, 1393, 1565, 1786, 2054, 2400, 2641, 2185, 1905, 1685, 1487, 1341, 1232, 1165, 1133, 1154, 1215, 1336, 1477, 1621, 1859, 2124, 2478, 2662, 2288, 2018, 1772, 1606, 1416, 1331, 1246, 1237, 1253, 1298, 1407, 1572, 1736, 1977, 2228, 2621, 2936, 2443, 2138, 1874, 1689, 1534, 1431, 1352, 1323, 1352, 1422, 1534, 1664, 1859, 2105, 2351, 2704, 3167, 2641, 2280, 2000, 1814, 1697, 1565, 1497, 1462, 1487, 1565, 1664, 1805, 2018, 2228, 2552, 2974, 3508, 2874, 2496, 2165, 2000, 1859, 1723, 1652, 1636, 1652, 1697, 1805, 1994, 2118, 2409, 2769, 3403, 4921, 3167, 2736, 2533, 2199, 2048, 1960, 1900, 1829, 1854, 1977, 2030, 2138, 2383, 2693, 3000, 4750] + }, + "lsc_samples_blue": { + "uCoeff": [3130, 2548, 2211, 1953, 1739, 1609, 1627, 1551, 1512, 1528, 1609, 1672, 1700, 1916, 2118, 2465, 3036, 2783, 2313, 1966, 1801, 1609, 1535, 1454, 1387, 1406, 1413, 1468, 1528, 1627, 1791, 1928, 2261, 2733, 2592, 2164, 1892, 1681, 1528, 1433, 1350, 1309, 1275, 1275, 1350, 1413, 1551, 1653, 1823, 2046, 2406, 2349, 1992, 1759, 1601, 1426, 1338, 1244, 1199, 1190, 1214, 1254, 1309, 1433, 1584, 1759, 1953, 2313, 2244, 1892, 1681, 1535, 1393, 1259, 1171, 1162, 1132, 1149, 1176, 1254, 1387, 1482, 1635, 1869, 2133, 2133, 1834, 1627, 1482, 1332, 1190, 1136, 1099, 1075, 1079, 1132, 1209, 1309, 1433, 1601, 1801, 2089, 2074, 1801, 1609, 1447, 1275, 1171, 1099, 1045, 1024, 1064, 1087, 1162, 1270, 1374, 1535, 1770, 2074, 1992, 1759, 1575, 1406, 1270, 1145, 1068, 1035, 1024, 1031, 1068, 1149, 1239, 1387, 1551, 1729, 2005, 2032, 1770, 1551, 1393, 1254, 1149, 1064, 1042, 1031, 1024, 1056, 1132, 1244, 1393, 1551, 1739, 2074, 2089, 1801, 1575, 1406, 1254, 1149, 1068, 1042, 1031, 1031, 1068, 1149, 1259, 1387, 1535, 1791, 2032, 2089, 1834, 1584, 1433, 1292, 1209, 1111, 1064, 1053, 1068, 1107, 1176, 1275, 1406, 1601, 1770, 2089, 2261, 1869, 1653, 1454, 1332, 1239, 1149, 1111, 1079, 1087, 1158, 1224, 1309, 1454, 1627, 1857, 2180, 2313, 1966, 1729, 1559, 1406, 1303, 1224, 1190, 1158, 1171, 1209, 1309, 1393, 1528, 1700, 1916, 2244, 2406, 2089, 1834, 1627, 1505, 1393, 1303, 1254, 1254, 1244, 1303, 1368, 1505, 1609, 1770, 1992, 2406, 2592, 2261, 1953, 1770, 1584, 1490, 1393, 1368, 1332, 1356, 1393, 1433, 1584, 1700, 1916, 2164, 2548, 2890, 2425, 2133, 1869, 1681, 1601, 1512, 1468, 1454, 1454, 1490, 1584, 1681, 1834, 2032, 2406, 2890, 3952, 2708, 2368, 2005, 1892, 1729, 1653, 1584, 1627, 1575, 1601, 1759, 1823, 2005, 2180, 2592, 4004] + } + }, { + "name": "3264x2448_CWF_70", + "resolution": "3264x2448", + "illumination": "CWF", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [2997, 2377, 2110, 1961, 1862, 1745, 1632, 1606, 1583, 1657, 1651, 1745, 1812, 1952, 2156, 2305, 2806, 2625, 2332, 2032, 1860, 1741, 1619, 1538, 1498, 1458, 1456, 1555, 1619, 1698, 1810, 1982, 2186, 2517, 2412, 2121, 1920, 1759, 1659, 1525, 1432, 1365, 1353, 1379, 1417, 1497, 1607, 1737, 1850, 2087, 2381, 2338, 2045, 1842, 1673, 1558, 1405, 1329, 1278, 1245, 1263, 1321, 1419, 1507, 1666, 1809, 2014, 2283, 2307, 1971, 1783, 1624, 1456, 1343, 1253, 1183, 1167, 1176, 1234, 1329, 1441, 1593, 1745, 1897, 2165, 2205, 1927, 1747, 1546, 1407, 1288, 1173, 1104, 1087, 1119, 1176, 1275, 1407, 1512, 1711, 1882, 2110, 2192, 1881, 1689, 1511, 1373, 1231, 1123, 1075, 1065, 1075, 1132, 1235, 1373, 1474, 1675, 1864, 2054, 2139, 1886, 1693, 1519, 1344, 1203, 1093, 1032, 1024, 1040, 1096, 1194, 1331, 1471, 1639, 1818, 2104, 2189, 1871, 1701, 1532, 1348, 1197, 1102, 1048, 1037, 1040, 1111, 1194, 1345, 1494, 1640, 1845, 2074, 2127, 1895, 1735, 1531, 1371, 1244, 1123, 1076, 1054, 1062, 1132, 1214, 1361, 1503, 1658, 1844, 2127, 2230, 1936, 1754, 1563, 1396, 1270, 1157, 1111, 1096, 1111, 1174, 1277, 1396, 1534, 1710, 1890, 2132, 2296, 2014, 1793, 1632, 1483, 1360, 1244, 1168, 1165, 1164, 1233, 1337, 1436, 1601, 1770, 1955, 2168, 2439, 2084, 1882, 1699, 1591, 1441, 1348, 1248, 1237, 1291, 1334, 1421, 1520, 1684, 1823, 2021, 2307, 2509, 2110, 1921, 1775, 1665, 1553, 1425, 1359, 1373, 1363, 1425, 1507, 1620, 1759, 1912, 2110, 2509, 2671, 2324, 2027, 1899, 1759, 1621, 1557, 1499, 1484, 1477, 1539, 1647, 1736, 1847, 1996, 2217, 2509, 2876, 2452, 2191, 2019, 1878, 1805, 1662, 1615, 1625, 1648, 1682, 1735, 1810, 1960, 2143, 2346, 2808, 3802, 2667, 2354, 2177, 2085, 1927, 1837, 1828, 1783, 1780, 1862, 1927, 2011, 2141, 2243, 2610, 3759] + }, + "lsc_samples_greenR": { + "uCoeff": [2808, 2385, 2191, 1993, 1859, 1757, 1672, 1591, 1558, 1580, 1660, 1701, 1830, 1920, 2108, 2334, 2796, 2538, 2253, 2025, 1873, 1751, 1636, 1546, 1483, 1450, 1483, 1516, 1581, 1692, 1828, 1984, 2186, 2450, 2389, 2159, 1909, 1783, 1656, 1510, 1412, 1361, 1342, 1361, 1412, 1484, 1596, 1709, 1862, 2061, 2304, 2385, 2052, 1865, 1674, 1528, 1413, 1317, 1282, 1253, 1259, 1307, 1397, 1499, 1624, 1812, 1986, 2180, 2231, 1962, 1797, 1612, 1463, 1334, 1244, 1182, 1161, 1160, 1238, 1310, 1431, 1562, 1721, 1914, 2186, 2196, 1915, 1731, 1558, 1383, 1278, 1171, 1125, 1107, 1114, 1155, 1246, 1372, 1518, 1693, 1859, 2087, 2172, 1892, 1692, 1543, 1357, 1223, 1130, 1078, 1047, 1059, 1112, 1199, 1334, 1475, 1652, 1832, 2034, 2144, 1902, 1679, 1487, 1336, 1200, 1104, 1056, 1036, 1043, 1099, 1194, 1308, 1462, 1636, 1837, 2059, 2139, 1920, 1681, 1507, 1336, 1199, 1102, 1052, 1024, 1047, 1104, 1188, 1309, 1470, 1637, 1838, 2049, 2193, 1918, 1717, 1532, 1359, 1224, 1130, 1075, 1056, 1079, 1115, 1210, 1343, 1487, 1667, 1842, 2104, 2193, 1985, 1778, 1574, 1395, 1266, 1168, 1099, 1086, 1118, 1162, 1252, 1381, 1549, 1713, 1882, 2137, 2295, 2016, 1836, 1638, 1457, 1341, 1240, 1166, 1157, 1168, 1230, 1338, 1442, 1593, 1766, 1959, 2218, 2384, 2089, 1911, 1709, 1575, 1429, 1339, 1260, 1254, 1260, 1322, 1411, 1527, 1673, 1835, 2045, 2231, 2496, 2221, 1994, 1813, 1661, 1540, 1423, 1379, 1333, 1361, 1432, 1530, 1615, 1771, 1912, 2129, 2342, 2582, 2351, 2096, 1943, 1756, 1663, 1576, 1513, 1480, 1513, 1558, 1644, 1721, 1894, 2051, 2247, 2453, 2879, 2524, 2249, 2034, 1884, 1764, 1707, 1641, 1636, 1634, 1670, 1768, 1854, 2004, 2175, 2393, 2800, 3597, 2723, 2452, 2237, 2085, 1955, 1884, 1823, 1769, 1847, 1864, 1895, 2017, 2186, 2363, 2642, 3713] + }, + "lsc_samples_greenB": { + "uCoeff": [2868, 2452, 2163, 1988, 1854, 1756, 1671, 1587, 1567, 1619, 1667, 1738, 1839, 1964, 2089, 2370, 2713, 2583, 2335, 2082, 1883, 1768, 1635, 1552, 1491, 1465, 1488, 1537, 1613, 1733, 1868, 2008, 2209, 2491, 2446, 2167, 1963, 1820, 1663, 1512, 1425, 1368, 1343, 1350, 1416, 1502, 1610, 1729, 1914, 2080, 2382, 2379, 2046, 1860, 1698, 1564, 1412, 1330, 1270, 1256, 1267, 1323, 1396, 1505, 1638, 1830, 1998, 2240, 2263, 2058, 1820, 1637, 1483, 1345, 1243, 1183, 1161, 1183, 1241, 1318, 1438, 1596, 1756, 1941, 2217, 2219, 1976, 1766, 1561, 1406, 1271, 1183, 1116, 1114, 1114, 1157, 1256, 1387, 1530, 1693, 1853, 2113, 2159, 1929, 1733, 1509, 1369, 1231, 1145, 1076, 1070, 1065, 1119, 1202, 1348, 1490, 1651, 1857, 2072, 2138, 1897, 1703, 1512, 1332, 1191, 1100, 1057, 1030, 1040, 1104, 1195, 1324, 1473, 1625, 1817, 2053, 2140, 1899, 1688, 1522, 1325, 1195, 1104, 1048, 1024, 1044, 1104, 1183, 1315, 1457, 1644, 1833, 2043, 2194, 1913, 1724, 1531, 1357, 1224, 1117, 1056, 1040, 1062, 1115, 1213, 1342, 1493, 1643, 1892, 2117, 2224, 1951, 1768, 1566, 1399, 1245, 1147, 1093, 1081, 1085, 1156, 1249, 1371, 1518, 1695, 1892, 2124, 2304, 1993, 1793, 1622, 1456, 1327, 1226, 1162, 1131, 1151, 1209, 1322, 1447, 1564, 1752, 1942, 2175, 2303, 2065, 1880, 1692, 1560, 1393, 1318, 1239, 1231, 1246, 1287, 1385, 1529, 1660, 1844, 2015, 2271, 2489, 2172, 1967, 1771, 1626, 1497, 1407, 1336, 1309, 1336, 1399, 1497, 1603, 1757, 1939, 2097, 2312, 2629, 2303, 2064, 1863, 1724, 1635, 1523, 1465, 1434, 1456, 1523, 1605, 1717, 1879, 2021, 2233, 2484, 2832, 2450, 2212, 1981, 1868, 1764, 1654, 1595, 1583, 1595, 1630, 1716, 1863, 1942, 2142, 2369, 2755, 3752, 2624, 2365, 2253, 2012, 1905, 1844, 1799, 1738, 1758, 1858, 1890, 1960, 2131, 2332, 2500, 3632] + }, + "lsc_samples_blue": { + "uCoeff": [2498, 2162, 1954, 1781, 1625, 1528, 1552, 1490, 1457, 1470, 1536, 1582, 1592, 1751, 1881, 2100, 2432, 2304, 2017, 1785, 1676, 1530, 1477, 1411, 1354, 1373, 1378, 1424, 1470, 1546, 1667, 1754, 1977, 2268, 2198, 1926, 1743, 1589, 1471, 1395, 1325, 1290, 1259, 1258, 1325, 1377, 1491, 1565, 1686, 1833, 2059, 2039, 1807, 1646, 1531, 1388, 1315, 1231, 1191, 1182, 1205, 1241, 1288, 1394, 1516, 1646, 1775, 2012, 1976, 1739, 1590, 1481, 1364, 1245, 1165, 1158, 1129, 1145, 1170, 1241, 1358, 1433, 1550, 1720, 1890, 1902, 1700, 1550, 1439, 1311, 1182, 1133, 1098, 1074, 1078, 1129, 1201, 1290, 1394, 1527, 1672, 1867, 1864, 1679, 1539, 1411, 1260, 1166, 1097, 1045, 1024, 1064, 1086, 1157, 1256, 1344, 1474, 1653, 1864, 1803, 1647, 1512, 1375, 1257, 1141, 1067, 1035, 1024, 1031, 1067, 1145, 1228, 1358, 1491, 1621, 1813, 1837, 1657, 1492, 1364, 1242, 1145, 1063, 1042, 1031, 1024, 1056, 1129, 1233, 1364, 1492, 1631, 1870, 1881, 1683, 1512, 1375, 1242, 1145, 1067, 1042, 1031, 1031, 1067, 1145, 1247, 1358, 1477, 1674, 1835, 1876, 1707, 1517, 1398, 1276, 1202, 1109, 1064, 1053, 1068, 1105, 1170, 1260, 1373, 1532, 1653, 1876, 2003, 1729, 1573, 1413, 1311, 1229, 1145, 1109, 1078, 1086, 1154, 1215, 1290, 1413, 1550, 1719, 1939, 2030, 1799, 1631, 1502, 1376, 1287, 1216, 1185, 1154, 1166, 1201, 1293, 1364, 1474, 1606, 1758, 1976, 2083, 1885, 1709, 1554, 1459, 1366, 1287, 1243, 1244, 1233, 1287, 1343, 1459, 1538, 1655, 1807, 2083, 2198, 2003, 1793, 1666, 1521, 1447, 1365, 1345, 1312, 1334, 1365, 1395, 1521, 1605, 1763, 1926, 2165, 2382, 2104, 1919, 1733, 1592, 1535, 1464, 1428, 1417, 1415, 1444, 1520, 1592, 1703, 1838, 2089, 2382, 3074, 2281, 2077, 1823, 1754, 1631, 1575, 1519, 1559, 1511, 1529, 1657, 1696, 1823, 1930, 2195, 3110] + } + }, { + "name": "3264x2448_D50_100", + "resolution": "3264x2448", + "illumination": "D50", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [3563, 2927, 2529, 2174, 2017, 1868, 1729, 1687, 1638, 1647, 1751, 1868, 1974, 2157, 2462, 2896, 4026, 3309, 2700, 2299, 2017, 1819, 1708, 1609, 1555, 1505, 1555, 1600, 1687, 1819, 2017, 2244, 2575, 3055, 3055, 2462, 2092, 1881, 1708, 1538, 1428, 1392, 1352, 1413, 1489, 1530, 1677, 1819, 2017, 2318, 2896, 2927, 2262, 2017, 1751, 1609, 1458, 1313, 1283, 1260, 1266, 1332, 1428, 1564, 1740, 1946, 2244, 2754, 2674, 2208, 1906, 1697, 1513, 1365, 1232, 1175, 1180, 1180, 1243, 1385, 1513, 1628, 1856, 2124, 2624, 2754, 2046, 1843, 1657, 1465, 1266, 1165, 1105, 1110, 1114, 1165, 1295, 1392, 1582, 1796, 2124, 2462, 2506, 2061, 1807, 1582, 1413, 1232, 1132, 1063, 1075, 1088, 1141, 1211, 1358, 1538, 1751, 2002, 2358, 2462, 2017, 1751, 1530, 1345, 1190, 1114, 1047, 1024, 1051, 1088, 1211, 1358, 1538, 1740, 1974, 2318, 2419, 2061, 1762, 1547, 1385, 1185, 1105, 1071, 1028, 1063, 1119, 1211, 1378, 1489, 1708, 1974, 2440, 2624, 2124, 1784, 1600, 1378, 1232, 1110, 1055, 1071, 1075, 1114, 1243, 1385, 1547, 1784, 2017, 2398, 2506, 2157, 1856, 1647, 1428, 1313, 1175, 1105, 1092, 1092, 1165, 1283, 1413, 1600, 1856, 2061, 2506, 2700, 2157, 1906, 1729, 1538, 1332, 1254, 1190, 1160, 1165, 1227, 1326, 1497, 1657, 1881, 2124, 2529, 2958, 2318, 2017, 1762, 1628, 1458, 1358, 1266, 1238, 1272, 1326, 1435, 1591, 1751, 1988, 2157, 2700, 3055, 2462, 2174, 1868, 1708, 1582, 1465, 1385, 1365, 1385, 1465, 1538, 1708, 1881, 2124, 2358, 2838, 3474, 2700, 2262, 2046, 1906, 1677, 1600, 1538, 1473, 1538, 1591, 1697, 1807, 2002, 2226, 2552, 3124, 3913, 2838, 2506, 2262, 2061, 1919, 1708, 1740, 1638, 1708, 1751, 1856, 2002, 2141, 2462, 2896, 3518, 4705, 3349, 2838, 2529, 2299, 2124, 1988, 1974, 1946, 1933, 2017, 2124, 2244, 2506, 2674, 3159, 4956] + }, + "lsc_samples_greenR": { + "uCoeff": [3825, 3056, 2647, 2246, 2066, 1876, 1719, 1670, 1638, 1689, 1744, 1775, 1944, 2148, 2420, 2864, 3638, 3276, 2732, 2307, 2073, 1859, 1689, 1611, 1532, 1475, 1512, 1594, 1656, 1813, 1983, 2246, 2647, 3171, 2979, 2502, 2188, 1876, 1709, 1552, 1446, 1388, 1347, 1369, 1425, 1536, 1689, 1882, 2088, 2325, 2878, 2797, 2325, 2010, 1786, 1615, 1453, 1354, 1267, 1246, 1240, 1323, 1436, 1540, 1729, 1950, 2237, 2567, 2758, 2221, 1983, 1670, 1509, 1354, 1243, 1176, 1160, 1169, 1230, 1338, 1475, 1647, 1870, 2117, 2502, 2534, 2148, 1841, 1620, 1412, 1272, 1167, 1112, 1090, 1096, 1156, 1267, 1412, 1577, 1797, 2080, 2381, 2470, 2102, 1813, 1573, 1376, 1240, 1112, 1076, 1057, 1066, 1114, 1203, 1344, 1528, 1744, 1996, 2353, 2502, 2088, 1775, 1552, 1347, 1210, 1080, 1048, 1033, 1042, 1090, 1205, 1347, 1497, 1729, 2003, 2289, 2481, 2110, 1791, 1577, 1338, 1193, 1100, 1038, 1024, 1038, 1096, 1181, 1329, 1528, 1709, 2010, 2362, 2534, 2110, 1797, 1573, 1385, 1220, 1136, 1070, 1055, 1057, 1123, 1203, 1326, 1509, 1739, 2003, 2450, 2578, 2196, 1870, 1615, 1408, 1275, 1149, 1092, 1094, 1094, 1149, 1256, 1388, 1548, 1819, 2073, 2372, 2612, 2280, 1983, 1689, 1501, 1357, 1220, 1172, 1153, 1167, 1228, 1329, 1460, 1661, 1847, 2204, 2512, 2878, 2325, 2088, 1819, 1611, 1475, 1318, 1261, 1228, 1283, 1318, 1429, 1594, 1744, 1963, 2307, 2732, 2979, 2556, 2221, 1919, 1714, 1552, 1460, 1376, 1329, 1372, 1453, 1552, 1709, 1888, 2140, 2450, 2950, 3331, 2758, 2353, 2030, 1876, 1714, 1573, 1520, 1501, 1497, 1624, 1709, 1847, 2052, 2325, 2623, 3137, 3705, 3025, 2567, 2316, 2052, 1853, 1734, 1744, 1661, 1714, 1786, 1859, 2066, 2280, 2523, 2823, 3638, 5201, 3331, 2878, 2556, 2325, 2110, 2044, 1906, 1853, 1870, 2003, 2088, 2188, 2420, 2758, 3331, 4705] + }, + "lsc_samples_greenB": { + "uCoeff": [3656, 3056, 2536, 2328, 2076, 1886, 1784, 1717, 1703, 1679, 1784, 1801, 1973, 2257, 2442, 2825, 3845, 3405, 2772, 2365, 2128, 1868, 1743, 1655, 1548, 1524, 1548, 1624, 1713, 1823, 2062, 2301, 2685, 3120, 3025, 2569, 2167, 1948, 1727, 1606, 1483, 1402, 1376, 1409, 1468, 1544, 1698, 1892, 2175, 2442, 2893, 2825, 2328, 2098, 1779, 1628, 1497, 1351, 1287, 1273, 1265, 1333, 1433, 1619, 1768, 2020, 2337, 2637, 2721, 2283, 1993, 1693, 1536, 1367, 1265, 1199, 1173, 1185, 1247, 1348, 1472, 1651, 1910, 2191, 2602, 2547, 2215, 1898, 1655, 1450, 1316, 1175, 1112, 1100, 1116, 1171, 1268, 1412, 1589, 1828, 2113, 2494, 2494, 2136, 1784, 1589, 1383, 1221, 1131, 1080, 1057, 1078, 1131, 1226, 1380, 1540, 1774, 2091, 2384, 2463, 2151, 1795, 1564, 1348, 1197, 1106, 1047, 1033, 1057, 1120, 1199, 1339, 1528, 1738, 1980, 2384, 2473, 2076, 1784, 1548, 1348, 1209, 1110, 1047, 1024, 1038, 1110, 1194, 1304, 1509, 1743, 2013, 2328, 2547, 2113, 1834, 1581, 1383, 1221, 1127, 1076, 1053, 1072, 1120, 1204, 1348, 1540, 1774, 2027, 2365, 2525, 2159, 1851, 1624, 1450, 1249, 1162, 1096, 1090, 1100, 1175, 1255, 1412, 1581, 1801, 2136, 2433, 2649, 2249, 1910, 1722, 1486, 1348, 1216, 1164, 1164, 1159, 1226, 1324, 1450, 1642, 1868, 2207, 2515, 2893, 2365, 2084, 1779, 1602, 1443, 1336, 1242, 1221, 1252, 1321, 1402, 1577, 1753, 1987, 2301, 2602, 2965, 2494, 2199, 1910, 1688, 1577, 1433, 1367, 1318, 1339, 1426, 1516, 1679, 1851, 2113, 2423, 2907, 3348, 2746, 2365, 2048, 1834, 1693, 1577, 1528, 1490, 1520, 1564, 1679, 1806, 2055, 2301, 2625, 3072, 3656, 2965, 2547, 2257, 2027, 1851, 1722, 1717, 1655, 1669, 1743, 1828, 1993, 2207, 2494, 2851, 3526, 4845, 3293, 2965, 2463, 2257, 2013, 1980, 1857, 1898, 1880, 1973, 2020, 2199, 2483, 2772, 3222, 5008] + }, + "lsc_samples_blue": { + "uCoeff": [3493, 2791, 2385, 2082, 1979, 1766, 1684, 1594, 1623, 1645, 1684, 1792, 1886, 2070, 2354, 2791, 3493, 2975, 2518, 2196, 1990, 1757, 1638, 1573, 1508, 1489, 1501, 1553, 1660, 1749, 1896, 2119, 2417, 2769, 2769, 2339, 2058, 1792, 1630, 1560, 1430, 1350, 1360, 1355, 1402, 1508, 1638, 1792, 2024, 2279, 2609, 2609, 2196, 1906, 1684, 1501, 1430, 1310, 1243, 1238, 1256, 1310, 1419, 1533, 1676, 1886, 2119, 2466, 2466, 2119, 1876, 1601, 1495, 1335, 1205, 1174, 1137, 1137, 1226, 1310, 1430, 1623, 1829, 2058, 2433, 2354, 2012, 1766, 1560, 1386, 1247, 1148, 1089, 1092, 1112, 1163, 1243, 1386, 1527, 1716, 2001, 2279, 2265, 1990, 1716, 1520, 1365, 1193, 1096, 1063, 1039, 1060, 1126, 1193, 1360, 1508, 1699, 1906, 2119, 2209, 1926, 1676, 1471, 1350, 1166, 1086, 1039, 1042, 1045, 1076, 1155, 1306, 1495, 1699, 1906, 2082, 2237, 1979, 1684, 1471, 1306, 1201, 1051, 1042, 1024, 1036, 1086, 1166, 1335, 1441, 1699, 1906, 2309, 2170, 1979, 1766, 1465, 1360, 1193, 1076, 1042, 1024, 1042, 1076, 1205, 1335, 1477, 1699, 1906, 2251, 2323, 1979, 1740, 1540, 1381, 1238, 1126, 1070, 1051, 1073, 1112, 1226, 1355, 1495, 1724, 1990, 2209, 2385, 2012, 1838, 1608, 1430, 1301, 1182, 1148, 1102, 1123, 1213, 1283, 1413, 1560, 1749, 2001, 2385, 2501, 2196, 1958, 1676, 1527, 1391, 1310, 1201, 1193, 1201, 1292, 1365, 1465, 1676, 1838, 2106, 2401, 2667, 2309, 2001, 1766, 1594, 1489, 1386, 1310, 1310, 1325, 1381, 1477, 1587, 1792, 1947, 2251, 2687, 2927, 2483, 2170, 1937, 1749, 1594, 1508, 1465, 1402, 1447, 1471, 1630, 1749, 1857, 2144, 2401, 2707, 3427, 2647, 2339, 2024, 1876, 1757, 1660, 1601, 1623, 1560, 1623, 1707, 1801, 2024, 2196, 2647, 3272, 4610, 2903, 2518, 2183, 2106, 1896, 1792, 1716, 1676, 1660, 1810, 1886, 1979, 2183, 2483, 2903, 4440] + } + }, { + "name": "3264x2448_D50_70", + "resolution": "3264x2448", + "illumination": "D50", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [2801, 2445, 2203, 1961, 1859, 1751, 1641, 1610, 1569, 1575, 1661, 1751, 1822, 1947, 2151, 2422, 3125, 2687, 2316, 2053, 1857, 1712, 1630, 1551, 1507, 1463, 1507, 1543, 1611, 1712, 1857, 2009, 2219, 2502, 2545, 2162, 1909, 1761, 1631, 1491, 1397, 1367, 1331, 1387, 1453, 1483, 1603, 1708, 1846, 2048, 2426, 2482, 2025, 1864, 1663, 1554, 1426, 1296, 1270, 1249, 1254, 1314, 1398, 1513, 1653, 1804, 2011, 2350, 2312, 1999, 1783, 1625, 1474, 1345, 1223, 1170, 1175, 1175, 1234, 1364, 1474, 1564, 1740, 1930, 2273, 2394, 1877, 1738, 1597, 1435, 1255, 1161, 1103, 1109, 1112, 1161, 1283, 1367, 1529, 1697, 1942, 2163, 2209, 1898, 1714, 1534, 1390, 1224, 1130, 1063, 1075, 1087, 1139, 1204, 1339, 1494, 1664, 1848, 2091, 2181, 1866, 1668, 1489, 1328, 1185, 1113, 1047, 1024, 1051, 1087, 1205, 1340, 1496, 1658, 1829, 2065, 2149, 1905, 1679, 1506, 1366, 1180, 1104, 1071, 1028, 1063, 1118, 1206, 1360, 1452, 1631, 1831, 2165, 2311, 1956, 1697, 1553, 1359, 1226, 1109, 1055, 1071, 1075, 1113, 1236, 1366, 1505, 1697, 1866, 2129, 2209, 1979, 1757, 1593, 1404, 1303, 1172, 1104, 1092, 1091, 1162, 1274, 1390, 1550, 1757, 1898, 2209, 2351, 1969, 1793, 1662, 1504, 1318, 1247, 1187, 1158, 1162, 1221, 1312, 1465, 1597, 1772, 1942, 2216, 2534, 2089, 1879, 1683, 1580, 1433, 1344, 1258, 1232, 1264, 1313, 1411, 1546, 1674, 1854, 1957, 2332, 2581, 2187, 1997, 1765, 1643, 1541, 1440, 1368, 1350, 1368, 1440, 1500, 1643, 1777, 1955, 2103, 2414, 2859, 2350, 2049, 1903, 1806, 1617, 1556, 1503, 1444, 1503, 1547, 1635, 1718, 1865, 2020, 2233, 2597, 3126, 2422, 2220, 2062, 1921, 1817, 1640, 1675, 1585, 1646, 1679, 1761, 1870, 1961, 2185, 2467, 2839, 3601, 2760, 2445, 2250, 2096, 1971, 1868, 1864, 1842, 1828, 1893, 1971, 2049, 2231, 2317, 2618, 3776] + }, + "lsc_samples_greenR": { + "uCoeff": [2985, 2541, 2296, 2019, 1900, 1757, 1633, 1595, 1569, 1612, 1654, 1670, 1797, 1940, 2118, 2398, 2854, 2663, 2340, 2060, 1904, 1746, 1613, 1553, 1486, 1436, 1468, 1537, 1584, 1707, 1828, 2011, 2275, 2586, 2488, 2193, 1988, 1757, 1631, 1503, 1414, 1363, 1326, 1346, 1394, 1489, 1614, 1762, 1905, 2053, 2412, 2383, 2076, 1858, 1693, 1559, 1422, 1335, 1255, 1236, 1230, 1306, 1406, 1491, 1643, 1807, 2005, 2207, 2378, 2009, 1850, 1601, 1471, 1335, 1234, 1171, 1156, 1164, 1221, 1320, 1439, 1581, 1752, 1924, 2178, 2220, 1962, 1737, 1564, 1386, 1261, 1163, 1110, 1089, 1095, 1152, 1256, 1386, 1525, 1698, 1905, 2098, 2180, 1932, 1719, 1526, 1355, 1232, 1110, 1075, 1057, 1066, 1112, 1197, 1325, 1485, 1658, 1843, 2087, 2213, 1926, 1689, 1509, 1330, 1204, 1079, 1048, 1033, 1042, 1089, 1199, 1330, 1459, 1648, 1854, 2042, 2199, 1946, 1705, 1533, 1322, 1188, 1099, 1038, 1024, 1038, 1095, 1176, 1313, 1488, 1632, 1861, 2103, 2239, 1944, 1709, 1529, 1366, 1214, 1134, 1070, 1055, 1057, 1122, 1197, 1310, 1470, 1657, 1854, 2171, 2267, 2012, 1769, 1564, 1386, 1266, 1146, 1091, 1093, 1093, 1146, 1248, 1367, 1503, 1724, 1908, 2102, 2281, 2072, 1861, 1626, 1469, 1342, 1214, 1169, 1151, 1164, 1222, 1315, 1431, 1601, 1742, 2009, 2202, 2471, 2095, 1940, 1734, 1564, 1449, 1306, 1253, 1222, 1275, 1306, 1406, 1549, 1667, 1832, 2080, 2357, 2522, 2263, 2037, 1810, 1649, 1513, 1435, 1359, 1315, 1355, 1428, 1513, 1644, 1783, 1968, 2177, 2500, 2752, 2396, 2125, 1889, 1779, 1650, 1531, 1486, 1470, 1465, 1578, 1646, 1754, 1908, 2102, 2289, 2606, 2975, 2566, 2270, 2108, 1913, 1758, 1664, 1679, 1606, 1652, 1710, 1764, 1925, 2078, 2234, 2410, 2926, 3948, 2747, 2477, 2272, 2117, 1959, 1917, 1804, 1760, 1772, 1881, 1940, 2002, 2161, 2383, 2747, 3601] + }, + "lsc_samples_greenB": { + "uCoeff": [2866, 2541, 2209, 2086, 1908, 1766, 1689, 1637, 1627, 1603, 1689, 1693, 1822, 2028, 2135, 2369, 2999, 2757, 2371, 2107, 1950, 1754, 1661, 1592, 1501, 1480, 1501, 1564, 1634, 1715, 1895, 2055, 2304, 2549, 2522, 2246, 1971, 1819, 1647, 1552, 1448, 1376, 1353, 1383, 1434, 1496, 1622, 1771, 1977, 2146, 2424, 2404, 2079, 1933, 1687, 1571, 1462, 1332, 1274, 1262, 1253, 1315, 1403, 1563, 1677, 1867, 2086, 2260, 2349, 2060, 1858, 1622, 1495, 1347, 1255, 1193, 1169, 1180, 1238, 1329, 1436, 1584, 1787, 1985, 2256, 2230, 2018, 1786, 1595, 1421, 1303, 1171, 1110, 1099, 1114, 1167, 1257, 1386, 1536, 1725, 1933, 2188, 2200, 1961, 1693, 1540, 1362, 1214, 1129, 1079, 1057, 1077, 1129, 1219, 1359, 1496, 1685, 1923, 2112, 2182, 1979, 1707, 1520, 1331, 1192, 1105, 1047, 1033, 1057, 1119, 1194, 1322, 1487, 1656, 1834, 2118, 2192, 1917, 1698, 1506, 1331, 1204, 1109, 1047, 1024, 1038, 1109, 1189, 1290, 1471, 1662, 1864, 2075, 2249, 1947, 1741, 1536, 1364, 1215, 1125, 1076, 1053, 1072, 1119, 1198, 1331, 1498, 1688, 1874, 2103, 2224, 1980, 1752, 1572, 1425, 1241, 1159, 1095, 1090, 1099, 1172, 1247, 1389, 1533, 1708, 1961, 2151, 2311, 2046, 1797, 1656, 1455, 1333, 1210, 1161, 1162, 1156, 1220, 1310, 1421, 1583, 1760, 2011, 2205, 2483, 2128, 1936, 1699, 1556, 1419, 1323, 1235, 1215, 1245, 1309, 1380, 1533, 1675, 1853, 2075, 2256, 2512, 2213, 2018, 1802, 1625, 1536, 1409, 1350, 1305, 1324, 1403, 1480, 1617, 1750, 1945, 2155, 2467, 2764, 2387, 2135, 1905, 1742, 1631, 1534, 1494, 1460, 1486, 1522, 1619, 1717, 1911, 2082, 2291, 2558, 2939, 2520, 2254, 2058, 1892, 1757, 1653, 1655, 1600, 1611, 1672, 1736, 1862, 2016, 2211, 2432, 2845, 3699, 2718, 2545, 2196, 2060, 1875, 1861, 1761, 1800, 1781, 1855, 1881, 2012, 2213, 2394, 2665, 3813] + }, + "lsc_samples_blue": { + "uCoeff": [2752, 2343, 2090, 1886, 1827, 1663, 1602, 1528, 1556, 1573, 1602, 1685, 1748, 1876, 2066, 2343, 2752, 2444, 2175, 1970, 1834, 1658, 1568, 1519, 1464, 1449, 1458, 1501, 1587, 1651, 1755, 1908, 2097, 2294, 2331, 2064, 1880, 1685, 1561, 1511, 1399, 1328, 1338, 1333, 1373, 1463, 1568, 1685, 1852, 2017, 2211, 2239, 1972, 1770, 1604, 1456, 1400, 1293, 1232, 1228, 1245, 1293, 1390, 1485, 1597, 1753, 1910, 2129, 2150, 1925, 1757, 1540, 1458, 1317, 1197, 1169, 1134, 1133, 1218, 1294, 1398, 1559, 1717, 1875, 2124, 2077, 1848, 1671, 1509, 1362, 1237, 1144, 1088, 1091, 1110, 1159, 1233, 1362, 1479, 1628, 1839, 2018, 2016, 1838, 1633, 1477, 1345, 1187, 1095, 1063, 1039, 1060, 1124, 1187, 1340, 1466, 1618, 1767, 1900, 1977, 1788, 1602, 1435, 1333, 1162, 1085, 1039, 1042, 1045, 1075, 1151, 1291, 1457, 1622, 1772, 1875, 2002, 1835, 1610, 1436, 1292, 1196, 1051, 1042, 1024, 1036, 1085, 1162, 1319, 1408, 1623, 1773, 2060, 1946, 1833, 1681, 1429, 1342, 1188, 1075, 1042, 1024, 1042, 1075, 1199, 1318, 1440, 1622, 1772, 2011, 2063, 1829, 1655, 1496, 1360, 1230, 1124, 1070, 1051, 1072, 1110, 1219, 1336, 1454, 1641, 1838, 1972, 2102, 1848, 1734, 1553, 1403, 1288, 1177, 1146, 1101, 1121, 1207, 1271, 1387, 1509, 1656, 1839, 2102, 2177, 1989, 1828, 1607, 1487, 1370, 1298, 1195, 1188, 1195, 1281, 1345, 1430, 1607, 1725, 1915, 2099, 2283, 2063, 1851, 1676, 1540, 1455, 1365, 1296, 1297, 1310, 1360, 1444, 1534, 1699, 1805, 2016, 2299, 2449, 2178, 1973, 1809, 1667, 1541, 1471, 1435, 1378, 1418, 1437, 1574, 1667, 1740, 1952, 2114, 2284, 2773, 2275, 2086, 1863, 1761, 1673, 1597, 1549, 1571, 1512, 1564, 1629, 1696, 1863, 1970, 2275, 2660, 3534, 2427, 2195, 1968, 1933, 1775, 1696, 1636, 1603, 1587, 1712, 1766, 1827, 1968, 2167, 2427, 3415] + } + }, { + "name": "3264x2448_D65_100", + "resolution": "3264x2448", + "illumination": "D65", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [3961, 3057, 2569, 2328, 2059, 1924, 1785, 1700, 1674, 1700, 1785, 1868, 2059, 2231, 2471, 2919, 3775, 3210, 2745, 2328, 2100, 1868, 1728, 1623, 1560, 1545, 1560, 1623, 1700, 1868, 2046, 2246, 2611, 3210, 3087, 2529, 2200, 1936, 1737, 1607, 1454, 1410, 1368, 1404, 1488, 1568, 1728, 1924, 2156, 2415, 3057, 2867, 2345, 2086, 1815, 1623, 1468, 1328, 1276, 1251, 1291, 1351, 1448, 1607, 1815, 2021, 2294, 2745, 2654, 2200, 1959, 1718, 1516, 1351, 1246, 1182, 1173, 1173, 1251, 1351, 1495, 1691, 1924, 2231, 2611, 2654, 2200, 1868, 1615, 1422, 1266, 1186, 1116, 1079, 1116, 1173, 1281, 1441, 1623, 1826, 2100, 2509, 2590, 2100, 1847, 1583, 1391, 1232, 1120, 1061, 1051, 1072, 1136, 1232, 1422, 1560, 1815, 2059, 2452, 2509, 2059, 1826, 1591, 1368, 1191, 1105, 1058, 1027, 1047, 1120, 1218, 1374, 1538, 1766, 2046, 2397, 2529, 2086, 1815, 1568, 1368, 1218, 1097, 1037, 1024, 1037, 1094, 1213, 1374, 1545, 1785, 2059, 2415, 2590, 2100, 1826, 1591, 1391, 1232, 1132, 1068, 1037, 1058, 1109, 1200, 1404, 1583, 1815, 2046, 2452, 2590, 2142, 1868, 1648, 1441, 1281, 1173, 1105, 1083, 1094, 1173, 1291, 1441, 1607, 1847, 2127, 2471, 2792, 2246, 1924, 1700, 1523, 1362, 1236, 1156, 1148, 1191, 1236, 1351, 1509, 1674, 1959, 2185, 2611, 2817, 2345, 2046, 1826, 1615, 1441, 1334, 1266, 1251, 1276, 1345, 1448, 1607, 1785, 2059, 2294, 2745, 2973, 2509, 2200, 1936, 1737, 1607, 1448, 1404, 1374, 1391, 1488, 1583, 1728, 1901, 2142, 2415, 2919, 3275, 2721, 2345, 2086, 1868, 1737, 1640, 1560, 1523, 1523, 1607, 1718, 1857, 2086, 2294, 2590, 3147, 3775, 2973, 2529, 2246, 2021, 1924, 1756, 1700, 1718, 1718, 1785, 1924, 1983, 2231, 2471, 2867, 3606, 5087, 3378, 2892, 2529, 2362, 2142, 2059, 1971, 1901, 1983, 2008, 2156, 2278, 2471, 2745, 3210, 5087] + }, + "lsc_samples_greenR": { + "uCoeff": [3795, 2895, 2488, 2210, 2042, 1887, 1754, 1684, 1671, 1663, 1763, 1820, 2023, 2139, 2443, 2787, 3499, 3214, 2666, 2316, 2061, 1856, 1701, 1599, 1544, 1510, 1513, 1573, 1675, 1801, 2011, 2217, 2545, 3012, 2871, 2470, 2126, 1908, 1714, 1573, 1457, 1399, 1363, 1374, 1448, 1527, 1684, 1851, 2073, 2365, 2776, 2753, 2308, 2023, 1806, 1607, 1448, 1352, 1287, 1253, 1277, 1352, 1442, 1555, 1740, 1947, 2254, 2604, 2676, 2232, 1947, 1705, 1513, 1365, 1253, 1176, 1170, 1176, 1239, 1346, 1470, 1650, 1866, 2126, 2545, 2545, 2146, 1866, 1630, 1420, 1280, 1170, 1114, 1094, 1105, 1168, 1270, 1408, 1584, 1791, 2099, 2399, 2470, 2106, 1820, 1573, 1371, 1233, 1131, 1068, 1055, 1066, 1114, 1224, 1363, 1527, 1754, 1999, 2357, 2416, 2061, 1791, 1562, 1360, 1204, 1101, 1056, 1024, 1043, 1099, 1195, 1328, 1523, 1731, 2011, 2374, 2507, 2073, 1806, 1559, 1374, 1217, 1105, 1051, 1027, 1038, 1112, 1197, 1328, 1503, 1745, 2017, 2308, 2507, 2119, 1835, 1584, 1388, 1226, 1135, 1078, 1045, 1071, 1114, 1217, 1360, 1548, 1763, 2054, 2365, 2574, 2188, 1871, 1634, 1442, 1277, 1164, 1107, 1087, 1099, 1168, 1277, 1417, 1581, 1801, 2080, 2416, 2666, 2217, 1964, 1696, 1513, 1354, 1242, 1176, 1150, 1181, 1233, 1338, 1483, 1671, 1887, 2167, 2479, 2787, 2341, 2054, 1806, 1607, 1451, 1328, 1265, 1242, 1263, 1335, 1457, 1581, 1763, 1976, 2262, 2676, 2972, 2479, 2188, 1903, 1731, 1581, 1470, 1397, 1365, 1391, 1451, 1570, 1688, 1871, 2106, 2399, 2787, 3214, 2698, 2332, 2080, 1866, 1718, 1599, 1523, 1499, 1527, 1596, 1696, 1840, 2042, 2285, 2584, 3026, 3611, 2972, 2564, 2239, 2042, 1887, 1772, 1705, 1684, 1705, 1758, 1887, 2036, 2217, 2507, 2846, 3445, 4903, 3325, 2846, 2516, 2239, 2106, 1947, 1925, 1840, 1919, 1964, 2042, 2269, 2425, 2709, 3124, 4698] + }, + "lsc_samples_greenB": { + "uCoeff": [3674, 2933, 2477, 2244, 2014, 1863, 1755, 1719, 1693, 1693, 1750, 1857, 2032, 2207, 2477, 2845, 3483, 3199, 2685, 2306, 2083, 1868, 1723, 1627, 1562, 1548, 1548, 1592, 1693, 1832, 2032, 2229, 2572, 2999, 2858, 2477, 2129, 1933, 1750, 1585, 1476, 1411, 1384, 1396, 1460, 1562, 1676, 1868, 2090, 2414, 2833, 2810, 2306, 2032, 1798, 1627, 1483, 1345, 1286, 1264, 1288, 1348, 1444, 1566, 1755, 1973, 2259, 2685, 2633, 2207, 1933, 1710, 1527, 1373, 1274, 1175, 1177, 1175, 1243, 1340, 1476, 1676, 1868, 2150, 2504, 2533, 2136, 1857, 1627, 1432, 1271, 1179, 1120, 1100, 1118, 1169, 1274, 1402, 1585, 1812, 2070, 2458, 2414, 2090, 1802, 1573, 1367, 1236, 1130, 1073, 1045, 1066, 1120, 1231, 1367, 1551, 1750, 2014, 2346, 2414, 2064, 1783, 1541, 1359, 1211, 1107, 1045, 1024, 1046, 1094, 1198, 1332, 1509, 1723, 1984, 2330, 2414, 2045, 1764, 1527, 1348, 1211, 1102, 1051, 1024, 1045, 1094, 1196, 1332, 1506, 1723, 1990, 2306, 2405, 2064, 1812, 1555, 1365, 1225, 1120, 1060, 1040, 1056, 1113, 1218, 1348, 1520, 1737, 2014, 2330, 2495, 2109, 1857, 1611, 1423, 1266, 1159, 1089, 1084, 1094, 1151, 1257, 1393, 1577, 1798, 2064, 2346, 2633, 2164, 1938, 1693, 1473, 1324, 1225, 1151, 1133, 1153, 1207, 1324, 1466, 1655, 1842, 2116, 2504, 2707, 2298, 2014, 1769, 1600, 1411, 1324, 1248, 1227, 1255, 1311, 1420, 1555, 1732, 1938, 2222, 2685, 2933, 2458, 2116, 1894, 1710, 1541, 1432, 1367, 1337, 1359, 1426, 1520, 1680, 1857, 2083, 2388, 2775, 3067, 2653, 2274, 2026, 1832, 1680, 1577, 1527, 1483, 1506, 1577, 1680, 1812, 2002, 2244, 2552, 3053, 3576, 2895, 2477, 2222, 2026, 1832, 1723, 1668, 1655, 1676, 1723, 1847, 1984, 2157, 2432, 2810, 3412, 4845, 3215, 2775, 2414, 2185, 2045, 1911, 1900, 1847, 1878, 1916, 2070, 2185, 2405, 2696, 3096, 4580] + }, + "lsc_samples_blue": { + "uCoeff": [3195, 2638, 2235, 2000, 1856, 1738, 1653, 1576, 1559, 1576, 1617, 1698, 1810, 1921, 2246, 2531, 3291, 2843, 2474, 2106, 1864, 1725, 1593, 1511, 1456, 1427, 1456, 1495, 1576, 1685, 1818, 2028, 2355, 2754, 2576, 2235, 1947, 1788, 1593, 1475, 1400, 1340, 1316, 1332, 1382, 1456, 1576, 1718, 1896, 2158, 2591, 2474, 2076, 1833, 1653, 1506, 1369, 1289, 1231, 1221, 1241, 1270, 1365, 1495, 1623, 1795, 2056, 2406, 2317, 2000, 1766, 1565, 1418, 1293, 1207, 1150, 1135, 1150, 1188, 1278, 1400, 1559, 1725, 1964, 2235, 2212, 1947, 1705, 1511, 1369, 1221, 1147, 1090, 1082, 1098, 1138, 1241, 1332, 1470, 1653, 1896, 2168, 2168, 1872, 1660, 1446, 1300, 1178, 1093, 1059, 1041, 1051, 1101, 1188, 1312, 1432, 1623, 1818, 2126, 2158, 1872, 1635, 1432, 1304, 1159, 1085, 1041, 1024, 1056, 1074, 1150, 1263, 1427, 1593, 1833, 2126, 2106, 1864, 1641, 1418, 1281, 1144, 1077, 1043, 1039, 1041, 1074, 1150, 1289, 1418, 1599, 1810, 2066, 2190, 1864, 1623, 1475, 1304, 1178, 1085, 1039, 1034, 1041, 1090, 1166, 1281, 1441, 1617, 1841, 2096, 2190, 1921, 1698, 1506, 1332, 1201, 1112, 1085, 1051, 1074, 1118, 1197, 1328, 1470, 1641, 1864, 2158, 2269, 1973, 1738, 1548, 1396, 1252, 1169, 1121, 1101, 1121, 1178, 1263, 1365, 1537, 1705, 1947, 2269, 2433, 2037, 1788, 1617, 1461, 1340, 1241, 1178, 1169, 1175, 1252, 1340, 1456, 1582, 1795, 2028, 2367, 2531, 2190, 1938, 1718, 1576, 1441, 1340, 1278, 1252, 1281, 1352, 1409, 1543, 1698, 1872, 2106, 2474, 2862, 2393, 2037, 1818, 1653, 1543, 1446, 1387, 1374, 1369, 1470, 1543, 1672, 1818, 2009, 2246, 2686, 3195, 2591, 2201, 1921, 1788, 1679, 1559, 1506, 1506, 1543, 1565, 1660, 1759, 1913, 2137, 2488, 2999, 4089, 2807, 2446, 2168, 1938, 1833, 1705, 1653, 1635, 1641, 1685, 1810, 1921, 2076, 2317, 2737, 4331] + } + }, { + "name": "3264x2448_D65_70", + "resolution": "3264x2448", + "illumination": "D65", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [3080, 2542, 2234, 2086, 1894, 1799, 1690, 1622, 1601, 1622, 1690, 1751, 1894, 2007, 2158, 2439, 2950, 2615, 2350, 2077, 1927, 1754, 1648, 1564, 1512, 1500, 1512, 1564, 1623, 1754, 1881, 2011, 2247, 2615, 2569, 2215, 1998, 1808, 1656, 1553, 1421, 1384, 1346, 1378, 1452, 1518, 1648, 1798, 1962, 2125, 2546, 2436, 2092, 1923, 1719, 1566, 1435, 1310, 1264, 1241, 1278, 1332, 1417, 1552, 1719, 1868, 2051, 2343, 2296, 1992, 1829, 1644, 1477, 1332, 1237, 1177, 1169, 1168, 1241, 1332, 1458, 1620, 1799, 2018, 2263, 2315, 2005, 1760, 1559, 1395, 1255, 1181, 1114, 1078, 1114, 1169, 1269, 1413, 1566, 1724, 1922, 2200, 2276, 1931, 1749, 1535, 1370, 1224, 1118, 1061, 1051, 1071, 1134, 1224, 1399, 1514, 1721, 1896, 2166, 2219, 1901, 1734, 1545, 1350, 1186, 1104, 1058, 1027, 1047, 1119, 1212, 1355, 1496, 1681, 1890, 2129, 2237, 1926, 1726, 1525, 1350, 1212, 1096, 1037, 1024, 1037, 1093, 1207, 1356, 1504, 1699, 1903, 2145, 2284, 1936, 1734, 1545, 1372, 1226, 1130, 1068, 1037, 1058, 1108, 1195, 1384, 1538, 1725, 1890, 2173, 2276, 1966, 1767, 1594, 1417, 1272, 1170, 1104, 1083, 1093, 1170, 1281, 1417, 1557, 1749, 1953, 2181, 2424, 2044, 1809, 1636, 1490, 1347, 1230, 1153, 1146, 1188, 1230, 1336, 1476, 1612, 1840, 1993, 2281, 2424, 2111, 1904, 1741, 1568, 1417, 1321, 1258, 1244, 1268, 1332, 1424, 1561, 1704, 1915, 2069, 2368, 2518, 2225, 2019, 1825, 1669, 1564, 1424, 1386, 1358, 1373, 1461, 1542, 1661, 1794, 1970, 2149, 2476, 2710, 2367, 2118, 1937, 1772, 1671, 1593, 1524, 1491, 1489, 1562, 1654, 1763, 1937, 2076, 2263, 2614, 3026, 2526, 2239, 2049, 1886, 1821, 1683, 1639, 1658, 1655, 1709, 1821, 1854, 2036, 2192, 2444, 2903, 3868, 2782, 2488, 2250, 2149, 1986, 1930, 1862, 1802, 1872, 1886, 1998, 2078, 2203, 2372, 2656, 3868] + }, + "lsc_samples_greenR": { + "uCoeff": [2964, 2421, 2171, 1990, 1880, 1767, 1663, 1608, 1598, 1589, 1671, 1709, 1864, 1932, 2136, 2340, 2757, 2618, 2289, 2067, 1894, 1744, 1624, 1542, 1497, 1468, 1469, 1519, 1601, 1696, 1852, 1987, 2196, 2471, 2407, 2168, 1937, 1784, 1636, 1522, 1424, 1374, 1341, 1350, 1415, 1481, 1609, 1735, 1893, 2085, 2336, 2349, 2062, 1869, 1711, 1552, 1417, 1333, 1274, 1243, 1265, 1333, 1411, 1505, 1653, 1805, 2019, 2235, 2314, 2018, 1819, 1632, 1474, 1345, 1243, 1171, 1166, 1171, 1230, 1327, 1435, 1583, 1749, 1931, 2211, 2228, 1960, 1759, 1573, 1393, 1268, 1166, 1112, 1093, 1103, 1164, 1259, 1382, 1531, 1693, 1921, 2113, 2180, 1936, 1725, 1526, 1351, 1225, 1129, 1068, 1055, 1066, 1112, 1217, 1343, 1484, 1667, 1846, 2090, 2144, 1903, 1703, 1518, 1342, 1198, 1100, 1056, 1024, 1043, 1098, 1190, 1312, 1483, 1650, 1860, 2110, 2219, 1915, 1718, 1517, 1356, 1211, 1104, 1051, 1027, 1038, 1111, 1192, 1312, 1465, 1664, 1867, 2059, 2217, 1952, 1742, 1539, 1369, 1220, 1133, 1078, 1045, 1071, 1113, 1211, 1342, 1506, 1679, 1897, 2103, 2264, 2005, 1770, 1581, 1418, 1268, 1161, 1106, 1087, 1098, 1165, 1268, 1394, 1533, 1708, 1914, 2137, 2324, 2020, 1844, 1632, 1480, 1339, 1236, 1173, 1148, 1178, 1227, 1324, 1452, 1610, 1777, 1978, 2176, 2400, 2108, 1911, 1723, 1561, 1426, 1315, 1257, 1236, 1255, 1322, 1432, 1537, 1684, 1843, 2043, 2314, 2517, 2201, 2009, 1796, 1664, 1540, 1444, 1379, 1350, 1373, 1426, 1530, 1625, 1768, 1939, 2136, 2375, 2664, 2349, 2107, 1932, 1771, 1654, 1555, 1489, 1468, 1493, 1552, 1634, 1748, 1900, 2068, 2258, 2523, 2906, 2525, 2267, 2043, 1905, 1788, 1698, 1644, 1627, 1644, 1685, 1788, 1899, 2025, 2221, 2428, 2786, 3739, 2742, 2452, 2239, 2045, 1955, 1832, 1821, 1748, 1816, 1847, 1900, 2070, 2165, 2344, 2592, 3596] + }, + "lsc_samples_greenB": { + "uCoeff": [2879, 2449, 2162, 2018, 1856, 1746, 1664, 1639, 1618, 1616, 1660, 1741, 1871, 1988, 2162, 2384, 2745, 2607, 2304, 2059, 1912, 1754, 1643, 1567, 1514, 1502, 1501, 1536, 1617, 1723, 1870, 1997, 2217, 2461, 2397, 2174, 1939, 1806, 1668, 1533, 1441, 1385, 1361, 1371, 1426, 1512, 1602, 1750, 1907, 2124, 2379, 2393, 2061, 1877, 1704, 1570, 1449, 1326, 1273, 1253, 1275, 1329, 1413, 1515, 1666, 1827, 2023, 2297, 2280, 1998, 1806, 1637, 1487, 1353, 1264, 1170, 1173, 1170, 1234, 1322, 1440, 1607, 1751, 1951, 2179, 2219, 1952, 1751, 1570, 1405, 1260, 1174, 1118, 1099, 1116, 1165, 1263, 1377, 1532, 1711, 1897, 2159, 2136, 1922, 1709, 1526, 1347, 1228, 1128, 1072, 1045, 1066, 1118, 1223, 1347, 1506, 1663, 1858, 2081, 2142, 1905, 1696, 1499, 1341, 1205, 1106, 1045, 1024, 1046, 1093, 1193, 1316, 1470, 1643, 1838, 2075, 2144, 1891, 1681, 1487, 1331, 1206, 1101, 1051, 1024, 1045, 1093, 1191, 1316, 1468, 1644, 1844, 2057, 2135, 1905, 1722, 1512, 1347, 1219, 1119, 1060, 1040, 1056, 1112, 1212, 1331, 1480, 1656, 1863, 2075, 2200, 1938, 1758, 1560, 1400, 1257, 1156, 1088, 1084, 1093, 1148, 1249, 1371, 1529, 1706, 1900, 2081, 2298, 1975, 1821, 1630, 1443, 1310, 1219, 1148, 1131, 1150, 1202, 1310, 1436, 1595, 1738, 1935, 2196, 2338, 2073, 1876, 1690, 1554, 1389, 1311, 1241, 1221, 1248, 1299, 1397, 1513, 1657, 1811, 2010, 2321, 2487, 2184, 1948, 1788, 1645, 1503, 1408, 1350, 1323, 1343, 1403, 1484, 1618, 1756, 1920, 2127, 2366, 2554, 2313, 2059, 1886, 1740, 1620, 1534, 1493, 1453, 1473, 1534, 1620, 1723, 1865, 2034, 2233, 2543, 2881, 2466, 2197, 2029, 1891, 1740, 1654, 1610, 1600, 1617, 1654, 1753, 1854, 1974, 2161, 2400, 2762, 3699, 2660, 2396, 2156, 2000, 1903, 1801, 1799, 1754, 1779, 1805, 1924, 2000, 2149, 2334, 2571, 3513] + }, + "lsc_samples_blue": { + "uCoeff": [2544, 2229, 1973, 1819, 1723, 1639, 1575, 1512, 1499, 1512, 1543, 1604, 1685, 1755, 1981, 2149, 2611, 2348, 2141, 1898, 1729, 1630, 1528, 1463, 1417, 1392, 1417, 1448, 1513, 1596, 1690, 1835, 2050, 2283, 2186, 1982, 1788, 1681, 1529, 1433, 1371, 1319, 1297, 1311, 1354, 1416, 1513, 1621, 1746, 1921, 2197, 2135, 1875, 1708, 1576, 1460, 1344, 1274, 1221, 1212, 1231, 1256, 1340, 1450, 1550, 1676, 1859, 2083, 2033, 1827, 1663, 1507, 1387, 1278, 1199, 1146, 1132, 1146, 1181, 1263, 1370, 1502, 1627, 1798, 1969, 1965, 1794, 1618, 1465, 1346, 1212, 1143, 1089, 1081, 1097, 1135, 1231, 1311, 1428, 1573, 1752, 1930, 1939, 1739, 1584, 1410, 1284, 1172, 1092, 1059, 1041, 1051, 1099, 1182, 1295, 1397, 1552, 1693, 1905, 1936, 1743, 1565, 1399, 1289, 1155, 1084, 1041, 1024, 1056, 1073, 1146, 1250, 1394, 1528, 1710, 1911, 1896, 1737, 1572, 1387, 1268, 1141, 1076, 1043, 1039, 1041, 1073, 1146, 1275, 1387, 1534, 1691, 1864, 1962, 1736, 1555, 1438, 1289, 1173, 1084, 1039, 1034, 1041, 1089, 1162, 1267, 1407, 1549, 1716, 1886, 1956, 1780, 1618, 1464, 1314, 1195, 1110, 1084, 1051, 1073, 1116, 1191, 1310, 1432, 1567, 1732, 1931, 2010, 1816, 1647, 1498, 1371, 1242, 1165, 1119, 1100, 1119, 1173, 1252, 1342, 1488, 1618, 1794, 2010, 2124, 1858, 1682, 1554, 1426, 1322, 1232, 1173, 1165, 1170, 1242, 1322, 1422, 1523, 1688, 1850, 2072, 2179, 1967, 1797, 1634, 1524, 1410, 1322, 1266, 1242, 1269, 1333, 1381, 1494, 1616, 1741, 1899, 2135, 2400, 2107, 1863, 1707, 1582, 1495, 1414, 1362, 1351, 1346, 1436, 1495, 1599, 1707, 1840, 1991, 2269, 2604, 2232, 1974, 1776, 1685, 1604, 1506, 1463, 1464, 1496, 1511, 1587, 1660, 1770, 1923, 2152, 2461, 3170, 2355, 2138, 1956, 1792, 1720, 1620, 1580, 1566, 1570, 1603, 1701, 1778, 1881, 2037, 2303, 3339] + } + }, { + "name": "3264x2448_D75_100", + "resolution": "3264x2448", + "illumination": "D75", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [4057, 3248, 2635, 2340, 2136, 1951, 1795, 1753, 1763, 1785, 1852, 1964, 2105, 2322, 2521, 2953, 3895, 3321, 2895, 2418, 2167, 1900, 1785, 1654, 1617, 1574, 1626, 1635, 1795, 1888, 2090, 2359, 2708, 3248, 3248, 2500, 2216, 1964, 1785, 1608, 1509, 1456, 1381, 1435, 1509, 1608, 1774, 1951, 2183, 2458, 3110, 2953, 2398, 2075, 1841, 1635, 1525, 1387, 1290, 1279, 1301, 1387, 1479, 1617, 1829, 2075, 2340, 2683, 2839, 2233, 1991, 1712, 1582, 1381, 1262, 1225, 1171, 1205, 1279, 1375, 1525, 1722, 1964, 2216, 2659, 2708, 2216, 1951, 1682, 1501, 1301, 1215, 1131, 1113, 1109, 1200, 1325, 1501, 1692, 1888, 2183, 2500, 2635, 2167, 1876, 1644, 1435, 1251, 1148, 1057, 1053, 1085, 1167, 1290, 1442, 1654, 1829, 2136, 2588, 2566, 2090, 1852, 1574, 1394, 1220, 1101, 1050, 1042, 1046, 1105, 1241, 1387, 1582, 1795, 2105, 2458, 2588, 2075, 1852, 1608, 1375, 1225, 1097, 1046, 1024, 1039, 1089, 1225, 1381, 1541, 1829, 2090, 2521, 2635, 2167, 1864, 1608, 1435, 1257, 1113, 1053, 1057, 1057, 1135, 1246, 1428, 1617, 1864, 2105, 2418, 2839, 2200, 1964, 1692, 1486, 1337, 1200, 1139, 1085, 1153, 1210, 1331, 1456, 1673, 1876, 2200, 2635, 2839, 2359, 2046, 1785, 1557, 1375, 1296, 1205, 1185, 1215, 1279, 1381, 1549, 1732, 1964, 2268, 2683, 3014, 2418, 2090, 1841, 1644, 1449, 1343, 1290, 1296, 1290, 1375, 1494, 1626, 1852, 2061, 2340, 2812, 3077, 2521, 2233, 1938, 1785, 1599, 1509, 1421, 1421, 1435, 1494, 1574, 1795, 1938, 2167, 2500, 3045, 3321, 2759, 2340, 2090, 1938, 1763, 1635, 1565, 1541, 1541, 1654, 1774, 1876, 2075, 2303, 2683, 3143, 3844, 3077, 2635, 2285, 2136, 1964, 1841, 1785, 1732, 1774, 1807, 1925, 2061, 2268, 2588, 2953, 3844, 5211, 3359, 3014, 2611, 2418, 2183, 2090, 2046, 2046, 2075, 2105, 2167, 2303, 2635, 2953, 3399, 5120] + }, + "lsc_samples_greenR": { + "uCoeff": [3711, 3002, 2580, 2209, 2064, 1882, 1738, 1689, 1655, 1734, 1716, 1850, 1977, 2166, 2428, 2923, 3908, 3286, 2741, 2301, 2083, 1892, 1707, 1615, 1550, 1525, 1540, 1588, 1698, 1855, 1983, 2231, 2663, 3270, 2989, 2437, 2124, 1898, 1720, 1561, 1468, 1390, 1367, 1405, 1448, 1558, 1672, 1860, 2064, 2376, 2823, 2823, 2301, 2014, 1810, 1584, 1458, 1353, 1278, 1263, 1273, 1326, 1417, 1565, 1747, 1954, 2209, 2685, 2663, 2231, 1954, 1707, 1518, 1353, 1265, 1184, 1175, 1190, 1235, 1359, 1471, 1635, 1830, 2138, 2560, 2580, 2151, 1898, 1655, 1452, 1293, 1192, 1135, 1125, 1127, 1175, 1280, 1433, 1591, 1815, 2097, 2455, 2455, 2110, 1824, 1584, 1423, 1253, 1141, 1092, 1074, 1092, 1149, 1244, 1376, 1550, 1780, 2045, 2376, 2455, 2090, 1805, 1558, 1367, 1221, 1123, 1060, 1035, 1064, 1103, 1201, 1353, 1518, 1752, 1995, 2359, 2455, 2077, 1785, 1554, 1353, 1207, 1123, 1050, 1024, 1043, 1114, 1219, 1324, 1508, 1698, 1995, 2301, 2642, 2097, 1845, 1561, 1388, 1244, 1145, 1085, 1064, 1081, 1133, 1239, 1359, 1558, 1752, 2014, 2350, 2707, 2187, 1882, 1655, 1452, 1313, 1184, 1135, 1104, 1133, 1194, 1298, 1445, 1615, 1805, 2083, 2419, 2685, 2247, 1977, 1738, 1525, 1373, 1256, 1197, 1159, 1197, 1265, 1345, 1478, 1672, 1903, 2180, 2590, 2859, 2384, 2051, 1815, 1603, 1452, 1337, 1268, 1246, 1278, 1345, 1433, 1584, 1766, 1972, 2239, 2707, 3072, 2560, 2138, 1914, 1707, 1558, 1455, 1376, 1373, 1385, 1455, 1536, 1698, 1866, 2070, 2428, 2884, 3286, 2763, 2342, 2090, 1887, 1729, 1611, 1529, 1511, 1536, 1588, 1689, 1830, 2026, 2262, 2663, 3044, 3711, 3030, 2653, 2262, 2064, 1898, 1752, 1711, 1689, 1720, 1752, 1898, 2020, 2187, 2580, 2897, 3629, 5160, 3422, 2923, 2492, 2301, 2077, 1954, 1926, 1882, 1903, 1972, 2051, 2254, 2419, 2823, 3238, 4752] + }, + "lsc_samples_greenB": { + "uCoeff": [3822, 3058, 2578, 2267, 2035, 1917, 1763, 1739, 1699, 1681, 1748, 1889, 2029, 2163, 2500, 2896, 3652, 3337, 2728, 2331, 2080, 1900, 1748, 1635, 1554, 1547, 1543, 1611, 1712, 1862, 2010, 2275, 2662, 3101, 3002, 2490, 2121, 1900, 1744, 1565, 1471, 1405, 1417, 1414, 1442, 1543, 1708, 1889, 2067, 2417, 2883, 2762, 2267, 2029, 1777, 1603, 1454, 1367, 1289, 1267, 1284, 1333, 1429, 1580, 1721, 1962, 2251, 2662, 2662, 2177, 1917, 1703, 1525, 1367, 1259, 1195, 1172, 1195, 1255, 1361, 1487, 1656, 1841, 2128, 2558, 2568, 2134, 1873, 1635, 1451, 1312, 1200, 1137, 1124, 1149, 1191, 1294, 1429, 1611, 1852, 2080, 2500, 2538, 2074, 1821, 1600, 1414, 1250, 1164, 1105, 1081, 1094, 1149, 1236, 1378, 1532, 1772, 2023, 2348, 2462, 2035, 1777, 1532, 1367, 1202, 1122, 1047, 1034, 1059, 1110, 1204, 1331, 1498, 1730, 1986, 2315, 2408, 1986, 1777, 1532, 1358, 1202, 1114, 1047, 1024, 1054, 1107, 1189, 1331, 1498, 1725, 1957, 2340, 2481, 2080, 1801, 1550, 1378, 1240, 1122, 1076, 1045, 1079, 1126, 1231, 1370, 1543, 1758, 2023, 2382, 2558, 2155, 1878, 1631, 1435, 1279, 1182, 1110, 1107, 1110, 1180, 1294, 1429, 1588, 1821, 2074, 2471, 2662, 2236, 1906, 1681, 1504, 1339, 1231, 1180, 1155, 1178, 1236, 1358, 1474, 1639, 1889, 2134, 2578, 2797, 2275, 1986, 1777, 1584, 1423, 1328, 1247, 1220, 1247, 1317, 1411, 1565, 1730, 1939, 2221, 2672, 2935, 2426, 2080, 1857, 1694, 1540, 1405, 1361, 1347, 1355, 1417, 1532, 1664, 1821, 2054, 2399, 2809, 3254, 2728, 2291, 2023, 1816, 1677, 1588, 1515, 1491, 1518, 1588, 1664, 1816, 1962, 2191, 2609, 3207, 3673, 2988, 2578, 2214, 2017, 1857, 1748, 1694, 1703, 1677, 1767, 1836, 1974, 2170, 2500, 2871, 3612, 5388, 3354, 2822, 2490, 2221, 2042, 1974, 1945, 1873, 1934, 1889, 2054, 2214, 2408, 2797, 3238, 4906] + }, + "lsc_samples_blue": { + "uCoeff": [3326, 2769, 2360, 2056, 1881, 1701, 1641, 1624, 1527, 1568, 1601, 1689, 1920, 1985, 2224, 2673, 3374, 2964, 2541, 2172, 1920, 1759, 1568, 1507, 1437, 1446, 1446, 1488, 1585, 1689, 1881, 2065, 2434, 2837, 2704, 2278, 1985, 1786, 1596, 1464, 1369, 1330, 1282, 1300, 1369, 1437, 1537, 1707, 1912, 2203, 2613, 2473, 2112, 1858, 1647, 1460, 1341, 1254, 1202, 1196, 1228, 1251, 1369, 1437, 1579, 1800, 2029, 2447, 2313, 2020, 1766, 1558, 1415, 1289, 1215, 1154, 1129, 1157, 1199, 1275, 1394, 1522, 1720, 1969, 2267, 2384, 1977, 1707, 1517, 1357, 1247, 1151, 1105, 1092, 1105, 1146, 1228, 1341, 1478, 1695, 1912, 2278, 2256, 1920, 1670, 1469, 1307, 1193, 1126, 1076, 1066, 1084, 1115, 1193, 1322, 1420, 1647, 1904, 2151, 2192, 1904, 1618, 1433, 1282, 1166, 1066, 1047, 1045, 1057, 1094, 1157, 1268, 1390, 1579, 1822, 2112, 2182, 1881, 1612, 1424, 1278, 1148, 1079, 1031, 1024, 1035, 1076, 1146, 1264, 1377, 1585, 1836, 2142, 2224, 1912, 1664, 1437, 1282, 1178, 1092, 1057, 1054, 1054, 1086, 1178, 1275, 1415, 1601, 1873, 2122, 2245, 1969, 1707, 1478, 1334, 1218, 1126, 1094, 1084, 1084, 1113, 1224, 1334, 1478, 1676, 1881, 2192, 2348, 2029, 1773, 1532, 1402, 1251, 1199, 1143, 1126, 1129, 1178, 1254, 1369, 1537, 1707, 1969, 2372, 2447, 2093, 1836, 1612, 1428, 1322, 1231, 1181, 1169, 1178, 1228, 1338, 1433, 1579, 1807, 2029, 2384, 2584, 2224, 1944, 1701, 1483, 1394, 1318, 1258, 1241, 1268, 1334, 1402, 1527, 1652, 1912, 2074, 2555, 2890, 2447, 2093, 1881, 1652, 1537, 1451, 1386, 1386, 1398, 1433, 1532, 1624, 1793, 2020, 2313, 2769, 3279, 2673, 2336, 2003, 1807, 1695, 1574, 1517, 1527, 1517, 1596, 1658, 1807, 1960, 2213, 2598, 3302, 4359, 2803, 2500, 2172, 1985, 1836, 1746, 1664, 1624, 1652, 1676, 1904, 1960, 2103, 2384, 2803, 4400] + } + }, { + "name": "3264x2448_D75_70", + "resolution": "3264x2448", + "illumination": "D75", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [3147, 2685, 2286, 2096, 1959, 1822, 1699, 1669, 1680, 1697, 1749, 1833, 1933, 2081, 2197, 2464, 3034, 2695, 2466, 2149, 1983, 1782, 1698, 1591, 1564, 1526, 1572, 1574, 1707, 1771, 1918, 2102, 2322, 2642, 2689, 2192, 2011, 1832, 1699, 1554, 1472, 1427, 1358, 1407, 1472, 1554, 1689, 1821, 1984, 2159, 2586, 2502, 2135, 1913, 1742, 1577, 1488, 1366, 1277, 1267, 1288, 1366, 1446, 1561, 1731, 1913, 2088, 2295, 2441, 2019, 1856, 1639, 1538, 1360, 1252, 1219, 1167, 1199, 1268, 1355, 1485, 1648, 1833, 2005, 2300, 2357, 2019, 1833, 1620, 1469, 1288, 1209, 1129, 1112, 1107, 1195, 1311, 1469, 1629, 1778, 1991, 2193, 2312, 1987, 1774, 1591, 1411, 1243, 1145, 1057, 1053, 1084, 1164, 1280, 1418, 1600, 1733, 1961, 2275, 2265, 1927, 1757, 1529, 1374, 1214, 1100, 1050, 1042, 1046, 1104, 1234, 1368, 1537, 1707, 1940, 2178, 2285, 1916, 1759, 1562, 1357, 1219, 1096, 1046, 1024, 1039, 1088, 1219, 1363, 1500, 1738, 1929, 2231, 2320, 1993, 1768, 1561, 1413, 1250, 1112, 1053, 1057, 1057, 1133, 1239, 1407, 1569, 1768, 1940, 2145, 2476, 2015, 1852, 1634, 1459, 1326, 1196, 1138, 1085, 1152, 1206, 1320, 1431, 1617, 1774, 2015, 2312, 2461, 2138, 1916, 1713, 1521, 1359, 1288, 1201, 1182, 1211, 1272, 1365, 1514, 1665, 1844, 2062, 2338, 2578, 2172, 1942, 1754, 1595, 1425, 1330, 1281, 1288, 1281, 1360, 1467, 1578, 1764, 1917, 2107, 2420, 2597, 2235, 2047, 1827, 1713, 1557, 1481, 1402, 1403, 1415, 1467, 1534, 1722, 1827, 1991, 2218, 2573, 2744, 2397, 2114, 1941, 1834, 1695, 1588, 1528, 1508, 1506, 1606, 1705, 1779, 1928, 2083, 2337, 2611, 3076, 2606, 2325, 2082, 1986, 1857, 1760, 1716, 1670, 1706, 1729, 1822, 1921, 2067, 2287, 2511, 3076, 3955, 2768, 2583, 2317, 2196, 2022, 1957, 1928, 1931, 1954, 1970, 2008, 2099, 2336, 2535, 2797, 3891] + }, + "lsc_samples_greenR": { + "uCoeff": [2905, 2501, 2243, 1989, 1898, 1763, 1649, 1612, 1584, 1652, 1630, 1735, 1825, 1954, 2124, 2442, 3043, 2670, 2347, 2055, 1912, 1775, 1629, 1556, 1503, 1481, 1493, 1532, 1621, 1743, 1828, 1998, 2287, 2658, 2496, 2142, 1935, 1776, 1641, 1511, 1434, 1365, 1345, 1379, 1415, 1509, 1599, 1743, 1885, 2094, 2371, 2403, 2057, 1862, 1714, 1531, 1426, 1334, 1266, 1252, 1261, 1309, 1388, 1514, 1659, 1811, 1982, 2297, 2304, 2018, 1825, 1634, 1479, 1334, 1255, 1179, 1171, 1185, 1226, 1340, 1436, 1570, 1718, 1941, 2223, 2256, 1964, 1786, 1595, 1423, 1281, 1187, 1133, 1123, 1125, 1171, 1268, 1406, 1537, 1714, 1919, 2157, 2168, 1939, 1729, 1536, 1400, 1245, 1139, 1091, 1074, 1091, 1146, 1236, 1355, 1505, 1690, 1884, 2105, 2175, 1927, 1716, 1515, 1349, 1215, 1122, 1060, 1035, 1064, 1102, 1196, 1336, 1478, 1669, 1847, 2098, 2178, 1918, 1699, 1512, 1336, 1202, 1122, 1050, 1024, 1043, 1113, 1213, 1309, 1470, 1622, 1849, 2053, 2326, 1933, 1751, 1518, 1369, 1237, 1143, 1085, 1064, 1081, 1131, 1232, 1341, 1515, 1669, 1863, 2091, 2370, 2004, 1780, 1601, 1427, 1303, 1181, 1134, 1103, 1132, 1191, 1288, 1420, 1564, 1712, 1916, 2140, 2339, 2045, 1855, 1670, 1491, 1357, 1249, 1194, 1157, 1194, 1258, 1330, 1448, 1611, 1791, 1989, 2264, 2457, 2144, 1908, 1731, 1557, 1427, 1324, 1260, 1240, 1270, 1332, 1409, 1540, 1687, 1840, 2024, 2338, 2594, 2266, 1967, 1806, 1642, 1519, 1430, 1359, 1357, 1368, 1430, 1498, 1634, 1764, 1909, 2160, 2449, 2718, 2400, 2116, 1941, 1789, 1664, 1566, 1495, 1480, 1501, 1545, 1628, 1739, 1886, 2049, 2321, 2537, 2979, 2570, 2339, 2062, 1924, 1798, 1680, 1649, 1631, 1657, 1680, 1798, 1886, 2000, 2280, 2467, 2920, 3919, 2815, 2512, 2220, 2097, 1930, 1838, 1822, 1785, 1801, 1854, 1908, 2058, 2160, 2434, 2677, 3634] + }, + "lsc_samples_greenB": { + "uCoeff": [2983, 2543, 2242, 2037, 1874, 1793, 1671, 1656, 1623, 1605, 1658, 1769, 1869, 1952, 2180, 2422, 2864, 2707, 2337, 2079, 1910, 1782, 1665, 1574, 1506, 1501, 1496, 1553, 1633, 1749, 1851, 2034, 2286, 2535, 2505, 2184, 1933, 1777, 1662, 1515, 1437, 1379, 1392, 1388, 1410, 1495, 1631, 1768, 1888, 2126, 2416, 2356, 2029, 1874, 1685, 1548, 1422, 1347, 1276, 1256, 1271, 1315, 1399, 1527, 1636, 1818, 2016, 2279, 2303, 1973, 1793, 1631, 1485, 1347, 1249, 1189, 1168, 1189, 1245, 1342, 1450, 1589, 1727, 1933, 2222, 2247, 1950, 1765, 1577, 1422, 1299, 1195, 1135, 1122, 1147, 1186, 1282, 1402, 1555, 1746, 1905, 2193, 2235, 1909, 1726, 1550, 1391, 1242, 1161, 1104, 1081, 1093, 1146, 1228, 1357, 1488, 1683, 1866, 2083, 2181, 1881, 1691, 1491, 1349, 1196, 1121, 1047, 1034, 1059, 1109, 1198, 1315, 1460, 1649, 1839, 2063, 2140, 1841, 1692, 1492, 1341, 1197, 1113, 1047, 1024, 1054, 1106, 1184, 1315, 1460, 1646, 1816, 2085, 2196, 1919, 1712, 1507, 1359, 1233, 1121, 1076, 1045, 1079, 1124, 1225, 1352, 1501, 1674, 1871, 2117, 2251, 1977, 1776, 1579, 1411, 1270, 1179, 1109, 1106, 1109, 1177, 1284, 1405, 1539, 1726, 1909, 2181, 2321, 2035, 1793, 1619, 1472, 1325, 1225, 1177, 1153, 1175, 1230, 1343, 1444, 1581, 1779, 1950, 2254, 2408, 2054, 1852, 1697, 1540, 1400, 1315, 1240, 1214, 1240, 1305, 1389, 1522, 1655, 1812, 2009, 2311, 2489, 2158, 1917, 1756, 1631, 1502, 1383, 1345, 1332, 1339, 1394, 1495, 1603, 1724, 1895, 2136, 2392, 2694, 2372, 2073, 1883, 1726, 1617, 1545, 1482, 1461, 1485, 1545, 1605, 1726, 1831, 1991, 2278, 2659, 2952, 2538, 2279, 2022, 1883, 1762, 1676, 1634, 1644, 1618, 1693, 1743, 1846, 1985, 2216, 2447, 2907, 4079, 2764, 2433, 2218, 2030, 1900, 1856, 1839, 1777, 1829, 1781, 1911, 2024, 2151, 2413, 2677, 3741] + }, + "lsc_samples_blue": { + "uCoeff": [2635, 2327, 2071, 1865, 1744, 1607, 1564, 1555, 1470, 1505, 1529, 1596, 1777, 1807, 1964, 2255, 2669, 2436, 2193, 1951, 1776, 1660, 1506, 1459, 1400, 1409, 1408, 1442, 1521, 1599, 1743, 1864, 2111, 2343, 2282, 2016, 1820, 1679, 1531, 1423, 1342, 1309, 1265, 1281, 1342, 1399, 1479, 1611, 1759, 1957, 2214, 2135, 1904, 1730, 1571, 1419, 1318, 1241, 1193, 1188, 1218, 1238, 1344, 1398, 1511, 1681, 1837, 2115, 2030, 1844, 1663, 1501, 1384, 1274, 1207, 1150, 1126, 1153, 1192, 1261, 1365, 1469, 1623, 1802, 1994, 2101, 1819, 1620, 1470, 1335, 1237, 1147, 1103, 1091, 1103, 1142, 1219, 1320, 1435, 1609, 1765, 2017, 2009, 1779, 1593, 1431, 1290, 1187, 1124, 1075, 1066, 1083, 1113, 1187, 1305, 1386, 1573, 1766, 1925, 1964, 1770, 1550, 1400, 1268, 1162, 1065, 1047, 1045, 1057, 1093, 1153, 1255, 1360, 1516, 1700, 1899, 1957, 1752, 1546, 1392, 1265, 1144, 1078, 1031, 1024, 1035, 1075, 1142, 1252, 1349, 1522, 1714, 1925, 1989, 1777, 1591, 1404, 1268, 1173, 1091, 1057, 1054, 1054, 1085, 1173, 1262, 1383, 1535, 1744, 1907, 2000, 1820, 1626, 1439, 1316, 1211, 1124, 1093, 1084, 1083, 1111, 1217, 1316, 1439, 1598, 1746, 1958, 2072, 1863, 1677, 1484, 1377, 1241, 1194, 1141, 1124, 1127, 1173, 1244, 1346, 1488, 1620, 1813, 2091, 2135, 1904, 1723, 1549, 1396, 1305, 1222, 1176, 1165, 1173, 1219, 1320, 1401, 1520, 1698, 1851, 2086, 2220, 1995, 1802, 1619, 1440, 1367, 1301, 1247, 1231, 1256, 1316, 1374, 1479, 1576, 1775, 1873, 2197, 2421, 2150, 1909, 1761, 1581, 1490, 1418, 1361, 1363, 1373, 1402, 1485, 1556, 1685, 1849, 2044, 2331, 2665, 2295, 2083, 1845, 1701, 1618, 1519, 1473, 1483, 1473, 1539, 1586, 1701, 1809, 1984, 2237, 2682, 3359, 2352, 2180, 1959, 1832, 1723, 1656, 1590, 1556, 1579, 1595, 1782, 1811, 1903, 2090, 2352, 3387] + } + }, { + "name": "3264x2448_HZ_100", + "resolution": "3264x2448", + "illumination": "HZ", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [4417, 3517, 2971, 2590, 2357, 2197, 1998, 1901, 1833, 1901, 1965, 2130, 2304, 2553, 2946, 3399, 4283, 3721, 3129, 2720, 2397, 2156, 1943, 1777, 1705, 1661, 1688, 1782, 1901, 2111, 2365, 2639, 3009, 3535, 3535, 2922, 2544, 2217, 1959, 1742, 1597, 1496, 1471, 1508, 1597, 1734, 1922, 2150, 2473, 2773, 3415, 3335, 2730, 2373, 2062, 1809, 1586, 1435, 1337, 1318, 1361, 1435, 1565, 1755, 2009, 2296, 2639, 3199, 3156, 2600, 2231, 1901, 1665, 1462, 1315, 1228, 1201, 1228, 1308, 1459, 1634, 1871, 2183, 2517, 2984, 3088, 2481, 2183, 1814, 1565, 1343, 1226, 1128, 1102, 1125, 1214, 1343, 1538, 1791, 2093, 2447, 2946, 2910, 2439, 2093, 1742, 1489, 1284, 1152, 1075, 1069, 1082, 1160, 1289, 1474, 1717, 2021, 2342, 2817, 2984, 2422, 2044, 1721, 1462, 1254, 1120, 1053, 1024, 1059, 1127, 1248, 1429, 1684, 1987, 2357, 2806, 2922, 2422, 2062, 1721, 1462, 1257, 1120, 1053, 1028, 1047, 1127, 1259, 1438, 1680, 2009, 2365, 2806, 2946, 2422, 2074, 1760, 1489, 1284, 1158, 1082, 1047, 1069, 1136, 1279, 1471, 1713, 1998, 2373, 2829, 3009, 2508, 2124, 1800, 1551, 1348, 1193, 1138, 1113, 1127, 1199, 1332, 1538, 1809, 2111, 2397, 2922, 3074, 2581, 2238, 1927, 1653, 1450, 1298, 1201, 1177, 1214, 1296, 1421, 1623, 1881, 2183, 2581, 3061, 3335, 2752, 2406, 2044, 1777, 1569, 1421, 1325, 1305, 1348, 1407, 1531, 1738, 2009, 2326, 2639, 3199, 3625, 2922, 2517, 2203, 1970, 1738, 1572, 1462, 1456, 1474, 1565, 1713, 1943, 2170, 2481, 2829, 3319, 3884, 3129, 2709, 2422, 2143, 1943, 1791, 1668, 1661, 1668, 1768, 1891, 2093, 2342, 2669, 3009, 3644, 4258, 3449, 2971, 2639, 2373, 2176, 1987, 1927, 1881, 1907, 1993, 2130, 2326, 2553, 2898, 3304, 4086, 5936, 3884, 3415, 3009, 2679, 2447, 2304, 2267, 2197, 2197, 2326, 2447, 2669, 2875, 3243, 3644, 5477] + }, + "lsc_samples_greenR": { + "uCoeff": [3773, 3054, 2584, 2368, 2081, 1922, 1814, 1746, 1708, 1768, 1809, 1876, 2033, 2191, 2441, 2915, 3713, 3328, 2724, 2392, 2119, 1902, 1746, 1656, 1578, 1561, 1582, 1614, 1712, 1892, 2027, 2254, 2623, 3122, 3002, 2529, 2205, 1971, 1768, 1607, 1495, 1425, 1389, 1417, 1482, 1582, 1733, 1912, 2125, 2400, 2952, 2903, 2368, 2081, 1814, 1648, 1482, 1367, 1297, 1283, 1295, 1354, 1458, 1593, 1768, 1993, 2283, 2703, 2683, 2240, 1971, 1717, 1534, 1378, 1267, 1184, 1178, 1180, 1251, 1381, 1498, 1668, 1902, 2171, 2584, 2633, 2178, 1902, 1629, 1443, 1283, 1184, 1129, 1092, 1118, 1174, 1262, 1434, 1600, 1837, 2094, 2476, 2511, 2119, 1833, 1607, 1392, 1247, 1122, 1067, 1045, 1061, 1125, 1225, 1381, 1547, 1786, 2039, 2424, 2511, 2106, 1837, 1554, 1362, 1223, 1108, 1047, 1024, 1045, 1102, 1198, 1339, 1534, 1768, 2039, 2400, 2476, 2106, 1814, 1571, 1378, 1210, 1101, 1045, 1024, 1039, 1109, 1196, 1354, 1547, 1773, 2033, 2392, 2556, 2112, 1828, 1582, 1383, 1247, 1134, 1079, 1041, 1067, 1131, 1236, 1381, 1554, 1804, 2081, 2424, 2623, 2164, 1902, 1660, 1434, 1292, 1184, 1111, 1106, 1115, 1159, 1274, 1431, 1600, 1866, 2081, 2476, 2745, 2298, 2010, 1751, 1527, 1383, 1247, 1184, 1159, 1184, 1255, 1378, 1521, 1668, 1933, 2205, 2556, 2892, 2400, 2112, 1837, 1641, 1485, 1354, 1285, 1264, 1280, 1349, 1473, 1614, 1795, 2016, 2352, 2724, 3108, 2575, 2212, 1965, 1768, 1614, 1504, 1440, 1397, 1403, 1485, 1600, 1738, 1960, 2144, 2502, 2940, 3312, 2800, 2416, 2119, 1954, 1773, 1645, 1585, 1568, 1582, 1656, 1733, 1902, 2081, 2352, 2714, 3122, 3753, 3028, 2683, 2336, 2119, 1982, 1823, 1755, 1751, 1764, 1833, 1960, 2094, 2283, 2594, 2915, 3694, 4832, 3408, 3002, 2652, 2384, 2191, 2069, 2004, 1954, 1982, 2045, 2144, 2321, 2584, 2811, 3266, 5113] + }, + "lsc_samples_greenB": { + "uCoeff": [3789, 3068, 2586, 2339, 2090, 1974, 1836, 1716, 1720, 1758, 1831, 1963, 2103, 2278, 2605, 2965, 3769, 3327, 2823, 2452, 2174, 1941, 1758, 1656, 1578, 1568, 1578, 1633, 1745, 1920, 2103, 2346, 2736, 3281, 3136, 2586, 2293, 2013, 1799, 1622, 1504, 1423, 1403, 1432, 1489, 1585, 1776, 1952, 2160, 2522, 2990, 2928, 2452, 2154, 1895, 1637, 1501, 1389, 1317, 1288, 1310, 1373, 1486, 1648, 1831, 2066, 2402, 2834, 2779, 2362, 2042, 1763, 1557, 1409, 1281, 1209, 1177, 1213, 1272, 1387, 1527, 1737, 1990, 2264, 2694, 2715, 2271, 1968, 1691, 1473, 1317, 1197, 1137, 1112, 1143, 1201, 1303, 1464, 1633, 1885, 2180, 2549, 2625, 2221, 1905, 1648, 1426, 1265, 1147, 1079, 1056, 1070, 1143, 1252, 1423, 1600, 1817, 2115, 2605, 2605, 2180, 1895, 1614, 1395, 1228, 1128, 1051, 1034, 1061, 1119, 1230, 1387, 1578, 1803, 2078, 2452, 2596, 2180, 1900, 1589, 1400, 1230, 1112, 1050, 1024, 1045, 1121, 1220, 1373, 1568, 1812, 2115, 2452, 2674, 2221, 1905, 1622, 1432, 1259, 1134, 1072, 1048, 1069, 1121, 1239, 1395, 1592, 1831, 2122, 2452, 2674, 2264, 1947, 1675, 1464, 1307, 1169, 1107, 1090, 1111, 1169, 1288, 1440, 1637, 1855, 2174, 2540, 2801, 2331, 2042, 1737, 1534, 1379, 1241, 1167, 1154, 1167, 1241, 1352, 1504, 1707, 1963, 2250, 2715, 2904, 2469, 2128, 1855, 1640, 1470, 1355, 1268, 1237, 1265, 1334, 1458, 1607, 1831, 2048, 2394, 2801, 3136, 2596, 2221, 1968, 1754, 1589, 1470, 1389, 1373, 1389, 1440, 1589, 1716, 1947, 2201, 2478, 2916, 3407, 2812, 2444, 2122, 1910, 1741, 1603, 1534, 1514, 1534, 1607, 1720, 1880, 2066, 2331, 2664, 3149, 3729, 3068, 2634, 2293, 2072, 1920, 1776, 1687, 1671, 1683, 1763, 1895, 2019, 2242, 2558, 2916, 3634, 5098, 3457, 2965, 2634, 2362, 2115, 1979, 1968, 1920, 1974, 1996, 2122, 2278, 2549, 2823, 3342, 4821] + }, + "lsc_samples_blue": { + "uCoeff": [3491, 2854, 2439, 2091, 1920, 1816, 1736, 1723, 1639, 1686, 1723, 1845, 1985, 2002, 2365, 2722, 3598, 3000, 2545, 2252, 1985, 1816, 1698, 1552, 1542, 1512, 1532, 1583, 1686, 1802, 2002, 2169, 2545, 3039, 2854, 2365, 2073, 1874, 1650, 1542, 1456, 1412, 1395, 1387, 1465, 1552, 1698, 1845, 2055, 2342, 2786, 2660, 2230, 1968, 1723, 1573, 1429, 1339, 1281, 1288, 1310, 1363, 1456, 1605, 1723, 1920, 2274, 2660, 2464, 2129, 1874, 1639, 1474, 1355, 1254, 1196, 1178, 1202, 1267, 1387, 1474, 1605, 1860, 2129, 2464, 2319, 2002, 1789, 1583, 1387, 1288, 1184, 1133, 1111, 1149, 1196, 1295, 1395, 1583, 1775, 2055, 2365, 2319, 1968, 1723, 1532, 1339, 1221, 1111, 1086, 1056, 1101, 1149, 1234, 1363, 1542, 1736, 1985, 2274, 2210, 1968, 1736, 1502, 1317, 1184, 1111, 1056, 1042, 1061, 1106, 1227, 1355, 1502, 1674, 1920, 2230, 2210, 1936, 1698, 1493, 1317, 1184, 1101, 1042, 1024, 1056, 1106, 1221, 1347, 1532, 1674, 1985, 2252, 2319, 1936, 1723, 1493, 1339, 1184, 1106, 1061, 1033, 1081, 1111, 1209, 1339, 1512, 1698, 1985, 2230, 2252, 1936, 1749, 1552, 1355, 1247, 1149, 1076, 1066, 1076, 1149, 1227, 1395, 1532, 1698, 1920, 2252, 2365, 2055, 1802, 1627, 1421, 1281, 1184, 1144, 1127, 1155, 1202, 1267, 1395, 1583, 1802, 2019, 2365, 2545, 2129, 1920, 1686, 1512, 1387, 1288, 1227, 1202, 1221, 1281, 1379, 1502, 1650, 1874, 2091, 2545, 2820, 2274, 2002, 1775, 1594, 1474, 1379, 1310, 1317, 1324, 1387, 1465, 1605, 1749, 1985, 2252, 2660, 2925, 2439, 2129, 1874, 1723, 1605, 1542, 1447, 1421, 1456, 1474, 1594, 1698, 1920, 2073, 2439, 2854, 3295, 2690, 2274, 2002, 1860, 1749, 1639, 1583, 1583, 1583, 1605, 1736, 1845, 2002, 2210, 2660, 3342, 4327, 3039, 2572, 2210, 1985, 1816, 1789, 1749, 1686, 1749, 1749, 1874, 2055, 2129, 2464, 2925, 4409] + } + }, { + "name": "3264x2448_HZ_70", + "resolution": "3264x2448", + "illumination": "HZ", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [3399, 2886, 2549, 2300, 2144, 2034, 1877, 1800, 1742, 1800, 1848, 1976, 2100, 2270, 2530, 2797, 3305, 2987, 2646, 2393, 2176, 2003, 1838, 1702, 1644, 1606, 1628, 1707, 1801, 1964, 2149, 2328, 2554, 2851, 2904, 2526, 2283, 2050, 1853, 1676, 1553, 1464, 1442, 1475, 1553, 1669, 1820, 1992, 2224, 2408, 2815, 2795, 2404, 2165, 1936, 1735, 1545, 1411, 1322, 1305, 1345, 1411, 1525, 1686, 1889, 2100, 2330, 2691, 2688, 2321, 2063, 1808, 1614, 1437, 1303, 1221, 1196, 1221, 1296, 1434, 1586, 1781, 2022, 2253, 2554, 2658, 2240, 2035, 1739, 1529, 1329, 1220, 1126, 1101, 1123, 1208, 1329, 1504, 1718, 1957, 2211, 2546, 2532, 2216, 1966, 1680, 1462, 1275, 1149, 1074, 1069, 1081, 1157, 1279, 1448, 1657, 1902, 2135, 2458, 2601, 2209, 1927, 1665, 1439, 1247, 1119, 1053, 1024, 1059, 1125, 1241, 1408, 1631, 1877, 2154, 2458, 2554, 2211, 1945, 1666, 1440, 1250, 1119, 1053, 1028, 1047, 1126, 1252, 1417, 1628, 1898, 2163, 2460, 2570, 2209, 1954, 1700, 1464, 1276, 1156, 1082, 1047, 1069, 1134, 1271, 1447, 1657, 1887, 2167, 2476, 2611, 2274, 1993, 1733, 1520, 1336, 1190, 1137, 1112, 1126, 1195, 1321, 1508, 1741, 1981, 2181, 2542, 2647, 2323, 2083, 1842, 1611, 1431, 1290, 1198, 1174, 1210, 1288, 1403, 1583, 1800, 2035, 2323, 2637, 2828, 2446, 2214, 1935, 1717, 1538, 1404, 1315, 1297, 1338, 1391, 1502, 1681, 1904, 2145, 2353, 2722, 3017, 2559, 2287, 2060, 1880, 1686, 1540, 1441, 1436, 1452, 1534, 1663, 1856, 2031, 2257, 2484, 2783, 3166, 2690, 2420, 2226, 2016, 1858, 1732, 1624, 1620, 1624, 1711, 1811, 1972, 2158, 2386, 2595, 2986, 3377, 2893, 2596, 2379, 2191, 2044, 1891, 1846, 1806, 1827, 1897, 2004, 2150, 2307, 2537, 2781, 3252, 4462, 3160, 2897, 2641, 2415, 2249, 2145, 2123, 2065, 2061, 2164, 2249, 2407, 2532, 2763, 2980, 4141] + }, + "lsc_samples_greenR": { + "uCoeff": [2948, 2540, 2246, 2119, 1912, 1797, 1716, 1663, 1631, 1682, 1711, 1757, 1872, 1975, 2134, 2436, 2906, 2701, 2334, 2128, 1943, 1784, 1664, 1593, 1528, 1514, 1532, 1555, 1633, 1775, 1865, 2017, 2256, 2551, 2505, 2215, 2002, 1839, 1684, 1553, 1459, 1398, 1365, 1390, 1447, 1531, 1653, 1788, 1936, 2113, 2468, 2464, 2111, 1918, 1718, 1589, 1448, 1347, 1284, 1271, 1282, 1335, 1426, 1539, 1677, 1844, 2042, 2311, 2319, 2025, 1839, 1643, 1494, 1358, 1257, 1179, 1174, 1175, 1241, 1360, 1460, 1599, 1780, 1968, 2242, 2298, 1987, 1790, 1572, 1415, 1271, 1179, 1127, 1091, 1116, 1170, 1251, 1406, 1545, 1733, 1917, 2174, 2213, 1947, 1737, 1557, 1371, 1239, 1120, 1067, 1045, 1061, 1123, 1218, 1360, 1502, 1695, 1879, 2144, 2220, 1941, 1744, 1511, 1344, 1217, 1107, 1047, 1024, 1045, 1101, 1193, 1322, 1493, 1683, 1884, 2131, 2194, 1943, 1725, 1528, 1360, 1205, 1100, 1045, 1024, 1039, 1108, 1191, 1337, 1506, 1689, 1881, 2127, 2257, 1946, 1736, 1537, 1364, 1240, 1132, 1079, 1041, 1067, 1129, 1229, 1362, 1511, 1715, 1920, 2150, 2303, 1985, 1797, 1605, 1410, 1282, 1181, 1110, 1105, 1114, 1156, 1265, 1407, 1550, 1766, 1915, 2185, 2387, 2087, 1884, 1682, 1493, 1367, 1240, 1181, 1157, 1181, 1248, 1362, 1488, 1607, 1817, 2010, 2237, 2482, 2157, 1961, 1750, 1592, 1458, 1340, 1277, 1257, 1272, 1335, 1447, 1567, 1713, 1878, 2117, 2351, 2621, 2278, 2029, 1851, 1698, 1571, 1476, 1420, 1380, 1385, 1458, 1558, 1670, 1846, 1972, 2219, 2492, 2737, 2429, 2177, 1966, 1849, 1704, 1597, 1547, 1533, 1544, 1607, 1668, 1803, 1933, 2124, 2361, 2595, 3010, 2568, 2363, 2125, 1971, 1873, 1744, 1689, 1688, 1697, 1753, 1853, 1950, 2080, 2292, 2481, 2967, 3690, 2804, 2574, 2350, 2167, 2029, 1939, 1891, 1849, 1871, 1918, 1988, 2114, 2295, 2424, 2698, 3886] + }, + "lsc_samples_greenB": { + "uCoeff": [2960, 2550, 2248, 2095, 1920, 1842, 1735, 1636, 1642, 1673, 1731, 1832, 1931, 2046, 2263, 2473, 2946, 2700, 2410, 2177, 1989, 1817, 1674, 1593, 1528, 1521, 1528, 1573, 1663, 1799, 1929, 2091, 2343, 2666, 2606, 2260, 2075, 1875, 1711, 1567, 1467, 1396, 1379, 1404, 1453, 1533, 1691, 1822, 1965, 2209, 2496, 2483, 2179, 1980, 1789, 1579, 1466, 1368, 1303, 1276, 1296, 1353, 1452, 1589, 1733, 1906, 2138, 2411, 2394, 2125, 1900, 1684, 1515, 1387, 1270, 1203, 1173, 1207, 1262, 1366, 1487, 1661, 1856, 2045, 2328, 2363, 2065, 1848, 1628, 1443, 1304, 1192, 1135, 1111, 1141, 1196, 1290, 1434, 1575, 1775, 1989, 2231, 2304, 2033, 1800, 1594, 1403, 1256, 1145, 1078, 1056, 1070, 1141, 1244, 1400, 1550, 1722, 1943, 2288, 2296, 2004, 1796, 1566, 1375, 1222, 1126, 1051, 1034, 1061, 1118, 1224, 1368, 1533, 1714, 1917, 2173, 2291, 2006, 1801, 1544, 1381, 1224, 1111, 1050, 1024, 1045, 1120, 1214, 1355, 1525, 1723, 1950, 2175, 2351, 2038, 1804, 1574, 1410, 1252, 1132, 1072, 1048, 1069, 1120, 1232, 1375, 1546, 1739, 1955, 2173, 2344, 2069, 1837, 1619, 1438, 1297, 1166, 1106, 1090, 1110, 1166, 1278, 1416, 1584, 1756, 1993, 2236, 2431, 2115, 1912, 1669, 1500, 1363, 1235, 1164, 1152, 1164, 1235, 1337, 1472, 1642, 1843, 2047, 2363, 2492, 2214, 1974, 1766, 1591, 1444, 1341, 1260, 1231, 1257, 1321, 1433, 1561, 1745, 1905, 2152, 2411, 2643, 2295, 2037, 1853, 1685, 1548, 1444, 1371, 1357, 1371, 1416, 1548, 1650, 1835, 2020, 2200, 2474, 2809, 2439, 2200, 1968, 1810, 1675, 1558, 1499, 1482, 1499, 1562, 1656, 1783, 1920, 2106, 2322, 2615, 2992, 2599, 2324, 2088, 1931, 1818, 1701, 1627, 1615, 1624, 1690, 1796, 1885, 2046, 2262, 2482, 2923, 3876, 2841, 2545, 2336, 2149, 1963, 1860, 1859, 1819, 1864, 1875, 1969, 2078, 2266, 2434, 2755, 3682] + }, + "lsc_samples_blue": { + "uCoeff": [2751, 2390, 2133, 1893, 1777, 1706, 1647, 1642, 1570, 1610, 1636, 1731, 1832, 1821, 2075, 2292, 2826, 2462, 2196, 2015, 1830, 1709, 1621, 1500, 1495, 1470, 1486, 1528, 1610, 1697, 1844, 1948, 2196, 2490, 2394, 2085, 1893, 1755, 1579, 1494, 1423, 1386, 1371, 1362, 1431, 1503, 1622, 1730, 1878, 2067, 2343, 2278, 1999, 1823, 1638, 1521, 1399, 1321, 1269, 1276, 1296, 1343, 1424, 1550, 1638, 1782, 2035, 2278, 2148, 1934, 1756, 1573, 1438, 1336, 1244, 1190, 1174, 1196, 1257, 1366, 1438, 1543, 1744, 1934, 2148, 2049, 1840, 1691, 1530, 1363, 1276, 1179, 1131, 1110, 1147, 1191, 1283, 1370, 1530, 1679, 1884, 2086, 2060, 1819, 1640, 1488, 1321, 1214, 1109, 1085, 1056, 1100, 1146, 1226, 1343, 1497, 1651, 1834, 2024, 1978, 1824, 1655, 1463, 1301, 1179, 1110, 1056, 1042, 1061, 1105, 1221, 1337, 1463, 1600, 1783, 1994, 1980, 1798, 1622, 1456, 1302, 1179, 1100, 1042, 1024, 1056, 1105, 1215, 1330, 1492, 1601, 1840, 2014, 2066, 1797, 1643, 1455, 1322, 1179, 1105, 1061, 1033, 1081, 1110, 1203, 1322, 1472, 1621, 1838, 1994, 2006, 1792, 1663, 1507, 1336, 1239, 1146, 1075, 1066, 1075, 1146, 1220, 1373, 1488, 1618, 1779, 2006, 2086, 1884, 1703, 1570, 1394, 1269, 1179, 1142, 1125, 1152, 1197, 1256, 1370, 1530, 1703, 1854, 2086, 2211, 1934, 1795, 1615, 1473, 1366, 1277, 1220, 1197, 1215, 1270, 1359, 1464, 1583, 1756, 1902, 2211, 2400, 2035, 1851, 1684, 1540, 1441, 1358, 1296, 1304, 1309, 1366, 1433, 1550, 1661, 1837, 2017, 2278, 2448, 2144, 1939, 1755, 1644, 1551, 1502, 1418, 1395, 1427, 1439, 1541, 1622, 1795, 1893, 2144, 2394, 2677, 2308, 2033, 1844, 1747, 1666, 1578, 1533, 1534, 1533, 1547, 1655, 1734, 1844, 1982, 2285, 2711, 3336, 2529, 2237, 1990, 1832, 1706, 1694, 1665, 1611, 1665, 1659, 1756, 1891, 1924, 2152, 2444, 3394] + } + }, { + "name": "3264x2448_TL84_100", + "resolution": "3264x2448", + "illumination": "TL84", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [3642, 2815, 2401, 2160, 1963, 1865, 1745, 1660, 1608, 1702, 1753, 1848, 1935, 2160, 2346, 2739, 3517, 3188, 2567, 2231, 2011, 1815, 1695, 1589, 1553, 1502, 1536, 1602, 1681, 1807, 1973, 2160, 2535, 3023, 2957, 2459, 2105, 1873, 1702, 1565, 1464, 1389, 1357, 1399, 1459, 1559, 1702, 1865, 2052, 2346, 2796, 2668, 2231, 1963, 1760, 1602, 1459, 1339, 1293, 1249, 1281, 1348, 1454, 1589, 1776, 1963, 2207, 2616, 2600, 2127, 1908, 1681, 1502, 1366, 1234, 1181, 1154, 1181, 1249, 1339, 1496, 1653, 1831, 2073, 2504, 2504, 2105, 1831, 1608, 1433, 1293, 1191, 1110, 1092, 1098, 1167, 1277, 1454, 1589, 1783, 2031, 2444, 2430, 2002, 1783, 1565, 1385, 1249, 1125, 1070, 1058, 1067, 1138, 1209, 1385, 1536, 1730, 1963, 2333, 2401, 2002, 1745, 1541, 1366, 1209, 1101, 1050, 1029, 1048, 1098, 1191, 1353, 1524, 1730, 1963, 2243, 2430, 2002, 1753, 1541, 1357, 1209, 1101, 1050, 1024, 1024, 1092, 1198, 1339, 1496, 1709, 1973, 2294, 2430, 2042, 1783, 1577, 1385, 1257, 1135, 1072, 1053, 1053, 1101, 1234, 1357, 1541, 1745, 2002, 2373, 2444, 2052, 1831, 1602, 1409, 1293, 1198, 1122, 1084, 1113, 1161, 1265, 1438, 1608, 1791, 2031, 2401, 2685, 2149, 1908, 1702, 1513, 1371, 1245, 1167, 1138, 1171, 1219, 1339, 1464, 1647, 1882, 2116, 2567, 2739, 2243, 2002, 1776, 1589, 1464, 1353, 1273, 1249, 1265, 1326, 1409, 1565, 1776, 1945, 2207, 2633, 2854, 2444, 2105, 1908, 1723, 1565, 1454, 1389, 1357, 1389, 1454, 1553, 1674, 1882, 2073, 2333, 2854, 3213, 2567, 2256, 2011, 1848, 1681, 1608, 1541, 1518, 1518, 1589, 1660, 1815, 1963, 2207, 2600, 2979, 3547, 2874, 2459, 2207, 2031, 1873, 1730, 1702, 1660, 1674, 1753, 1848, 1963, 2127, 2387, 2685, 3547, 4633, 3238, 2758, 2444, 2256, 2083, 1982, 1882, 1873, 1882, 1973, 2002, 2243, 2430, 2739, 3091, 4740] + }, + "lsc_samples_greenR": { + "uCoeff": [3620, 2844, 2491, 2216, 1966, 1835, 1739, 1699, 1636, 1716, 1721, 1815, 1920, 2110, 2418, 2693, 3506, 3140, 2608, 2269, 2020, 1825, 1699, 1581, 1544, 1516, 1527, 1581, 1652, 1781, 1943, 2172, 2500, 2932, 2945, 2436, 2117, 1893, 1699, 1566, 1459, 1401, 1369, 1404, 1437, 1534, 1656, 1815, 2039, 2325, 2726, 2682, 2254, 1996, 1781, 1593, 1459, 1358, 1291, 1245, 1289, 1338, 1416, 1541, 1708, 1898, 2187, 2578, 2538, 2151, 1882, 1686, 1496, 1369, 1250, 1181, 1162, 1177, 1238, 1330, 1447, 1616, 1820, 2070, 2454, 2519, 2110, 1815, 1612, 1431, 1291, 1177, 1117, 1104, 1110, 1175, 1281, 1410, 1559, 1786, 2002, 2341, 2427, 2045, 1786, 1559, 1383, 1236, 1131, 1060, 1058, 1072, 1129, 1220, 1366, 1530, 1730, 1960, 2223, 2392, 2039, 1767, 1548, 1358, 1216, 1104, 1058, 1024, 1053, 1106, 1196, 1336, 1496, 1699, 1932, 2269, 2392, 2026, 1781, 1534, 1372, 1216, 1099, 1048, 1029, 1048, 1102, 1200, 1336, 1506, 1716, 1932, 2341, 2436, 2051, 1791, 1566, 1398, 1245, 1133, 1072, 1053, 1067, 1119, 1231, 1352, 1534, 1757, 1966, 2308, 2472, 2117, 1877, 1669, 1443, 1302, 1183, 1106, 1091, 1106, 1158, 1274, 1401, 1570, 1771, 2045, 2400, 2578, 2194, 1904, 1699, 1506, 1358, 1241, 1185, 1168, 1168, 1250, 1347, 1459, 1644, 1856, 2117, 2519, 2796, 2308, 2008, 1791, 1596, 1459, 1352, 1284, 1255, 1289, 1341, 1447, 1585, 1739, 1937, 2231, 2578, 2893, 2472, 2144, 1898, 1748, 1574, 1459, 1392, 1360, 1392, 1443, 1548, 1703, 1845, 2077, 2366, 2726, 3201, 2682, 2285, 2064, 1856, 1708, 1608, 1534, 1516, 1544, 1581, 1682, 1800, 2039, 2246, 2538, 2984, 3581, 2971, 2519, 2231, 2045, 1877, 1757, 1690, 1686, 1708, 1771, 1882, 2020, 2172, 2427, 2807, 3506, 4633, 3216, 2844, 2436, 2254, 2097, 1943, 1882, 1856, 1877, 1882, 2039, 2201, 2418, 2682, 3096, 4666] + }, + "lsc_samples_greenB": { + "uCoeff": [3604, 2880, 2479, 2235, 1986, 1868, 1740, 1691, 1682, 1695, 1745, 1812, 1992, 2134, 2416, 2759, 3604, 3140, 2681, 2274, 2061, 1863, 1722, 1616, 1541, 1523, 1527, 1578, 1674, 1817, 2011, 2213, 2527, 3011, 2867, 2442, 2162, 1911, 1731, 1585, 1472, 1403, 1385, 1385, 1453, 1559, 1695, 1868, 2087, 2381, 2867, 2714, 2314, 2017, 1792, 1593, 1462, 1371, 1283, 1268, 1293, 1343, 1449, 1574, 1749, 1951, 2220, 2617, 2566, 2176, 1934, 1700, 1502, 1374, 1256, 1186, 1169, 1180, 1235, 1354, 1485, 1649, 1852, 2114, 2517, 2517, 2127, 1868, 1608, 1446, 1283, 1184, 1112, 1094, 1114, 1178, 1266, 1418, 1601, 1782, 2067, 2364, 2451, 2061, 1797, 1585, 1383, 1235, 1139, 1067, 1043, 1078, 1120, 1240, 1371, 1534, 1745, 1992, 2347, 2389, 2061, 1792, 1541, 1351, 1210, 1110, 1034, 1035, 1052, 1097, 1190, 1346, 1523, 1713, 1969, 2364, 2364, 2061, 1759, 1559, 1351, 1206, 1101, 1043, 1024, 1043, 1099, 1184, 1346, 1499, 1726, 1992, 2290, 2461, 2061, 1817, 1566, 1385, 1235, 1125, 1072, 1043, 1052, 1110, 1217, 1354, 1527, 1726, 1945, 2314, 2488, 2127, 1832, 1605, 1430, 1259, 1155, 1086, 1074, 1086, 1157, 1266, 1403, 1589, 1792, 2035, 2364, 2586, 2184, 1911, 1695, 1482, 1340, 1223, 1163, 1155, 1163, 1219, 1335, 1475, 1620, 1827, 2114, 2507, 2783, 2274, 2035, 1759, 1585, 1430, 1306, 1259, 1226, 1249, 1324, 1424, 1574, 1726, 1945, 2258, 2596, 2867, 2461, 2127, 1873, 1682, 1537, 1437, 1346, 1332, 1377, 1424, 1513, 1678, 1863, 2100, 2322, 2703, 3186, 2627, 2290, 2035, 1812, 1674, 1552, 1495, 1462, 1502, 1563, 1649, 1797, 1986, 2184, 2527, 3011, 3508, 2892, 2461, 2176, 1969, 1817, 1731, 1661, 1645, 1653, 1700, 1827, 1928, 2127, 2416, 2714, 3399, 4813, 3140, 2748, 2442, 2213, 1998, 1884, 1873, 1832, 1827, 1906, 2017, 2155, 2416, 2596, 3111, 4779] + }, + "lsc_samples_blue": { + "uCoeff": [3252, 2701, 2238, 2018, 1758, 1647, 1575, 1575, 1566, 1549, 1637, 1619, 1758, 2003, 2255, 2490, 3045, 2727, 2387, 2091, 1837, 1706, 1566, 1485, 1455, 1412, 1455, 1477, 1575, 1647, 1791, 1976, 2273, 2701, 2627, 2186, 1873, 1716, 1575, 1477, 1365, 1339, 1315, 1333, 1385, 1440, 1524, 1647, 1848, 2122, 2469, 2448, 2061, 1780, 1610, 1493, 1333, 1291, 1246, 1210, 1236, 1274, 1352, 1433, 1610, 1780, 2003, 2367, 2238, 1923, 1706, 1541, 1391, 1321, 1210, 1175, 1142, 1175, 1215, 1291, 1391, 1516, 1706, 1923, 2255, 2186, 1873, 1666, 1485, 1352, 1230, 1161, 1090, 1098, 1098, 1138, 1230, 1333, 1477, 1619, 1848, 2186, 2186, 1837, 1637, 1433, 1285, 1215, 1111, 1078, 1062, 1066, 1138, 1161, 1291, 1405, 1583, 1825, 2138, 2122, 1825, 1575, 1426, 1291, 1161, 1082, 1062, 1024, 1062, 1090, 1165, 1274, 1412, 1575, 1802, 2076, 2138, 1802, 1583, 1426, 1285, 1156, 1098, 1035, 1028, 1054, 1078, 1161, 1285, 1405, 1601, 1802, 2061, 2122, 1802, 1637, 1412, 1291, 1190, 1107, 1062, 1046, 1046, 1111, 1180, 1268, 1405, 1610, 1837, 2061, 2122, 1837, 1637, 1485, 1339, 1199, 1124, 1066, 1078, 1062, 1111, 1210, 1333, 1440, 1619, 1825, 2203, 2273, 1936, 1676, 1516, 1385, 1246, 1190, 1111, 1111, 1124, 1175, 1252, 1358, 1508, 1676, 1885, 2238, 2273, 2018, 1780, 1566, 1426, 1309, 1230, 1180, 1180, 1190, 1252, 1339, 1433, 1549, 1726, 1936, 2255, 2490, 2122, 1837, 1666, 1508, 1405, 1333, 1274, 1246, 1297, 1321, 1412, 1508, 1666, 1837, 2076, 2406, 2627, 2255, 1962, 1780, 1619, 1516, 1426, 1391, 1365, 1385, 1412, 1508, 1601, 1758, 1923, 2255, 2603, 3045, 2534, 2186, 1910, 1758, 1647, 1524, 1508, 1493, 1485, 1541, 1610, 1716, 1885, 2122, 2367, 3145, 4144, 2701, 2367, 2091, 1837, 1716, 1686, 1575, 1619, 1619, 1666, 1758, 1848, 2018, 2238, 2651, 3972] + } + }, { + "name": "3264x2448_TL84_70", + "resolution": "3264x2448", + "illumination": "TL84", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [2857, 2361, 2103, 1949, 1813, 1748, 1655, 1587, 1542, 1624, 1662, 1733, 1790, 1949, 2060, 2305, 2769, 2599, 2213, 1998, 1852, 1708, 1618, 1533, 1505, 1460, 1490, 1545, 1606, 1701, 1820, 1941, 2188, 2479, 2472, 2159, 1919, 1754, 1625, 1515, 1430, 1364, 1335, 1374, 1426, 1510, 1625, 1747, 1875, 2070, 2351, 2284, 2000, 1818, 1670, 1547, 1427, 1321, 1280, 1239, 1269, 1329, 1422, 1536, 1685, 1818, 1981, 2244, 2254, 1932, 1785, 1611, 1464, 1346, 1225, 1176, 1150, 1176, 1240, 1321, 1459, 1586, 1719, 1888, 2179, 2196, 1926, 1728, 1553, 1406, 1281, 1186, 1108, 1091, 1097, 1163, 1266, 1425, 1536, 1686, 1864, 2148, 2148, 1848, 1692, 1518, 1364, 1241, 1123, 1070, 1058, 1067, 1136, 1202, 1364, 1492, 1646, 1815, 2071, 2132, 1853, 1663, 1499, 1348, 1203, 1100, 1050, 1029, 1048, 1097, 1186, 1336, 1484, 1649, 1820, 2005, 2157, 1854, 1671, 1500, 1340, 1204, 1100, 1050, 1024, 1024, 1091, 1193, 1323, 1459, 1632, 1830, 2048, 2155, 1887, 1696, 1532, 1366, 1250, 1133, 1072, 1053, 1053, 1100, 1228, 1339, 1499, 1663, 1853, 2109, 2160, 1890, 1735, 1552, 1387, 1283, 1194, 1121, 1084, 1112, 1158, 1256, 1414, 1558, 1700, 1873, 2125, 2339, 1963, 1795, 1638, 1480, 1355, 1239, 1164, 1136, 1168, 1213, 1325, 1434, 1588, 1773, 1935, 2246, 2363, 2027, 1866, 1696, 1544, 1439, 1339, 1265, 1242, 1257, 1313, 1387, 1522, 1696, 1817, 1998, 2280, 2427, 2172, 1939, 1800, 1657, 1525, 1429, 1371, 1342, 1371, 1429, 1514, 1612, 1778, 1912, 2083, 2427, 2663, 2245, 2044, 1873, 1755, 1620, 1563, 1506, 1486, 1485, 1546, 1601, 1725, 1832, 2004, 2271, 2488, 2860, 2450, 2183, 2016, 1895, 1776, 1660, 1641, 1605, 1615, 1681, 1754, 1836, 1949, 2124, 2304, 2860, 3550, 2677, 2383, 2181, 2059, 1936, 1863, 1783, 1777, 1783, 1855, 1866, 2049, 2169, 2368, 2567, 3625] + }, + "lsc_samples_greenR": { + "uCoeff": [2841, 2383, 2173, 1995, 1816, 1722, 1650, 1621, 1567, 1636, 1634, 1705, 1777, 1909, 2116, 2270, 2761, 2564, 2245, 2029, 1859, 1717, 1622, 1526, 1497, 1473, 1482, 1526, 1580, 1679, 1795, 1951, 2161, 2412, 2463, 2141, 1929, 1771, 1623, 1516, 1426, 1375, 1347, 1378, 1405, 1487, 1584, 1704, 1865, 2053, 2299, 2295, 2019, 1846, 1689, 1539, 1427, 1339, 1278, 1235, 1276, 1320, 1387, 1492, 1625, 1763, 1965, 2215, 2206, 1952, 1763, 1615, 1459, 1349, 1241, 1176, 1158, 1172, 1229, 1312, 1413, 1553, 1709, 1885, 2140, 2208, 1930, 1714, 1556, 1404, 1279, 1173, 1115, 1103, 1108, 1171, 1269, 1384, 1508, 1689, 1840, 2067, 2146, 1884, 1695, 1513, 1362, 1228, 1129, 1060, 1058, 1071, 1127, 1213, 1346, 1486, 1646, 1813, 1983, 2125, 1884, 1682, 1506, 1340, 1210, 1103, 1058, 1024, 1053, 1105, 1191, 1319, 1458, 1622, 1794, 2026, 2127, 1875, 1696, 1494, 1354, 1210, 1098, 1048, 1029, 1048, 1101, 1195, 1320, 1468, 1638, 1795, 2086, 2160, 1894, 1703, 1522, 1378, 1238, 1131, 1072, 1053, 1067, 1118, 1225, 1335, 1493, 1673, 1822, 2057, 2182, 1945, 1775, 1613, 1419, 1292, 1180, 1105, 1091, 1105, 1155, 1265, 1379, 1523, 1682, 1884, 2124, 2254, 2000, 1792, 1635, 1474, 1343, 1235, 1182, 1166, 1165, 1243, 1332, 1430, 1585, 1750, 1936, 2208, 2407, 2081, 1871, 1709, 1551, 1434, 1338, 1276, 1248, 1280, 1328, 1423, 1541, 1663, 1810, 2018, 2237, 2456, 2195, 1972, 1792, 1679, 1534, 1434, 1374, 1345, 1374, 1419, 1510, 1639, 1745, 1915, 2109, 2328, 2654, 2336, 2068, 1918, 1762, 1645, 1563, 1499, 1484, 1509, 1538, 1621, 1712, 1897, 2036, 2222, 2492, 2885, 2524, 2231, 2036, 1907, 1780, 1684, 1630, 1628, 1646, 1697, 1784, 1886, 1987, 2157, 2398, 2830, 3550, 2661, 2450, 2174, 2058, 1948, 1829, 1783, 1762, 1778, 1775, 1898, 2013, 2160, 2323, 2571, 3573] + }, + "lsc_samples_greenB": { + "uCoeff": [2830, 2410, 2164, 2011, 1833, 1751, 1651, 1614, 1608, 1617, 1655, 1702, 1838, 1928, 2115, 2320, 2830, 2564, 2301, 2033, 1894, 1750, 1642, 1557, 1494, 1480, 1482, 1523, 1600, 1710, 1852, 1984, 2182, 2470, 2404, 2146, 1967, 1787, 1651, 1533, 1438, 1377, 1362, 1361, 1420, 1510, 1619, 1750, 1904, 2098, 2404, 2319, 2067, 1864, 1699, 1539, 1430, 1351, 1270, 1257, 1280, 1325, 1418, 1522, 1661, 1808, 1991, 2245, 2228, 1972, 1807, 1628, 1464, 1354, 1246, 1181, 1165, 1175, 1226, 1335, 1448, 1582, 1737, 1921, 2190, 2206, 1944, 1760, 1553, 1418, 1271, 1179, 1110, 1093, 1112, 1173, 1255, 1392, 1546, 1685, 1894, 2085, 2165, 1898, 1705, 1537, 1362, 1227, 1137, 1067, 1043, 1077, 1118, 1232, 1351, 1490, 1659, 1840, 2082, 2122, 1903, 1704, 1499, 1334, 1204, 1109, 1034, 1035, 1052, 1096, 1185, 1329, 1483, 1634, 1825, 2102, 2104, 1905, 1676, 1517, 1334, 1201, 1100, 1043, 1024, 1043, 1098, 1179, 1329, 1461, 1647, 1846, 2045, 2180, 1903, 1726, 1522, 1366, 1228, 1123, 1072, 1043, 1052, 1109, 1211, 1336, 1486, 1646, 1805, 2062, 2195, 1953, 1736, 1555, 1406, 1250, 1152, 1085, 1074, 1085, 1154, 1257, 1381, 1540, 1700, 1876, 2096, 2261, 1992, 1798, 1631, 1451, 1326, 1217, 1160, 1153, 1160, 1213, 1321, 1445, 1564, 1725, 1934, 2198, 2397, 2053, 1894, 1681, 1541, 1407, 1294, 1251, 1220, 1242, 1311, 1401, 1530, 1651, 1817, 2040, 2251, 2436, 2186, 1957, 1770, 1620, 1499, 1413, 1330, 1318, 1360, 1401, 1477, 1616, 1761, 1934, 2074, 2311, 2643, 2292, 2073, 1894, 1723, 1614, 1511, 1463, 1434, 1470, 1522, 1591, 1709, 1851, 1985, 2213, 2512, 2832, 2464, 2184, 1990, 1841, 1726, 1661, 1604, 1591, 1596, 1633, 1735, 1806, 1949, 2148, 2326, 2752, 3676, 2604, 2375, 2179, 2023, 1862, 1777, 1775, 1741, 1734, 1796, 1879, 1975, 2158, 2256, 2582, 3653] + }, + "lsc_samples_blue": { + "uCoeff": [2584, 2276, 1975, 1834, 1641, 1560, 1506, 1511, 1505, 1488, 1561, 1536, 1641, 1822, 1988, 2119, 2439, 2263, 2074, 1885, 1706, 1614, 1504, 1439, 1416, 1378, 1416, 1432, 1512, 1563, 1667, 1793, 1987, 2244, 2224, 1943, 1727, 1619, 1513, 1435, 1339, 1318, 1296, 1312, 1357, 1402, 1467, 1560, 1706, 1893, 2106, 2115, 1863, 1664, 1539, 1449, 1310, 1276, 1235, 1202, 1226, 1260, 1328, 1394, 1539, 1664, 1816, 2053, 1972, 1764, 1611, 1486, 1362, 1304, 1202, 1170, 1139, 1170, 1207, 1276, 1362, 1464, 1611, 1764, 1985, 1944, 1732, 1584, 1441, 1330, 1221, 1157, 1089, 1097, 1097, 1135, 1221, 1312, 1434, 1543, 1712, 1944, 1953, 1709, 1564, 1398, 1270, 1208, 1109, 1077, 1062, 1066, 1136, 1156, 1275, 1372, 1516, 1699, 1915, 1907, 1703, 1512, 1393, 1277, 1157, 1081, 1062, 1024, 1062, 1089, 1161, 1261, 1381, 1512, 1683, 1870, 1922, 1685, 1520, 1394, 1272, 1152, 1097, 1035, 1028, 1054, 1077, 1157, 1272, 1375, 1536, 1685, 1860, 1907, 1683, 1567, 1381, 1277, 1185, 1106, 1062, 1046, 1046, 1110, 1175, 1255, 1374, 1543, 1713, 1858, 1902, 1709, 1564, 1445, 1321, 1193, 1122, 1066, 1078, 1062, 1109, 1203, 1315, 1404, 1548, 1699, 1967, 2013, 1785, 1593, 1469, 1361, 1236, 1185, 1109, 1110, 1122, 1171, 1242, 1336, 1462, 1593, 1743, 1985, 1999, 1842, 1675, 1508, 1394, 1293, 1221, 1175, 1175, 1185, 1242, 1321, 1401, 1493, 1628, 1775, 1985, 2148, 1912, 1712, 1588, 1462, 1377, 1315, 1262, 1236, 1284, 1304, 1384, 1462, 1588, 1712, 1875, 2083, 2224, 1998, 1801, 1674, 1552, 1471, 1395, 1366, 1343, 1361, 1382, 1463, 1536, 1655, 1769, 1998, 2206, 2495, 2188, 1962, 1767, 1659, 1576, 1474, 1464, 1452, 1443, 1490, 1543, 1623, 1746, 1910, 2059, 2567, 3208, 2276, 2076, 1893, 1707, 1620, 1604, 1511, 1552, 1550, 1586, 1656, 1717, 1834, 1975, 2239, 3088] + } + }, { + "name": "3264x2448_GRAY_0", + "resolution": "3264x2448", + "illumination": "GRAY", + "vignetting": 0, + "lsc_samples_red": { + "uCoeff": [1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024] + }, + "lsc_samples_greenR": { + "uCoeff": [1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024] + }, + "lsc_samples_greenB": { + "uCoeff": [1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024] + }, + "lsc_samples_blue": { + "uCoeff": [1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024] + } + }], + "tableAll_len": 15 + } + }, + "colorAsGrey": { + "param": { + "enable": 0 + } + }, + "lumaDetect": { + "luma_detect_en": 1, + "fixed_times": 0, + "mutation_threshold": 0.0002, + "mutation_threshold_level2": 1000 + }, + "aldch": { + "param": { + "ldch_en": 0, + "meshfile": "LDCH_mesh_2688_1520_os04a10_4IR", + "correct_level": 255, + "correct_level_max": 255, + "light_center": [1351.12, 739.486], + "coefficient": [-1830.26, 0.000423795, -2.50767e-07, 1.27247e-10] + } + }, + "ccm_calib": { + "control": { + "enable": 1, + "mode": "CALIB_CCM_MODE_AUTO", + "wbgain_tolerance": 0.1, + "gain_tolerance": 0.2 + }, + "lumaCCM": { + "rgb2y_para": [38, 75, 15], + "low_bound_pos_bit": 8, + "y_alpha_curve": [0, 64, 128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024], + "gain_alphaScale_curve": { + "gain": [1, 2, 4, 8, 16, 32, 64, 128, 256], + "scale": [1, 0.8, 0.8, 0.9, 1, 1, 1, 1, 1] + } + }, + "manualPara": { + "ccMatrix": [1, 0, 0, 0, 1, 0, 0, 0, 1], + "ccOffsets": [0, 0, 0] + }, + "TuningPara": { + "damp_enable": 1, + "illu_estim": { + "interp_enable": 0, + "default_illu": "A", + "weightRB": [1, 1], + "prob_limit": 0.2, + "frame_no": 8 + }, + "aCcmCof": [{ + "name": "A", + "awbGain": [1.3452, 2.4161], + "minDist": 0.05, + "matrixUsed": ["A_100", "A_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "CWF", + "awbGain": [1.8123, 2.0694], + "minDist": 0.05, + "matrixUsed": ["CWF_100", "CWF_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "D50", + "awbGain": [2.0413, 1.565], + "minDist": 0.05, + "matrixUsed": ["D50_100", "D50_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "D65", + "awbGain": [2.204, 1.4498], + "minDist": 0.05, + "matrixUsed": ["D65_100", "D65_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "D75", + "awbGain": [2.3379, 1.3483], + "minDist": 0.05, + "matrixUsed": ["D75_100", "D75_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "HZ", + "awbGain": [1.1019, 2.9858], + "minDist": 0.05, + "matrixUsed": ["HZ_100", "HZ_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "TL84", + "awbGain": [1.7523, 2.1252], + "minDist": 0.05, + "matrixUsed": ["TL84_100", "TL84_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }], + "aCcmCof_len": 7, + "matrixAll": [{ + "name": "A_100", + "illumination": "A", + "saturation": 100, + "ccMatrix": [1.6891, -0.5521, -0.137, -0.3788, 1.5903, -0.2116, -0.1644, -0.948, 2.1124], + "ccOffsets": [0, 0, 0] + }, { + "name": "A_74", + "illumination": "A", + "saturation": 74, + "ccMatrix": [1.3186, -0.2377, -0.081, -0.2115, 1.3487, -0.1372, -0.0538, -0.529, 1.5828], + "ccOffsets": [0, 0, 0] + }, { + "name": "CWF_100", + "illumination": "CWF", + "saturation": 100, + "ccMatrix": [2.2712, -1.2488, -0.0224, -0.4072, 1.5721, -0.1649, -0.107, -0.5879, 1.6949], + "ccOffsets": [0, 0, 0] + }, { + "name": "CWF_74", + "illumination": "CWF", + "saturation": 74, + "ccMatrix": [1.792, -0.7994, 0.0074, -0.1898, 1.2888, -0.0989, 0.0311, -0.3086, 1.2775], + "ccOffsets": [0, 0, 0] + }, { + "name": "D50_100", + "illumination": "D50", + "saturation": 100, + "ccMatrix": [1.655, -0.9098, 0.2548, -0.2647, 1.2982, -0.0335, 0.16, -0.7713, 1.6113], + "ccOffsets": [0, 0, 0] + }, { + "name": "D50_74", + "illumination": "D50", + "saturation": 74, + "ccMatrix": [1.5565, -0.5177, -0.0389, -0.0858, 1.3389, -0.2531, 0.0647, -0.2656, 1.201], + "ccOffsets": [0, 0, 0] + }, { + "name": "D65_100", + "illumination": "D65", + "saturation": 100, + "ccMatrix": [2.0667, -1.0499, -0.0168, -0.2201, 1.594, -0.3739, -0.0537, -0.4778, 1.5315], + "ccOffsets": [0, 0, 0] + }, { + "name": "D65_74", + "illumination": "D65", + "saturation": 74, + "ccMatrix": [1.6549, -0.6301, -0.0248, -0.0372, 1.327, -0.2899, 0.0849, -0.2052, 1.1202], + "ccOffsets": [0, 0, 0] + }, { + "name": "D75_100", + "illumination": "D75", + "saturation": 100, + "ccMatrix": [2.155, -1.122, -0.033, -0.2227, 1.6076, -0.3849, -0.0495, -0.4337, 1.4832], + "ccOffsets": [0, 0, 0] + }, { + "name": "D75_74", + "illumination": "D75", + "saturation": 74, + "ccMatrix": [1.7269, -0.6857, -0.0411, -0.0325, 1.3349, -0.3024, 0.0946, -0.1747, 1.0801], + "ccOffsets": [0, 0, 0] + }, { + "name": "HZ_100", + "illumination": "HZ", + "saturation": 100, + "ccMatrix": [1.5916, -0.3465, -0.2451, -0.4361, 1.5559, -0.1198, -0.4226, -1.2969, 2.7195], + "ccOffsets": [0, 0, 0] + }, { + "name": "HZ_74", + "illumination": "HZ", + "saturation": 74, + "ccMatrix": [1.2224, -0.0853, -0.1371, -0.2778, 1.3236, -0.0457, -0.2688, -0.787, 2.0558], + "ccOffsets": [0, 0, 0] + }, { + "name": "TL84_100", + "illumination": "TL84", + "saturation": 100, + "ccMatrix": [1.935, -0.8598, -0.0752, -0.3278, 1.5314, -0.2036, -0.1164, -0.5772, 1.6936], + "ccOffsets": [0, 0, 0] + }, { + "name": "TL84_74", + "illumination": "TL84", + "saturation": 74, + "ccMatrix": [1.5289, -0.4872, -0.0417, -0.1454, 1.283, -0.1376, 0.01, -0.2765, 1.2665], + "ccOffsets": [0, 0, 0] + }], + "matrixAll_len": 14 + } + }, + "lut3d_calib": { + "common": { + "enable": 0, + "mode": "CALIB_Lut3D_MODE_AUTO", + "gain_tolerance": 0.1, + "wbgain_tolerance": 1 + }, + "MLut3D": { + "Table": { + "look_up_table_r": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "look_up_table_g": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "look_up_table_b": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + } + }, + "ALut3D": { + "damp_en": 1, + "lutAll": [{ + "name": "Normal", + "awbGain": [1, 1], + "gain_alpha": { + "gain": [1, 2, 4, 8, 16, 32, 64, 128, 256], + "alpha": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }, + "Table": { + "look_up_table_r": [0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 20, 205, 416, 626, 829, 1023, 1023, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 20, 205, 416, 626, 829, 1023, 1023, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 509, 511, 541, 616, 724, 850, 971, 1023, 1023, 677, 678, 687, 714, 759, 821, 897, 983, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 509, 510, 541, 616, 724, 850, 970, 1023, 1023, 677, 678, 687, 714, 759, 821, 897, 983, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 511, 512, 539, 614, 723, 849, 969, 1023, 1023, 677, 678, 686, 713, 758, 820, 896, 982, 1023, 0, 20, 205, 416, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 357, 567, 773, 971, 1023, 1023, 0, 17, 178, 357, 567, 773, 971, 1023, 1023, 0, 17, 178, 357, 567, 773, 971, 1023, 1023, 1, 17, 178, 357, 567, 773, 971, 1023, 1023, 516, 518, 544, 610, 718, 845, 965, 1023, 1023, 678, 679, 687, 710, 755, 817, 893, 979, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 357, 567, 773, 971, 1023, 1023, 0, 17, 178, 357, 537, 745, 944, 1023, 1023, 0, 17, 178, 357, 537, 745, 944, 1023, 1023, 0, 17, 178, 357, 537, 745, 944, 1023, 1023, 526, 528, 554, 618, 713, 841, 957, 1023, 1023, 680, 680, 688, 711, 750, 811, 888, 974, 1023, 0, 20, 205, 416, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 357, 567, 773, 971, 1023, 1023, 0, 17, 178, 357, 537, 745, 944, 1023, 1023, 0, 17, 178, 357, 537, 715, 916, 1023, 1023, 0, 17, 178, 357, 537, 715, 916, 1023, 1023, 543, 544, 569, 632, 725, 838, 947, 1023, 1023, 682, 682, 691, 713, 751, 804, 880, 967, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 1, 17, 178, 357, 567, 773, 971, 1023, 1023, 0, 17, 178, 357, 537, 745, 944, 1023, 1023, 0, 17, 178, 357, 537, 715, 916, 1023, 1023, 1, 17, 178, 357, 537, 715, 886, 1023, 1023, 569, 570, 594, 654, 745, 853, 935, 1023, 1023, 685, 686, 694, 716, 754, 806, 871, 957, 1023, 71, 83, 214, 402, 599, 791, 976, 1023, 1023, 72, 82, 212, 401, 597, 790, 975, 1023, 1023, 84, 93, 201, 386, 582, 776, 963, 1023, 1023, 114, 121, 215, 368, 561, 755, 942, 1023, 1023, 161, 166, 243, 384, 544, 735, 920, 1023, 1023, 230, 234, 293, 415, 563, 719, 900, 1023, 1023, 344, 347, 388, 482, 608, 747, 889, 1023, 1023, 608, 610, 632, 689, 776, 855, 936, 1023, 1023, 689, 690, 698, 720, 757, 808, 872, 945, 1023, 247, 250, 299, 407, 545, 693, 840, 978, 1023, 248, 251, 299, 407, 545, 693, 840, 978, 1023, 268, 271, 311, 413, 547, 693, 837, 975, 1023, 321, 323, 356, 435, 558, 695, 833, 968, 1023, 402, 403, 428, 489, 578, 700, 830, 960, 1023, 478, 479, 498, 546, 620, 711, 829, 951, 1023, 556, 557, 571, 608, 667, 743, 832, 943, 1023, 630, 630, 641, 669, 715, 777, 853, 936, 1023, 695, 695, 703, 725, 761, 811, 874, 946, 1023], + "look_up_table_g": [0, 0, 0, 1, 0, 1, 1, 637, 1771, 78, 78, 78, 78, 78, 78, 78, 663, 1778, 821, 820, 821, 821, 821, 821, 821, 1036, 1899, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1703, 2192, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2442, 2596, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3170, 3049, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3837, 3501, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3923, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 0, 0, 1, 1, 1, 0, 0, 637, 1771, 78, 69, 69, 69, 69, 69, 69, 660, 1778, 820, 810, 810, 810, 810, 810, 810, 1033, 1898, 1662, 1650, 1650, 1650, 1650, 1650, 1650, 1700, 2191, 2503, 2491, 2491, 2491, 2491, 2491, 2491, 2439, 2595, 3317, 3305, 3305, 3305, 3305, 3305, 3305, 3168, 3049, 4095, 4091, 4091, 4091, 4091, 4091, 4091, 3836, 3501, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3923, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 0, 1, 0, 1, 1, 1, 0, 640, 1775, 78, 69, 69, 69, 69, 69, 69, 663, 1781, 821, 810, 713, 713, 713, 713, 713, 990, 1890, 1662, 1650, 1543, 1543, 1543, 1543, 1543, 1658, 2183, 2503, 2491, 2383, 2383, 2383, 2383, 2383, 2404, 2587, 3317, 3305, 3202, 3202, 3202, 3202, 3202, 3143, 3042, 4095, 4091, 3990, 3990, 3990, 3990, 3990, 3821, 3495, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3918, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 1, 1, 1, 0, 1, 0, 2, 650, 1786, 78, 69, 69, 69, 69, 69, 69, 673, 1792, 821, 810, 713, 713, 713, 713, 713, 996, 1899, 1662, 1650, 1543, 1428, 1428, 1428, 1428, 1579, 2161, 2503, 2491, 2383, 2267, 2267, 2267, 2267, 2331, 2567, 3317, 3305, 3202, 3091, 3091, 3091, 3091, 3085, 3023, 4095, 4091, 3990, 3882, 3882, 3882, 3882, 3783, 3479, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3904, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 0, 1, 1, 1, 0, 1, 0, 668, 1805, 78, 69, 69, 69, 69, 69, 69, 690, 1811, 821, 810, 713, 713, 713, 713, 713, 1008, 1916, 1662, 1650, 1543, 1428, 1428, 1428, 1428, 1587, 2174, 2503, 2491, 2383, 2267, 2149, 2149, 2149, 2242, 2534, 3317, 3305, 3202, 3091, 2978, 2978, 2978, 3008, 2993, 4095, 4091, 3990, 3882, 3775, 3775, 3775, 3727, 3452, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3881, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 1, 0, 1, 0, 1, 1, 0, 697, 1834, 78, 69, 69, 69, 69, 69, 69, 718, 1840, 821, 810, 713, 713, 713, 713, 713, 1028, 1942, 1662, 1650, 1543, 1428, 1428, 1428, 1428, 1599, 2194, 2503, 2491, 2383, 2267, 2149, 2149, 2149, 2251, 2548, 3317, 3305, 3202, 3091, 2978, 2860, 2860, 2920, 2952, 4095, 4091, 3990, 3882, 3775, 3663, 3663, 3660, 3415, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3848, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 1, 0, 0, 2, 0, 0, 3, 737, 1874, 78, 69, 69, 69, 69, 69, 69, 758, 1880, 821, 810, 713, 713, 713, 713, 713, 1056, 1979, 1662, 1650, 1543, 1428, 1428, 1428, 1428, 1618, 2223, 2503, 2491, 2383, 2267, 2149, 2149, 2149, 2264, 2567, 3317, 3305, 3202, 3091, 2978, 2860, 2860, 2931, 2964, 4095, 4091, 3990, 3882, 3775, 3663, 3545, 3586, 3368, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3805, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 283, 284, 299, 339, 405, 501, 628, 793, 1927, 334, 328, 342, 378, 439, 529, 651, 812, 1932, 866, 861, 802, 820, 852, 903, 981, 1096, 2026, 1624, 1619, 1561, 1474, 1492, 1522, 1570, 1645, 2260, 2403, 2400, 2351, 2268, 2177, 2197, 2230, 2284, 2593, 3155, 3152, 3117, 3047, 2964, 2877, 2903, 2948, 2980, 3847, 3846, 3823, 3771, 3702, 3627, 3557, 3606, 3377, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3754, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 988, 989, 1014, 1082, 1198, 1367, 1588, 1785, 1992, 1003, 1003, 1027, 1094, 1209, 1377, 1596, 1791, 1997, 1245, 1244, 1243, 1299, 1396, 1543, 1724, 1899, 2086, 1751, 1750, 1745, 1741, 1813, 1918, 2029, 2161, 2307, 2354, 2354, 2347, 2330, 2313, 2366, 2437, 2525, 2626, 2923, 2923, 2916, 2898, 2873, 2846, 2887, 2939, 3000, 3449, 3449, 3442, 3425, 3399, 3365, 3328, 3355, 3387, 3916, 3915, 3910, 3894, 3869, 3834, 3792, 3745, 3758, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095], + "look_up_table_b": [0, 0, 0, 0, 0, 0, 0, 159, 443, 0, 0, 0, 0, 0, 0, 0, 160, 443, 0, 0, 0, 0, 0, 0, 0, 168, 452, 0, 0, 0, 0, 0, 0, 1, 193, 476, 0, 0, 0, 0, 0, 0, 0, 237, 514, 0, 0, 0, 0, 0, 0, 0, 313, 563, 0, 0, 0, 1, 0, 0, 1, 461, 617, 509, 509, 515, 531, 563, 623, 709, 724, 673, 677, 677, 678, 680, 684, 691, 700, 711, 725, 20, 20, 20, 20, 20, 20, 20, 165, 444, 20, 17, 17, 17, 17, 17, 17, 165, 444, 20, 17, 17, 17, 17, 17, 17, 173, 453, 20, 17, 17, 17, 17, 17, 17, 197, 477, 20, 17, 17, 17, 17, 17, 17, 240, 515, 20, 17, 17, 17, 17, 17, 17, 316, 564, 20, 17, 17, 17, 17, 17, 17, 462, 618, 510, 510, 516, 532, 565, 623, 709, 725, 673, 678, 678, 678, 681, 685, 691, 700, 711, 725, 205, 205, 205, 205, 205, 205, 205, 254, 467, 205, 202, 202, 202, 202, 202, 202, 253, 467, 205, 202, 178, 178, 178, 178, 178, 247, 472, 205, 202, 178, 178, 178, 178, 178, 264, 495, 205, 202, 178, 178, 178, 178, 178, 297, 530, 205, 202, 178, 178, 178, 178, 178, 359, 576, 205, 202, 178, 178, 178, 178, 178, 490, 628, 537, 537, 539, 554, 584, 640, 720, 734, 681, 687, 687, 686, 689, 693, 699, 707, 718, 731, 415, 415, 415, 416, 415, 416, 415, 417, 525, 415, 413, 413, 413, 413, 413, 413, 416, 525, 415, 413, 386, 386, 386, 386, 386, 407, 529, 416, 413, 386, 357, 357, 357, 357, 395, 540, 415, 413, 386, 357, 357, 357, 357, 415, 570, 416, 413, 386, 357, 357, 357, 357, 458, 610, 415, 413, 386, 357, 357, 357, 357, 557, 656, 606, 606, 606, 610, 636, 684, 747, 760, 704, 712, 712, 712, 710, 714, 719, 727, 737, 749, 626, 626, 626, 626, 626, 626, 626, 601, 614, 626, 623, 623, 623, 623, 623, 623, 600, 614, 626, 623, 596, 596, 596, 596, 596, 590, 616, 626, 623, 596, 567, 567, 567, 567, 573, 622, 626, 623, 596, 567, 537, 537, 537, 560, 634, 626, 623, 596, 567, 537, 537, 537, 587, 665, 626, 623, 596, 567, 537, 537, 537, 654, 702, 706, 706, 706, 707, 713, 752, 793, 803, 741, 755, 755, 755, 753, 750, 754, 761, 769, 780, 829, 829, 829, 829, 829, 829, 829, 789, 724, 829, 826, 826, 826, 826, 826, 826, 788, 724, 829, 826, 800, 800, 800, 800, 800, 777, 724, 829, 826, 800, 773, 773, 773, 773, 759, 726, 829, 826, 800, 773, 745, 745, 745, 741, 730, 829, 826, 800, 773, 745, 715, 715, 730, 738, 829, 826, 800, 773, 745, 715, 715, 771, 765, 829, 829, 827, 825, 825, 838, 856, 863, 794, 816, 816, 815, 813, 809, 804, 809, 816, 823, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 973, 848, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 972, 848, 1023, 1023, 997, 997, 997, 997, 997, 961, 846, 1023, 1023, 997, 971, 971, 971, 971, 942, 843, 1023, 1023, 997, 971, 944, 944, 944, 921, 841, 1023, 1023, 997, 971, 944, 916, 916, 902, 840, 1023, 1023, 997, 971, 944, 916, 886, 897, 842, 961, 961, 959, 953, 947, 946, 935, 938, 861, 893, 893, 892, 889, 884, 878, 871, 875, 880, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 977, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 977, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 975, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 969, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 961, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 952, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 945, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 938, 982, 982, 980, 977, 972, 965, 956, 945, 948, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023] + } + }], + "lutAll_len": 1 + } + }, + "af": { + "TuningPara": { + "af_mode": "CalibDbV2_AF_MODE_NOT_SET", + "win_h_offs": 0, + "win_v_offs": 0, + "win_h_size": 0, + "win_v_size": 0, + "fixed_mode": { + "code": 8 + }, + "macro_mode": { + "code": 32 + }, + "infinity_mode": { + "code": 32 + }, + "contrast_af": { + "enable": 1, + "Afss": "CalibDbV2_CAM_AFM_FSS_ADAPTIVE_RANGE", + "FullDir": "CalibDbV2_CAM_AFM_ADAPTIVE_SEARCH", + "FullSteps": 9, + "FullRangeTbl": [0, 8, 16, 24, 32, 40, 48, 56, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "AdaptiveDir": "CalibDbV2_CAM_AFM_ADAPTIVE_SEARCH", + "AdaptiveSteps": 9, + "AdaptRangeTbl": [0, 8, 16, 24, 32, 40, 48, 56, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "TrigThers": 0.075, + "LumaTrigThers": 0, + "StableThers": 0.02, + "StableFrames": 3, + "StableTime": 200, + "SceneDiffEnable": 0, + "SceneDiffThers": 0, + "SceneDiffBlkThers": 0, + "CenterSceneDiffThers": 0, + "ValidMaxMinRatio": 0, + "ValidValueThers": 0, + "OutFocusValue": 50, + "OutFocusPos": 30, + "WeightEnable": 0, + "Weight": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "SearchPauseLumaEnable": 0, + "SearchPauseLumaThers": 0, + "SearchLumaStableFrames": 0, + "SearchLumaStableThers": 0, + "FlatValue": 0 + }, + "laser_af": { + "enable": 0, + "vcmDot": [0, 16, 32, 40, 48, 56, 64], + "distanceDot": [0.2, 0.24, 0.34, 0.4, 0.66, 1, 3] + }, + "pdaf": { + "enable": 0 + }, + "vcmcfg": { + "start_current": -1, + "rated_current": -1, + "step_mode": -1, + "extra_delay": 0 + }, + "measiso_cfg": [{ + "iso": 50, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 100, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 200, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 400, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 800, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 1600, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 3200, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 6400, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 12800, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 25600, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 51200, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 102400, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 204800, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }], + "zoomfocus_tbl": { + "tbl_len": 0, + "focal_length": [], + "focal_length_len": 0, + "zoom_pos": [], + "zoom_pos_len": 0, + "focus_infpos": [], + "focus_infpos_len": 0, + "focus_macropos": [], + "focus_macropos_len": 0 + } + } + }, + "thumbnails": { + "param": { + "thumbnail_configs": [{ + "owner_cookies": 0, + "stream_type": 0, + "after_nodes": 0, + "before_node": 0, + "format": "NV12\u0002", + "width_intfactor": 2, + "height_intfactor": 2, + "buffer_count": 0 + }, { + "owner_cookies": 1, + "stream_type": 0, + "after_nodes": 0, + "before_node": 0, + "format": "NV12\u0004", + "width_intfactor": 4, + "height_intfactor": 4, + "buffer_count": 0 + }, { + "owner_cookies": 2, + "stream_type": 0, + "after_nodes": 0, + "before_node": 0, + "format": "NV12\b", + "width_intfactor": 8, + "height_intfactor": 8, + "buffer_count": 0 + }], + "thumbnail_configs_len": 3 + } + }, + "bayernr_v2": { + "Version": "", + "CalibPara": { + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Calib_ISO": [{ + "iso": 50, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [440, 385, 336, 292, 226, 191, 187, 202, 220, 235, 241, 238, 224, 203, 176, 155] + }, { + "iso": 100, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [747, 638, 535, 436, 251, 141, 120, 135, 114, 187, 226, 237, 222, 181, 112, 100] + }, { + "iso": 200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [1233, 1094, 966, 850, 657, 526, 459, 448, 464, 483, 490, 477, 440, 383, 313, 262] + }, { + "iso": 400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [1076, 1002, 936, 877, 783, 717, 674, 647, 628, 612, 593, 567, 534, 494, 452, 416] + }, { + "iso": 800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [2708, 2445, 2204, 1986, 1624, 1366, 1209, 1136, 1113, 1104, 1082, 1031, 942, 813, 655, 512] + }, { + "iso": 1600, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 3200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 6400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 12800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 25600, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 51200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 102400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 204800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }], + "Calib_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Calib_ISO": [{ + "iso": 50, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [329, 292, 258, 227, 176, 141, 124, 121, 127, 133, 137, 135, 127, 113, 94, 75] + }, { + "iso": 100, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [747, 638, 535, 436, 251, 141, 120, 135, 114, 187, 226, 237, 222, 181, 112, 100] + }, { + "iso": 200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [835, 721, 614, 514, 336, 194, 120, 147, 207, 256, 284, 288, 267, 221, 148, 120] + }, { + "iso": 400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [789, 703, 625, 553, 435, 354, 311, 301, 308, 318, 321, 312, 288, 249, 198, 147] + }, { + "iso": 800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [761, 707, 658, 614, 542, 490, 454, 430, 414, 401, 386, 366, 341, 309, 273, 238] + }, { + "iso": 1600, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 3200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 6400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 12800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 25600, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 51200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 102400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 204800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }], + "Calib_ISO_len": 13 + }], + "Setting_len": 2 + }, + "Bayernr2D": { + "enable": 1, + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Tuning_ISO": [{ + "iso": 50, + "gauss_guide": 1, + "filter_strength": 15, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 100, + "gauss_guide": 1, + "filter_strength": 15, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 200, + "gauss_guide": 1, + "filter_strength": 15, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 400, + "gauss_guide": 1, + "filter_strength": 15, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 800, + "gauss_guide": 1, + "filter_strength": 15, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 1600, + "gauss_guide": 1, + "filter_strength": 0.8, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 3200, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 6400, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 12800, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 25600, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 51200, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 102400, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 204800, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }], + "Tuning_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Tuning_ISO": [{ + "iso": 50, + "gauss_guide": 0, + "filter_strength": 4, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 100, + "gauss_guide": 0, + "filter_strength": 4, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 200, + "gauss_guide": 0, + "filter_strength": 4, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 400, + "gauss_guide": 0, + "filter_strength": 4, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 800, + "gauss_guide": 0, + "filter_strength": 4, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 1600, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 3200, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 6400, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 12800, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 25600, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 51200, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 102400, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 204800, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }], + "Tuning_ISO_len": 13 + }], + "Setting_len": 2 + }, + "Bayernr3D": { + "enable": 0, + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Tuning_ISO": [{ + "iso": 50, + "filter_strength": 0.5, + "sp_filter_strength": 0.55, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.88, + "softwgt": 0 + }, { + "iso": 100, + "filter_strength": 0.5, + "sp_filter_strength": 0.55, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.88, + "softwgt": 0 + }, { + "iso": 200, + "filter_strength": 0.5, + "sp_filter_strength": 0.6, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.88, + "softwgt": 0 + }, { + "iso": 400, + "filter_strength": 0.5, + "sp_filter_strength": 0.6, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.88, + "softwgt": 0 + }, { + "iso": 800, + "filter_strength": 0.5, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.88, + "softwgt": 0 + }, { + "iso": 1600, + "filter_strength": 0.1, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 3200, + "filter_strength": 0.1, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 6400, + "filter_strength": 0.5, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 12800, + "filter_strength": 0.5, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 25600, + "filter_strength": 0.6, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 51200, + "filter_strength": 0.6, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 102400, + "filter_strength": 0.7, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 204800, + "filter_strength": 0.7, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }], + "Tuning_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Tuning_ISO": [{ + "iso": 50, + "filter_strength": 0.1, + "sp_filter_strength": 0.55, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 100, + "filter_strength": 0.1, + "sp_filter_strength": 0.55, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 200, + "filter_strength": 0.1, + "sp_filter_strength": 0.6, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 400, + "filter_strength": 0.1, + "sp_filter_strength": 0.6, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 800, + "filter_strength": 0.1, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 1600, + "filter_strength": 0.1, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 3200, + "filter_strength": 0.1, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 6400, + "filter_strength": 0.5, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 12800, + "filter_strength": 0.5, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 25600, + "filter_strength": 0.6, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 51200, + "filter_strength": 0.6, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 102400, + "filter_strength": 0.7, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 204800, + "filter_strength": 0.7, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }], + "Tuning_ISO_len": 13 + }], + "Setting_len": 2 + } + }, + "cnr_v1": { + "Version": "", + "TuningPara": { + "enable": 1, + "Kernel_Coeff": { + "kernel_5x5": [1, 0.8825, 0.7788, 0.6065, 0.3679] + }, + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Tuning_ISO": [{ + "iso": 50, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 30, + "color_sat_adj_alpha": 0.4, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 50, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 30, + "thumb_color_sat": 4, + "lf_denoise_strength": 40, + "lf_color_sat": 4, + "lf_denoise_alpha": 0.5 + }, { + "iso": 100, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 30, + "color_sat_adj_alpha": 0.4, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 50, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 30, + "thumb_color_sat": 4, + "lf_denoise_strength": 40, + "lf_color_sat": 4, + "lf_denoise_alpha": 0.5 + }, { + "iso": 200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 30, + "color_sat_adj_alpha": 0.4, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 50, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 30, + "thumb_color_sat": 4, + "lf_denoise_strength": 40, + "lf_color_sat": 4, + "lf_denoise_alpha": 0.5 + }, { + "iso": 400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 30, + "color_sat_adj_alpha": 0.4, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 50, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 30, + "thumb_color_sat": 4, + "lf_denoise_strength": 40, + "lf_color_sat": 4, + "lf_denoise_alpha": 0.5 + }, { + "iso": 800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 30, + "color_sat_adj_alpha": 0.4, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 50, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 30, + "thumb_color_sat": 4, + "lf_denoise_strength": 40, + "lf_color_sat": 4, + "lf_denoise_alpha": 0.5 + }, { + "iso": 1600, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 3200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 6400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 12800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 25600, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 51200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 102400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 204800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }], + "Tuning_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Tuning_ISO": [{ + "iso": 50, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 100, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 1600, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 3200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 6400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 12800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 25600, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 51200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 102400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 204800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }], + "Tuning_ISO_len": 13 + }], + "Setting_len": 2 + } + }, + "ynr_v2": { + "Version": "", + "CalibPara": { + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Calib_ISO": [{ + "iso": 50, + "sigma_curve": [5.26063e-13, -4.31051e-09, 6.01295e-06, 0.00733553, 30.2968], + "ynr_ci_l": 0.35887, + "ynr_ci_h": 0.218965 + }, { + "iso": 100, + "sigma_curve": [-8.51864e-13, 8.4477e-09, -3.1173e-05, 0.0431732, 20.4729], + "ynr_ci_l": 0.266861, + "ynr_ci_h": 0.176977 + }, { + "iso": 200, + "sigma_curve": [-1.91013e-12, 1.68572e-08, -5.42127e-05, 0.0644649, 50.8293], + "ynr_ci_l": 0.264338, + "ynr_ci_h": 0.176603 + }, { + "iso": 400, + "sigma_curve": [-1.39053e-12, 1.37088e-08, -5.30971e-05, 0.0730568, 77.3162], + "ynr_ci_l": 0.260614, + "ynr_ci_h": 0.169545 + }, { + "iso": 800, + "sigma_curve": [-7.56352e-13, 8.08215e-09, -4.17244e-05, 0.0722224, 122.519], + "ynr_ci_l": 0.292136, + "ynr_ci_h": 0.186536 + }, { + "iso": 1600, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 3200, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 6400, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 12800, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 25600, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 51200, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 102400, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 204800, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }], + "Calib_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Calib_ISO": [{ + "iso": 50, + "sigma_curve": [-3.79338e-13, 4.20139e-09, -1.65728e-05, 0.0227778, 17.7731], + "ynr_ci_l": 0.264599, + "ynr_ci_h": 0.186359 + }, { + "iso": 100, + "sigma_curve": [-8.51864e-13, 8.4477e-09, -3.1173e-05, 0.0431732, 20.4729], + "ynr_ci_l": 0.266861, + "ynr_ci_h": 0.176977 + }, { + "iso": 200, + "sigma_curve": [-1.01774e-12, 1.07758e-08, -4.22101e-05, 0.0597135, 28.7999], + "ynr_ci_l": 0.259483, + "ynr_ci_h": 0.166846 + }, { + "iso": 400, + "sigma_curve": [-1.32816e-12, 1.29829e-08, -4.53493e-05, 0.0511179, 55.0177], + "ynr_ci_l": 0.254945, + "ynr_ci_h": 0.156095 + }, { + "iso": 800, + "sigma_curve": [-1.76225e-12, 1.64389e-08, -5.4805e-05, 0.0586055, 72.3208], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 1600, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 3200, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 6400, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 12800, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 25600, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 51200, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 102400, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 204800, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }], + "Calib_ISO_len": 13 + }], + "Setting_len": 2 + }, + "TuningPara": { + "enable": 1, + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Tuning_ISO": [{ + "iso": 50, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 20, + "low_bf_1": 20, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.1, + "low_dist_adj": 8, + "low_weight": 1, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.9, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 20, + "high_weight": 1, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3, 3.5, 4] + }, { + "iso": 100, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 20, + "low_bf_1": 20, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.1, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.9, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 20, + "high_weight": 1, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3, 3.5, 4] + }, { + "iso": 200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 20, + "low_bf_1": 20, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.1, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.9, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 20, + "high_weight": 1, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3, 3.5, 4] + }, { + "iso": 400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 20, + "low_bf_1": 20, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.1, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.9, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 20, + "high_weight": 1, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3, 3.5, 4] + }, { + "iso": 800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 20, + "low_bf_1": 20, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.1, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.9, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 20, + "high_weight": 1, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3, 3.5, 4] + }, { + "iso": 1600, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 5, + "low_bf_1": 5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.5, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3.5] + }, { + "iso": 3200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.95, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 6400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 12800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1.1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 25600, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1.1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 51200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1.1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 102400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1.1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 204800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1.1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }], + "Tuning_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Tuning_ISO": [{ + "iso": 50, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0.5, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 100, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 1600, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 3200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 6400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 12800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 25600, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 51200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 102400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 204800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }], + "Tuning_ISO_len": 13 + }], + "Setting_len": 2 + } + }, + "sharp_v3": { + "Version": "", + "TuningPara": { + "enable": 1, + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Tuning_ISO": [{ + "iso": 50, + "pbf_gain": 0.8, + "pbf_ratio": 0.5, + "pbf_add": 1, + "gaus_ratio": 0.5, + "sharp_ratio": 10, + "bf_gain": 2, + "bf_ratio": 5, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [12, 16, 20, 24, 28, 24, 20, 20], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 100, + "pbf_gain": 0.8, + "pbf_ratio": 0.5, + "pbf_add": 1, + "gaus_ratio": 0.5, + "sharp_ratio": 10, + "bf_gain": 3, + "bf_ratio": 5, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [24, 32, 40, 48, 56, 48, 48, 40], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 200, + "pbf_gain": 0.8, + "pbf_ratio": 0.5, + "pbf_add": 1, + "gaus_ratio": 0.5, + "sharp_ratio": 10, + "bf_gain": 3, + "bf_ratio": 5, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [24, 32, 40, 48, 56, 48, 48, 40], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 400, + "pbf_gain": 0.8, + "pbf_ratio": 0.5, + "pbf_add": 1, + "gaus_ratio": 0.5, + "sharp_ratio": 10, + "bf_gain": 4, + "bf_ratio": 5, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [32, 40, 48, 56, 64, 56, 48, 40], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 800, + "pbf_gain": 0.8, + "pbf_ratio": 0.5, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 10, + "bf_gain": 4, + "bf_ratio": 5, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [40, 48, 56, 64, 80, 64, 56, 48], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 1600, + "pbf_gain": 0.8, + "pbf_ratio": 0.2, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [256, 256, 256, 256, 256, 256, 256, 256] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 3200, + "pbf_gain": 0.8, + "pbf_ratio": 0.2, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 6400, + "pbf_gain": 0.8, + "pbf_ratio": 0.3, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 12800, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 25600, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 51200, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 102400, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 204800, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }], + "Tuning_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Tuning_ISO": [{ + "iso": 50, + "pbf_gain": 0.8, + "pbf_ratio": 0, + "pbf_add": 1, + "gaus_ratio": 0, + "sharp_ratio": 6, + "bf_gain": 2, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [8, 12, 16, 16, 24, 20, 16, 16], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 100, + "pbf_gain": 0.8, + "pbf_ratio": 0, + "pbf_add": 1, + "gaus_ratio": 0, + "sharp_ratio": 6, + "bf_gain": 3, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [12, 16, 20, 24, 28, 24, 20, 20], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 200, + "pbf_gain": 0.8, + "pbf_ratio": 0, + "pbf_add": 1, + "gaus_ratio": 0, + "sharp_ratio": 6, + "bf_gain": 3, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [24, 32, 40, 48, 56, 48, 48, 40], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 400, + "pbf_gain": 0.8, + "pbf_ratio": 0, + "pbf_add": 1, + "gaus_ratio": 0, + "sharp_ratio": 7, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [32, 40, 48, 56, 64, 56, 48, 40], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 800, + "pbf_gain": 0.8, + "pbf_ratio": 0.2, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 7, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [40, 48, 56, 64, 80, 64, 56, 48], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 1600, + "pbf_gain": 0.8, + "pbf_ratio": 0.2, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [256, 256, 256, 256, 256, 256, 256, 256] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 3200, + "pbf_gain": 0.8, + "pbf_ratio": 0.2, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 6400, + "pbf_gain": 0.8, + "pbf_ratio": 0.3, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 12800, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 25600, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 51200, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 102400, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 204800, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }], + "Tuning_ISO_len": 13 + }], + "Setting_len": 2 + } + } + } + }], + "sub_scene_len": 1 + }], + "main_scene_len": 1, + "uapi": [], + "uapi_len": 0, + "sys_static_cfg": { + "algoSwitch": { + "enable": 0, + "enable_algos": [], + "enable_algos_len": 0 + } + } +} \ No newline at end of file diff --git a/hardware/isp/etc/iqfiles/gc8034_RK-CMK-8M-2-v1_CK8401.json b/hardware/isp/etc/iqfiles/gc8034_RK-CMK-8M-2-v1_CK8401.json new file mode 100644 index 0000000000000000000000000000000000000000..6d892a2b54a877e2676802749c9c4b79dc80e57e --- /dev/null +++ b/hardware/isp/etc/iqfiles/gc8034_RK-CMK-8M-2-v1_CK8401.json @@ -0,0 +1,4650 @@ +{ + "sensor_calib": { + "resolution": { + "width": 3264, + "height": 2448 + }, + "Gain2Reg": { + "GainMode": "EXPGAIN_MODE_LINEAR", + "GainRange": [1, 16, 64, 0, 1, 64, 1024], + "GainRange_len": 7 + }, + "Time2Reg": { + "fCoeff": [0, 0, 1, 0.5] + }, + "CISGainSet": { + "CISAgainRange": { + "Min": 1, + "Max": 16 + }, + "CISExtraAgainRange": { + "Min": 1, + "Max": 1 + }, + "CISDgainRange": { + "Min": 1, + "Max": 1 + }, + "CISIspDgainRange": { + "Min": 1, + "Max": 1 + }, + "CISHdrGainIndSetEn": 1 + }, + "CISTimeSet": { + "Linear": { + "CISTimeRegMin": 4, + "CISLinTimeRegMaxFac": { + "fCoeff": [1, 4] + }, + "CISTimeRegOdevity": { + "fCoeff": [1, 0] + } + }, + "Hdr": [{ + "name": "HDR_TWO_FRAME", + "CISTimeRegUnEqualEn": 1, + "CISTimeRegMin": 4, + "CISHdrTimeRegSumFac": { + "fCoeff": [1, 4] + }, + "CISTimeRegMax": { + "Coeff": [0, 0, 0] + }, + "CISTimeRegOdevity": { + "fCoeff": [1, 0] + } + }, { + "name": "HDR_THREE_FRAME", + "CISTimeRegUnEqualEn": 1, + "CISTimeRegMin": 4, + "CISHdrTimeRegSumFac": { + "fCoeff": [1, 4] + }, + "CISTimeRegMax": { + "Coeff": [0, 0, 0] + }, + "CISTimeRegOdevity": { + "fCoeff": [1, 0] + } + }] + }, + "CISHdrSet": { + "hdr_en": 0, + "hdr_mode": "RK_AIQ_ISP_HDR_MODE_2_LINE_HDR", + "line_mode": "RK_AIQ_SENSOR_HDR_LINE_MODE_STAGGER" + }, + "CISDcgSet": { + "Linear": { + "support_en": 0, + "dcg_optype": "RK_AIQ_OP_MODE_AUTO", + "dcg_mode": { + "Coeff": [0, 0, 0] + }, + "dcg_ratio": 1, + "sync_switch": 0, + "lcg2hcg_gain_th": 32, + "hcg2lcg_gain_th": 16 + }, + "Hdr": { + "support_en": 0, + "dcg_optype": "RK_AIQ_OP_MODE_AUTO", + "dcg_mode": { + "Coeff": [0, 0, 0] + }, + "dcg_ratio": 3.5, + "sync_switch": 1, + "lcg2hcg_gain_th": 32, + "hcg2lcg_gain_th": 16 + } + }, + "CISExpUpdate": { + "Linear": { + "time_update": 2, + "gain_update": 2, + "dcg_update": 2 + }, + "Hdr": { + "time_update": 2, + "gain_update": 2, + "dcg_update": 1 + } + }, + "CISMinFps": 10, + "CISFlip": 3 + }, + "module_calib": { + "sensor_module": { + "FNumber": 1.6, + "EFL": 5.2, + "LensT": 90, + "IRCutT": 90 + } + }, + "main_scene": [{ + "name": "normal", + "sub_scene": [{ + "name": "day", + "scene_isp21": { + "ae_calib": { + "CommCtrl": { + "Enable": 1, + "AecRunInterval": 0, + "AecOpType": "RK_AIQ_OP_MODE_AUTO", + "HistStatsMode": "CAM_HISTV2_MODE_Y", + "RawStatsMode": "CAM_RAWSTATSV2_MODE_Y", + "YRangeMode": "CAM_YRANGEV2_MODE_FULL", + "AecGridWeight": [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 1, 1, 2, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 2, 1, 1, 2, 5, 8, 10, 10, 10, 10, 10, 10, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 13, 13, 13, 13, 13, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 13, 15, 15, 15, 13, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 13, 15, 15, 15, 13, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 13, 15, 15, 15, 13, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 13, 13, 13, 13, 13, 10, 8, 5, 2, 1, 1, 2, 5, 8, 10, 10, 10, 10, 10, 10, 10, 8, 5, 2, 1, 1, 2, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 2, 1, 1, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + "AecManualCtrl": { + "LinearAE": { + "ManualTimeEn": 1, + "ManualGainEn": 1, + "ManualIspDgainEn": 1, + "TimeValue": 0.02, + "GainValue": 6, + "IspDGainValue": 1 + }, + "HdrAE": { + "ManualTimeEn": 1, + "ManualGainEn": 1, + "ManualIspDgainEn": 1, + "TimeValue": [0.01, 0.02, 0.03], + "GainValue": [1, 1, 1], + "IspDGainValue": [1, 1, 1] + } + }, + "AecSpeed": { + "DampOver": 0.15, + "DampUnder": 0.45, + "DampDark2Bright": 0.15, + "DampBright2Dark": 0.45 + }, + "AecDelayFrmNum": { + "BlackDelay": 2, + "WhiteDelay": 2 + }, + "AecFrameRateMode": { + "isFpsFix": 1, + "FpsValue": 25 + }, + "AecAntiFlicker": { + "enable": 1, + "Frequency": "AECV2_FLICKER_FREQUENCY_50HZ", + "Mode": "AECV2_ANTIFLICKER_AUTO_MODE" + }, + "AecEnvLvCalib": { + "CalibFNumber": 1.6, + "CurveCoeff": [0.02859, 0.5972] + }, + "AecWinScale": { + "InRawWinScale": { + "h_offs": 0, + "v_offs": 0, + "h_size": 1, + "v_size": 1 + }, + "TmoRawWinScale": { + "h_offs": 0.1, + "v_offs": 0.1, + "h_size": 0.9, + "v_size": 0.9 + }, + "YuvWinScale": { + "h_offs": 0, + "v_offs": 0, + "h_size": 1, + "v_size": 1 + } + } + }, + "LinearAeCtrl": { + "RawStatsEn": 1, + "ToleranceIn": 10, + "ToleranceOut": 15, + "Evbias": 0, + "StrategyMode": "AECV2_STRATEGY_MODE_LOWLIGHT_PRIOR", + "InitExp": { + "InitTimeValue": 0.003, + "InitGainValue": 1, + "InitIspDGainValue": 1, + "InitPIrisGainValue": 512, + "InitDCIrisDutyValue": 100 + }, + "Route": { + "TimeDot": [0, 0.04, 0.04, 0.04, 0.04, 0.04], + "TimeDot_len": 6, + "GainDot": [1, 1, 4, 8, 15.5, 16], + "GainDot_len": 6, + "IspDGainDot": [1, 1, 1, 1, 1, 2], + "IspDGainDot_len": 6, + "PIrisDot": [512, 512, 512, 512, 512, 512], + "PIrisDot_len": 6 + }, + "DySetpoint": { + "ExpLevel": [0, 0.032, 0.064, 0.192, 0.32, 0.448], + "ExpLevel_len": 6, + "DySetpoint": [45, 45, 40, 38, 33, 30], + "DySetpoint_len": 6 + }, + "BackLightCtrl": { + "Enable": 0, + "StrBias": 0, + "MeasArea": "AECV2_MEASURE_AREA_AUTO", + "OEROILowTh": 150, + "LumaDistTh": 10, + "LvLowTh": 0.3125, + "LvHighTh": 7.5, + "BacklitSetPoint": { + "ExpLevel": [0.032, 0.064, 0.128, 0.192, 0.32, 0.448], + "ExpLevel_len": 6, + "NonOEPdfTh": [0.4, 0.45, 0.55, 0.65, 0.75, 1], + "NonOEPdfTh_len": 6, + "LowLightPdfTh": [0.2, 0.2, 0.22, 0.25, 0.3, 0.35], + "LowLightPdfTh_len": 6, + "TargetLLLuma": [25, 22, 20, 18, 15, 12], + "TargetLLLuma_len": 6 + } + }, + "OverExpCtrl": { + "Enable": 0, + "StrBias": 0, + "MaxWeight": 8, + "HighLightTh": 150, + "LowLightTh": 30, + "OverExpSetPoint": { + "OEpdf": [0.01, 0.02, 0.03, 0.04, 0.05, 0.07], + "OEpdf_len": 6, + "LowLightWeight": [1, 1, 1, 1, 1, 1], + "LowLightWeight_len": 6, + "HighLightWeight": [4, 3, 3, 3, 2, 2], + "HighLightWeight_len": 6 + } + } + }, + "HdrAeCtrl": { + "ToleranceIn": 10, + "ToleranceOut": 15, + "Evbias": 0, + "StrategyMode": "AECV2_STRATEGY_MODE_LOWLIGHT_PRIOR", + "LumaDistTh": 10, + "InitExp": { + "InitTimeValue": [0.0005, 0.003, 0.003], + "InitGainValue": [1, 1, 1], + "InitIspDGainValue": [1, 1, 1], + "InitPIrisGainValue": 512, + "InitDCIrisDutyValue": 100 + }, + "Route": { + "Frm0TimeDot": [0, 0.003, 0.003, 0.003, 0.003, 0.003], + "Frm0TimeDot_len": 6, + "Frm0GainDot": [1, 1, 4, 8, 15.5, 32], + "Frm0GainDot_len": 6, + "Frm0IspDGainDot": [1, 1, 1, 1, 1, 1], + "Frm0IspDGainDot_len": 6, + "Frm1TimeDot": [0, 0.03, 0.03, 0.03, 0.03, 0.03], + "Frm1TimeDot_len": 6, + "Frm1GainDot": [1, 1, 4, 8, 15.5, 64], + "Frm1GainDot_len": 6, + "Frm1IspDGainDot": [1, 1, 1, 1, 1, 1], + "Frm1IspDGainDot_len": 6, + "Frm2TimeDot": [0, 0.03, 0.03, 0.03, 0.03, 0.03], + "Frm2TimeDot_len": 6, + "Frm2GainDot": [1, 1, 4, 8, 15.5, 64], + "Frm2GainDot_len": 6, + "Frm2IspDGainDot": [1, 1, 1, 1, 1, 1], + "Frm2IspDGainDot_len": 6, + "PIrisDot": [512, 512, 512, 512, 512, 512], + "PIrisDot_len": 6 + }, + "ExpRatioCtrl": { + "ExpRatioType": "AECV2_HDR_RATIOTYPE_MODE_AUTO", + "ExpRatio": { + "RatioExpDot": [0, 0.1, 0.3, 0.5, 0.7, 1], + "RatioExpDot_len": 6, + "M2SRatioFix": [4, 4, 4, 4, 4, 4], + "M2SRatioFix_len": 6, + "L2MRatioFix": [4, 4, 4, 4, 4, 4], + "L2MRatioFix_len": 6, + "M2SRatioMax": [64, 64, 64, 64, 64, 64], + "M2SRatioMax_len": 6, + "L2MRatioMax": [32, 32, 30, 28, 26, 24], + "L2MRatioMax_len": 6 + } + }, + "LongFrmMode": { + "mode": "AECV2_HDR_LONGFRMMODE_NORMAL", + "SfrmMinLine": 2, + "LfrmModeExpTh": 0.62 + }, + "LframeCtrl": { + "OEROILowTh": 150, + "LvLowTh": 0.3125, + "LvHighTh": 7.5, + "LfrmSetPoint": { + "LExpLevel": [0, 0.0192, 0.0576, 0.096, 0.192, 0.384], + "LExpLevel_len": 6, + "NonOEPdfTh": [0.4, 0.45, 0.55, 0.65, 0.75, 1], + "NonOEPdfTh_len": 6, + "LowLightPdfTh": [0.2, 0.22, 0.25, 0.3, 0.35, 0.4], + "LowLightPdfTh_len": 6, + "LSetPoint": [75, 70, 65, 60, 45, 40], + "LSetPoint_len": 6, + "TargetLLLuma": [35, 32, 30, 28, 25, 20], + "TargetLLLuma_len": 6 + } + }, + "MframeCtrl": { + "MExpLevel": [0.096, 0.192, 0.384, 0.96, 1.344, 1.92], + "MExpLevel_len": 6, + "MSetPoint": [60, 60, 55, 50, 45, 40], + "MSetPoint_len": 6 + }, + "SframeCtrl": { + "HLROIExpandEn": 0, + "HLLumaTolerance": 12, + "SfrmSetPoint": { + "SExpLevel": [0, 0.0048, 0.0144, 0.024, 0.0384, 0.0576], + "SExpLevel_len": 6, + "SSetPoint": [18, 18, 15, 12, 12, 12], + "SSetPoint_len": 6, + "TargetHLLuma": [100, 100, 100, 90, 80, 70], + "TargetHLLuma_len": 6 + } + } + }, + "IrisCtrl": { + "Enable": 0, + "IrisType": "IRISV2_DC_TYPE", + "ManualEn": 0, + "ManualAttr": { + "PIrisGainValue": 1, + "DCIrisHoldValue": 30 + }, + "InitAttr": { + "PIrisGainValue": 512, + "DCIrisHoldValue": 100 + }, + "PIrisAttr": { + "TotalStep": 81, + "EffcStep": 44, + "ZeroIsMax": 1, + "StepTable": [512, 511, 506, 499, 491, 483, 474, 465, 456, 446, 437, 427, 417, 408, 398, 388, 378, 368, 359, 349, 339, 329, 319, 309, 300, 290, 280, 271, 261, 252, 242, 233, 224, 214, 205, 196, 187, 178, 170, 161, 153, 144, 136, 128, 120, 112, 105, 98, 90, 83, 77, 70, 64, 58, 52, 46, 41, 36, 31, 27, 23, 19, 16, 13, 10, 8, 6, 4, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "DCIrisAttr": { + "Kp": 0.5, + "Ki": 0.2, + "Kd": 0.3, + "MinPwmDuty": 0, + "MaxPwmDuty": 100, + "OpenPwmDuty": 40, + "ClosePwmDuty": 22 + } + }, + "SyncTest": { + "Enable": 0, + "IntervalFrm": 60, + "AlterExp": { + "LinearAE": [{ + "TimeValue": 0.02, + "GainValue": 1, + "IspDGainValue": 1, + "PIrisGainValue": 1, + "DcgMode": 0 + }, { + "TimeValue": 0.02, + "GainValue": 6, + "IspDGainValue": 1, + "PIrisGainValue": 29, + "DcgMode": 0 + }], + "LinearAE_len": 2, + "HdrAE": [{ + "TimeValue": [0.01, 0.02, 0.03], + "GainValue": [1, 1, 1], + "IspDGainValue": [1, 1, 1], + "PIrisGainValue": 1, + "DcgMode": [0, 0, 0] + }, { + "TimeValue": [0.01, 0.02, 0.03], + "GainValue": [6, 6, 1], + "IspDGainValue": [1, 1, 1], + "PIrisGainValue": 29, + "DcgMode": [0, 0, 0] + }], + "HdrAE_len": 2 + } + } + }, + "wb_v21": { + "control": { + "byPass": 0, + "mode": "CALIB_WB_MODE_AUTO" + }, + "manualPara": { + "mode": "CALIB_MWB_MODE_SCENE", + "cfg": { + "mwbGain": [1.31933, 1, 1, 2.50981], + "scene": "CALIB_WB_SCENE_CLOUDY_DAYLIGHT", + "cct": { + "CCT": 5000, + "CCRI": 0 + } + } + }, + "autoPara": { + "hdrPara": { + "frameChooseMode": "CALIB_AWB_HDR_FRAME_CHOOSE_MODE_MANUAL", + "frameChoose": 1 + }, + "lscBypassEnable": 0, + "uvDetectionEnable": 1, + "xyDetectionEnable": 1, + "yuvDetectionEnable": 1, + "lsUsedForYuvDet": ["A", "CWF", "D65", "TL84", "D50", "HZ", "D75"], + "lsUsedForYuvDet_len": 7, + "blkStatisticsEnable": 1, + "downScaleMode": "CALIB_AWB_DS_8X8", + "blkMeasureMode": "CALIB_AWB_BLK_STAT_MODE_ALL_V201", + "mainWindow": { + "mode": "CALIB_AWB_WINDOW_CFG_FIXED", + "window": [0, 0, 1, 1] + }, + "limitRange": { + "lumaValue": [0], + "lumaValue_len": 1, + "maxR": [230], + "maxR_len": 1, + "minR": [6], + "minR_len": 1, + "maxG": [230], + "maxG_len": 1, + "minG": [9], + "minG_len": 1, + "maxB": [230], + "maxB_len": 1, + "minB": [6], + "minB_len": 1, + "maxY": [210], + "maxY_len": 1, + "minY": [9], + "minY_len": 1 + }, + "rgb2TcsPara": { + "pseudoLuminanceWeight": [0.372935, 0.37602, 0.251045], + "rotationMat": [-0.589702, 0.807621, -0.326631, 0.807621, 0.589702, 0.560524, 0, 0, 1] + }, + "rgb2RotationYuvMat": [0.0351562, 0.136719, 0.0136719, 34.875, -0.0839844, 0.00195312, 0.0703125, 134.875, 0.046875, -0.0566406, 0.0507812, 109.812, 0, 0, 0, 1], + "extraWpRange": [{ + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_UV", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [244, 249, 228, 211] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_XY", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [-1096, -985, 140, 65] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_XY", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [-40, 158, 121, 16] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_XY", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [-235, -40, 237, 80] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_UV", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [0, 0, 0, 0] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_UV", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [0, 0, 0, 0] + }, { + "domain": "CALIB_AWB_EXTRA_RANGE_DOMAIN_UV", + "mode": "CALIB_AWB_EXCLUDE_WP_MODE", + "region": [0, 0, 0, 0] + }], + "wpDiffLumaWeight": { + "enable": 1, + "wpDiffWeiEnableTh": { + "wpDiffWeiNoTh": 0.004, + "wpDiffWeiLvValueTh": 64 + }, + "wpDiffwei_y": [0, 16, 32, 64, 96, 128, 192, 224, 240], + "perfectBin": [0, 0, 0, 1, 1, 1, 1, 0], + "wpDiffWeightLvSet": [{ + "LvValue": 256, + "ratioSet": [{ + "ratioValue": 0, + "weight": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "ratioValue": 0.01, + "weight": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "ratioValue": 0.1, + "weight": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }], + "ratioSet_len": 3 + }, { + "LvValue": 8192, + "ratioSet": [{ + "ratioValue": 0, + "weight": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "ratioValue": 0.01, + "weight": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "ratioValue": 0.1, + "weight": [0, 0, 0.2, 0.5, 1, 1, 1, 0.5, 0] + }], + "ratioSet_len": 3 + }], + "wpDiffWeightLvSet_len": 2 + }, + "wpDiffBlkWeiEnable": 1, + "wpDiffBlkWeight": [6, 6, 6, 8, 8, 8, 8, 10, 8, 8, 8, 8, 6, 6, 6, 6, 6, 8, 8, 10, 10, 12, 12, 12, 10, 10, 8, 8, 6, 6, 6, 8, 10, 12, 14, 16, 18, 20, 18, 16, 14, 12, 10, 8, 6, 8, 8, 12, 16, 22, 26, 30, 32, 30, 26, 22, 16, 12, 8, 8, 8, 10, 14, 22, 28, 36, 42, 46, 42, 36, 28, 22, 14, 10, 8, 8, 10, 16, 26, 36, 46, 54, 58, 54, 46, 36, 26, 16, 10, 8, 8, 12, 18, 30, 42, 54, 63, 63, 63, 54, 42, 30, 18, 12, 8, 10, 12, 20, 32, 46, 58, 63, 63, 63, 58, 46, 32, 20, 12, 10, 8, 12, 18, 30, 42, 54, 63, 63, 63, 54, 42, 30, 18, 12, 8, 8, 10, 16, 26, 36, 46, 54, 58, 54, 46, 36, 26, 16, 10, 8, 8, 10, 14, 22, 28, 36, 42, 46, 42, 36, 28, 22, 14, 10, 8, 8, 8, 12, 16, 22, 26, 30, 32, 30, 26, 22, 16, 12, 8, 8, 6, 8, 10, 12, 14, 16, 18, 20, 18, 16, 14, 12, 10, 8, 6, 6, 6, 8, 8, 10, 10, 12, 12, 12, 10, 10, 8, 8, 6, 6, 6, 6, 6, 8, 8, 8, 8, 10, 8, 8, 8, 8, 6, 6, 6], + "lightSources": [{ + "name": "A", + "doorType": "CALIB_AWB_DOOR_TYPE_INDOOR", + "standardGainValue": [1.31933, 1, 1, 2.50981], + "uvRegion": { + "u": [124.5, 54.5, 58.5, 125], + "v": [128, 114.5, 90.5, 127] + }, + "xyRegion": { + "normal": [-1.225, -0.73125, 0.0729253, -0.0435484], + "big": [-1.22875, -0.745, 0.092997, -0.0761649] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.1875, 1.1875, 1.75, 2, 4], + "lineVector": [10, 140.875, 109.375, 186.688, 101.625, 110.5], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 75], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "CWF", + "doorType": "CALIB_AWB_DOOR_TYPE_INDOOR", + "standardGainValue": [1.76901, 1, 1, 2.15255], + "uvRegion": { + "u": [68.5, 74.5, 124, 123], + "v": [73.5, 60.5, 125, 125.5] + }, + "xyRegion": { + "normal": [-0.732778, -0.438333, 0.000487089, -0.0845602], + "big": [-0.737593, -0.43537, 0.0435897, -0.1] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.125, 1.1875, 1.1875, 1.75, 2, 4], + "lineVector": [10, 137.812, 110.75, 190, 119.812, 103.938], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 70, 60, 50, 40], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "D50", + "doorType": "CALIB_AWB_DOOR_TYPE_AMBIGUITY", + "standardGainValue": [1.9499, 1, 1, 1.66695], + "uvRegion": { + "u": [74, 94, 126, 124.5], + "v": [59.5, 53.5, 124.5, 125.5] + }, + "xyRegion": { + "normal": [-0.426481, -0.171667, 0.0682934, -0.0644886], + "big": [-0.427963, -0.179074, 0.088365, -0.0845602] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.3125, 1.375, 1.75, 2, 4], + "lineVector": [10, 135.75, 110, 191, 132.938, 108.5], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "D65", + "doorType": "CALIB_AWB_DOOR_TYPE_OUTDOOR", + "standardGainValue": [2.18207, 1, 1, 1.45549], + "uvRegion": { + "u": [94, 112.5, 127.5, 126], + "v": [53.5, 48.5, 121, 124] + }, + "xyRegion": { + "normal": [-0.176111, 0.0712963, 0.0875931, -0.104632], + "big": [-0.186481, 0.0801852, 0.136228, -0.171023] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.5, 1.5, 1.8125, 2, 4], + "lineVector": [10, 133.812, 109.625, 190.75, 143.812, 109.625], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 80, 70], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "D75", + "doorType": "CALIB_AWB_DOOR_TYPE_OUTDOOR", + "standardGainValue": [2.32318, 1, 1, 1.35032], + "uvRegion": { + "u": [131.5, 127, 112.5, 129.5], + "v": [121, 122.5, 48.5, 43.5] + }, + "xyRegion": { + "normal": [0.0835185, 0.369074, 0.0962136, -0.0938241], + "big": [0.0787037, 0.375, 0.142404, -0.181831] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.3125, 1.5, 1.75, 2, 4], + "lineVector": [10, 132.688, 109.875, 190.25, 149.625, 110.688], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 80, 70, 50], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "HZ", + "doorType": "CALIB_AWB_DOOR_TYPE_INDOOR", + "standardGainValue": [1.05376, 1, 1, 2.97437], + "uvRegion": { + "u": [123.5, 57.5, 55.5, 124.5], + "v": [130.5, 140, 113.5, 128] + }, + "xyRegion": { + "normal": [-1.96056, -1.23625, 0.089909, -0.0310036], + "big": [-1.96278, -1.22944, 0.100717, -0.0837883] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.3125, 1.3125, 1.75, 2, 4], + "lineVector": [10, 143.625, 108.562, 181.688, 86.5625, 115.438], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 75, 50], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }, { + "name": "TL84", + "doorType": "CALIB_AWB_DOOR_TYPE_INDOOR", + "standardGainValue": [1.71132, 1, 1, 2.14938], + "uvRegion": { + "u": [124, 58, 68.5, 124.5], + "v": [126.5, 90, 73.5, 125.5] + }, + "xyRegion": { + "normal": [-0.728333, -0.433889, 0.0529823, -0.038241], + "big": [-0.73875, -0.433889, 0.088365, -0.066129] + }, + "rtYuvRegion": { + "thcurve_u": [50, 54, 70, 78, 110, 142], + "thcure_th": [1.1875, 1.1875, 1.3125, 1.75, 2, 4], + "lineVector": [10, 138.062, 110.062, 189.875, 118.312, 106.188], + "disP1P2": 15 + }, + "staWeight": [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 90, 80, 70, 60, 60], + "dayGainLvThSet": [1024, 8192], + "defaultDayGainLow": [1.76901, 1, 1, 2.15255], + "defaultDayGainHigh": [1.9499, 1, 1, 1.66695], + "xyType2Enable": 1 + }], + "lightSources_len": 7 + }, + "autoExtPara": { + "lightSourceForFirstFrame": "D50", + "tolerance": { + "lumaValue": [256, 512, 32768, 131072], + "lumaValue_len": 4, + "toleranceValue": [0, 0, 0, 0], + "toleranceValue_len": 4 + }, + "runInterval": { + "lumaValue": [256, 512, 32768, 131072], + "lumaValue_len": 4, + "intervalValue": [0, 0, 0, 0], + "intervalValue_len": 4 + }, + "dampFactor": { + "dFStep": 0.05, + "dFMin": 0.7, + "dFMax": 0.9, + "lvIIRsize": 4, + "lvVarTh": 0.04 + }, + "wbGainAdjust": { + "enable": 0, + "lutAll": [{ + "lumaValue": 128, + "ct_grid_num": 7, + "cri_grid_num": 9, + "ct_in_range": [2000, 8000], + "cri_in_range": [-1, 1], + "ct_lut_out": [2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000], + "ct_lut_out_len": 63, + "cri_lut_out": [-1, -1, -1, -1, -1, -1, -1, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 1, 1, 1, 1, 1, 1, 1], + "cri_lut_out_len": 63 + }, { + "lumaValue": 8192, + "ct_grid_num": 7, + "cri_grid_num": 9, + "ct_in_range": [2000, 8000], + "cri_in_range": [-1, 1], + "ct_lut_out": [2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000], + "ct_lut_out_len": 63, + "cri_lut_out": [-1, -1, -1, -1, -1, -1, -1, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 1, 1, 1, 1, 1, 1, 1], + "cri_lut_out_len": 63 + }, { + "lumaValue": 65536, + "ct_grid_num": 7, + "cri_grid_num": 9, + "ct_in_range": [2000, 8000], + "cri_in_range": [-1, 1], + "ct_lut_out": [2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 2000, 3000, 4000, 5000, 6000, 7000, 8000], + "ct_lut_out_len": 63, + "cri_lut_out": [-1, -1, -1, -1, -1, -1, -1, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.75, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.5, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, -0.25, 0, 0, 0, 0, 0, 0, 0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 1, 1, 1, 1, 1, 1, 1], + "cri_lut_out_len": 63 + }], + "lutAll_len": 3 + }, + "wbGainDaylightClip": { + "enable": 0, + "outdoor_cct_min": 5000 + }, + "wbGainClip": { + "enable": 0, + "cct": [1000, 2856, 4100, 6500, 7500], + "cct_len": 5, + "cri_bound_up": [0.091, 0.091, 0.18, 0.12, 0.12], + "cri_bound_up_len": 5, + "cri_bound_low": [0.07, 0.07, 0.16, 0.16, 0.16], + "cri_bound_low_len": 5 + }, + "division": { + "lumaValThLow": 110, + "lumaValThLow2": 200, + "lumaValThHigh": 65536, + "lumaValThHigh2": 65600, + "wpNumTh": { + "lumaValue": [0], + "lumaValue_len": 1, + "low": [50], + "low_len": 1, + "high": [80], + "high_len": 1 + } + }, + "defaultNightGain": [1.31933, 1, 1, 2.50981], + "lumaValueMatrix": [0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144], + "defaultNightGainWeight": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "probCalcDis": { + "proDis_THH": 4.6124, + "proDis_THL": 0.0269 + }, + "probCalcLv": { + "outdoorLumaValThLow": 30000, + "outdoorLumaValThHigh": 45745 + }, + "probCalcWp": { + "wpNumPercTh": 0.031, + "wpNumPercTh2": 0.2 + }, + "converged": { + "varThforUnDamp": 0.005, + "varThforDamp": 0.005 + }, + "xyRegionStableSelection": { + "enable": 1, + "wpNumTh": { + "lumaValue": [0], + "lumaValue_len": 1, + "forBigType": [80], + "forBigType_len": 1, + "forExtraType": [80], + "forExtraType_len": 1 + }, + "xyTypeListSize": 50, + "varianceLumaTh": 0.06 + }, + "weightForNightGainCalc": [25, 25, 25, 25], + "weightForNightGainCalc_len": 4, + "singleColorProces": { + "enable": 1, + "colorBlock": [{ + "index": 15, + "meanC": 26.1455, + "meanH": 30.4796 + }, { + "index": 13, + "meanC": 24.607, + "meanH": -75.964 + }, { + "index": 5, + "meanC": 10.9565, + "meanH": -67.7098 + }, { + "index": 10, + "meanC": 11.9595, + "meanH": -41.2431 + }, { + "index": 14, + "meanC": 19.0206, + "meanH": 144.275 + }, { + "index": 16, + "meanC": 30.264, + "meanH": 88.699 + }], + "colorBlock_len": 6, + "lsUsedForEstimation": [{ + "name": "A", + "RGain": 1.31933, + "BGain": 2.50981 + }, { + "name": "TL84", + "RGain": 1.9499, + "BGain": 1.66695 + }, { + "name": "D50", + "RGain": 1.71132, + "BGain": 2.14938 + }], + "lsUsedForEstimation_len": 3, + "alpha": 0.9 + }, + "lineRgBg": [-0.8395, -0.5434, -2.741], + "lineRgProjCCT": [1, -0.0003, 0.4559], + "chrAdpttAdj": { + "enable": 0, + "targetGain": [2.2099, 1, 1, 1.6302], + "laCalcFactor": 40 + }, + "remosaicCfg": { + "enable": 0, + "applyInvWbGainEnable": 1, + "sensorWbGain": [1, 1, 1, 1] + }, + "wbGainOffset": { + "enable": 0, + "offset": [0, 0, 0, 0] + } + } + }, + "agamma_calib": { + "GammaTuningPara": { + "Gamma_en": 1, + "Gamma_out_segnum": "GAMMATYPE_LOG", + "Gamma_out_offset": 0, + "Gamma_curve": [0, 6, 11, 17, 22, 28, 33, 39, 44, 55, 66, 77, 88, 109, 130, 150, 170, 210, 248, 286, 323, 393, 460, 525, 586, 702, 809, 909, 1002, 1172, 1325, 1462, 1588, 1811, 2004, 2174, 2327, 2590, 2813, 3006, 3177, 3467, 3708, 3915, 4095] + } + }, + "ablc_calib": { + "BlcTuningPara": { + "enable": 1, + "BLC_Data": { + "ISO": [50, 100, 200, 400, 800, 1600, 3200, 10000, 12800, 25600, 51200, 102400, 204800], + "ISO_len": 13, + "R_Channel": [255, 253, 255, 255, 254, 256, 256, 256, 256, 256, 256, 256, 256], + "R_Channel_len": 13, + "Gr_Channel": [256, 254, 256, 256, 257, 256, 256, 256, 256, 256, 256, 256, 256], + "Gr_Channel_len": 13, + "Gb_Channel": [256, 254, 256, 256, 257, 256, 256, 256, 256, 256, 256, 256, 256], + "Gb_Channel_len": 13, + "B_Channel": [255, 253, 255, 254, 254, 256, 256, 256, 256, 256, 256, 256, 256], + "B_Channel_len": 13 + } + } + }, + "adegamma_calib": { + "DegammaTuningPara": { + "degamma_en": 0, + "X_axis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "curve_R": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "curve_G": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "curve_B": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + } + }, + "agic_calib_v21": { + "GicTuningPara": { + "enable": 0, + "gr_ration": 0, + "GicData": { + "ISO": [50, 100, 200, 400, 800, 1600, 3200, 6400, 12800], + "ISO_len": 9, + "min_busy_thre": [40, 40, 40, 40, 40, 40, 40, 40, 40], + "min_busy_thre_len": 9, + "min_grad_thr1": [16, 16, 16, 16, 16, 16, 16, 16, 16], + "min_grad_thr1_len": 9, + "min_grad_thr2": [8, 8, 8, 8, 8, 8, 8, 8, 8], + "min_grad_thr2_len": 9, + "k_grad1": [64, 64, 64, 64, 64, 64, 64, 64, 64], + "k_grad1_len": 9, + "k_grad2": [2, 2, 2, 2, 2, 2, 2, 2, 2], + "k_grad2_len": 9, + "gb_thre": [32, 32, 32, 32, 32, 32, 32, 32, 32], + "gb_thre_len": 9, + "maxCorV": [10, 10, 10, 10, 10, 10, 10, 10, 10], + "maxCorV_len": 9, + "maxCorVboth": [20, 20, 20, 20, 20, 20, 20, 20, 20], + "maxCorVboth_len": 9, + "dark_thre": [120, 120, 120, 120, 120, 120, 120, 120, 120], + "dark_thre_len": 9, + "dark_threHi": [240, 240, 240, 240, 240, 240, 240, 240, 240], + "dark_threHi_len": 9, + "k_grad1_dark": [64, 64, 64, 64, 64, 64, 64, 64, 64], + "k_grad1_dark_len": 9, + "k_grad2_dark": [2, 2, 2, 2, 2, 2, 2, 2, 2], + "k_grad2_dark_len": 9, + "min_grad_thr_dark1": [16, 16, 16, 16, 16, 16, 16, 16, 16], + "min_grad_thr_dark1_len": 9, + "min_grad_thr_dark2": [8, 8, 8, 8, 8, 8, 8, 8, 8], + "min_grad_thr_dark2_len": 9, + "noiseCurve_0": [0, 0, 0, 0, 0, 0, 0, 0, 0], + "noiseCurve_0_len": 9, + "noiseCurve_1": [0, 0, 0, 0, 0, 0, 0, 0, 0], + "noiseCurve_1_len": 9, + "NoiseScale": [0, 0, 0, 0, 0, 0, 0, 0, 0], + "NoiseScale_len": 9, + "NoiseBase": [0, 0, 0, 0, 0, 0, 0, 0, 0], + "NoiseBase_len": 9, + "globalStrength": [1, 1, 1, 1, 1, 1, 1, 1, 1], + "globalStrength_len": 9, + "diff_clip": [32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767], + "diff_clip_len": 9 + } + } + }, + "adehaze_calib_v21": { + "DehazeTuningPara": { + "Enable": 1, + "cfg_alpha": 0, + "ByPassThr": 0, + "dehaze_setting": { + "en": 0, + "air_lc_en": 1, + "stab_fnum": 8, + "sigma": 6, + "wt_sigma": 8, + "air_sigma": 120, + "tmax_sigma": 0.01, + "pre_wet": 0.01, + "DehazeData": { + "EnvLv": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1], + "EnvLv_len": 9, + "dc_min_th": [64, 64, 64, 64, 64, 64, 64, 64, 64], + "dc_min_th_len": 9, + "dc_max_th": [192, 192, 192, 192, 192, 192, 192, 192, 192], + "dc_max_th_len": 9, + "yhist_th": [249, 249, 249, 249, 249, 249, 249, 249, 249], + "yhist_th_len": 9, + "yblk_th": [0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002, 0.002], + "yblk_th_len": 9, + "dark_th": [250, 250, 250, 250, 250, 250, 250, 250, 250], + "dark_th_len": 9, + "bright_min": [180, 180, 180, 180, 180, 180, 180, 180, 180], + "bright_min_len": 9, + "bright_max": [240, 240, 240, 240, 240, 240, 240, 240, 240], + "bright_max_len": 9, + "wt_max": [0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9], + "wt_max_len": 9, + "air_min": [200, 200, 200, 200, 200, 200, 200, 200, 200], + "air_min_len": 9, + "air_max": [250, 250, 250, 250, 250, 250, 250, 250, 250], + "air_max_len": 9, + "tmax_base": [125, 125, 125, 125, 125, 125, 125, 125, 125], + "tmax_base_len": 9, + "tmax_off": [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], + "tmax_off_len": 9, + "tmax_max": [0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8], + "tmax_max_len": 9, + "cfg_wt": [0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8], + "cfg_wt_len": 9, + "cfg_air": [210, 210, 210, 210, 210, 210, 210, 210, 210], + "cfg_air_len": 9, + "cfg_tmax": [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2], + "cfg_tmax_len": 9, + "dc_weitcur": [1, 1, 1, 1, 1, 1, 1, 1, 1], + "dc_weitcur_len": 9, + "bf_weight": [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5], + "bf_weight_len": 9, + "range_sigma": [0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14], + "range_sigma_len": 9, + "space_sigma_pre": [0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14], + "space_sigma_pre_len": 9, + "space_sigma_cur": [0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14], + "space_sigma_cur_len": 9 + } + }, + "enhance_setting": { + "en": 1, + "enhance_curve": [0, 64, 128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1023], + "EnhanceData": { + "EnvLv": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1], + "EnvLv_len": 9, + "enhance_value": [1.15, 1.15, 1.15, 1.12, 1.12, 1.12, 1.1, 1.1, 1], + "enhance_value_len": 9, + "enhance_chroma": [1.5, 1.4, 1.3, 1.2, 1.2, 1.2, 1.1, 1.1, 1], + "enhance_chroma_len": 9 + } + }, + "hist_setting": { + "en": 0, + "hist_para_en": 1, + "HistData": { + "EnvLv": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.9, 1], + "EnvLv_len": 9, + "hist_gratio": [2, 2, 2, 2, 2, 2, 2, 2, 2], + "hist_gratio_len": 9, + "hist_th_off": [64, 64, 64, 64, 64, 64, 64, 64, 64], + "hist_th_off_len": 9, + "hist_k": [2, 2, 2, 2, 2, 2, 2, 2, 2], + "hist_k_len": 9, + "hist_min": [0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015, 0.015], + "hist_min_len": 9, + "hist_scale": [0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09], + "hist_scale_len": 9, + "cfg_gratio": [2, 2, 2, 2, 2, 2, 2, 2, 2], + "cfg_gratio_len": 9 + } + } + } + }, + "adpcc_calib": { + "DpccTuningPara": { + "Enable": 1, + "Fast_Mode": { + "Fast_mode_en": 0, + "Single_enable": 0, + "Double_enable": 0, + "Triple_enable": 0, + "Fast_Data": { + "ISO": [50, 100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600, 51200, 102400, 204800], + "ISO_len": 13, + "Single_level": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "Single_level_len": 13, + "Double_level": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "Double_level_len": 13, + "Triple_level": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "Triple_level_len": 13 + } + }, + "Expert_Mode": { + "stage1_Enable": 1, + "grayscale_mode": 0, + "dpcc_out_sel": 1, + "stage1_g_3x3": 0, + "stage1_rb_3x3": 0, + "stage1_inc_rb_center": 1, + "stage1_inc_g_center": 1, + "rk_out_sel": 1, + "SetEnable": { + "ISO": [50, 100, 200, 400, 800, 1500, 1507, 1510, 3200, 6400, 12800, 102400, 204800], + "fix_set": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "set1": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "set2": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "set3": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "set1": { + "RK": { + "RK_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "g_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_min": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_max": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "LC": { + "LC_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_line_thr": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "g_line_thr": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "rb_line_mad_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_line_mad_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] + }, + "PG": { + "PG_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_pg_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_pg_fac": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + }, + "RND": { + "RND_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_rnd_thr": [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10], + "g_rnd_thr": [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10], + "rb_rnd_offs": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + "g_rnd_offs": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + }, + "RG": { + "RG_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_rg_fac": [32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32], + "g_rg_fac": [32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32] + }, + "RO": { + "RO_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_ro_lim": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + "g_ro_lim": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + } + }, + "set2": { + "RK": { + "RK_enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "rb_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "g_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_min": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_max": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "LC": { + "LC_enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "rb_line_thr": [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], + "g_line_thr": [24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24], + "rb_line_mad_fac": [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], + "g_line_mad_fac": [12, 12, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, + "PG": { + "PG_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_pg_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_pg_fac": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + }, + "RND": { + "RND_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_rnd_thr": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "g_rnd_thr": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "rb_rnd_offs": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "g_rnd_offs": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "RG": { + "RG_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_rg_fac": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "g_rg_fac": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8] + }, + "RO": { + "RO_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_ro_lim": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "g_ro_lim": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + } + }, + "set3": { + "RK": { + "RK_enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "rb_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "g_sw_mindis": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_min": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "sw_dis_scale_max": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + "LC": { + "LC_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_line_thr": [32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32], + "g_line_thr": [32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32], + "rb_line_mad_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_line_mad_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] + }, + "PG": { + "PG_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_pg_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_pg_fac": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + }, + "RND": { + "RND_enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "rb_rnd_thr": [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8], + "g_rnd_thr": [6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6], + "rb_rnd_offs": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3], + "g_rnd_offs": [3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3] + }, + "RG": { + "RG_enable": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "rb_rg_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4], + "g_rg_fac": [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4] + }, + "RO": { + "RO_enable": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "rb_ro_lim": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], + "g_ro_lim": [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2] + } + } + }, + "Dpcc_pdaf": { + "en": 0, + "point_en": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "offsetx": 0, + "offsety": 0, + "wrapx": 0, + "wrapy": 0, + "wrapx_num": 0, + "wrapy_num": 0, + "point_x": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "point_y": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "forward_med": 0 + }, + "Sensor_dpcc": { + "sensor_dpcc_auto_en": 0, + "max_level": 20, + "SensorDpcc_Data": { + "ISO": [50, 100, 200, 400, 800, 1500, 1507, 1510, 3200, 6400, 12800, 102400, 204800], + "ISO_len": 13, + "level_single": [19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19], + "level_single_len": 13, + "level_multiple": [19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19], + "level_multiple_len": 13 + } + } + } + }, + "amerge_calib": { + "MergeTuningPara": { + "OECurve": { + "EnvLv": [0, 0.005, 0.01, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1], + "EnvLv_len": 13, + "Smooth": [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4], + "Smooth_len": 13, + "Offset": [210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210], + "Offset_len": 13 + }, + "MDCurve": { + "MoveCoef": [0, 0.005, 0.01, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1], + "MoveCoef_len": 13, + "LM_smooth": [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4], + "LM_smooth_len": 13, + "LM_offset": [0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38], + "LM_offset_len": 13, + "MS_smooth": [0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4], + "MS_smooth_len": 13, + "MS_offset": [0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38, 0.38], + "MS_offset_len": 13 + }, + "ByPassThr": 0, + "OECurve_damp": 0.3, + "MDCurveLM_damp": 0.3, + "MDCurveMS_damp": 0.3 + } + }, + "adrc_calib": { + "DrcTuningPara": { + "Enable": 0, + "DrcGain": { + "EnvLv": [0, 0.005, 0.01, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1], + "EnvLv_len": 13, + "DrcGain": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "DrcGain_len": 13, + "Alpha": [0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2], + "Alpha_len": 13, + "Clip": [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16], + "Clip_len": 13 + }, + "HiLight": { + "EnvLv": [0, 0.005, 0.01, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1], + "EnvLv_len": 13, + "Strength": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "Strength_len": 13 + }, + "LocalTMOSetting": { + "LocalTMOData": { + "EnvLv": [0, 0.005, 0.01, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.6, 0.8, 1], + "EnvLv_len": 13, + "LocalWeit": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + "LocalWeit_len": 13, + "GlobalContrast": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "GlobalContrast_len": 13, + "LoLitContrast": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "LoLitContrast_len": 13 + }, + "curPixWeit": 0.376471, + "preFrameWeit": 1, + "Range_force_sgm": 0, + "Range_sgm_cur": 0.125015, + "Range_sgm_pre": 0.125015, + "Space_sgm_cur": 4068, + "Space_sgm_pre": 3968 + }, + "CompressSetting": { + "Mode": "COMPRESS_AUTO", + "Manual_curve": [0, 558, 1087, 1588, 2063, 2515, 2944, 3353, 3744, 4473, 5139, 5751, 6316, 6838, 7322, 7772, 8192] + }, + "Scale_y": [0, 2, 20, 76, 193, 381, 631, 772, 919, 1066, 1211, 1479, 1700, 1863, 1968, 2024, 2048], + "ByPassThr": 0, + "Edge_Weit": 0.0627451, + "OutPutLongFrame": 0, + "IIR_frame": 16, + "Tolerance": 0, + "damp": 0.9 + } + }, + "cpsl": { + "param": { + "enable": 1, + "mode": "RK_AIQ_OP_MODE_AUTO", + "force_gray": 1, + "light_src": "LED", + "auto_adjust_sens": 50, + "auto_on2off_th": 3000, + "auto_off2on_th": 100, + "auto_sw_interval": 0, + "manual_on": 0, + "manual_strength": 100 + } + }, + "orb": { + "param": { + "orb_en": 0 + } + }, + "debayer": { + "param": { + "debayer_en": 1, + "debayer_filter1": [2, -6, 0, 6, -2], + "debayer_filter2": [2, -4, 4, -4, 2], + "debayer_gain_offset": 4, + "debayer_offset": 1, + "debayer_clip_en": 1, + "debayer_filter_g_en": 1, + "debayer_filter_c_en": 1, + "debayer_thed0": 3, + "debayer_thed1": 6, + "debayer_dist_scale": 8, + "debayer_cnr_strength": 5, + "debayer_shift_num": 2, + "array": { + "ISO": [50, 100, 200, 400, 800, 1600, 3200, 6400, 12800], + "sharp_strength": [4, 4, 4, 4, 4, 4, 4, 4, 4], + "debayer_hf_offset": [1, 1, 1, 1, 1, 1, 1, 1, 1] + } + } + }, + "cproc": { + "param": { + "enable": 1, + "brightness": 128, + "contrast": 128, + "saturation": 128, + "hue": 128 + } + }, + "ie": { + "param": { + "enable": 0, + "mode": 0 + } + }, + "lsc_v2": { + "common": { + "enable": 1, + "resolutionAll": [{ + "name": "3264x2448", + "lsc_sect_size_x": [204, 204, 204, 204, 204, 204, 204, 204], + "lsc_sect_size_y": [153, 153, 153, 153, 153, 153, 153, 153] + }], + "resolutionAll_len": 1 + }, + "alscCoef": { + "damp_enable": 1, + "illAll": [{ + "usedForCase": 0, + "name": "A", + "wbGain": [1.2422, 2.5859], + "tableUsed": [{ + "name": "A_100" + }, { + "name": "A_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [100, 100, 90, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "CWF", + "wbGain": [1.7163, 2.2709], + "tableUsed": [{ + "name": "CWF_100" + }, { + "name": "CWF_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [100, 100, 90, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "D50", + "wbGain": [2.0413, 1.565], + "tableUsed": [{ + "name": "D50_100" + }, { + "name": "D50_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [100, 100, 80, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "D65", + "wbGain": [2.1927, 1.4514], + "tableUsed": [{ + "name": "D65_100" + }, { + "name": "D65_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [90, 85, 80, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "D75", + "wbGain": [2.3467, 1.323], + "tableUsed": [{ + "name": "D75_100" + }, { + "name": "D75_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [90, 85, 80, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "HZ", + "wbGain": [0.9985, 3.0212], + "tableUsed": [{ + "name": "HZ_100" + }, { + "name": "HZ_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [100, 100, 90, 70], + "vig_len": 4 + }, { + "usedForCase": 0, + "name": "TL84", + "wbGain": [1.622, 2.3057], + "tableUsed": [{ + "name": "TL84_100" + }, { + "name": "TL84_70" + }], + "tableUsed_len": 2, + "gains": [1, 4, 6, 8], + "gains_len": 4, + "vig": [100, 100, 90, 70], + "vig_len": 4 + }, { + "usedForCase": 2, + "name": "GRAY", + "wbGain": [1, 1], + "tableUsed": [{ + "name": "GRAY_0" + }], + "tableUsed_len": 1, + "gains": [1, 10, 31, 64], + "gains_len": 4, + "vig": [90, 60, 25, 0], + "vig_len": 4 + }], + "illAll_len": 8 + }, + "tbl": { + "tableAll": [{ + "name": "3264x2448_A_100", + "resolution": "3264x2448", + "illumination": "A", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [4126, 3298, 2812, 2502, 2280, 2072, 1924, 1846, 1834, 1846, 1936, 2044, 2254, 2420, 2746, 3157, 4070, 3621, 3012, 2601, 2334, 2080, 1887, 1737, 1645, 1614, 1645, 1732, 1869, 2037, 2263, 2534, 2880, 3513, 3316, 2785, 2430, 2147, 1881, 1688, 1567, 1473, 1448, 1470, 1559, 1678, 1869, 2072, 2353, 2696, 3191, 3140, 2613, 2280, 1975, 1748, 1550, 1403, 1322, 1298, 1319, 1407, 1542, 1717, 1943, 2195, 2545, 3012, 3027, 2471, 2179, 1869, 1627, 1430, 1298, 1223, 1189, 1216, 1293, 1427, 1597, 1846, 2117, 2410, 2894, 2894, 2410, 2058, 1785, 1526, 1337, 1201, 1130, 1108, 1119, 1211, 1337, 1526, 1748, 2009, 2316, 2825, 2812, 2334, 2002, 1712, 1451, 1271, 1149, 1076, 1057, 1074, 1141, 1284, 1455, 1673, 1949, 2271, 2672, 2812, 2289, 1969, 1678, 1434, 1249, 1115, 1055, 1031, 1049, 1128, 1231, 1427, 1650, 1918, 2271, 2672, 2825, 2325, 1982, 1683, 1437, 1236, 1117, 1044, 1024, 1044, 1119, 1236, 1427, 1650, 1956, 2254, 2660, 2825, 2334, 2002, 1712, 1462, 1273, 1147, 1080, 1049, 1074, 1132, 1265, 1459, 1693, 1949, 2271, 2708, 2866, 2381, 2065, 1774, 1530, 1334, 1211, 1125, 1100, 1113, 1191, 1316, 1499, 1748, 2002, 2334, 2785, 3027, 2471, 2163, 1875, 1627, 1434, 1279, 1194, 1186, 1198, 1282, 1403, 1588, 1840, 2102, 2430, 2937, 3226, 2601, 2298, 1956, 1742, 1530, 1397, 1313, 1284, 1313, 1400, 1538, 1702, 1943, 2237, 2567, 3075, 3432, 2825, 2430, 2109, 1875, 1688, 1542, 1459, 1430, 1462, 1538, 1669, 1834, 2094, 2362, 2672, 3261, 3666, 2982, 2590, 2325, 2051, 1875, 1737, 1645, 1610, 1645, 1722, 1863, 2016, 2280, 2545, 2894, 3452, 4070, 3279, 2825, 2523, 2280, 2065, 1930, 1869, 1817, 1840, 1924, 2065, 2212, 2460, 2759, 3174, 4042, 5511, 3712, 3174, 2838, 2590, 2353, 2220, 2163, 2124, 2132, 2179, 2325, 2513, 2772, 3140, 3534, 5313] + }, + "lsc_samples_greenR": { + "uCoeff": [3693, 2996, 2530, 2306, 2054, 1929, 1805, 1724, 1696, 1708, 1801, 1879, 2025, 2196, 2421, 2834, 3566, 3264, 2749, 2366, 2107, 1899, 1753, 1654, 1576, 1559, 1569, 1636, 1737, 1865, 2031, 2271, 2611, 3059, 3021, 2530, 2202, 1976, 1770, 1618, 1507, 1434, 1401, 1417, 1486, 1593, 1720, 1889, 2089, 2405, 2890, 2812, 2351, 2071, 1837, 1650, 1486, 1385, 1315, 1278, 1303, 1359, 1459, 1618, 1779, 2003, 2264, 2649, 2649, 2257, 1976, 1733, 1542, 1398, 1274, 1203, 1183, 1201, 1256, 1369, 1504, 1681, 1904, 2157, 2556, 2593, 2163, 1889, 1654, 1451, 1289, 1191, 1128, 1099, 1118, 1189, 1292, 1434, 1614, 1837, 2071, 2437, 2521, 2150, 1856, 1600, 1398, 1254, 1141, 1080, 1054, 1072, 1120, 1231, 1385, 1556, 1770, 2042, 2437, 2462, 2132, 1814, 1576, 1380, 1229, 1120, 1050, 1024, 1046, 1109, 1217, 1354, 1542, 1762, 2020, 2328, 2495, 2125, 1823, 1572, 1374, 1217, 1109, 1052, 1027, 1037, 1104, 1219, 1354, 1542, 1766, 2025, 2336, 2574, 2138, 1837, 1614, 1403, 1256, 1139, 1075, 1054, 1075, 1120, 1231, 1382, 1569, 1796, 2083, 2389, 2630, 2189, 1904, 1669, 1462, 1292, 1181, 1116, 1101, 1116, 1177, 1296, 1431, 1632, 1860, 2132, 2478, 2749, 2271, 2003, 1724, 1552, 1385, 1263, 1206, 1168, 1185, 1263, 1364, 1504, 1704, 1934, 2202, 2574, 2913, 2397, 2083, 1837, 1654, 1495, 1377, 1306, 1272, 1306, 1359, 1480, 1621, 1801, 2014, 2285, 2749, 3034, 2556, 2250, 1965, 1779, 1618, 1498, 1425, 1409, 1442, 1504, 1603, 1745, 1939, 2157, 2454, 2867, 3339, 2834, 2374, 2157, 1945, 1779, 1650, 1589, 1569, 1593, 1636, 1762, 1904, 2089, 2314, 2639, 3138, 3730, 3046, 2649, 2314, 2101, 1950, 1832, 1762, 1733, 1766, 1823, 1929, 2071, 2271, 2521, 2924, 3602, 5113, 3401, 2913, 2556, 2314, 2132, 2025, 1976, 1934, 1987, 2065, 2157, 2314, 2512, 2823, 3264, 4974] + }, + "lsc_samples_greenB": { + "uCoeff": [3964, 3072, 2671, 2333, 2095, 1945, 1834, 1751, 1743, 1760, 1811, 1935, 2095, 2276, 2499, 2926, 3781, 3367, 2814, 2425, 2162, 1982, 1777, 1679, 1606, 1579, 1610, 1664, 1760, 1920, 2107, 2326, 2681, 3192, 3111, 2587, 2255, 2020, 1820, 1642, 1514, 1446, 1423, 1437, 1514, 1613, 1781, 1956, 2168, 2482, 2973, 2926, 2441, 2143, 1876, 1679, 1520, 1407, 1326, 1300, 1326, 1388, 1514, 1635, 1839, 2065, 2348, 2731, 2772, 2341, 2037, 1777, 1582, 1412, 1287, 1221, 1205, 1225, 1284, 1410, 1565, 1739, 1966, 2234, 2652, 2681, 2241, 1961, 1699, 1489, 1331, 1221, 1143, 1122, 1141, 1201, 1326, 1466, 1672, 1895, 2162, 2542, 2551, 2201, 1910, 1646, 1446, 1280, 1148, 1095, 1065, 1081, 1152, 1267, 1418, 1603, 1834, 2089, 2482, 2569, 2168, 1871, 1610, 1399, 1245, 1129, 1061, 1040, 1052, 1122, 1241, 1396, 1589, 1807, 2083, 2417, 2534, 2137, 1867, 1613, 1407, 1237, 1127, 1065, 1024, 1061, 1112, 1231, 1376, 1572, 1811, 2071, 2402, 2569, 2168, 1895, 1638, 1423, 1265, 1145, 1079, 1061, 1081, 1133, 1254, 1391, 1599, 1830, 2107, 2482, 2633, 2221, 1971, 1687, 1486, 1310, 1183, 1114, 1104, 1117, 1183, 1296, 1460, 1661, 1890, 2168, 2499, 2761, 2297, 2014, 1760, 1542, 1383, 1262, 1189, 1172, 1189, 1260, 1365, 1511, 1719, 1950, 2227, 2643, 2914, 2433, 2107, 1857, 1642, 1486, 1363, 1280, 1265, 1280, 1360, 1469, 1631, 1820, 2042, 2333, 2731, 3151, 2569, 2214, 1982, 1777, 1603, 1480, 1407, 1381, 1410, 1480, 1599, 1731, 1940, 2201, 2482, 2949, 3321, 2772, 2402, 2119, 1910, 1747, 1631, 1575, 1536, 1555, 1631, 1735, 1895, 2089, 2326, 2643, 3151, 3742, 3009, 2560, 2290, 2065, 1900, 1785, 1723, 1687, 1723, 1777, 1910, 2037, 2241, 2508, 2914, 3579, 5016, 3367, 2937, 2560, 2326, 2150, 2020, 1935, 1935, 1966, 2009, 2125, 2318, 2474, 2836, 3248, 5016] + }, + "lsc_samples_blue": { + "uCoeff": [3507, 2733, 2331, 2107, 1884, 1823, 1704, 1617, 1654, 1654, 1704, 1767, 1896, 2138, 2331, 2707, 3422, 2930, 2516, 2154, 1948, 1778, 1654, 1538, 1506, 1514, 1522, 1572, 1635, 1767, 1896, 2138, 2472, 2930, 2787, 2293, 2017, 1847, 1654, 1530, 1437, 1388, 1362, 1388, 1430, 1514, 1635, 1789, 1989, 2275, 2682, 2494, 2204, 1909, 1704, 1538, 1444, 1324, 1276, 1265, 1265, 1336, 1437, 1538, 1683, 1884, 2138, 2584, 2451, 2076, 1835, 1617, 1459, 1324, 1248, 1181, 1162, 1201, 1254, 1324, 1459, 1635, 1801, 2032, 2369, 2331, 1989, 1735, 1563, 1395, 1254, 1171, 1121, 1121, 1130, 1167, 1259, 1395, 1555, 1735, 1948, 2204, 2239, 1935, 1724, 1514, 1330, 1216, 1125, 1086, 1058, 1095, 1130, 1222, 1355, 1506, 1693, 1909, 2222, 2204, 1909, 1674, 1498, 1312, 1191, 1099, 1062, 1024, 1062, 1116, 1191, 1324, 1482, 1664, 1884, 2138, 2204, 1909, 1664, 1467, 1306, 1176, 1091, 1047, 1024, 1043, 1108, 1186, 1324, 1444, 1664, 1884, 2222, 2204, 1909, 1683, 1498, 1324, 1181, 1108, 1078, 1028, 1050, 1108, 1211, 1330, 1467, 1664, 1884, 2154, 2257, 1989, 1745, 1530, 1355, 1254, 1134, 1082, 1082, 1078, 1143, 1227, 1336, 1506, 1683, 1935, 2171, 2389, 2003, 1801, 1581, 1423, 1300, 1201, 1130, 1108, 1162, 1181, 1276, 1430, 1589, 1778, 2032, 2331, 2516, 2122, 1859, 1674, 1506, 1381, 1265, 1216, 1191, 1222, 1271, 1375, 1498, 1664, 1847, 2076, 2430, 2707, 2293, 1975, 1745, 1589, 1459, 1381, 1312, 1300, 1330, 1375, 1452, 1572, 1724, 1909, 2154, 2584, 2787, 2430, 2107, 1871, 1693, 1589, 1506, 1452, 1416, 1437, 1482, 1581, 1683, 1835, 2017, 2331, 2871, 3382, 2632, 2312, 2003, 1823, 1724, 1617, 1563, 1522, 1563, 1607, 1704, 1801, 1975, 2222, 2516, 3157, 4435, 2930, 2584, 2138, 1962, 1884, 1778, 1704, 1704, 1704, 1724, 1859, 1935, 2154, 2472, 2842, 4301] + } + }, { + "name": "3264x2448_A_70", + "resolution": "3264x2448", + "illumination": "A", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [3195, 2722, 2425, 2228, 2080, 1926, 1812, 1751, 1743, 1751, 1822, 1902, 2058, 2161, 2373, 2617, 3156, 2914, 2556, 2297, 2123, 1937, 1788, 1666, 1589, 1563, 1589, 1662, 1772, 1900, 2063, 2243, 2454, 2835, 2740, 2417, 2188, 1990, 1784, 1627, 1525, 1443, 1421, 1440, 1518, 1618, 1773, 1925, 2125, 2347, 2647, 2646, 2309, 2087, 1859, 1679, 1511, 1381, 1308, 1286, 1305, 1385, 1504, 1651, 1831, 2015, 2254, 2548, 2588, 2215, 2018, 1779, 1579, 1407, 1287, 1217, 1184, 1210, 1282, 1404, 1552, 1758, 1965, 2165, 2484, 2505, 2181, 1926, 1713, 1492, 1323, 1196, 1128, 1107, 1117, 1206, 1323, 1492, 1679, 1883, 2102, 2450, 2454, 2128, 1885, 1653, 1426, 1262, 1146, 1075, 1057, 1073, 1139, 1275, 1430, 1617, 1839, 2075, 2342, 2462, 2096, 1861, 1625, 1412, 1242, 1114, 1055, 1031, 1049, 1126, 1225, 1406, 1599, 1816, 2081, 2350, 2476, 2129, 1874, 1631, 1416, 1230, 1116, 1044, 1024, 1044, 1118, 1230, 1406, 1600, 1851, 2068, 2343, 2473, 2134, 1890, 1656, 1439, 1265, 1145, 1080, 1049, 1074, 1130, 1258, 1436, 1639, 1843, 2081, 2379, 2497, 2167, 1941, 1709, 1500, 1323, 1207, 1124, 1099, 1112, 1188, 1305, 1471, 1686, 1885, 2128, 2432, 2610, 2232, 2018, 1794, 1587, 1415, 1272, 1191, 1183, 1195, 1274, 1386, 1550, 1763, 1964, 2197, 2539, 2743, 2322, 2121, 1857, 1685, 1501, 1381, 1304, 1276, 1304, 1384, 1508, 1648, 1845, 2068, 2294, 2625, 2869, 2481, 2214, 1977, 1794, 1639, 1512, 1438, 1412, 1441, 1508, 1622, 1757, 1964, 2156, 2357, 2738, 3002, 2573, 2321, 2143, 1935, 1797, 1682, 1603, 1572, 1603, 1668, 1786, 1904, 2104, 2284, 2504, 2842, 3240, 2762, 2478, 2281, 2110, 1946, 1840, 1793, 1748, 1766, 1835, 1946, 2052, 2229, 2425, 2681, 3220, 4165, 3031, 2709, 2502, 2340, 2168, 2071, 2031, 2000, 2004, 2035, 2144, 2275, 2448, 2682, 2898, 4026] + }, + "lsc_samples_greenR": { + "uCoeff": [2892, 2497, 2204, 2068, 1890, 1803, 1708, 1643, 1620, 1629, 1704, 1760, 1865, 1979, 2119, 2376, 2803, 2654, 2353, 2107, 1932, 1781, 1670, 1591, 1526, 1512, 1520, 1575, 1656, 1751, 1869, 2031, 2247, 2505, 2519, 2216, 2000, 1843, 1685, 1563, 1470, 1406, 1377, 1390, 1450, 1541, 1641, 1768, 1906, 2117, 2421, 2394, 2097, 1910, 1738, 1591, 1452, 1364, 1301, 1267, 1290, 1340, 1427, 1562, 1687, 1852, 2027, 2269, 2293, 2039, 1843, 1657, 1501, 1376, 1264, 1197, 1178, 1195, 1246, 1349, 1466, 1611, 1782, 1957, 2220, 2266, 1974, 1779, 1594, 1422, 1277, 1186, 1126, 1098, 1116, 1184, 1280, 1406, 1558, 1733, 1898, 2143, 2221, 1973, 1757, 1550, 1376, 1246, 1139, 1079, 1054, 1071, 1118, 1223, 1364, 1510, 1681, 1882, 2154, 2181, 1963, 1724, 1531, 1361, 1223, 1119, 1050, 1024, 1046, 1108, 1211, 1336, 1500, 1678, 1868, 2073, 2210, 1959, 1733, 1529, 1356, 1211, 1108, 1052, 1027, 1037, 1103, 1213, 1337, 1501, 1682, 1874, 2082, 2271, 1968, 1744, 1566, 1383, 1249, 1137, 1075, 1054, 1075, 1119, 1225, 1363, 1525, 1708, 1922, 2122, 2308, 2006, 1799, 1613, 1436, 1282, 1178, 1115, 1100, 1115, 1174, 1286, 1407, 1580, 1760, 1958, 2187, 2390, 2065, 1878, 1658, 1517, 1369, 1256, 1202, 1166, 1182, 1256, 1349, 1472, 1640, 1818, 2007, 2251, 2499, 2154, 1936, 1750, 1604, 1468, 1362, 1297, 1265, 1297, 1345, 1454, 1574, 1718, 1876, 2062, 2371, 2564, 2263, 2061, 1851, 1708, 1574, 1471, 1406, 1392, 1422, 1476, 1561, 1677, 1828, 1983, 2181, 2436, 2758, 2456, 2142, 1998, 1841, 1709, 1602, 1551, 1534, 1554, 1589, 1694, 1804, 1940, 2092, 2302, 2607, 2993, 2582, 2336, 2106, 1956, 1844, 1752, 1695, 1671, 1699, 1744, 1826, 1930, 2070, 2233, 2488, 2900, 3886, 2799, 2504, 2272, 2108, 1978, 1900, 1866, 1832, 1876, 1935, 1999, 2108, 2236, 2434, 2697, 3789] + }, + "lsc_samples_greenB": { + "uCoeff": [3082, 2553, 2314, 2090, 1924, 1817, 1733, 1667, 1662, 1675, 1713, 1808, 1924, 2044, 2180, 2444, 2954, 2729, 2403, 2155, 1979, 1853, 1691, 1614, 1554, 1531, 1557, 1600, 1676, 1799, 1932, 2075, 2301, 2602, 2587, 2261, 2044, 1881, 1730, 1585, 1476, 1417, 1397, 1409, 1476, 1559, 1695, 1826, 1971, 2178, 2484, 2482, 2170, 1971, 1772, 1617, 1484, 1385, 1311, 1288, 1311, 1367, 1478, 1577, 1740, 1905, 2095, 2332, 2389, 2108, 1896, 1697, 1538, 1390, 1276, 1215, 1200, 1219, 1273, 1388, 1522, 1663, 1835, 2020, 2295, 2336, 2040, 1841, 1635, 1458, 1317, 1215, 1141, 1120, 1139, 1196, 1312, 1436, 1611, 1784, 1974, 2226, 2245, 2016, 1804, 1592, 1421, 1271, 1145, 1094, 1065, 1080, 1149, 1258, 1395, 1553, 1737, 1921, 2190, 2267, 1994, 1774, 1563, 1379, 1238, 1127, 1061, 1040, 1052, 1121, 1234, 1376, 1543, 1718, 1922, 2145, 2241, 1969, 1772, 1566, 1387, 1231, 1126, 1065, 1024, 1061, 1111, 1225, 1358, 1529, 1722, 1913, 2135, 2267, 1994, 1796, 1588, 1402, 1258, 1143, 1079, 1061, 1081, 1131, 1247, 1372, 1552, 1738, 1942, 2197, 2311, 2033, 1858, 1630, 1459, 1300, 1180, 1113, 1103, 1116, 1180, 1286, 1435, 1606, 1787, 1988, 2204, 2399, 2086, 1888, 1690, 1507, 1367, 1255, 1186, 1170, 1186, 1253, 1350, 1478, 1653, 1832, 2028, 2306, 2499, 2184, 1956, 1768, 1593, 1459, 1349, 1272, 1258, 1272, 1346, 1443, 1583, 1735, 1900, 2102, 2357, 2654, 2274, 2031, 1865, 1706, 1561, 1454, 1388, 1365, 1391, 1454, 1557, 1664, 1829, 2020, 2203, 2499, 2744, 2407, 2165, 1966, 1810, 1680, 1584, 1538, 1503, 1519, 1584, 1669, 1796, 1940, 2102, 2305, 2617, 3002, 2554, 2264, 2086, 1925, 1800, 1709, 1660, 1629, 1660, 1702, 1809, 1900, 2045, 2222, 2480, 2883, 3818, 2774, 2523, 2275, 2118, 1993, 1896, 1830, 1832, 1857, 1886, 1972, 2112, 2205, 2444, 2685, 3818] + }, + "lsc_samples_blue": { + "uCoeff": [2762, 2300, 2048, 1906, 1747, 1712, 1619, 1548, 1583, 1581, 1619, 1664, 1757, 1932, 2048, 2281, 2703, 2411, 2174, 1936, 1799, 1676, 1582, 1487, 1463, 1471, 1477, 1518, 1565, 1667, 1755, 1923, 2140, 2411, 2344, 2028, 1846, 1732, 1583, 1483, 1405, 1363, 1340, 1363, 1399, 1469, 1566, 1682, 1823, 2014, 2266, 2151, 1978, 1773, 1621, 1489, 1413, 1307, 1264, 1254, 1253, 1318, 1407, 1489, 1603, 1752, 1925, 2220, 2138, 1890, 1722, 1554, 1425, 1307, 1239, 1176, 1158, 1195, 1244, 1307, 1425, 1570, 1693, 1854, 2074, 2059, 1829, 1644, 1512, 1370, 1244, 1167, 1119, 1119, 1128, 1163, 1248, 1370, 1505, 1644, 1795, 1958, 1996, 1792, 1641, 1472, 1312, 1209, 1123, 1085, 1058, 1094, 1128, 1215, 1336, 1464, 1613, 1770, 1982, 1973, 1774, 1600, 1460, 1297, 1186, 1098, 1062, 1024, 1062, 1115, 1186, 1308, 1445, 1591, 1753, 1920, 1975, 1775, 1592, 1432, 1292, 1172, 1090, 1047, 1024, 1043, 1107, 1181, 1309, 1411, 1592, 1754, 1990, 1973, 1774, 1608, 1460, 1308, 1176, 1107, 1078, 1028, 1050, 1107, 1205, 1314, 1431, 1591, 1753, 1933, 2010, 1837, 1659, 1486, 1336, 1246, 1132, 1081, 1082, 1077, 1141, 1220, 1318, 1464, 1604, 1792, 1941, 2105, 1841, 1702, 1528, 1396, 1288, 1196, 1128, 1107, 1159, 1176, 1265, 1403, 1536, 1682, 1865, 2059, 2189, 1928, 1743, 1605, 1468, 1360, 1255, 1210, 1186, 1216, 1261, 1355, 1460, 1596, 1732, 1890, 2122, 2314, 2050, 1829, 1657, 1536, 1427, 1360, 1298, 1288, 1315, 1355, 1421, 1520, 1639, 1773, 1938, 2220, 2344, 2137, 1921, 1752, 1617, 1537, 1469, 1423, 1391, 1409, 1447, 1530, 1608, 1722, 1846, 2058, 2407, 2740, 2263, 2064, 1845, 1715, 1644, 1558, 1514, 1479, 1514, 1549, 1626, 1696, 1822, 1991, 2174, 2576, 3412, 2447, 2246, 1932, 1812, 1764, 1684, 1625, 1627, 1625, 1637, 1743, 1790, 1945, 2158, 2382, 3318] + } + }, { + "name": "3264x2448_CWF_100", + "resolution": "3264x2448", + "illumination": "CWF", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [3843, 2836, 2410, 2174, 2021, 1861, 1718, 1682, 1654, 1740, 1740, 1861, 1961, 2163, 2469, 2739, 3569, 3224, 2721, 2273, 2021, 1853, 1696, 1595, 1545, 1499, 1499, 1614, 1696, 1803, 1961, 2210, 2532, 3076, 2877, 2410, 2106, 1879, 1740, 1576, 1466, 1390, 1376, 1405, 1450, 1545, 1682, 1853, 2021, 2367, 2836, 2739, 2286, 1991, 1763, 1614, 1435, 1348, 1291, 1255, 1275, 1339, 1450, 1557, 1755, 1952, 2248, 2667, 2667, 2174, 1906, 1696, 1493, 1362, 1263, 1188, 1171, 1181, 1243, 1348, 1477, 1661, 1861, 2084, 2485, 2516, 2106, 1853, 1601, 1435, 1300, 1177, 1106, 1088, 1121, 1181, 1287, 1435, 1563, 1811, 2052, 2395, 2485, 2041, 1779, 1557, 1395, 1239, 1125, 1076, 1065, 1076, 1134, 1243, 1395, 1516, 1763, 2021, 2312, 2410, 2041, 1779, 1563, 1362, 1209, 1094, 1032, 1024, 1040, 1097, 1199, 1348, 1510, 1718, 1961, 2367, 2469, 2021, 1787, 1576, 1366, 1202, 1103, 1048, 1037, 1040, 1112, 1199, 1362, 1534, 1718, 1991, 2326, 2395, 2052, 1827, 1576, 1390, 1251, 1125, 1076, 1054, 1062, 1134, 1220, 1380, 1545, 1740, 1991, 2395, 2532, 2106, 1853, 1614, 1419, 1279, 1160, 1112, 1097, 1112, 1177, 1287, 1419, 1582, 1803, 2052, 2410, 2631, 2210, 1906, 1696, 1516, 1376, 1251, 1171, 1167, 1167, 1239, 1352, 1466, 1661, 1879, 2140, 2469, 2836, 2312, 2021, 1779, 1640, 1466, 1362, 1255, 1243, 1300, 1348, 1445, 1563, 1763, 1952, 2235, 2667, 2962, 2367, 2084, 1879, 1732, 1595, 1450, 1376, 1390, 1380, 1450, 1545, 1682, 1861, 2073, 2367, 2962, 3224, 2667, 2235, 2041, 1853, 1682, 1601, 1534, 1516, 1510, 1582, 1710, 1827, 1981, 2198, 2532, 3007, 3569, 2877, 2469, 2210, 2011, 1906, 1732, 1674, 1682, 1710, 1755, 1827, 1933, 2140, 2410, 2739, 3476, 4992, 3224, 2721, 2439, 2286, 2073, 1952, 1933, 1879, 1879, 1981, 2073, 2198, 2395, 2580, 3148, 4931] + }, + "lsc_samples_greenR": { + "uCoeff": [3573, 2847, 2513, 2213, 2018, 1875, 1764, 1665, 1626, 1653, 1750, 1810, 1983, 2124, 2407, 2778, 3555, 3104, 2619, 2264, 2036, 1864, 1715, 1603, 1528, 1491, 1528, 1570, 1653, 1796, 1983, 2213, 2532, 2983, 2847, 2459, 2092, 1906, 1737, 1559, 1444, 1386, 1364, 1386, 1444, 1531, 1669, 1820, 2036, 2334, 2733, 2800, 2295, 2018, 1764, 1581, 1444, 1335, 1295, 1264, 1271, 1324, 1426, 1549, 1707, 1955, 2213, 2532, 2570, 2164, 1922, 1682, 1501, 1353, 1254, 1187, 1165, 1165, 1247, 1327, 1466, 1626, 1834, 2105, 2513, 2504, 2092, 1834, 1614, 1409, 1290, 1175, 1127, 1108, 1116, 1159, 1257, 1397, 1570, 1791, 2024, 2366, 2459, 2054, 1782, 1592, 1378, 1230, 1132, 1079, 1047, 1059, 1114, 1206, 1353, 1518, 1737, 1983, 2287, 2416, 2060, 1764, 1528, 1353, 1206, 1105, 1056, 1036, 1043, 1100, 1199, 1324, 1501, 1715, 1983, 2310, 2407, 2079, 1764, 1549, 1353, 1204, 1103, 1052, 1024, 1047, 1105, 1193, 1324, 1508, 1715, 1983, 2295, 2477, 2079, 1806, 1577, 1378, 1230, 1132, 1075, 1056, 1079, 1116, 1216, 1361, 1528, 1750, 1989, 2366, 2486, 2164, 1880, 1626, 1418, 1275, 1171, 1100, 1086, 1119, 1165, 1261, 1403, 1599, 1806, 2042, 2416, 2629, 2213, 1955, 1702, 1488, 1356, 1247, 1169, 1159, 1171, 1236, 1353, 1472, 1653, 1875, 2144, 2532, 2766, 2318, 2054, 1791, 1622, 1454, 1353, 1268, 1261, 1268, 1335, 1435, 1570, 1750, 1966, 2264, 2570, 2945, 2504, 2171, 1922, 1728, 1581, 1447, 1397, 1348, 1378, 1457, 1570, 1677, 1875, 2073, 2390, 2744, 3104, 2701, 2318, 2092, 1849, 1728, 1622, 1549, 1511, 1549, 1603, 1707, 1810, 2036, 2264, 2570, 2932, 3573, 2970, 2541, 2228, 2018, 1859, 1782, 1702, 1694, 1694, 1741, 1864, 1983, 2192, 2450, 2800, 3465, 4699, 3299, 2847, 2513, 2287, 2105, 2006, 1927, 1864, 1955, 1983, 2036, 2206, 2450, 2733, 3191, 4866] + }, + "lsc_samples_greenB": { + "uCoeff": [3658, 2936, 2478, 2207, 2012, 1874, 1763, 1660, 1636, 1697, 1758, 1854, 1994, 2178, 2383, 2826, 3437, 3167, 2725, 2335, 2048, 1884, 1714, 1610, 1537, 1507, 1534, 1594, 1689, 1844, 2030, 2243, 2562, 3040, 2923, 2469, 2158, 1949, 1745, 1562, 1458, 1393, 1365, 1374, 1449, 1551, 1685, 1844, 2098, 2359, 2838, 2792, 2288, 2012, 1791, 1621, 1443, 1349, 1283, 1267, 1279, 1341, 1425, 1555, 1723, 1977, 2228, 2611, 2611, 2280, 1949, 1710, 1523, 1365, 1253, 1188, 1165, 1188, 1251, 1336, 1474, 1664, 1874, 2138, 2552, 2533, 2165, 1874, 1617, 1434, 1283, 1188, 1118, 1116, 1116, 1161, 1267, 1413, 1583, 1791, 2018, 2400, 2443, 2098, 1829, 1555, 1390, 1239, 1148, 1077, 1070, 1065, 1121, 1209, 1368, 1534, 1736, 2012, 2335, 2409, 2054, 1791, 1555, 1349, 1196, 1101, 1057, 1030, 1040, 1105, 1200, 1341, 1513, 1702, 1960, 2303, 2409, 2054, 1772, 1565, 1341, 1200, 1105, 1048, 1024, 1044, 1105, 1188, 1331, 1494, 1723, 1977, 2288, 2478, 2073, 1814, 1576, 1376, 1230, 1118, 1056, 1040, 1062, 1116, 1219, 1360, 1534, 1723, 2048, 2383, 2524, 2124, 1869, 1617, 1422, 1253, 1150, 1094, 1081, 1086, 1159, 1257, 1393, 1565, 1786, 2054, 2400, 2641, 2185, 1905, 1685, 1487, 1341, 1232, 1165, 1133, 1154, 1215, 1336, 1477, 1621, 1859, 2124, 2478, 2662, 2288, 2018, 1772, 1606, 1416, 1331, 1246, 1237, 1253, 1298, 1407, 1572, 1736, 1977, 2228, 2621, 2936, 2443, 2138, 1874, 1689, 1534, 1431, 1352, 1323, 1352, 1422, 1534, 1664, 1859, 2105, 2351, 2704, 3167, 2641, 2280, 2000, 1814, 1697, 1565, 1497, 1462, 1487, 1565, 1664, 1805, 2018, 2228, 2552, 2974, 3508, 2874, 2496, 2165, 2000, 1859, 1723, 1652, 1636, 1652, 1697, 1805, 1994, 2118, 2409, 2769, 3403, 4921, 3167, 2736, 2533, 2199, 2048, 1960, 1900, 1829, 1854, 1977, 2030, 2138, 2383, 2693, 3000, 4750] + }, + "lsc_samples_blue": { + "uCoeff": [3130, 2548, 2211, 1953, 1739, 1609, 1627, 1551, 1512, 1528, 1609, 1672, 1700, 1916, 2118, 2465, 3036, 2783, 2313, 1966, 1801, 1609, 1535, 1454, 1387, 1406, 1413, 1468, 1528, 1627, 1791, 1928, 2261, 2733, 2592, 2164, 1892, 1681, 1528, 1433, 1350, 1309, 1275, 1275, 1350, 1413, 1551, 1653, 1823, 2046, 2406, 2349, 1992, 1759, 1601, 1426, 1338, 1244, 1199, 1190, 1214, 1254, 1309, 1433, 1584, 1759, 1953, 2313, 2244, 1892, 1681, 1535, 1393, 1259, 1171, 1162, 1132, 1149, 1176, 1254, 1387, 1482, 1635, 1869, 2133, 2133, 1834, 1627, 1482, 1332, 1190, 1136, 1099, 1075, 1079, 1132, 1209, 1309, 1433, 1601, 1801, 2089, 2074, 1801, 1609, 1447, 1275, 1171, 1099, 1045, 1024, 1064, 1087, 1162, 1270, 1374, 1535, 1770, 2074, 1992, 1759, 1575, 1406, 1270, 1145, 1068, 1035, 1024, 1031, 1068, 1149, 1239, 1387, 1551, 1729, 2005, 2032, 1770, 1551, 1393, 1254, 1149, 1064, 1042, 1031, 1024, 1056, 1132, 1244, 1393, 1551, 1739, 2074, 2089, 1801, 1575, 1406, 1254, 1149, 1068, 1042, 1031, 1031, 1068, 1149, 1259, 1387, 1535, 1791, 2032, 2089, 1834, 1584, 1433, 1292, 1209, 1111, 1064, 1053, 1068, 1107, 1176, 1275, 1406, 1601, 1770, 2089, 2261, 1869, 1653, 1454, 1332, 1239, 1149, 1111, 1079, 1087, 1158, 1224, 1309, 1454, 1627, 1857, 2180, 2313, 1966, 1729, 1559, 1406, 1303, 1224, 1190, 1158, 1171, 1209, 1309, 1393, 1528, 1700, 1916, 2244, 2406, 2089, 1834, 1627, 1505, 1393, 1303, 1254, 1254, 1244, 1303, 1368, 1505, 1609, 1770, 1992, 2406, 2592, 2261, 1953, 1770, 1584, 1490, 1393, 1368, 1332, 1356, 1393, 1433, 1584, 1700, 1916, 2164, 2548, 2890, 2425, 2133, 1869, 1681, 1601, 1512, 1468, 1454, 1454, 1490, 1584, 1681, 1834, 2032, 2406, 2890, 3952, 2708, 2368, 2005, 1892, 1729, 1653, 1584, 1627, 1575, 1601, 1759, 1823, 2005, 2180, 2592, 4004] + } + }, { + "name": "3264x2448_CWF_70", + "resolution": "3264x2448", + "illumination": "CWF", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [2997, 2377, 2110, 1961, 1862, 1745, 1632, 1606, 1583, 1657, 1651, 1745, 1812, 1952, 2156, 2305, 2806, 2625, 2332, 2032, 1860, 1741, 1619, 1538, 1498, 1458, 1456, 1555, 1619, 1698, 1810, 1982, 2186, 2517, 2412, 2121, 1920, 1759, 1659, 1525, 1432, 1365, 1353, 1379, 1417, 1497, 1607, 1737, 1850, 2087, 2381, 2338, 2045, 1842, 1673, 1558, 1405, 1329, 1278, 1245, 1263, 1321, 1419, 1507, 1666, 1809, 2014, 2283, 2307, 1971, 1783, 1624, 1456, 1343, 1253, 1183, 1167, 1176, 1234, 1329, 1441, 1593, 1745, 1897, 2165, 2205, 1927, 1747, 1546, 1407, 1288, 1173, 1104, 1087, 1119, 1176, 1275, 1407, 1512, 1711, 1882, 2110, 2192, 1881, 1689, 1511, 1373, 1231, 1123, 1075, 1065, 1075, 1132, 1235, 1373, 1474, 1675, 1864, 2054, 2139, 1886, 1693, 1519, 1344, 1203, 1093, 1032, 1024, 1040, 1096, 1194, 1331, 1471, 1639, 1818, 2104, 2189, 1871, 1701, 1532, 1348, 1197, 1102, 1048, 1037, 1040, 1111, 1194, 1345, 1494, 1640, 1845, 2074, 2127, 1895, 1735, 1531, 1371, 1244, 1123, 1076, 1054, 1062, 1132, 1214, 1361, 1503, 1658, 1844, 2127, 2230, 1936, 1754, 1563, 1396, 1270, 1157, 1111, 1096, 1111, 1174, 1277, 1396, 1534, 1710, 1890, 2132, 2296, 2014, 1793, 1632, 1483, 1360, 1244, 1168, 1165, 1164, 1233, 1337, 1436, 1601, 1770, 1955, 2168, 2439, 2084, 1882, 1699, 1591, 1441, 1348, 1248, 1237, 1291, 1334, 1421, 1520, 1684, 1823, 2021, 2307, 2509, 2110, 1921, 1775, 1665, 1553, 1425, 1359, 1373, 1363, 1425, 1507, 1620, 1759, 1912, 2110, 2509, 2671, 2324, 2027, 1899, 1759, 1621, 1557, 1499, 1484, 1477, 1539, 1647, 1736, 1847, 1996, 2217, 2509, 2876, 2452, 2191, 2019, 1878, 1805, 1662, 1615, 1625, 1648, 1682, 1735, 1810, 1960, 2143, 2346, 2808, 3802, 2667, 2354, 2177, 2085, 1927, 1837, 1828, 1783, 1780, 1862, 1927, 2011, 2141, 2243, 2610, 3759] + }, + "lsc_samples_greenR": { + "uCoeff": [2808, 2385, 2191, 1993, 1859, 1757, 1672, 1591, 1558, 1580, 1660, 1701, 1830, 1920, 2108, 2334, 2796, 2538, 2253, 2025, 1873, 1751, 1636, 1546, 1483, 1450, 1483, 1516, 1581, 1692, 1828, 1984, 2186, 2450, 2389, 2159, 1909, 1783, 1656, 1510, 1412, 1361, 1342, 1361, 1412, 1484, 1596, 1709, 1862, 2061, 2304, 2385, 2052, 1865, 1674, 1528, 1413, 1317, 1282, 1253, 1259, 1307, 1397, 1499, 1624, 1812, 1986, 2180, 2231, 1962, 1797, 1612, 1463, 1334, 1244, 1182, 1161, 1160, 1238, 1310, 1431, 1562, 1721, 1914, 2186, 2196, 1915, 1731, 1558, 1383, 1278, 1171, 1125, 1107, 1114, 1155, 1246, 1372, 1518, 1693, 1859, 2087, 2172, 1892, 1692, 1543, 1357, 1223, 1130, 1078, 1047, 1059, 1112, 1199, 1334, 1475, 1652, 1832, 2034, 2144, 1902, 1679, 1487, 1336, 1200, 1104, 1056, 1036, 1043, 1099, 1194, 1308, 1462, 1636, 1837, 2059, 2139, 1920, 1681, 1507, 1336, 1199, 1102, 1052, 1024, 1047, 1104, 1188, 1309, 1470, 1637, 1838, 2049, 2193, 1918, 1717, 1532, 1359, 1224, 1130, 1075, 1056, 1079, 1115, 1210, 1343, 1487, 1667, 1842, 2104, 2193, 1985, 1778, 1574, 1395, 1266, 1168, 1099, 1086, 1118, 1162, 1252, 1381, 1549, 1713, 1882, 2137, 2295, 2016, 1836, 1638, 1457, 1341, 1240, 1166, 1157, 1168, 1230, 1338, 1442, 1593, 1766, 1959, 2218, 2384, 2089, 1911, 1709, 1575, 1429, 1339, 1260, 1254, 1260, 1322, 1411, 1527, 1673, 1835, 2045, 2231, 2496, 2221, 1994, 1813, 1661, 1540, 1423, 1379, 1333, 1361, 1432, 1530, 1615, 1771, 1912, 2129, 2342, 2582, 2351, 2096, 1943, 1756, 1663, 1576, 1513, 1480, 1513, 1558, 1644, 1721, 1894, 2051, 2247, 2453, 2879, 2524, 2249, 2034, 1884, 1764, 1707, 1641, 1636, 1634, 1670, 1768, 1854, 2004, 2175, 2393, 2800, 3597, 2723, 2452, 2237, 2085, 1955, 1884, 1823, 1769, 1847, 1864, 1895, 2017, 2186, 2363, 2642, 3713] + }, + "lsc_samples_greenB": { + "uCoeff": [2868, 2452, 2163, 1988, 1854, 1756, 1671, 1587, 1567, 1619, 1667, 1738, 1839, 1964, 2089, 2370, 2713, 2583, 2335, 2082, 1883, 1768, 1635, 1552, 1491, 1465, 1488, 1537, 1613, 1733, 1868, 2008, 2209, 2491, 2446, 2167, 1963, 1820, 1663, 1512, 1425, 1368, 1343, 1350, 1416, 1502, 1610, 1729, 1914, 2080, 2382, 2379, 2046, 1860, 1698, 1564, 1412, 1330, 1270, 1256, 1267, 1323, 1396, 1505, 1638, 1830, 1998, 2240, 2263, 2058, 1820, 1637, 1483, 1345, 1243, 1183, 1161, 1183, 1241, 1318, 1438, 1596, 1756, 1941, 2217, 2219, 1976, 1766, 1561, 1406, 1271, 1183, 1116, 1114, 1114, 1157, 1256, 1387, 1530, 1693, 1853, 2113, 2159, 1929, 1733, 1509, 1369, 1231, 1145, 1076, 1070, 1065, 1119, 1202, 1348, 1490, 1651, 1857, 2072, 2138, 1897, 1703, 1512, 1332, 1191, 1100, 1057, 1030, 1040, 1104, 1195, 1324, 1473, 1625, 1817, 2053, 2140, 1899, 1688, 1522, 1325, 1195, 1104, 1048, 1024, 1044, 1104, 1183, 1315, 1457, 1644, 1833, 2043, 2194, 1913, 1724, 1531, 1357, 1224, 1117, 1056, 1040, 1062, 1115, 1213, 1342, 1493, 1643, 1892, 2117, 2224, 1951, 1768, 1566, 1399, 1245, 1147, 1093, 1081, 1085, 1156, 1249, 1371, 1518, 1695, 1892, 2124, 2304, 1993, 1793, 1622, 1456, 1327, 1226, 1162, 1131, 1151, 1209, 1322, 1447, 1564, 1752, 1942, 2175, 2303, 2065, 1880, 1692, 1560, 1393, 1318, 1239, 1231, 1246, 1287, 1385, 1529, 1660, 1844, 2015, 2271, 2489, 2172, 1967, 1771, 1626, 1497, 1407, 1336, 1309, 1336, 1399, 1497, 1603, 1757, 1939, 2097, 2312, 2629, 2303, 2064, 1863, 1724, 1635, 1523, 1465, 1434, 1456, 1523, 1605, 1717, 1879, 2021, 2233, 2484, 2832, 2450, 2212, 1981, 1868, 1764, 1654, 1595, 1583, 1595, 1630, 1716, 1863, 1942, 2142, 2369, 2755, 3752, 2624, 2365, 2253, 2012, 1905, 1844, 1799, 1738, 1758, 1858, 1890, 1960, 2131, 2332, 2500, 3632] + }, + "lsc_samples_blue": { + "uCoeff": [2498, 2162, 1954, 1781, 1625, 1528, 1552, 1490, 1457, 1470, 1536, 1582, 1592, 1751, 1881, 2100, 2432, 2304, 2017, 1785, 1676, 1530, 1477, 1411, 1354, 1373, 1378, 1424, 1470, 1546, 1667, 1754, 1977, 2268, 2198, 1926, 1743, 1589, 1471, 1395, 1325, 1290, 1259, 1258, 1325, 1377, 1491, 1565, 1686, 1833, 2059, 2039, 1807, 1646, 1531, 1388, 1315, 1231, 1191, 1182, 1205, 1241, 1288, 1394, 1516, 1646, 1775, 2012, 1976, 1739, 1590, 1481, 1364, 1245, 1165, 1158, 1129, 1145, 1170, 1241, 1358, 1433, 1550, 1720, 1890, 1902, 1700, 1550, 1439, 1311, 1182, 1133, 1098, 1074, 1078, 1129, 1201, 1290, 1394, 1527, 1672, 1867, 1864, 1679, 1539, 1411, 1260, 1166, 1097, 1045, 1024, 1064, 1086, 1157, 1256, 1344, 1474, 1653, 1864, 1803, 1647, 1512, 1375, 1257, 1141, 1067, 1035, 1024, 1031, 1067, 1145, 1228, 1358, 1491, 1621, 1813, 1837, 1657, 1492, 1364, 1242, 1145, 1063, 1042, 1031, 1024, 1056, 1129, 1233, 1364, 1492, 1631, 1870, 1881, 1683, 1512, 1375, 1242, 1145, 1067, 1042, 1031, 1031, 1067, 1145, 1247, 1358, 1477, 1674, 1835, 1876, 1707, 1517, 1398, 1276, 1202, 1109, 1064, 1053, 1068, 1105, 1170, 1260, 1373, 1532, 1653, 1876, 2003, 1729, 1573, 1413, 1311, 1229, 1145, 1109, 1078, 1086, 1154, 1215, 1290, 1413, 1550, 1719, 1939, 2030, 1799, 1631, 1502, 1376, 1287, 1216, 1185, 1154, 1166, 1201, 1293, 1364, 1474, 1606, 1758, 1976, 2083, 1885, 1709, 1554, 1459, 1366, 1287, 1243, 1244, 1233, 1287, 1343, 1459, 1538, 1655, 1807, 2083, 2198, 2003, 1793, 1666, 1521, 1447, 1365, 1345, 1312, 1334, 1365, 1395, 1521, 1605, 1763, 1926, 2165, 2382, 2104, 1919, 1733, 1592, 1535, 1464, 1428, 1417, 1415, 1444, 1520, 1592, 1703, 1838, 2089, 2382, 3074, 2281, 2077, 1823, 1754, 1631, 1575, 1519, 1559, 1511, 1529, 1657, 1696, 1823, 1930, 2195, 3110] + } + }, { + "name": "3264x2448_D50_100", + "resolution": "3264x2448", + "illumination": "D50", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [3563, 2927, 2529, 2174, 2017, 1868, 1729, 1687, 1638, 1647, 1751, 1868, 1974, 2157, 2462, 2896, 4026, 3309, 2700, 2299, 2017, 1819, 1708, 1609, 1555, 1505, 1555, 1600, 1687, 1819, 2017, 2244, 2575, 3055, 3055, 2462, 2092, 1881, 1708, 1538, 1428, 1392, 1352, 1413, 1489, 1530, 1677, 1819, 2017, 2318, 2896, 2927, 2262, 2017, 1751, 1609, 1458, 1313, 1283, 1260, 1266, 1332, 1428, 1564, 1740, 1946, 2244, 2754, 2674, 2208, 1906, 1697, 1513, 1365, 1232, 1175, 1180, 1180, 1243, 1385, 1513, 1628, 1856, 2124, 2624, 2754, 2046, 1843, 1657, 1465, 1266, 1165, 1105, 1110, 1114, 1165, 1295, 1392, 1582, 1796, 2124, 2462, 2506, 2061, 1807, 1582, 1413, 1232, 1132, 1063, 1075, 1088, 1141, 1211, 1358, 1538, 1751, 2002, 2358, 2462, 2017, 1751, 1530, 1345, 1190, 1114, 1047, 1024, 1051, 1088, 1211, 1358, 1538, 1740, 1974, 2318, 2419, 2061, 1762, 1547, 1385, 1185, 1105, 1071, 1028, 1063, 1119, 1211, 1378, 1489, 1708, 1974, 2440, 2624, 2124, 1784, 1600, 1378, 1232, 1110, 1055, 1071, 1075, 1114, 1243, 1385, 1547, 1784, 2017, 2398, 2506, 2157, 1856, 1647, 1428, 1313, 1175, 1105, 1092, 1092, 1165, 1283, 1413, 1600, 1856, 2061, 2506, 2700, 2157, 1906, 1729, 1538, 1332, 1254, 1190, 1160, 1165, 1227, 1326, 1497, 1657, 1881, 2124, 2529, 2958, 2318, 2017, 1762, 1628, 1458, 1358, 1266, 1238, 1272, 1326, 1435, 1591, 1751, 1988, 2157, 2700, 3055, 2462, 2174, 1868, 1708, 1582, 1465, 1385, 1365, 1385, 1465, 1538, 1708, 1881, 2124, 2358, 2838, 3474, 2700, 2262, 2046, 1906, 1677, 1600, 1538, 1473, 1538, 1591, 1697, 1807, 2002, 2226, 2552, 3124, 3913, 2838, 2506, 2262, 2061, 1919, 1708, 1740, 1638, 1708, 1751, 1856, 2002, 2141, 2462, 2896, 3518, 4705, 3349, 2838, 2529, 2299, 2124, 1988, 1974, 1946, 1933, 2017, 2124, 2244, 2506, 2674, 3159, 4956] + }, + "lsc_samples_greenR": { + "uCoeff": [3825, 3056, 2647, 2246, 2066, 1876, 1719, 1670, 1638, 1689, 1744, 1775, 1944, 2148, 2420, 2864, 3638, 3276, 2732, 2307, 2073, 1859, 1689, 1611, 1532, 1475, 1512, 1594, 1656, 1813, 1983, 2246, 2647, 3171, 2979, 2502, 2188, 1876, 1709, 1552, 1446, 1388, 1347, 1369, 1425, 1536, 1689, 1882, 2088, 2325, 2878, 2797, 2325, 2010, 1786, 1615, 1453, 1354, 1267, 1246, 1240, 1323, 1436, 1540, 1729, 1950, 2237, 2567, 2758, 2221, 1983, 1670, 1509, 1354, 1243, 1176, 1160, 1169, 1230, 1338, 1475, 1647, 1870, 2117, 2502, 2534, 2148, 1841, 1620, 1412, 1272, 1167, 1112, 1090, 1096, 1156, 1267, 1412, 1577, 1797, 2080, 2381, 2470, 2102, 1813, 1573, 1376, 1240, 1112, 1076, 1057, 1066, 1114, 1203, 1344, 1528, 1744, 1996, 2353, 2502, 2088, 1775, 1552, 1347, 1210, 1080, 1048, 1033, 1042, 1090, 1205, 1347, 1497, 1729, 2003, 2289, 2481, 2110, 1791, 1577, 1338, 1193, 1100, 1038, 1024, 1038, 1096, 1181, 1329, 1528, 1709, 2010, 2362, 2534, 2110, 1797, 1573, 1385, 1220, 1136, 1070, 1055, 1057, 1123, 1203, 1326, 1509, 1739, 2003, 2450, 2578, 2196, 1870, 1615, 1408, 1275, 1149, 1092, 1094, 1094, 1149, 1256, 1388, 1548, 1819, 2073, 2372, 2612, 2280, 1983, 1689, 1501, 1357, 1220, 1172, 1153, 1167, 1228, 1329, 1460, 1661, 1847, 2204, 2512, 2878, 2325, 2088, 1819, 1611, 1475, 1318, 1261, 1228, 1283, 1318, 1429, 1594, 1744, 1963, 2307, 2732, 2979, 2556, 2221, 1919, 1714, 1552, 1460, 1376, 1329, 1372, 1453, 1552, 1709, 1888, 2140, 2450, 2950, 3331, 2758, 2353, 2030, 1876, 1714, 1573, 1520, 1501, 1497, 1624, 1709, 1847, 2052, 2325, 2623, 3137, 3705, 3025, 2567, 2316, 2052, 1853, 1734, 1744, 1661, 1714, 1786, 1859, 2066, 2280, 2523, 2823, 3638, 5201, 3331, 2878, 2556, 2325, 2110, 2044, 1906, 1853, 1870, 2003, 2088, 2188, 2420, 2758, 3331, 4705] + }, + "lsc_samples_greenB": { + "uCoeff": [3656, 3056, 2536, 2328, 2076, 1886, 1784, 1717, 1703, 1679, 1784, 1801, 1973, 2257, 2442, 2825, 3845, 3405, 2772, 2365, 2128, 1868, 1743, 1655, 1548, 1524, 1548, 1624, 1713, 1823, 2062, 2301, 2685, 3120, 3025, 2569, 2167, 1948, 1727, 1606, 1483, 1402, 1376, 1409, 1468, 1544, 1698, 1892, 2175, 2442, 2893, 2825, 2328, 2098, 1779, 1628, 1497, 1351, 1287, 1273, 1265, 1333, 1433, 1619, 1768, 2020, 2337, 2637, 2721, 2283, 1993, 1693, 1536, 1367, 1265, 1199, 1173, 1185, 1247, 1348, 1472, 1651, 1910, 2191, 2602, 2547, 2215, 1898, 1655, 1450, 1316, 1175, 1112, 1100, 1116, 1171, 1268, 1412, 1589, 1828, 2113, 2494, 2494, 2136, 1784, 1589, 1383, 1221, 1131, 1080, 1057, 1078, 1131, 1226, 1380, 1540, 1774, 2091, 2384, 2463, 2151, 1795, 1564, 1348, 1197, 1106, 1047, 1033, 1057, 1120, 1199, 1339, 1528, 1738, 1980, 2384, 2473, 2076, 1784, 1548, 1348, 1209, 1110, 1047, 1024, 1038, 1110, 1194, 1304, 1509, 1743, 2013, 2328, 2547, 2113, 1834, 1581, 1383, 1221, 1127, 1076, 1053, 1072, 1120, 1204, 1348, 1540, 1774, 2027, 2365, 2525, 2159, 1851, 1624, 1450, 1249, 1162, 1096, 1090, 1100, 1175, 1255, 1412, 1581, 1801, 2136, 2433, 2649, 2249, 1910, 1722, 1486, 1348, 1216, 1164, 1164, 1159, 1226, 1324, 1450, 1642, 1868, 2207, 2515, 2893, 2365, 2084, 1779, 1602, 1443, 1336, 1242, 1221, 1252, 1321, 1402, 1577, 1753, 1987, 2301, 2602, 2965, 2494, 2199, 1910, 1688, 1577, 1433, 1367, 1318, 1339, 1426, 1516, 1679, 1851, 2113, 2423, 2907, 3348, 2746, 2365, 2048, 1834, 1693, 1577, 1528, 1490, 1520, 1564, 1679, 1806, 2055, 2301, 2625, 3072, 3656, 2965, 2547, 2257, 2027, 1851, 1722, 1717, 1655, 1669, 1743, 1828, 1993, 2207, 2494, 2851, 3526, 4845, 3293, 2965, 2463, 2257, 2013, 1980, 1857, 1898, 1880, 1973, 2020, 2199, 2483, 2772, 3222, 5008] + }, + "lsc_samples_blue": { + "uCoeff": [3493, 2791, 2385, 2082, 1979, 1766, 1684, 1594, 1623, 1645, 1684, 1792, 1886, 2070, 2354, 2791, 3493, 2975, 2518, 2196, 1990, 1757, 1638, 1573, 1508, 1489, 1501, 1553, 1660, 1749, 1896, 2119, 2417, 2769, 2769, 2339, 2058, 1792, 1630, 1560, 1430, 1350, 1360, 1355, 1402, 1508, 1638, 1792, 2024, 2279, 2609, 2609, 2196, 1906, 1684, 1501, 1430, 1310, 1243, 1238, 1256, 1310, 1419, 1533, 1676, 1886, 2119, 2466, 2466, 2119, 1876, 1601, 1495, 1335, 1205, 1174, 1137, 1137, 1226, 1310, 1430, 1623, 1829, 2058, 2433, 2354, 2012, 1766, 1560, 1386, 1247, 1148, 1089, 1092, 1112, 1163, 1243, 1386, 1527, 1716, 2001, 2279, 2265, 1990, 1716, 1520, 1365, 1193, 1096, 1063, 1039, 1060, 1126, 1193, 1360, 1508, 1699, 1906, 2119, 2209, 1926, 1676, 1471, 1350, 1166, 1086, 1039, 1042, 1045, 1076, 1155, 1306, 1495, 1699, 1906, 2082, 2237, 1979, 1684, 1471, 1306, 1201, 1051, 1042, 1024, 1036, 1086, 1166, 1335, 1441, 1699, 1906, 2309, 2170, 1979, 1766, 1465, 1360, 1193, 1076, 1042, 1024, 1042, 1076, 1205, 1335, 1477, 1699, 1906, 2251, 2323, 1979, 1740, 1540, 1381, 1238, 1126, 1070, 1051, 1073, 1112, 1226, 1355, 1495, 1724, 1990, 2209, 2385, 2012, 1838, 1608, 1430, 1301, 1182, 1148, 1102, 1123, 1213, 1283, 1413, 1560, 1749, 2001, 2385, 2501, 2196, 1958, 1676, 1527, 1391, 1310, 1201, 1193, 1201, 1292, 1365, 1465, 1676, 1838, 2106, 2401, 2667, 2309, 2001, 1766, 1594, 1489, 1386, 1310, 1310, 1325, 1381, 1477, 1587, 1792, 1947, 2251, 2687, 2927, 2483, 2170, 1937, 1749, 1594, 1508, 1465, 1402, 1447, 1471, 1630, 1749, 1857, 2144, 2401, 2707, 3427, 2647, 2339, 2024, 1876, 1757, 1660, 1601, 1623, 1560, 1623, 1707, 1801, 2024, 2196, 2647, 3272, 4610, 2903, 2518, 2183, 2106, 1896, 1792, 1716, 1676, 1660, 1810, 1886, 1979, 2183, 2483, 2903, 4440] + } + }, { + "name": "3264x2448_D50_70", + "resolution": "3264x2448", + "illumination": "D50", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [2801, 2445, 2203, 1961, 1859, 1751, 1641, 1610, 1569, 1575, 1661, 1751, 1822, 1947, 2151, 2422, 3125, 2687, 2316, 2053, 1857, 1712, 1630, 1551, 1507, 1463, 1507, 1543, 1611, 1712, 1857, 2009, 2219, 2502, 2545, 2162, 1909, 1761, 1631, 1491, 1397, 1367, 1331, 1387, 1453, 1483, 1603, 1708, 1846, 2048, 2426, 2482, 2025, 1864, 1663, 1554, 1426, 1296, 1270, 1249, 1254, 1314, 1398, 1513, 1653, 1804, 2011, 2350, 2312, 1999, 1783, 1625, 1474, 1345, 1223, 1170, 1175, 1175, 1234, 1364, 1474, 1564, 1740, 1930, 2273, 2394, 1877, 1738, 1597, 1435, 1255, 1161, 1103, 1109, 1112, 1161, 1283, 1367, 1529, 1697, 1942, 2163, 2209, 1898, 1714, 1534, 1390, 1224, 1130, 1063, 1075, 1087, 1139, 1204, 1339, 1494, 1664, 1848, 2091, 2181, 1866, 1668, 1489, 1328, 1185, 1113, 1047, 1024, 1051, 1087, 1205, 1340, 1496, 1658, 1829, 2065, 2149, 1905, 1679, 1506, 1366, 1180, 1104, 1071, 1028, 1063, 1118, 1206, 1360, 1452, 1631, 1831, 2165, 2311, 1956, 1697, 1553, 1359, 1226, 1109, 1055, 1071, 1075, 1113, 1236, 1366, 1505, 1697, 1866, 2129, 2209, 1979, 1757, 1593, 1404, 1303, 1172, 1104, 1092, 1091, 1162, 1274, 1390, 1550, 1757, 1898, 2209, 2351, 1969, 1793, 1662, 1504, 1318, 1247, 1187, 1158, 1162, 1221, 1312, 1465, 1597, 1772, 1942, 2216, 2534, 2089, 1879, 1683, 1580, 1433, 1344, 1258, 1232, 1264, 1313, 1411, 1546, 1674, 1854, 1957, 2332, 2581, 2187, 1997, 1765, 1643, 1541, 1440, 1368, 1350, 1368, 1440, 1500, 1643, 1777, 1955, 2103, 2414, 2859, 2350, 2049, 1903, 1806, 1617, 1556, 1503, 1444, 1503, 1547, 1635, 1718, 1865, 2020, 2233, 2597, 3126, 2422, 2220, 2062, 1921, 1817, 1640, 1675, 1585, 1646, 1679, 1761, 1870, 1961, 2185, 2467, 2839, 3601, 2760, 2445, 2250, 2096, 1971, 1868, 1864, 1842, 1828, 1893, 1971, 2049, 2231, 2317, 2618, 3776] + }, + "lsc_samples_greenR": { + "uCoeff": [2985, 2541, 2296, 2019, 1900, 1757, 1633, 1595, 1569, 1612, 1654, 1670, 1797, 1940, 2118, 2398, 2854, 2663, 2340, 2060, 1904, 1746, 1613, 1553, 1486, 1436, 1468, 1537, 1584, 1707, 1828, 2011, 2275, 2586, 2488, 2193, 1988, 1757, 1631, 1503, 1414, 1363, 1326, 1346, 1394, 1489, 1614, 1762, 1905, 2053, 2412, 2383, 2076, 1858, 1693, 1559, 1422, 1335, 1255, 1236, 1230, 1306, 1406, 1491, 1643, 1807, 2005, 2207, 2378, 2009, 1850, 1601, 1471, 1335, 1234, 1171, 1156, 1164, 1221, 1320, 1439, 1581, 1752, 1924, 2178, 2220, 1962, 1737, 1564, 1386, 1261, 1163, 1110, 1089, 1095, 1152, 1256, 1386, 1525, 1698, 1905, 2098, 2180, 1932, 1719, 1526, 1355, 1232, 1110, 1075, 1057, 1066, 1112, 1197, 1325, 1485, 1658, 1843, 2087, 2213, 1926, 1689, 1509, 1330, 1204, 1079, 1048, 1033, 1042, 1089, 1199, 1330, 1459, 1648, 1854, 2042, 2199, 1946, 1705, 1533, 1322, 1188, 1099, 1038, 1024, 1038, 1095, 1176, 1313, 1488, 1632, 1861, 2103, 2239, 1944, 1709, 1529, 1366, 1214, 1134, 1070, 1055, 1057, 1122, 1197, 1310, 1470, 1657, 1854, 2171, 2267, 2012, 1769, 1564, 1386, 1266, 1146, 1091, 1093, 1093, 1146, 1248, 1367, 1503, 1724, 1908, 2102, 2281, 2072, 1861, 1626, 1469, 1342, 1214, 1169, 1151, 1164, 1222, 1315, 1431, 1601, 1742, 2009, 2202, 2471, 2095, 1940, 1734, 1564, 1449, 1306, 1253, 1222, 1275, 1306, 1406, 1549, 1667, 1832, 2080, 2357, 2522, 2263, 2037, 1810, 1649, 1513, 1435, 1359, 1315, 1355, 1428, 1513, 1644, 1783, 1968, 2177, 2500, 2752, 2396, 2125, 1889, 1779, 1650, 1531, 1486, 1470, 1465, 1578, 1646, 1754, 1908, 2102, 2289, 2606, 2975, 2566, 2270, 2108, 1913, 1758, 1664, 1679, 1606, 1652, 1710, 1764, 1925, 2078, 2234, 2410, 2926, 3948, 2747, 2477, 2272, 2117, 1959, 1917, 1804, 1760, 1772, 1881, 1940, 2002, 2161, 2383, 2747, 3601] + }, + "lsc_samples_greenB": { + "uCoeff": [2866, 2541, 2209, 2086, 1908, 1766, 1689, 1637, 1627, 1603, 1689, 1693, 1822, 2028, 2135, 2369, 2999, 2757, 2371, 2107, 1950, 1754, 1661, 1592, 1501, 1480, 1501, 1564, 1634, 1715, 1895, 2055, 2304, 2549, 2522, 2246, 1971, 1819, 1647, 1552, 1448, 1376, 1353, 1383, 1434, 1496, 1622, 1771, 1977, 2146, 2424, 2404, 2079, 1933, 1687, 1571, 1462, 1332, 1274, 1262, 1253, 1315, 1403, 1563, 1677, 1867, 2086, 2260, 2349, 2060, 1858, 1622, 1495, 1347, 1255, 1193, 1169, 1180, 1238, 1329, 1436, 1584, 1787, 1985, 2256, 2230, 2018, 1786, 1595, 1421, 1303, 1171, 1110, 1099, 1114, 1167, 1257, 1386, 1536, 1725, 1933, 2188, 2200, 1961, 1693, 1540, 1362, 1214, 1129, 1079, 1057, 1077, 1129, 1219, 1359, 1496, 1685, 1923, 2112, 2182, 1979, 1707, 1520, 1331, 1192, 1105, 1047, 1033, 1057, 1119, 1194, 1322, 1487, 1656, 1834, 2118, 2192, 1917, 1698, 1506, 1331, 1204, 1109, 1047, 1024, 1038, 1109, 1189, 1290, 1471, 1662, 1864, 2075, 2249, 1947, 1741, 1536, 1364, 1215, 1125, 1076, 1053, 1072, 1119, 1198, 1331, 1498, 1688, 1874, 2103, 2224, 1980, 1752, 1572, 1425, 1241, 1159, 1095, 1090, 1099, 1172, 1247, 1389, 1533, 1708, 1961, 2151, 2311, 2046, 1797, 1656, 1455, 1333, 1210, 1161, 1162, 1156, 1220, 1310, 1421, 1583, 1760, 2011, 2205, 2483, 2128, 1936, 1699, 1556, 1419, 1323, 1235, 1215, 1245, 1309, 1380, 1533, 1675, 1853, 2075, 2256, 2512, 2213, 2018, 1802, 1625, 1536, 1409, 1350, 1305, 1324, 1403, 1480, 1617, 1750, 1945, 2155, 2467, 2764, 2387, 2135, 1905, 1742, 1631, 1534, 1494, 1460, 1486, 1522, 1619, 1717, 1911, 2082, 2291, 2558, 2939, 2520, 2254, 2058, 1892, 1757, 1653, 1655, 1600, 1611, 1672, 1736, 1862, 2016, 2211, 2432, 2845, 3699, 2718, 2545, 2196, 2060, 1875, 1861, 1761, 1800, 1781, 1855, 1881, 2012, 2213, 2394, 2665, 3813] + }, + "lsc_samples_blue": { + "uCoeff": [2752, 2343, 2090, 1886, 1827, 1663, 1602, 1528, 1556, 1573, 1602, 1685, 1748, 1876, 2066, 2343, 2752, 2444, 2175, 1970, 1834, 1658, 1568, 1519, 1464, 1449, 1458, 1501, 1587, 1651, 1755, 1908, 2097, 2294, 2331, 2064, 1880, 1685, 1561, 1511, 1399, 1328, 1338, 1333, 1373, 1463, 1568, 1685, 1852, 2017, 2211, 2239, 1972, 1770, 1604, 1456, 1400, 1293, 1232, 1228, 1245, 1293, 1390, 1485, 1597, 1753, 1910, 2129, 2150, 1925, 1757, 1540, 1458, 1317, 1197, 1169, 1134, 1133, 1218, 1294, 1398, 1559, 1717, 1875, 2124, 2077, 1848, 1671, 1509, 1362, 1237, 1144, 1088, 1091, 1110, 1159, 1233, 1362, 1479, 1628, 1839, 2018, 2016, 1838, 1633, 1477, 1345, 1187, 1095, 1063, 1039, 1060, 1124, 1187, 1340, 1466, 1618, 1767, 1900, 1977, 1788, 1602, 1435, 1333, 1162, 1085, 1039, 1042, 1045, 1075, 1151, 1291, 1457, 1622, 1772, 1875, 2002, 1835, 1610, 1436, 1292, 1196, 1051, 1042, 1024, 1036, 1085, 1162, 1319, 1408, 1623, 1773, 2060, 1946, 1833, 1681, 1429, 1342, 1188, 1075, 1042, 1024, 1042, 1075, 1199, 1318, 1440, 1622, 1772, 2011, 2063, 1829, 1655, 1496, 1360, 1230, 1124, 1070, 1051, 1072, 1110, 1219, 1336, 1454, 1641, 1838, 1972, 2102, 1848, 1734, 1553, 1403, 1288, 1177, 1146, 1101, 1121, 1207, 1271, 1387, 1509, 1656, 1839, 2102, 2177, 1989, 1828, 1607, 1487, 1370, 1298, 1195, 1188, 1195, 1281, 1345, 1430, 1607, 1725, 1915, 2099, 2283, 2063, 1851, 1676, 1540, 1455, 1365, 1296, 1297, 1310, 1360, 1444, 1534, 1699, 1805, 2016, 2299, 2449, 2178, 1973, 1809, 1667, 1541, 1471, 1435, 1378, 1418, 1437, 1574, 1667, 1740, 1952, 2114, 2284, 2773, 2275, 2086, 1863, 1761, 1673, 1597, 1549, 1571, 1512, 1564, 1629, 1696, 1863, 1970, 2275, 2660, 3534, 2427, 2195, 1968, 1933, 1775, 1696, 1636, 1603, 1587, 1712, 1766, 1827, 1968, 2167, 2427, 3415] + } + }, { + "name": "3264x2448_D65_100", + "resolution": "3264x2448", + "illumination": "D65", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [3961, 3057, 2569, 2328, 2059, 1924, 1785, 1700, 1674, 1700, 1785, 1868, 2059, 2231, 2471, 2919, 3775, 3210, 2745, 2328, 2100, 1868, 1728, 1623, 1560, 1545, 1560, 1623, 1700, 1868, 2046, 2246, 2611, 3210, 3087, 2529, 2200, 1936, 1737, 1607, 1454, 1410, 1368, 1404, 1488, 1568, 1728, 1924, 2156, 2415, 3057, 2867, 2345, 2086, 1815, 1623, 1468, 1328, 1276, 1251, 1291, 1351, 1448, 1607, 1815, 2021, 2294, 2745, 2654, 2200, 1959, 1718, 1516, 1351, 1246, 1182, 1173, 1173, 1251, 1351, 1495, 1691, 1924, 2231, 2611, 2654, 2200, 1868, 1615, 1422, 1266, 1186, 1116, 1079, 1116, 1173, 1281, 1441, 1623, 1826, 2100, 2509, 2590, 2100, 1847, 1583, 1391, 1232, 1120, 1061, 1051, 1072, 1136, 1232, 1422, 1560, 1815, 2059, 2452, 2509, 2059, 1826, 1591, 1368, 1191, 1105, 1058, 1027, 1047, 1120, 1218, 1374, 1538, 1766, 2046, 2397, 2529, 2086, 1815, 1568, 1368, 1218, 1097, 1037, 1024, 1037, 1094, 1213, 1374, 1545, 1785, 2059, 2415, 2590, 2100, 1826, 1591, 1391, 1232, 1132, 1068, 1037, 1058, 1109, 1200, 1404, 1583, 1815, 2046, 2452, 2590, 2142, 1868, 1648, 1441, 1281, 1173, 1105, 1083, 1094, 1173, 1291, 1441, 1607, 1847, 2127, 2471, 2792, 2246, 1924, 1700, 1523, 1362, 1236, 1156, 1148, 1191, 1236, 1351, 1509, 1674, 1959, 2185, 2611, 2817, 2345, 2046, 1826, 1615, 1441, 1334, 1266, 1251, 1276, 1345, 1448, 1607, 1785, 2059, 2294, 2745, 2973, 2509, 2200, 1936, 1737, 1607, 1448, 1404, 1374, 1391, 1488, 1583, 1728, 1901, 2142, 2415, 2919, 3275, 2721, 2345, 2086, 1868, 1737, 1640, 1560, 1523, 1523, 1607, 1718, 1857, 2086, 2294, 2590, 3147, 3775, 2973, 2529, 2246, 2021, 1924, 1756, 1700, 1718, 1718, 1785, 1924, 1983, 2231, 2471, 2867, 3606, 5087, 3378, 2892, 2529, 2362, 2142, 2059, 1971, 1901, 1983, 2008, 2156, 2278, 2471, 2745, 3210, 5087] + }, + "lsc_samples_greenR": { + "uCoeff": [3795, 2895, 2488, 2210, 2042, 1887, 1754, 1684, 1671, 1663, 1763, 1820, 2023, 2139, 2443, 2787, 3499, 3214, 2666, 2316, 2061, 1856, 1701, 1599, 1544, 1510, 1513, 1573, 1675, 1801, 2011, 2217, 2545, 3012, 2871, 2470, 2126, 1908, 1714, 1573, 1457, 1399, 1363, 1374, 1448, 1527, 1684, 1851, 2073, 2365, 2776, 2753, 2308, 2023, 1806, 1607, 1448, 1352, 1287, 1253, 1277, 1352, 1442, 1555, 1740, 1947, 2254, 2604, 2676, 2232, 1947, 1705, 1513, 1365, 1253, 1176, 1170, 1176, 1239, 1346, 1470, 1650, 1866, 2126, 2545, 2545, 2146, 1866, 1630, 1420, 1280, 1170, 1114, 1094, 1105, 1168, 1270, 1408, 1584, 1791, 2099, 2399, 2470, 2106, 1820, 1573, 1371, 1233, 1131, 1068, 1055, 1066, 1114, 1224, 1363, 1527, 1754, 1999, 2357, 2416, 2061, 1791, 1562, 1360, 1204, 1101, 1056, 1024, 1043, 1099, 1195, 1328, 1523, 1731, 2011, 2374, 2507, 2073, 1806, 1559, 1374, 1217, 1105, 1051, 1027, 1038, 1112, 1197, 1328, 1503, 1745, 2017, 2308, 2507, 2119, 1835, 1584, 1388, 1226, 1135, 1078, 1045, 1071, 1114, 1217, 1360, 1548, 1763, 2054, 2365, 2574, 2188, 1871, 1634, 1442, 1277, 1164, 1107, 1087, 1099, 1168, 1277, 1417, 1581, 1801, 2080, 2416, 2666, 2217, 1964, 1696, 1513, 1354, 1242, 1176, 1150, 1181, 1233, 1338, 1483, 1671, 1887, 2167, 2479, 2787, 2341, 2054, 1806, 1607, 1451, 1328, 1265, 1242, 1263, 1335, 1457, 1581, 1763, 1976, 2262, 2676, 2972, 2479, 2188, 1903, 1731, 1581, 1470, 1397, 1365, 1391, 1451, 1570, 1688, 1871, 2106, 2399, 2787, 3214, 2698, 2332, 2080, 1866, 1718, 1599, 1523, 1499, 1527, 1596, 1696, 1840, 2042, 2285, 2584, 3026, 3611, 2972, 2564, 2239, 2042, 1887, 1772, 1705, 1684, 1705, 1758, 1887, 2036, 2217, 2507, 2846, 3445, 4903, 3325, 2846, 2516, 2239, 2106, 1947, 1925, 1840, 1919, 1964, 2042, 2269, 2425, 2709, 3124, 4698] + }, + "lsc_samples_greenB": { + "uCoeff": [3674, 2933, 2477, 2244, 2014, 1863, 1755, 1719, 1693, 1693, 1750, 1857, 2032, 2207, 2477, 2845, 3483, 3199, 2685, 2306, 2083, 1868, 1723, 1627, 1562, 1548, 1548, 1592, 1693, 1832, 2032, 2229, 2572, 2999, 2858, 2477, 2129, 1933, 1750, 1585, 1476, 1411, 1384, 1396, 1460, 1562, 1676, 1868, 2090, 2414, 2833, 2810, 2306, 2032, 1798, 1627, 1483, 1345, 1286, 1264, 1288, 1348, 1444, 1566, 1755, 1973, 2259, 2685, 2633, 2207, 1933, 1710, 1527, 1373, 1274, 1175, 1177, 1175, 1243, 1340, 1476, 1676, 1868, 2150, 2504, 2533, 2136, 1857, 1627, 1432, 1271, 1179, 1120, 1100, 1118, 1169, 1274, 1402, 1585, 1812, 2070, 2458, 2414, 2090, 1802, 1573, 1367, 1236, 1130, 1073, 1045, 1066, 1120, 1231, 1367, 1551, 1750, 2014, 2346, 2414, 2064, 1783, 1541, 1359, 1211, 1107, 1045, 1024, 1046, 1094, 1198, 1332, 1509, 1723, 1984, 2330, 2414, 2045, 1764, 1527, 1348, 1211, 1102, 1051, 1024, 1045, 1094, 1196, 1332, 1506, 1723, 1990, 2306, 2405, 2064, 1812, 1555, 1365, 1225, 1120, 1060, 1040, 1056, 1113, 1218, 1348, 1520, 1737, 2014, 2330, 2495, 2109, 1857, 1611, 1423, 1266, 1159, 1089, 1084, 1094, 1151, 1257, 1393, 1577, 1798, 2064, 2346, 2633, 2164, 1938, 1693, 1473, 1324, 1225, 1151, 1133, 1153, 1207, 1324, 1466, 1655, 1842, 2116, 2504, 2707, 2298, 2014, 1769, 1600, 1411, 1324, 1248, 1227, 1255, 1311, 1420, 1555, 1732, 1938, 2222, 2685, 2933, 2458, 2116, 1894, 1710, 1541, 1432, 1367, 1337, 1359, 1426, 1520, 1680, 1857, 2083, 2388, 2775, 3067, 2653, 2274, 2026, 1832, 1680, 1577, 1527, 1483, 1506, 1577, 1680, 1812, 2002, 2244, 2552, 3053, 3576, 2895, 2477, 2222, 2026, 1832, 1723, 1668, 1655, 1676, 1723, 1847, 1984, 2157, 2432, 2810, 3412, 4845, 3215, 2775, 2414, 2185, 2045, 1911, 1900, 1847, 1878, 1916, 2070, 2185, 2405, 2696, 3096, 4580] + }, + "lsc_samples_blue": { + "uCoeff": [3195, 2638, 2235, 2000, 1856, 1738, 1653, 1576, 1559, 1576, 1617, 1698, 1810, 1921, 2246, 2531, 3291, 2843, 2474, 2106, 1864, 1725, 1593, 1511, 1456, 1427, 1456, 1495, 1576, 1685, 1818, 2028, 2355, 2754, 2576, 2235, 1947, 1788, 1593, 1475, 1400, 1340, 1316, 1332, 1382, 1456, 1576, 1718, 1896, 2158, 2591, 2474, 2076, 1833, 1653, 1506, 1369, 1289, 1231, 1221, 1241, 1270, 1365, 1495, 1623, 1795, 2056, 2406, 2317, 2000, 1766, 1565, 1418, 1293, 1207, 1150, 1135, 1150, 1188, 1278, 1400, 1559, 1725, 1964, 2235, 2212, 1947, 1705, 1511, 1369, 1221, 1147, 1090, 1082, 1098, 1138, 1241, 1332, 1470, 1653, 1896, 2168, 2168, 1872, 1660, 1446, 1300, 1178, 1093, 1059, 1041, 1051, 1101, 1188, 1312, 1432, 1623, 1818, 2126, 2158, 1872, 1635, 1432, 1304, 1159, 1085, 1041, 1024, 1056, 1074, 1150, 1263, 1427, 1593, 1833, 2126, 2106, 1864, 1641, 1418, 1281, 1144, 1077, 1043, 1039, 1041, 1074, 1150, 1289, 1418, 1599, 1810, 2066, 2190, 1864, 1623, 1475, 1304, 1178, 1085, 1039, 1034, 1041, 1090, 1166, 1281, 1441, 1617, 1841, 2096, 2190, 1921, 1698, 1506, 1332, 1201, 1112, 1085, 1051, 1074, 1118, 1197, 1328, 1470, 1641, 1864, 2158, 2269, 1973, 1738, 1548, 1396, 1252, 1169, 1121, 1101, 1121, 1178, 1263, 1365, 1537, 1705, 1947, 2269, 2433, 2037, 1788, 1617, 1461, 1340, 1241, 1178, 1169, 1175, 1252, 1340, 1456, 1582, 1795, 2028, 2367, 2531, 2190, 1938, 1718, 1576, 1441, 1340, 1278, 1252, 1281, 1352, 1409, 1543, 1698, 1872, 2106, 2474, 2862, 2393, 2037, 1818, 1653, 1543, 1446, 1387, 1374, 1369, 1470, 1543, 1672, 1818, 2009, 2246, 2686, 3195, 2591, 2201, 1921, 1788, 1679, 1559, 1506, 1506, 1543, 1565, 1660, 1759, 1913, 2137, 2488, 2999, 4089, 2807, 2446, 2168, 1938, 1833, 1705, 1653, 1635, 1641, 1685, 1810, 1921, 2076, 2317, 2737, 4331] + } + }, { + "name": "3264x2448_D65_70", + "resolution": "3264x2448", + "illumination": "D65", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [3080, 2542, 2234, 2086, 1894, 1799, 1690, 1622, 1601, 1622, 1690, 1751, 1894, 2007, 2158, 2439, 2950, 2615, 2350, 2077, 1927, 1754, 1648, 1564, 1512, 1500, 1512, 1564, 1623, 1754, 1881, 2011, 2247, 2615, 2569, 2215, 1998, 1808, 1656, 1553, 1421, 1384, 1346, 1378, 1452, 1518, 1648, 1798, 1962, 2125, 2546, 2436, 2092, 1923, 1719, 1566, 1435, 1310, 1264, 1241, 1278, 1332, 1417, 1552, 1719, 1868, 2051, 2343, 2296, 1992, 1829, 1644, 1477, 1332, 1237, 1177, 1169, 1168, 1241, 1332, 1458, 1620, 1799, 2018, 2263, 2315, 2005, 1760, 1559, 1395, 1255, 1181, 1114, 1078, 1114, 1169, 1269, 1413, 1566, 1724, 1922, 2200, 2276, 1931, 1749, 1535, 1370, 1224, 1118, 1061, 1051, 1071, 1134, 1224, 1399, 1514, 1721, 1896, 2166, 2219, 1901, 1734, 1545, 1350, 1186, 1104, 1058, 1027, 1047, 1119, 1212, 1355, 1496, 1681, 1890, 2129, 2237, 1926, 1726, 1525, 1350, 1212, 1096, 1037, 1024, 1037, 1093, 1207, 1356, 1504, 1699, 1903, 2145, 2284, 1936, 1734, 1545, 1372, 1226, 1130, 1068, 1037, 1058, 1108, 1195, 1384, 1538, 1725, 1890, 2173, 2276, 1966, 1767, 1594, 1417, 1272, 1170, 1104, 1083, 1093, 1170, 1281, 1417, 1557, 1749, 1953, 2181, 2424, 2044, 1809, 1636, 1490, 1347, 1230, 1153, 1146, 1188, 1230, 1336, 1476, 1612, 1840, 1993, 2281, 2424, 2111, 1904, 1741, 1568, 1417, 1321, 1258, 1244, 1268, 1332, 1424, 1561, 1704, 1915, 2069, 2368, 2518, 2225, 2019, 1825, 1669, 1564, 1424, 1386, 1358, 1373, 1461, 1542, 1661, 1794, 1970, 2149, 2476, 2710, 2367, 2118, 1937, 1772, 1671, 1593, 1524, 1491, 1489, 1562, 1654, 1763, 1937, 2076, 2263, 2614, 3026, 2526, 2239, 2049, 1886, 1821, 1683, 1639, 1658, 1655, 1709, 1821, 1854, 2036, 2192, 2444, 2903, 3868, 2782, 2488, 2250, 2149, 1986, 1930, 1862, 1802, 1872, 1886, 1998, 2078, 2203, 2372, 2656, 3868] + }, + "lsc_samples_greenR": { + "uCoeff": [2964, 2421, 2171, 1990, 1880, 1767, 1663, 1608, 1598, 1589, 1671, 1709, 1864, 1932, 2136, 2340, 2757, 2618, 2289, 2067, 1894, 1744, 1624, 1542, 1497, 1468, 1469, 1519, 1601, 1696, 1852, 1987, 2196, 2471, 2407, 2168, 1937, 1784, 1636, 1522, 1424, 1374, 1341, 1350, 1415, 1481, 1609, 1735, 1893, 2085, 2336, 2349, 2062, 1869, 1711, 1552, 1417, 1333, 1274, 1243, 1265, 1333, 1411, 1505, 1653, 1805, 2019, 2235, 2314, 2018, 1819, 1632, 1474, 1345, 1243, 1171, 1166, 1171, 1230, 1327, 1435, 1583, 1749, 1931, 2211, 2228, 1960, 1759, 1573, 1393, 1268, 1166, 1112, 1093, 1103, 1164, 1259, 1382, 1531, 1693, 1921, 2113, 2180, 1936, 1725, 1526, 1351, 1225, 1129, 1068, 1055, 1066, 1112, 1217, 1343, 1484, 1667, 1846, 2090, 2144, 1903, 1703, 1518, 1342, 1198, 1100, 1056, 1024, 1043, 1098, 1190, 1312, 1483, 1650, 1860, 2110, 2219, 1915, 1718, 1517, 1356, 1211, 1104, 1051, 1027, 1038, 1111, 1192, 1312, 1465, 1664, 1867, 2059, 2217, 1952, 1742, 1539, 1369, 1220, 1133, 1078, 1045, 1071, 1113, 1211, 1342, 1506, 1679, 1897, 2103, 2264, 2005, 1770, 1581, 1418, 1268, 1161, 1106, 1087, 1098, 1165, 1268, 1394, 1533, 1708, 1914, 2137, 2324, 2020, 1844, 1632, 1480, 1339, 1236, 1173, 1148, 1178, 1227, 1324, 1452, 1610, 1777, 1978, 2176, 2400, 2108, 1911, 1723, 1561, 1426, 1315, 1257, 1236, 1255, 1322, 1432, 1537, 1684, 1843, 2043, 2314, 2517, 2201, 2009, 1796, 1664, 1540, 1444, 1379, 1350, 1373, 1426, 1530, 1625, 1768, 1939, 2136, 2375, 2664, 2349, 2107, 1932, 1771, 1654, 1555, 1489, 1468, 1493, 1552, 1634, 1748, 1900, 2068, 2258, 2523, 2906, 2525, 2267, 2043, 1905, 1788, 1698, 1644, 1627, 1644, 1685, 1788, 1899, 2025, 2221, 2428, 2786, 3739, 2742, 2452, 2239, 2045, 1955, 1832, 1821, 1748, 1816, 1847, 1900, 2070, 2165, 2344, 2592, 3596] + }, + "lsc_samples_greenB": { + "uCoeff": [2879, 2449, 2162, 2018, 1856, 1746, 1664, 1639, 1618, 1616, 1660, 1741, 1871, 1988, 2162, 2384, 2745, 2607, 2304, 2059, 1912, 1754, 1643, 1567, 1514, 1502, 1501, 1536, 1617, 1723, 1870, 1997, 2217, 2461, 2397, 2174, 1939, 1806, 1668, 1533, 1441, 1385, 1361, 1371, 1426, 1512, 1602, 1750, 1907, 2124, 2379, 2393, 2061, 1877, 1704, 1570, 1449, 1326, 1273, 1253, 1275, 1329, 1413, 1515, 1666, 1827, 2023, 2297, 2280, 1998, 1806, 1637, 1487, 1353, 1264, 1170, 1173, 1170, 1234, 1322, 1440, 1607, 1751, 1951, 2179, 2219, 1952, 1751, 1570, 1405, 1260, 1174, 1118, 1099, 1116, 1165, 1263, 1377, 1532, 1711, 1897, 2159, 2136, 1922, 1709, 1526, 1347, 1228, 1128, 1072, 1045, 1066, 1118, 1223, 1347, 1506, 1663, 1858, 2081, 2142, 1905, 1696, 1499, 1341, 1205, 1106, 1045, 1024, 1046, 1093, 1193, 1316, 1470, 1643, 1838, 2075, 2144, 1891, 1681, 1487, 1331, 1206, 1101, 1051, 1024, 1045, 1093, 1191, 1316, 1468, 1644, 1844, 2057, 2135, 1905, 1722, 1512, 1347, 1219, 1119, 1060, 1040, 1056, 1112, 1212, 1331, 1480, 1656, 1863, 2075, 2200, 1938, 1758, 1560, 1400, 1257, 1156, 1088, 1084, 1093, 1148, 1249, 1371, 1529, 1706, 1900, 2081, 2298, 1975, 1821, 1630, 1443, 1310, 1219, 1148, 1131, 1150, 1202, 1310, 1436, 1595, 1738, 1935, 2196, 2338, 2073, 1876, 1690, 1554, 1389, 1311, 1241, 1221, 1248, 1299, 1397, 1513, 1657, 1811, 2010, 2321, 2487, 2184, 1948, 1788, 1645, 1503, 1408, 1350, 1323, 1343, 1403, 1484, 1618, 1756, 1920, 2127, 2366, 2554, 2313, 2059, 1886, 1740, 1620, 1534, 1493, 1453, 1473, 1534, 1620, 1723, 1865, 2034, 2233, 2543, 2881, 2466, 2197, 2029, 1891, 1740, 1654, 1610, 1600, 1617, 1654, 1753, 1854, 1974, 2161, 2400, 2762, 3699, 2660, 2396, 2156, 2000, 1903, 1801, 1799, 1754, 1779, 1805, 1924, 2000, 2149, 2334, 2571, 3513] + }, + "lsc_samples_blue": { + "uCoeff": [2544, 2229, 1973, 1819, 1723, 1639, 1575, 1512, 1499, 1512, 1543, 1604, 1685, 1755, 1981, 2149, 2611, 2348, 2141, 1898, 1729, 1630, 1528, 1463, 1417, 1392, 1417, 1448, 1513, 1596, 1690, 1835, 2050, 2283, 2186, 1982, 1788, 1681, 1529, 1433, 1371, 1319, 1297, 1311, 1354, 1416, 1513, 1621, 1746, 1921, 2197, 2135, 1875, 1708, 1576, 1460, 1344, 1274, 1221, 1212, 1231, 1256, 1340, 1450, 1550, 1676, 1859, 2083, 2033, 1827, 1663, 1507, 1387, 1278, 1199, 1146, 1132, 1146, 1181, 1263, 1370, 1502, 1627, 1798, 1969, 1965, 1794, 1618, 1465, 1346, 1212, 1143, 1089, 1081, 1097, 1135, 1231, 1311, 1428, 1573, 1752, 1930, 1939, 1739, 1584, 1410, 1284, 1172, 1092, 1059, 1041, 1051, 1099, 1182, 1295, 1397, 1552, 1693, 1905, 1936, 1743, 1565, 1399, 1289, 1155, 1084, 1041, 1024, 1056, 1073, 1146, 1250, 1394, 1528, 1710, 1911, 1896, 1737, 1572, 1387, 1268, 1141, 1076, 1043, 1039, 1041, 1073, 1146, 1275, 1387, 1534, 1691, 1864, 1962, 1736, 1555, 1438, 1289, 1173, 1084, 1039, 1034, 1041, 1089, 1162, 1267, 1407, 1549, 1716, 1886, 1956, 1780, 1618, 1464, 1314, 1195, 1110, 1084, 1051, 1073, 1116, 1191, 1310, 1432, 1567, 1732, 1931, 2010, 1816, 1647, 1498, 1371, 1242, 1165, 1119, 1100, 1119, 1173, 1252, 1342, 1488, 1618, 1794, 2010, 2124, 1858, 1682, 1554, 1426, 1322, 1232, 1173, 1165, 1170, 1242, 1322, 1422, 1523, 1688, 1850, 2072, 2179, 1967, 1797, 1634, 1524, 1410, 1322, 1266, 1242, 1269, 1333, 1381, 1494, 1616, 1741, 1899, 2135, 2400, 2107, 1863, 1707, 1582, 1495, 1414, 1362, 1351, 1346, 1436, 1495, 1599, 1707, 1840, 1991, 2269, 2604, 2232, 1974, 1776, 1685, 1604, 1506, 1463, 1464, 1496, 1511, 1587, 1660, 1770, 1923, 2152, 2461, 3170, 2355, 2138, 1956, 1792, 1720, 1620, 1580, 1566, 1570, 1603, 1701, 1778, 1881, 2037, 2303, 3339] + } + }, { + "name": "3264x2448_D75_100", + "resolution": "3264x2448", + "illumination": "D75", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [4057, 3248, 2635, 2340, 2136, 1951, 1795, 1753, 1763, 1785, 1852, 1964, 2105, 2322, 2521, 2953, 3895, 3321, 2895, 2418, 2167, 1900, 1785, 1654, 1617, 1574, 1626, 1635, 1795, 1888, 2090, 2359, 2708, 3248, 3248, 2500, 2216, 1964, 1785, 1608, 1509, 1456, 1381, 1435, 1509, 1608, 1774, 1951, 2183, 2458, 3110, 2953, 2398, 2075, 1841, 1635, 1525, 1387, 1290, 1279, 1301, 1387, 1479, 1617, 1829, 2075, 2340, 2683, 2839, 2233, 1991, 1712, 1582, 1381, 1262, 1225, 1171, 1205, 1279, 1375, 1525, 1722, 1964, 2216, 2659, 2708, 2216, 1951, 1682, 1501, 1301, 1215, 1131, 1113, 1109, 1200, 1325, 1501, 1692, 1888, 2183, 2500, 2635, 2167, 1876, 1644, 1435, 1251, 1148, 1057, 1053, 1085, 1167, 1290, 1442, 1654, 1829, 2136, 2588, 2566, 2090, 1852, 1574, 1394, 1220, 1101, 1050, 1042, 1046, 1105, 1241, 1387, 1582, 1795, 2105, 2458, 2588, 2075, 1852, 1608, 1375, 1225, 1097, 1046, 1024, 1039, 1089, 1225, 1381, 1541, 1829, 2090, 2521, 2635, 2167, 1864, 1608, 1435, 1257, 1113, 1053, 1057, 1057, 1135, 1246, 1428, 1617, 1864, 2105, 2418, 2839, 2200, 1964, 1692, 1486, 1337, 1200, 1139, 1085, 1153, 1210, 1331, 1456, 1673, 1876, 2200, 2635, 2839, 2359, 2046, 1785, 1557, 1375, 1296, 1205, 1185, 1215, 1279, 1381, 1549, 1732, 1964, 2268, 2683, 3014, 2418, 2090, 1841, 1644, 1449, 1343, 1290, 1296, 1290, 1375, 1494, 1626, 1852, 2061, 2340, 2812, 3077, 2521, 2233, 1938, 1785, 1599, 1509, 1421, 1421, 1435, 1494, 1574, 1795, 1938, 2167, 2500, 3045, 3321, 2759, 2340, 2090, 1938, 1763, 1635, 1565, 1541, 1541, 1654, 1774, 1876, 2075, 2303, 2683, 3143, 3844, 3077, 2635, 2285, 2136, 1964, 1841, 1785, 1732, 1774, 1807, 1925, 2061, 2268, 2588, 2953, 3844, 5211, 3359, 3014, 2611, 2418, 2183, 2090, 2046, 2046, 2075, 2105, 2167, 2303, 2635, 2953, 3399, 5120] + }, + "lsc_samples_greenR": { + "uCoeff": [3711, 3002, 2580, 2209, 2064, 1882, 1738, 1689, 1655, 1734, 1716, 1850, 1977, 2166, 2428, 2923, 3908, 3286, 2741, 2301, 2083, 1892, 1707, 1615, 1550, 1525, 1540, 1588, 1698, 1855, 1983, 2231, 2663, 3270, 2989, 2437, 2124, 1898, 1720, 1561, 1468, 1390, 1367, 1405, 1448, 1558, 1672, 1860, 2064, 2376, 2823, 2823, 2301, 2014, 1810, 1584, 1458, 1353, 1278, 1263, 1273, 1326, 1417, 1565, 1747, 1954, 2209, 2685, 2663, 2231, 1954, 1707, 1518, 1353, 1265, 1184, 1175, 1190, 1235, 1359, 1471, 1635, 1830, 2138, 2560, 2580, 2151, 1898, 1655, 1452, 1293, 1192, 1135, 1125, 1127, 1175, 1280, 1433, 1591, 1815, 2097, 2455, 2455, 2110, 1824, 1584, 1423, 1253, 1141, 1092, 1074, 1092, 1149, 1244, 1376, 1550, 1780, 2045, 2376, 2455, 2090, 1805, 1558, 1367, 1221, 1123, 1060, 1035, 1064, 1103, 1201, 1353, 1518, 1752, 1995, 2359, 2455, 2077, 1785, 1554, 1353, 1207, 1123, 1050, 1024, 1043, 1114, 1219, 1324, 1508, 1698, 1995, 2301, 2642, 2097, 1845, 1561, 1388, 1244, 1145, 1085, 1064, 1081, 1133, 1239, 1359, 1558, 1752, 2014, 2350, 2707, 2187, 1882, 1655, 1452, 1313, 1184, 1135, 1104, 1133, 1194, 1298, 1445, 1615, 1805, 2083, 2419, 2685, 2247, 1977, 1738, 1525, 1373, 1256, 1197, 1159, 1197, 1265, 1345, 1478, 1672, 1903, 2180, 2590, 2859, 2384, 2051, 1815, 1603, 1452, 1337, 1268, 1246, 1278, 1345, 1433, 1584, 1766, 1972, 2239, 2707, 3072, 2560, 2138, 1914, 1707, 1558, 1455, 1376, 1373, 1385, 1455, 1536, 1698, 1866, 2070, 2428, 2884, 3286, 2763, 2342, 2090, 1887, 1729, 1611, 1529, 1511, 1536, 1588, 1689, 1830, 2026, 2262, 2663, 3044, 3711, 3030, 2653, 2262, 2064, 1898, 1752, 1711, 1689, 1720, 1752, 1898, 2020, 2187, 2580, 2897, 3629, 5160, 3422, 2923, 2492, 2301, 2077, 1954, 1926, 1882, 1903, 1972, 2051, 2254, 2419, 2823, 3238, 4752] + }, + "lsc_samples_greenB": { + "uCoeff": [3822, 3058, 2578, 2267, 2035, 1917, 1763, 1739, 1699, 1681, 1748, 1889, 2029, 2163, 2500, 2896, 3652, 3337, 2728, 2331, 2080, 1900, 1748, 1635, 1554, 1547, 1543, 1611, 1712, 1862, 2010, 2275, 2662, 3101, 3002, 2490, 2121, 1900, 1744, 1565, 1471, 1405, 1417, 1414, 1442, 1543, 1708, 1889, 2067, 2417, 2883, 2762, 2267, 2029, 1777, 1603, 1454, 1367, 1289, 1267, 1284, 1333, 1429, 1580, 1721, 1962, 2251, 2662, 2662, 2177, 1917, 1703, 1525, 1367, 1259, 1195, 1172, 1195, 1255, 1361, 1487, 1656, 1841, 2128, 2558, 2568, 2134, 1873, 1635, 1451, 1312, 1200, 1137, 1124, 1149, 1191, 1294, 1429, 1611, 1852, 2080, 2500, 2538, 2074, 1821, 1600, 1414, 1250, 1164, 1105, 1081, 1094, 1149, 1236, 1378, 1532, 1772, 2023, 2348, 2462, 2035, 1777, 1532, 1367, 1202, 1122, 1047, 1034, 1059, 1110, 1204, 1331, 1498, 1730, 1986, 2315, 2408, 1986, 1777, 1532, 1358, 1202, 1114, 1047, 1024, 1054, 1107, 1189, 1331, 1498, 1725, 1957, 2340, 2481, 2080, 1801, 1550, 1378, 1240, 1122, 1076, 1045, 1079, 1126, 1231, 1370, 1543, 1758, 2023, 2382, 2558, 2155, 1878, 1631, 1435, 1279, 1182, 1110, 1107, 1110, 1180, 1294, 1429, 1588, 1821, 2074, 2471, 2662, 2236, 1906, 1681, 1504, 1339, 1231, 1180, 1155, 1178, 1236, 1358, 1474, 1639, 1889, 2134, 2578, 2797, 2275, 1986, 1777, 1584, 1423, 1328, 1247, 1220, 1247, 1317, 1411, 1565, 1730, 1939, 2221, 2672, 2935, 2426, 2080, 1857, 1694, 1540, 1405, 1361, 1347, 1355, 1417, 1532, 1664, 1821, 2054, 2399, 2809, 3254, 2728, 2291, 2023, 1816, 1677, 1588, 1515, 1491, 1518, 1588, 1664, 1816, 1962, 2191, 2609, 3207, 3673, 2988, 2578, 2214, 2017, 1857, 1748, 1694, 1703, 1677, 1767, 1836, 1974, 2170, 2500, 2871, 3612, 5388, 3354, 2822, 2490, 2221, 2042, 1974, 1945, 1873, 1934, 1889, 2054, 2214, 2408, 2797, 3238, 4906] + }, + "lsc_samples_blue": { + "uCoeff": [3326, 2769, 2360, 2056, 1881, 1701, 1641, 1624, 1527, 1568, 1601, 1689, 1920, 1985, 2224, 2673, 3374, 2964, 2541, 2172, 1920, 1759, 1568, 1507, 1437, 1446, 1446, 1488, 1585, 1689, 1881, 2065, 2434, 2837, 2704, 2278, 1985, 1786, 1596, 1464, 1369, 1330, 1282, 1300, 1369, 1437, 1537, 1707, 1912, 2203, 2613, 2473, 2112, 1858, 1647, 1460, 1341, 1254, 1202, 1196, 1228, 1251, 1369, 1437, 1579, 1800, 2029, 2447, 2313, 2020, 1766, 1558, 1415, 1289, 1215, 1154, 1129, 1157, 1199, 1275, 1394, 1522, 1720, 1969, 2267, 2384, 1977, 1707, 1517, 1357, 1247, 1151, 1105, 1092, 1105, 1146, 1228, 1341, 1478, 1695, 1912, 2278, 2256, 1920, 1670, 1469, 1307, 1193, 1126, 1076, 1066, 1084, 1115, 1193, 1322, 1420, 1647, 1904, 2151, 2192, 1904, 1618, 1433, 1282, 1166, 1066, 1047, 1045, 1057, 1094, 1157, 1268, 1390, 1579, 1822, 2112, 2182, 1881, 1612, 1424, 1278, 1148, 1079, 1031, 1024, 1035, 1076, 1146, 1264, 1377, 1585, 1836, 2142, 2224, 1912, 1664, 1437, 1282, 1178, 1092, 1057, 1054, 1054, 1086, 1178, 1275, 1415, 1601, 1873, 2122, 2245, 1969, 1707, 1478, 1334, 1218, 1126, 1094, 1084, 1084, 1113, 1224, 1334, 1478, 1676, 1881, 2192, 2348, 2029, 1773, 1532, 1402, 1251, 1199, 1143, 1126, 1129, 1178, 1254, 1369, 1537, 1707, 1969, 2372, 2447, 2093, 1836, 1612, 1428, 1322, 1231, 1181, 1169, 1178, 1228, 1338, 1433, 1579, 1807, 2029, 2384, 2584, 2224, 1944, 1701, 1483, 1394, 1318, 1258, 1241, 1268, 1334, 1402, 1527, 1652, 1912, 2074, 2555, 2890, 2447, 2093, 1881, 1652, 1537, 1451, 1386, 1386, 1398, 1433, 1532, 1624, 1793, 2020, 2313, 2769, 3279, 2673, 2336, 2003, 1807, 1695, 1574, 1517, 1527, 1517, 1596, 1658, 1807, 1960, 2213, 2598, 3302, 4359, 2803, 2500, 2172, 1985, 1836, 1746, 1664, 1624, 1652, 1676, 1904, 1960, 2103, 2384, 2803, 4400] + } + }, { + "name": "3264x2448_D75_70", + "resolution": "3264x2448", + "illumination": "D75", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [3147, 2685, 2286, 2096, 1959, 1822, 1699, 1669, 1680, 1697, 1749, 1833, 1933, 2081, 2197, 2464, 3034, 2695, 2466, 2149, 1983, 1782, 1698, 1591, 1564, 1526, 1572, 1574, 1707, 1771, 1918, 2102, 2322, 2642, 2689, 2192, 2011, 1832, 1699, 1554, 1472, 1427, 1358, 1407, 1472, 1554, 1689, 1821, 1984, 2159, 2586, 2502, 2135, 1913, 1742, 1577, 1488, 1366, 1277, 1267, 1288, 1366, 1446, 1561, 1731, 1913, 2088, 2295, 2441, 2019, 1856, 1639, 1538, 1360, 1252, 1219, 1167, 1199, 1268, 1355, 1485, 1648, 1833, 2005, 2300, 2357, 2019, 1833, 1620, 1469, 1288, 1209, 1129, 1112, 1107, 1195, 1311, 1469, 1629, 1778, 1991, 2193, 2312, 1987, 1774, 1591, 1411, 1243, 1145, 1057, 1053, 1084, 1164, 1280, 1418, 1600, 1733, 1961, 2275, 2265, 1927, 1757, 1529, 1374, 1214, 1100, 1050, 1042, 1046, 1104, 1234, 1368, 1537, 1707, 1940, 2178, 2285, 1916, 1759, 1562, 1357, 1219, 1096, 1046, 1024, 1039, 1088, 1219, 1363, 1500, 1738, 1929, 2231, 2320, 1993, 1768, 1561, 1413, 1250, 1112, 1053, 1057, 1057, 1133, 1239, 1407, 1569, 1768, 1940, 2145, 2476, 2015, 1852, 1634, 1459, 1326, 1196, 1138, 1085, 1152, 1206, 1320, 1431, 1617, 1774, 2015, 2312, 2461, 2138, 1916, 1713, 1521, 1359, 1288, 1201, 1182, 1211, 1272, 1365, 1514, 1665, 1844, 2062, 2338, 2578, 2172, 1942, 1754, 1595, 1425, 1330, 1281, 1288, 1281, 1360, 1467, 1578, 1764, 1917, 2107, 2420, 2597, 2235, 2047, 1827, 1713, 1557, 1481, 1402, 1403, 1415, 1467, 1534, 1722, 1827, 1991, 2218, 2573, 2744, 2397, 2114, 1941, 1834, 1695, 1588, 1528, 1508, 1506, 1606, 1705, 1779, 1928, 2083, 2337, 2611, 3076, 2606, 2325, 2082, 1986, 1857, 1760, 1716, 1670, 1706, 1729, 1822, 1921, 2067, 2287, 2511, 3076, 3955, 2768, 2583, 2317, 2196, 2022, 1957, 1928, 1931, 1954, 1970, 2008, 2099, 2336, 2535, 2797, 3891] + }, + "lsc_samples_greenR": { + "uCoeff": [2905, 2501, 2243, 1989, 1898, 1763, 1649, 1612, 1584, 1652, 1630, 1735, 1825, 1954, 2124, 2442, 3043, 2670, 2347, 2055, 1912, 1775, 1629, 1556, 1503, 1481, 1493, 1532, 1621, 1743, 1828, 1998, 2287, 2658, 2496, 2142, 1935, 1776, 1641, 1511, 1434, 1365, 1345, 1379, 1415, 1509, 1599, 1743, 1885, 2094, 2371, 2403, 2057, 1862, 1714, 1531, 1426, 1334, 1266, 1252, 1261, 1309, 1388, 1514, 1659, 1811, 1982, 2297, 2304, 2018, 1825, 1634, 1479, 1334, 1255, 1179, 1171, 1185, 1226, 1340, 1436, 1570, 1718, 1941, 2223, 2256, 1964, 1786, 1595, 1423, 1281, 1187, 1133, 1123, 1125, 1171, 1268, 1406, 1537, 1714, 1919, 2157, 2168, 1939, 1729, 1536, 1400, 1245, 1139, 1091, 1074, 1091, 1146, 1236, 1355, 1505, 1690, 1884, 2105, 2175, 1927, 1716, 1515, 1349, 1215, 1122, 1060, 1035, 1064, 1102, 1196, 1336, 1478, 1669, 1847, 2098, 2178, 1918, 1699, 1512, 1336, 1202, 1122, 1050, 1024, 1043, 1113, 1213, 1309, 1470, 1622, 1849, 2053, 2326, 1933, 1751, 1518, 1369, 1237, 1143, 1085, 1064, 1081, 1131, 1232, 1341, 1515, 1669, 1863, 2091, 2370, 2004, 1780, 1601, 1427, 1303, 1181, 1134, 1103, 1132, 1191, 1288, 1420, 1564, 1712, 1916, 2140, 2339, 2045, 1855, 1670, 1491, 1357, 1249, 1194, 1157, 1194, 1258, 1330, 1448, 1611, 1791, 1989, 2264, 2457, 2144, 1908, 1731, 1557, 1427, 1324, 1260, 1240, 1270, 1332, 1409, 1540, 1687, 1840, 2024, 2338, 2594, 2266, 1967, 1806, 1642, 1519, 1430, 1359, 1357, 1368, 1430, 1498, 1634, 1764, 1909, 2160, 2449, 2718, 2400, 2116, 1941, 1789, 1664, 1566, 1495, 1480, 1501, 1545, 1628, 1739, 1886, 2049, 2321, 2537, 2979, 2570, 2339, 2062, 1924, 1798, 1680, 1649, 1631, 1657, 1680, 1798, 1886, 2000, 2280, 2467, 2920, 3919, 2815, 2512, 2220, 2097, 1930, 1838, 1822, 1785, 1801, 1854, 1908, 2058, 2160, 2434, 2677, 3634] + }, + "lsc_samples_greenB": { + "uCoeff": [2983, 2543, 2242, 2037, 1874, 1793, 1671, 1656, 1623, 1605, 1658, 1769, 1869, 1952, 2180, 2422, 2864, 2707, 2337, 2079, 1910, 1782, 1665, 1574, 1506, 1501, 1496, 1553, 1633, 1749, 1851, 2034, 2286, 2535, 2505, 2184, 1933, 1777, 1662, 1515, 1437, 1379, 1392, 1388, 1410, 1495, 1631, 1768, 1888, 2126, 2416, 2356, 2029, 1874, 1685, 1548, 1422, 1347, 1276, 1256, 1271, 1315, 1399, 1527, 1636, 1818, 2016, 2279, 2303, 1973, 1793, 1631, 1485, 1347, 1249, 1189, 1168, 1189, 1245, 1342, 1450, 1589, 1727, 1933, 2222, 2247, 1950, 1765, 1577, 1422, 1299, 1195, 1135, 1122, 1147, 1186, 1282, 1402, 1555, 1746, 1905, 2193, 2235, 1909, 1726, 1550, 1391, 1242, 1161, 1104, 1081, 1093, 1146, 1228, 1357, 1488, 1683, 1866, 2083, 2181, 1881, 1691, 1491, 1349, 1196, 1121, 1047, 1034, 1059, 1109, 1198, 1315, 1460, 1649, 1839, 2063, 2140, 1841, 1692, 1492, 1341, 1197, 1113, 1047, 1024, 1054, 1106, 1184, 1315, 1460, 1646, 1816, 2085, 2196, 1919, 1712, 1507, 1359, 1233, 1121, 1076, 1045, 1079, 1124, 1225, 1352, 1501, 1674, 1871, 2117, 2251, 1977, 1776, 1579, 1411, 1270, 1179, 1109, 1106, 1109, 1177, 1284, 1405, 1539, 1726, 1909, 2181, 2321, 2035, 1793, 1619, 1472, 1325, 1225, 1177, 1153, 1175, 1230, 1343, 1444, 1581, 1779, 1950, 2254, 2408, 2054, 1852, 1697, 1540, 1400, 1315, 1240, 1214, 1240, 1305, 1389, 1522, 1655, 1812, 2009, 2311, 2489, 2158, 1917, 1756, 1631, 1502, 1383, 1345, 1332, 1339, 1394, 1495, 1603, 1724, 1895, 2136, 2392, 2694, 2372, 2073, 1883, 1726, 1617, 1545, 1482, 1461, 1485, 1545, 1605, 1726, 1831, 1991, 2278, 2659, 2952, 2538, 2279, 2022, 1883, 1762, 1676, 1634, 1644, 1618, 1693, 1743, 1846, 1985, 2216, 2447, 2907, 4079, 2764, 2433, 2218, 2030, 1900, 1856, 1839, 1777, 1829, 1781, 1911, 2024, 2151, 2413, 2677, 3741] + }, + "lsc_samples_blue": { + "uCoeff": [2635, 2327, 2071, 1865, 1744, 1607, 1564, 1555, 1470, 1505, 1529, 1596, 1777, 1807, 1964, 2255, 2669, 2436, 2193, 1951, 1776, 1660, 1506, 1459, 1400, 1409, 1408, 1442, 1521, 1599, 1743, 1864, 2111, 2343, 2282, 2016, 1820, 1679, 1531, 1423, 1342, 1309, 1265, 1281, 1342, 1399, 1479, 1611, 1759, 1957, 2214, 2135, 1904, 1730, 1571, 1419, 1318, 1241, 1193, 1188, 1218, 1238, 1344, 1398, 1511, 1681, 1837, 2115, 2030, 1844, 1663, 1501, 1384, 1274, 1207, 1150, 1126, 1153, 1192, 1261, 1365, 1469, 1623, 1802, 1994, 2101, 1819, 1620, 1470, 1335, 1237, 1147, 1103, 1091, 1103, 1142, 1219, 1320, 1435, 1609, 1765, 2017, 2009, 1779, 1593, 1431, 1290, 1187, 1124, 1075, 1066, 1083, 1113, 1187, 1305, 1386, 1573, 1766, 1925, 1964, 1770, 1550, 1400, 1268, 1162, 1065, 1047, 1045, 1057, 1093, 1153, 1255, 1360, 1516, 1700, 1899, 1957, 1752, 1546, 1392, 1265, 1144, 1078, 1031, 1024, 1035, 1075, 1142, 1252, 1349, 1522, 1714, 1925, 1989, 1777, 1591, 1404, 1268, 1173, 1091, 1057, 1054, 1054, 1085, 1173, 1262, 1383, 1535, 1744, 1907, 2000, 1820, 1626, 1439, 1316, 1211, 1124, 1093, 1084, 1083, 1111, 1217, 1316, 1439, 1598, 1746, 1958, 2072, 1863, 1677, 1484, 1377, 1241, 1194, 1141, 1124, 1127, 1173, 1244, 1346, 1488, 1620, 1813, 2091, 2135, 1904, 1723, 1549, 1396, 1305, 1222, 1176, 1165, 1173, 1219, 1320, 1401, 1520, 1698, 1851, 2086, 2220, 1995, 1802, 1619, 1440, 1367, 1301, 1247, 1231, 1256, 1316, 1374, 1479, 1576, 1775, 1873, 2197, 2421, 2150, 1909, 1761, 1581, 1490, 1418, 1361, 1363, 1373, 1402, 1485, 1556, 1685, 1849, 2044, 2331, 2665, 2295, 2083, 1845, 1701, 1618, 1519, 1473, 1483, 1473, 1539, 1586, 1701, 1809, 1984, 2237, 2682, 3359, 2352, 2180, 1959, 1832, 1723, 1656, 1590, 1556, 1579, 1595, 1782, 1811, 1903, 2090, 2352, 3387] + } + }, { + "name": "3264x2448_HZ_100", + "resolution": "3264x2448", + "illumination": "HZ", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [4417, 3517, 2971, 2590, 2357, 2197, 1998, 1901, 1833, 1901, 1965, 2130, 2304, 2553, 2946, 3399, 4283, 3721, 3129, 2720, 2397, 2156, 1943, 1777, 1705, 1661, 1688, 1782, 1901, 2111, 2365, 2639, 3009, 3535, 3535, 2922, 2544, 2217, 1959, 1742, 1597, 1496, 1471, 1508, 1597, 1734, 1922, 2150, 2473, 2773, 3415, 3335, 2730, 2373, 2062, 1809, 1586, 1435, 1337, 1318, 1361, 1435, 1565, 1755, 2009, 2296, 2639, 3199, 3156, 2600, 2231, 1901, 1665, 1462, 1315, 1228, 1201, 1228, 1308, 1459, 1634, 1871, 2183, 2517, 2984, 3088, 2481, 2183, 1814, 1565, 1343, 1226, 1128, 1102, 1125, 1214, 1343, 1538, 1791, 2093, 2447, 2946, 2910, 2439, 2093, 1742, 1489, 1284, 1152, 1075, 1069, 1082, 1160, 1289, 1474, 1717, 2021, 2342, 2817, 2984, 2422, 2044, 1721, 1462, 1254, 1120, 1053, 1024, 1059, 1127, 1248, 1429, 1684, 1987, 2357, 2806, 2922, 2422, 2062, 1721, 1462, 1257, 1120, 1053, 1028, 1047, 1127, 1259, 1438, 1680, 2009, 2365, 2806, 2946, 2422, 2074, 1760, 1489, 1284, 1158, 1082, 1047, 1069, 1136, 1279, 1471, 1713, 1998, 2373, 2829, 3009, 2508, 2124, 1800, 1551, 1348, 1193, 1138, 1113, 1127, 1199, 1332, 1538, 1809, 2111, 2397, 2922, 3074, 2581, 2238, 1927, 1653, 1450, 1298, 1201, 1177, 1214, 1296, 1421, 1623, 1881, 2183, 2581, 3061, 3335, 2752, 2406, 2044, 1777, 1569, 1421, 1325, 1305, 1348, 1407, 1531, 1738, 2009, 2326, 2639, 3199, 3625, 2922, 2517, 2203, 1970, 1738, 1572, 1462, 1456, 1474, 1565, 1713, 1943, 2170, 2481, 2829, 3319, 3884, 3129, 2709, 2422, 2143, 1943, 1791, 1668, 1661, 1668, 1768, 1891, 2093, 2342, 2669, 3009, 3644, 4258, 3449, 2971, 2639, 2373, 2176, 1987, 1927, 1881, 1907, 1993, 2130, 2326, 2553, 2898, 3304, 4086, 5936, 3884, 3415, 3009, 2679, 2447, 2304, 2267, 2197, 2197, 2326, 2447, 2669, 2875, 3243, 3644, 5477] + }, + "lsc_samples_greenR": { + "uCoeff": [3773, 3054, 2584, 2368, 2081, 1922, 1814, 1746, 1708, 1768, 1809, 1876, 2033, 2191, 2441, 2915, 3713, 3328, 2724, 2392, 2119, 1902, 1746, 1656, 1578, 1561, 1582, 1614, 1712, 1892, 2027, 2254, 2623, 3122, 3002, 2529, 2205, 1971, 1768, 1607, 1495, 1425, 1389, 1417, 1482, 1582, 1733, 1912, 2125, 2400, 2952, 2903, 2368, 2081, 1814, 1648, 1482, 1367, 1297, 1283, 1295, 1354, 1458, 1593, 1768, 1993, 2283, 2703, 2683, 2240, 1971, 1717, 1534, 1378, 1267, 1184, 1178, 1180, 1251, 1381, 1498, 1668, 1902, 2171, 2584, 2633, 2178, 1902, 1629, 1443, 1283, 1184, 1129, 1092, 1118, 1174, 1262, 1434, 1600, 1837, 2094, 2476, 2511, 2119, 1833, 1607, 1392, 1247, 1122, 1067, 1045, 1061, 1125, 1225, 1381, 1547, 1786, 2039, 2424, 2511, 2106, 1837, 1554, 1362, 1223, 1108, 1047, 1024, 1045, 1102, 1198, 1339, 1534, 1768, 2039, 2400, 2476, 2106, 1814, 1571, 1378, 1210, 1101, 1045, 1024, 1039, 1109, 1196, 1354, 1547, 1773, 2033, 2392, 2556, 2112, 1828, 1582, 1383, 1247, 1134, 1079, 1041, 1067, 1131, 1236, 1381, 1554, 1804, 2081, 2424, 2623, 2164, 1902, 1660, 1434, 1292, 1184, 1111, 1106, 1115, 1159, 1274, 1431, 1600, 1866, 2081, 2476, 2745, 2298, 2010, 1751, 1527, 1383, 1247, 1184, 1159, 1184, 1255, 1378, 1521, 1668, 1933, 2205, 2556, 2892, 2400, 2112, 1837, 1641, 1485, 1354, 1285, 1264, 1280, 1349, 1473, 1614, 1795, 2016, 2352, 2724, 3108, 2575, 2212, 1965, 1768, 1614, 1504, 1440, 1397, 1403, 1485, 1600, 1738, 1960, 2144, 2502, 2940, 3312, 2800, 2416, 2119, 1954, 1773, 1645, 1585, 1568, 1582, 1656, 1733, 1902, 2081, 2352, 2714, 3122, 3753, 3028, 2683, 2336, 2119, 1982, 1823, 1755, 1751, 1764, 1833, 1960, 2094, 2283, 2594, 2915, 3694, 4832, 3408, 3002, 2652, 2384, 2191, 2069, 2004, 1954, 1982, 2045, 2144, 2321, 2584, 2811, 3266, 5113] + }, + "lsc_samples_greenB": { + "uCoeff": [3789, 3068, 2586, 2339, 2090, 1974, 1836, 1716, 1720, 1758, 1831, 1963, 2103, 2278, 2605, 2965, 3769, 3327, 2823, 2452, 2174, 1941, 1758, 1656, 1578, 1568, 1578, 1633, 1745, 1920, 2103, 2346, 2736, 3281, 3136, 2586, 2293, 2013, 1799, 1622, 1504, 1423, 1403, 1432, 1489, 1585, 1776, 1952, 2160, 2522, 2990, 2928, 2452, 2154, 1895, 1637, 1501, 1389, 1317, 1288, 1310, 1373, 1486, 1648, 1831, 2066, 2402, 2834, 2779, 2362, 2042, 1763, 1557, 1409, 1281, 1209, 1177, 1213, 1272, 1387, 1527, 1737, 1990, 2264, 2694, 2715, 2271, 1968, 1691, 1473, 1317, 1197, 1137, 1112, 1143, 1201, 1303, 1464, 1633, 1885, 2180, 2549, 2625, 2221, 1905, 1648, 1426, 1265, 1147, 1079, 1056, 1070, 1143, 1252, 1423, 1600, 1817, 2115, 2605, 2605, 2180, 1895, 1614, 1395, 1228, 1128, 1051, 1034, 1061, 1119, 1230, 1387, 1578, 1803, 2078, 2452, 2596, 2180, 1900, 1589, 1400, 1230, 1112, 1050, 1024, 1045, 1121, 1220, 1373, 1568, 1812, 2115, 2452, 2674, 2221, 1905, 1622, 1432, 1259, 1134, 1072, 1048, 1069, 1121, 1239, 1395, 1592, 1831, 2122, 2452, 2674, 2264, 1947, 1675, 1464, 1307, 1169, 1107, 1090, 1111, 1169, 1288, 1440, 1637, 1855, 2174, 2540, 2801, 2331, 2042, 1737, 1534, 1379, 1241, 1167, 1154, 1167, 1241, 1352, 1504, 1707, 1963, 2250, 2715, 2904, 2469, 2128, 1855, 1640, 1470, 1355, 1268, 1237, 1265, 1334, 1458, 1607, 1831, 2048, 2394, 2801, 3136, 2596, 2221, 1968, 1754, 1589, 1470, 1389, 1373, 1389, 1440, 1589, 1716, 1947, 2201, 2478, 2916, 3407, 2812, 2444, 2122, 1910, 1741, 1603, 1534, 1514, 1534, 1607, 1720, 1880, 2066, 2331, 2664, 3149, 3729, 3068, 2634, 2293, 2072, 1920, 1776, 1687, 1671, 1683, 1763, 1895, 2019, 2242, 2558, 2916, 3634, 5098, 3457, 2965, 2634, 2362, 2115, 1979, 1968, 1920, 1974, 1996, 2122, 2278, 2549, 2823, 3342, 4821] + }, + "lsc_samples_blue": { + "uCoeff": [3491, 2854, 2439, 2091, 1920, 1816, 1736, 1723, 1639, 1686, 1723, 1845, 1985, 2002, 2365, 2722, 3598, 3000, 2545, 2252, 1985, 1816, 1698, 1552, 1542, 1512, 1532, 1583, 1686, 1802, 2002, 2169, 2545, 3039, 2854, 2365, 2073, 1874, 1650, 1542, 1456, 1412, 1395, 1387, 1465, 1552, 1698, 1845, 2055, 2342, 2786, 2660, 2230, 1968, 1723, 1573, 1429, 1339, 1281, 1288, 1310, 1363, 1456, 1605, 1723, 1920, 2274, 2660, 2464, 2129, 1874, 1639, 1474, 1355, 1254, 1196, 1178, 1202, 1267, 1387, 1474, 1605, 1860, 2129, 2464, 2319, 2002, 1789, 1583, 1387, 1288, 1184, 1133, 1111, 1149, 1196, 1295, 1395, 1583, 1775, 2055, 2365, 2319, 1968, 1723, 1532, 1339, 1221, 1111, 1086, 1056, 1101, 1149, 1234, 1363, 1542, 1736, 1985, 2274, 2210, 1968, 1736, 1502, 1317, 1184, 1111, 1056, 1042, 1061, 1106, 1227, 1355, 1502, 1674, 1920, 2230, 2210, 1936, 1698, 1493, 1317, 1184, 1101, 1042, 1024, 1056, 1106, 1221, 1347, 1532, 1674, 1985, 2252, 2319, 1936, 1723, 1493, 1339, 1184, 1106, 1061, 1033, 1081, 1111, 1209, 1339, 1512, 1698, 1985, 2230, 2252, 1936, 1749, 1552, 1355, 1247, 1149, 1076, 1066, 1076, 1149, 1227, 1395, 1532, 1698, 1920, 2252, 2365, 2055, 1802, 1627, 1421, 1281, 1184, 1144, 1127, 1155, 1202, 1267, 1395, 1583, 1802, 2019, 2365, 2545, 2129, 1920, 1686, 1512, 1387, 1288, 1227, 1202, 1221, 1281, 1379, 1502, 1650, 1874, 2091, 2545, 2820, 2274, 2002, 1775, 1594, 1474, 1379, 1310, 1317, 1324, 1387, 1465, 1605, 1749, 1985, 2252, 2660, 2925, 2439, 2129, 1874, 1723, 1605, 1542, 1447, 1421, 1456, 1474, 1594, 1698, 1920, 2073, 2439, 2854, 3295, 2690, 2274, 2002, 1860, 1749, 1639, 1583, 1583, 1583, 1605, 1736, 1845, 2002, 2210, 2660, 3342, 4327, 3039, 2572, 2210, 1985, 1816, 1789, 1749, 1686, 1749, 1749, 1874, 2055, 2129, 2464, 2925, 4409] + } + }, { + "name": "3264x2448_HZ_70", + "resolution": "3264x2448", + "illumination": "HZ", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [3399, 2886, 2549, 2300, 2144, 2034, 1877, 1800, 1742, 1800, 1848, 1976, 2100, 2270, 2530, 2797, 3305, 2987, 2646, 2393, 2176, 2003, 1838, 1702, 1644, 1606, 1628, 1707, 1801, 1964, 2149, 2328, 2554, 2851, 2904, 2526, 2283, 2050, 1853, 1676, 1553, 1464, 1442, 1475, 1553, 1669, 1820, 1992, 2224, 2408, 2815, 2795, 2404, 2165, 1936, 1735, 1545, 1411, 1322, 1305, 1345, 1411, 1525, 1686, 1889, 2100, 2330, 2691, 2688, 2321, 2063, 1808, 1614, 1437, 1303, 1221, 1196, 1221, 1296, 1434, 1586, 1781, 2022, 2253, 2554, 2658, 2240, 2035, 1739, 1529, 1329, 1220, 1126, 1101, 1123, 1208, 1329, 1504, 1718, 1957, 2211, 2546, 2532, 2216, 1966, 1680, 1462, 1275, 1149, 1074, 1069, 1081, 1157, 1279, 1448, 1657, 1902, 2135, 2458, 2601, 2209, 1927, 1665, 1439, 1247, 1119, 1053, 1024, 1059, 1125, 1241, 1408, 1631, 1877, 2154, 2458, 2554, 2211, 1945, 1666, 1440, 1250, 1119, 1053, 1028, 1047, 1126, 1252, 1417, 1628, 1898, 2163, 2460, 2570, 2209, 1954, 1700, 1464, 1276, 1156, 1082, 1047, 1069, 1134, 1271, 1447, 1657, 1887, 2167, 2476, 2611, 2274, 1993, 1733, 1520, 1336, 1190, 1137, 1112, 1126, 1195, 1321, 1508, 1741, 1981, 2181, 2542, 2647, 2323, 2083, 1842, 1611, 1431, 1290, 1198, 1174, 1210, 1288, 1403, 1583, 1800, 2035, 2323, 2637, 2828, 2446, 2214, 1935, 1717, 1538, 1404, 1315, 1297, 1338, 1391, 1502, 1681, 1904, 2145, 2353, 2722, 3017, 2559, 2287, 2060, 1880, 1686, 1540, 1441, 1436, 1452, 1534, 1663, 1856, 2031, 2257, 2484, 2783, 3166, 2690, 2420, 2226, 2016, 1858, 1732, 1624, 1620, 1624, 1711, 1811, 1972, 2158, 2386, 2595, 2986, 3377, 2893, 2596, 2379, 2191, 2044, 1891, 1846, 1806, 1827, 1897, 2004, 2150, 2307, 2537, 2781, 3252, 4462, 3160, 2897, 2641, 2415, 2249, 2145, 2123, 2065, 2061, 2164, 2249, 2407, 2532, 2763, 2980, 4141] + }, + "lsc_samples_greenR": { + "uCoeff": [2948, 2540, 2246, 2119, 1912, 1797, 1716, 1663, 1631, 1682, 1711, 1757, 1872, 1975, 2134, 2436, 2906, 2701, 2334, 2128, 1943, 1784, 1664, 1593, 1528, 1514, 1532, 1555, 1633, 1775, 1865, 2017, 2256, 2551, 2505, 2215, 2002, 1839, 1684, 1553, 1459, 1398, 1365, 1390, 1447, 1531, 1653, 1788, 1936, 2113, 2468, 2464, 2111, 1918, 1718, 1589, 1448, 1347, 1284, 1271, 1282, 1335, 1426, 1539, 1677, 1844, 2042, 2311, 2319, 2025, 1839, 1643, 1494, 1358, 1257, 1179, 1174, 1175, 1241, 1360, 1460, 1599, 1780, 1968, 2242, 2298, 1987, 1790, 1572, 1415, 1271, 1179, 1127, 1091, 1116, 1170, 1251, 1406, 1545, 1733, 1917, 2174, 2213, 1947, 1737, 1557, 1371, 1239, 1120, 1067, 1045, 1061, 1123, 1218, 1360, 1502, 1695, 1879, 2144, 2220, 1941, 1744, 1511, 1344, 1217, 1107, 1047, 1024, 1045, 1101, 1193, 1322, 1493, 1683, 1884, 2131, 2194, 1943, 1725, 1528, 1360, 1205, 1100, 1045, 1024, 1039, 1108, 1191, 1337, 1506, 1689, 1881, 2127, 2257, 1946, 1736, 1537, 1364, 1240, 1132, 1079, 1041, 1067, 1129, 1229, 1362, 1511, 1715, 1920, 2150, 2303, 1985, 1797, 1605, 1410, 1282, 1181, 1110, 1105, 1114, 1156, 1265, 1407, 1550, 1766, 1915, 2185, 2387, 2087, 1884, 1682, 1493, 1367, 1240, 1181, 1157, 1181, 1248, 1362, 1488, 1607, 1817, 2010, 2237, 2482, 2157, 1961, 1750, 1592, 1458, 1340, 1277, 1257, 1272, 1335, 1447, 1567, 1713, 1878, 2117, 2351, 2621, 2278, 2029, 1851, 1698, 1571, 1476, 1420, 1380, 1385, 1458, 1558, 1670, 1846, 1972, 2219, 2492, 2737, 2429, 2177, 1966, 1849, 1704, 1597, 1547, 1533, 1544, 1607, 1668, 1803, 1933, 2124, 2361, 2595, 3010, 2568, 2363, 2125, 1971, 1873, 1744, 1689, 1688, 1697, 1753, 1853, 1950, 2080, 2292, 2481, 2967, 3690, 2804, 2574, 2350, 2167, 2029, 1939, 1891, 1849, 1871, 1918, 1988, 2114, 2295, 2424, 2698, 3886] + }, + "lsc_samples_greenB": { + "uCoeff": [2960, 2550, 2248, 2095, 1920, 1842, 1735, 1636, 1642, 1673, 1731, 1832, 1931, 2046, 2263, 2473, 2946, 2700, 2410, 2177, 1989, 1817, 1674, 1593, 1528, 1521, 1528, 1573, 1663, 1799, 1929, 2091, 2343, 2666, 2606, 2260, 2075, 1875, 1711, 1567, 1467, 1396, 1379, 1404, 1453, 1533, 1691, 1822, 1965, 2209, 2496, 2483, 2179, 1980, 1789, 1579, 1466, 1368, 1303, 1276, 1296, 1353, 1452, 1589, 1733, 1906, 2138, 2411, 2394, 2125, 1900, 1684, 1515, 1387, 1270, 1203, 1173, 1207, 1262, 1366, 1487, 1661, 1856, 2045, 2328, 2363, 2065, 1848, 1628, 1443, 1304, 1192, 1135, 1111, 1141, 1196, 1290, 1434, 1575, 1775, 1989, 2231, 2304, 2033, 1800, 1594, 1403, 1256, 1145, 1078, 1056, 1070, 1141, 1244, 1400, 1550, 1722, 1943, 2288, 2296, 2004, 1796, 1566, 1375, 1222, 1126, 1051, 1034, 1061, 1118, 1224, 1368, 1533, 1714, 1917, 2173, 2291, 2006, 1801, 1544, 1381, 1224, 1111, 1050, 1024, 1045, 1120, 1214, 1355, 1525, 1723, 1950, 2175, 2351, 2038, 1804, 1574, 1410, 1252, 1132, 1072, 1048, 1069, 1120, 1232, 1375, 1546, 1739, 1955, 2173, 2344, 2069, 1837, 1619, 1438, 1297, 1166, 1106, 1090, 1110, 1166, 1278, 1416, 1584, 1756, 1993, 2236, 2431, 2115, 1912, 1669, 1500, 1363, 1235, 1164, 1152, 1164, 1235, 1337, 1472, 1642, 1843, 2047, 2363, 2492, 2214, 1974, 1766, 1591, 1444, 1341, 1260, 1231, 1257, 1321, 1433, 1561, 1745, 1905, 2152, 2411, 2643, 2295, 2037, 1853, 1685, 1548, 1444, 1371, 1357, 1371, 1416, 1548, 1650, 1835, 2020, 2200, 2474, 2809, 2439, 2200, 1968, 1810, 1675, 1558, 1499, 1482, 1499, 1562, 1656, 1783, 1920, 2106, 2322, 2615, 2992, 2599, 2324, 2088, 1931, 1818, 1701, 1627, 1615, 1624, 1690, 1796, 1885, 2046, 2262, 2482, 2923, 3876, 2841, 2545, 2336, 2149, 1963, 1860, 1859, 1819, 1864, 1875, 1969, 2078, 2266, 2434, 2755, 3682] + }, + "lsc_samples_blue": { + "uCoeff": [2751, 2390, 2133, 1893, 1777, 1706, 1647, 1642, 1570, 1610, 1636, 1731, 1832, 1821, 2075, 2292, 2826, 2462, 2196, 2015, 1830, 1709, 1621, 1500, 1495, 1470, 1486, 1528, 1610, 1697, 1844, 1948, 2196, 2490, 2394, 2085, 1893, 1755, 1579, 1494, 1423, 1386, 1371, 1362, 1431, 1503, 1622, 1730, 1878, 2067, 2343, 2278, 1999, 1823, 1638, 1521, 1399, 1321, 1269, 1276, 1296, 1343, 1424, 1550, 1638, 1782, 2035, 2278, 2148, 1934, 1756, 1573, 1438, 1336, 1244, 1190, 1174, 1196, 1257, 1366, 1438, 1543, 1744, 1934, 2148, 2049, 1840, 1691, 1530, 1363, 1276, 1179, 1131, 1110, 1147, 1191, 1283, 1370, 1530, 1679, 1884, 2086, 2060, 1819, 1640, 1488, 1321, 1214, 1109, 1085, 1056, 1100, 1146, 1226, 1343, 1497, 1651, 1834, 2024, 1978, 1824, 1655, 1463, 1301, 1179, 1110, 1056, 1042, 1061, 1105, 1221, 1337, 1463, 1600, 1783, 1994, 1980, 1798, 1622, 1456, 1302, 1179, 1100, 1042, 1024, 1056, 1105, 1215, 1330, 1492, 1601, 1840, 2014, 2066, 1797, 1643, 1455, 1322, 1179, 1105, 1061, 1033, 1081, 1110, 1203, 1322, 1472, 1621, 1838, 1994, 2006, 1792, 1663, 1507, 1336, 1239, 1146, 1075, 1066, 1075, 1146, 1220, 1373, 1488, 1618, 1779, 2006, 2086, 1884, 1703, 1570, 1394, 1269, 1179, 1142, 1125, 1152, 1197, 1256, 1370, 1530, 1703, 1854, 2086, 2211, 1934, 1795, 1615, 1473, 1366, 1277, 1220, 1197, 1215, 1270, 1359, 1464, 1583, 1756, 1902, 2211, 2400, 2035, 1851, 1684, 1540, 1441, 1358, 1296, 1304, 1309, 1366, 1433, 1550, 1661, 1837, 2017, 2278, 2448, 2144, 1939, 1755, 1644, 1551, 1502, 1418, 1395, 1427, 1439, 1541, 1622, 1795, 1893, 2144, 2394, 2677, 2308, 2033, 1844, 1747, 1666, 1578, 1533, 1534, 1533, 1547, 1655, 1734, 1844, 1982, 2285, 2711, 3336, 2529, 2237, 1990, 1832, 1706, 1694, 1665, 1611, 1665, 1659, 1756, 1891, 1924, 2152, 2444, 3394] + } + }, { + "name": "3264x2448_TL84_100", + "resolution": "3264x2448", + "illumination": "TL84", + "vignetting": 100, + "lsc_samples_red": { + "uCoeff": [3642, 2815, 2401, 2160, 1963, 1865, 1745, 1660, 1608, 1702, 1753, 1848, 1935, 2160, 2346, 2739, 3517, 3188, 2567, 2231, 2011, 1815, 1695, 1589, 1553, 1502, 1536, 1602, 1681, 1807, 1973, 2160, 2535, 3023, 2957, 2459, 2105, 1873, 1702, 1565, 1464, 1389, 1357, 1399, 1459, 1559, 1702, 1865, 2052, 2346, 2796, 2668, 2231, 1963, 1760, 1602, 1459, 1339, 1293, 1249, 1281, 1348, 1454, 1589, 1776, 1963, 2207, 2616, 2600, 2127, 1908, 1681, 1502, 1366, 1234, 1181, 1154, 1181, 1249, 1339, 1496, 1653, 1831, 2073, 2504, 2504, 2105, 1831, 1608, 1433, 1293, 1191, 1110, 1092, 1098, 1167, 1277, 1454, 1589, 1783, 2031, 2444, 2430, 2002, 1783, 1565, 1385, 1249, 1125, 1070, 1058, 1067, 1138, 1209, 1385, 1536, 1730, 1963, 2333, 2401, 2002, 1745, 1541, 1366, 1209, 1101, 1050, 1029, 1048, 1098, 1191, 1353, 1524, 1730, 1963, 2243, 2430, 2002, 1753, 1541, 1357, 1209, 1101, 1050, 1024, 1024, 1092, 1198, 1339, 1496, 1709, 1973, 2294, 2430, 2042, 1783, 1577, 1385, 1257, 1135, 1072, 1053, 1053, 1101, 1234, 1357, 1541, 1745, 2002, 2373, 2444, 2052, 1831, 1602, 1409, 1293, 1198, 1122, 1084, 1113, 1161, 1265, 1438, 1608, 1791, 2031, 2401, 2685, 2149, 1908, 1702, 1513, 1371, 1245, 1167, 1138, 1171, 1219, 1339, 1464, 1647, 1882, 2116, 2567, 2739, 2243, 2002, 1776, 1589, 1464, 1353, 1273, 1249, 1265, 1326, 1409, 1565, 1776, 1945, 2207, 2633, 2854, 2444, 2105, 1908, 1723, 1565, 1454, 1389, 1357, 1389, 1454, 1553, 1674, 1882, 2073, 2333, 2854, 3213, 2567, 2256, 2011, 1848, 1681, 1608, 1541, 1518, 1518, 1589, 1660, 1815, 1963, 2207, 2600, 2979, 3547, 2874, 2459, 2207, 2031, 1873, 1730, 1702, 1660, 1674, 1753, 1848, 1963, 2127, 2387, 2685, 3547, 4633, 3238, 2758, 2444, 2256, 2083, 1982, 1882, 1873, 1882, 1973, 2002, 2243, 2430, 2739, 3091, 4740] + }, + "lsc_samples_greenR": { + "uCoeff": [3620, 2844, 2491, 2216, 1966, 1835, 1739, 1699, 1636, 1716, 1721, 1815, 1920, 2110, 2418, 2693, 3506, 3140, 2608, 2269, 2020, 1825, 1699, 1581, 1544, 1516, 1527, 1581, 1652, 1781, 1943, 2172, 2500, 2932, 2945, 2436, 2117, 1893, 1699, 1566, 1459, 1401, 1369, 1404, 1437, 1534, 1656, 1815, 2039, 2325, 2726, 2682, 2254, 1996, 1781, 1593, 1459, 1358, 1291, 1245, 1289, 1338, 1416, 1541, 1708, 1898, 2187, 2578, 2538, 2151, 1882, 1686, 1496, 1369, 1250, 1181, 1162, 1177, 1238, 1330, 1447, 1616, 1820, 2070, 2454, 2519, 2110, 1815, 1612, 1431, 1291, 1177, 1117, 1104, 1110, 1175, 1281, 1410, 1559, 1786, 2002, 2341, 2427, 2045, 1786, 1559, 1383, 1236, 1131, 1060, 1058, 1072, 1129, 1220, 1366, 1530, 1730, 1960, 2223, 2392, 2039, 1767, 1548, 1358, 1216, 1104, 1058, 1024, 1053, 1106, 1196, 1336, 1496, 1699, 1932, 2269, 2392, 2026, 1781, 1534, 1372, 1216, 1099, 1048, 1029, 1048, 1102, 1200, 1336, 1506, 1716, 1932, 2341, 2436, 2051, 1791, 1566, 1398, 1245, 1133, 1072, 1053, 1067, 1119, 1231, 1352, 1534, 1757, 1966, 2308, 2472, 2117, 1877, 1669, 1443, 1302, 1183, 1106, 1091, 1106, 1158, 1274, 1401, 1570, 1771, 2045, 2400, 2578, 2194, 1904, 1699, 1506, 1358, 1241, 1185, 1168, 1168, 1250, 1347, 1459, 1644, 1856, 2117, 2519, 2796, 2308, 2008, 1791, 1596, 1459, 1352, 1284, 1255, 1289, 1341, 1447, 1585, 1739, 1937, 2231, 2578, 2893, 2472, 2144, 1898, 1748, 1574, 1459, 1392, 1360, 1392, 1443, 1548, 1703, 1845, 2077, 2366, 2726, 3201, 2682, 2285, 2064, 1856, 1708, 1608, 1534, 1516, 1544, 1581, 1682, 1800, 2039, 2246, 2538, 2984, 3581, 2971, 2519, 2231, 2045, 1877, 1757, 1690, 1686, 1708, 1771, 1882, 2020, 2172, 2427, 2807, 3506, 4633, 3216, 2844, 2436, 2254, 2097, 1943, 1882, 1856, 1877, 1882, 2039, 2201, 2418, 2682, 3096, 4666] + }, + "lsc_samples_greenB": { + "uCoeff": [3604, 2880, 2479, 2235, 1986, 1868, 1740, 1691, 1682, 1695, 1745, 1812, 1992, 2134, 2416, 2759, 3604, 3140, 2681, 2274, 2061, 1863, 1722, 1616, 1541, 1523, 1527, 1578, 1674, 1817, 2011, 2213, 2527, 3011, 2867, 2442, 2162, 1911, 1731, 1585, 1472, 1403, 1385, 1385, 1453, 1559, 1695, 1868, 2087, 2381, 2867, 2714, 2314, 2017, 1792, 1593, 1462, 1371, 1283, 1268, 1293, 1343, 1449, 1574, 1749, 1951, 2220, 2617, 2566, 2176, 1934, 1700, 1502, 1374, 1256, 1186, 1169, 1180, 1235, 1354, 1485, 1649, 1852, 2114, 2517, 2517, 2127, 1868, 1608, 1446, 1283, 1184, 1112, 1094, 1114, 1178, 1266, 1418, 1601, 1782, 2067, 2364, 2451, 2061, 1797, 1585, 1383, 1235, 1139, 1067, 1043, 1078, 1120, 1240, 1371, 1534, 1745, 1992, 2347, 2389, 2061, 1792, 1541, 1351, 1210, 1110, 1034, 1035, 1052, 1097, 1190, 1346, 1523, 1713, 1969, 2364, 2364, 2061, 1759, 1559, 1351, 1206, 1101, 1043, 1024, 1043, 1099, 1184, 1346, 1499, 1726, 1992, 2290, 2461, 2061, 1817, 1566, 1385, 1235, 1125, 1072, 1043, 1052, 1110, 1217, 1354, 1527, 1726, 1945, 2314, 2488, 2127, 1832, 1605, 1430, 1259, 1155, 1086, 1074, 1086, 1157, 1266, 1403, 1589, 1792, 2035, 2364, 2586, 2184, 1911, 1695, 1482, 1340, 1223, 1163, 1155, 1163, 1219, 1335, 1475, 1620, 1827, 2114, 2507, 2783, 2274, 2035, 1759, 1585, 1430, 1306, 1259, 1226, 1249, 1324, 1424, 1574, 1726, 1945, 2258, 2596, 2867, 2461, 2127, 1873, 1682, 1537, 1437, 1346, 1332, 1377, 1424, 1513, 1678, 1863, 2100, 2322, 2703, 3186, 2627, 2290, 2035, 1812, 1674, 1552, 1495, 1462, 1502, 1563, 1649, 1797, 1986, 2184, 2527, 3011, 3508, 2892, 2461, 2176, 1969, 1817, 1731, 1661, 1645, 1653, 1700, 1827, 1928, 2127, 2416, 2714, 3399, 4813, 3140, 2748, 2442, 2213, 1998, 1884, 1873, 1832, 1827, 1906, 2017, 2155, 2416, 2596, 3111, 4779] + }, + "lsc_samples_blue": { + "uCoeff": [3252, 2701, 2238, 2018, 1758, 1647, 1575, 1575, 1566, 1549, 1637, 1619, 1758, 2003, 2255, 2490, 3045, 2727, 2387, 2091, 1837, 1706, 1566, 1485, 1455, 1412, 1455, 1477, 1575, 1647, 1791, 1976, 2273, 2701, 2627, 2186, 1873, 1716, 1575, 1477, 1365, 1339, 1315, 1333, 1385, 1440, 1524, 1647, 1848, 2122, 2469, 2448, 2061, 1780, 1610, 1493, 1333, 1291, 1246, 1210, 1236, 1274, 1352, 1433, 1610, 1780, 2003, 2367, 2238, 1923, 1706, 1541, 1391, 1321, 1210, 1175, 1142, 1175, 1215, 1291, 1391, 1516, 1706, 1923, 2255, 2186, 1873, 1666, 1485, 1352, 1230, 1161, 1090, 1098, 1098, 1138, 1230, 1333, 1477, 1619, 1848, 2186, 2186, 1837, 1637, 1433, 1285, 1215, 1111, 1078, 1062, 1066, 1138, 1161, 1291, 1405, 1583, 1825, 2138, 2122, 1825, 1575, 1426, 1291, 1161, 1082, 1062, 1024, 1062, 1090, 1165, 1274, 1412, 1575, 1802, 2076, 2138, 1802, 1583, 1426, 1285, 1156, 1098, 1035, 1028, 1054, 1078, 1161, 1285, 1405, 1601, 1802, 2061, 2122, 1802, 1637, 1412, 1291, 1190, 1107, 1062, 1046, 1046, 1111, 1180, 1268, 1405, 1610, 1837, 2061, 2122, 1837, 1637, 1485, 1339, 1199, 1124, 1066, 1078, 1062, 1111, 1210, 1333, 1440, 1619, 1825, 2203, 2273, 1936, 1676, 1516, 1385, 1246, 1190, 1111, 1111, 1124, 1175, 1252, 1358, 1508, 1676, 1885, 2238, 2273, 2018, 1780, 1566, 1426, 1309, 1230, 1180, 1180, 1190, 1252, 1339, 1433, 1549, 1726, 1936, 2255, 2490, 2122, 1837, 1666, 1508, 1405, 1333, 1274, 1246, 1297, 1321, 1412, 1508, 1666, 1837, 2076, 2406, 2627, 2255, 1962, 1780, 1619, 1516, 1426, 1391, 1365, 1385, 1412, 1508, 1601, 1758, 1923, 2255, 2603, 3045, 2534, 2186, 1910, 1758, 1647, 1524, 1508, 1493, 1485, 1541, 1610, 1716, 1885, 2122, 2367, 3145, 4144, 2701, 2367, 2091, 1837, 1716, 1686, 1575, 1619, 1619, 1666, 1758, 1848, 2018, 2238, 2651, 3972] + } + }, { + "name": "3264x2448_TL84_70", + "resolution": "3264x2448", + "illumination": "TL84", + "vignetting": 70, + "lsc_samples_red": { + "uCoeff": [2857, 2361, 2103, 1949, 1813, 1748, 1655, 1587, 1542, 1624, 1662, 1733, 1790, 1949, 2060, 2305, 2769, 2599, 2213, 1998, 1852, 1708, 1618, 1533, 1505, 1460, 1490, 1545, 1606, 1701, 1820, 1941, 2188, 2479, 2472, 2159, 1919, 1754, 1625, 1515, 1430, 1364, 1335, 1374, 1426, 1510, 1625, 1747, 1875, 2070, 2351, 2284, 2000, 1818, 1670, 1547, 1427, 1321, 1280, 1239, 1269, 1329, 1422, 1536, 1685, 1818, 1981, 2244, 2254, 1932, 1785, 1611, 1464, 1346, 1225, 1176, 1150, 1176, 1240, 1321, 1459, 1586, 1719, 1888, 2179, 2196, 1926, 1728, 1553, 1406, 1281, 1186, 1108, 1091, 1097, 1163, 1266, 1425, 1536, 1686, 1864, 2148, 2148, 1848, 1692, 1518, 1364, 1241, 1123, 1070, 1058, 1067, 1136, 1202, 1364, 1492, 1646, 1815, 2071, 2132, 1853, 1663, 1499, 1348, 1203, 1100, 1050, 1029, 1048, 1097, 1186, 1336, 1484, 1649, 1820, 2005, 2157, 1854, 1671, 1500, 1340, 1204, 1100, 1050, 1024, 1024, 1091, 1193, 1323, 1459, 1632, 1830, 2048, 2155, 1887, 1696, 1532, 1366, 1250, 1133, 1072, 1053, 1053, 1100, 1228, 1339, 1499, 1663, 1853, 2109, 2160, 1890, 1735, 1552, 1387, 1283, 1194, 1121, 1084, 1112, 1158, 1256, 1414, 1558, 1700, 1873, 2125, 2339, 1963, 1795, 1638, 1480, 1355, 1239, 1164, 1136, 1168, 1213, 1325, 1434, 1588, 1773, 1935, 2246, 2363, 2027, 1866, 1696, 1544, 1439, 1339, 1265, 1242, 1257, 1313, 1387, 1522, 1696, 1817, 1998, 2280, 2427, 2172, 1939, 1800, 1657, 1525, 1429, 1371, 1342, 1371, 1429, 1514, 1612, 1778, 1912, 2083, 2427, 2663, 2245, 2044, 1873, 1755, 1620, 1563, 1506, 1486, 1485, 1546, 1601, 1725, 1832, 2004, 2271, 2488, 2860, 2450, 2183, 2016, 1895, 1776, 1660, 1641, 1605, 1615, 1681, 1754, 1836, 1949, 2124, 2304, 2860, 3550, 2677, 2383, 2181, 2059, 1936, 1863, 1783, 1777, 1783, 1855, 1866, 2049, 2169, 2368, 2567, 3625] + }, + "lsc_samples_greenR": { + "uCoeff": [2841, 2383, 2173, 1995, 1816, 1722, 1650, 1621, 1567, 1636, 1634, 1705, 1777, 1909, 2116, 2270, 2761, 2564, 2245, 2029, 1859, 1717, 1622, 1526, 1497, 1473, 1482, 1526, 1580, 1679, 1795, 1951, 2161, 2412, 2463, 2141, 1929, 1771, 1623, 1516, 1426, 1375, 1347, 1378, 1405, 1487, 1584, 1704, 1865, 2053, 2299, 2295, 2019, 1846, 1689, 1539, 1427, 1339, 1278, 1235, 1276, 1320, 1387, 1492, 1625, 1763, 1965, 2215, 2206, 1952, 1763, 1615, 1459, 1349, 1241, 1176, 1158, 1172, 1229, 1312, 1413, 1553, 1709, 1885, 2140, 2208, 1930, 1714, 1556, 1404, 1279, 1173, 1115, 1103, 1108, 1171, 1269, 1384, 1508, 1689, 1840, 2067, 2146, 1884, 1695, 1513, 1362, 1228, 1129, 1060, 1058, 1071, 1127, 1213, 1346, 1486, 1646, 1813, 1983, 2125, 1884, 1682, 1506, 1340, 1210, 1103, 1058, 1024, 1053, 1105, 1191, 1319, 1458, 1622, 1794, 2026, 2127, 1875, 1696, 1494, 1354, 1210, 1098, 1048, 1029, 1048, 1101, 1195, 1320, 1468, 1638, 1795, 2086, 2160, 1894, 1703, 1522, 1378, 1238, 1131, 1072, 1053, 1067, 1118, 1225, 1335, 1493, 1673, 1822, 2057, 2182, 1945, 1775, 1613, 1419, 1292, 1180, 1105, 1091, 1105, 1155, 1265, 1379, 1523, 1682, 1884, 2124, 2254, 2000, 1792, 1635, 1474, 1343, 1235, 1182, 1166, 1165, 1243, 1332, 1430, 1585, 1750, 1936, 2208, 2407, 2081, 1871, 1709, 1551, 1434, 1338, 1276, 1248, 1280, 1328, 1423, 1541, 1663, 1810, 2018, 2237, 2456, 2195, 1972, 1792, 1679, 1534, 1434, 1374, 1345, 1374, 1419, 1510, 1639, 1745, 1915, 2109, 2328, 2654, 2336, 2068, 1918, 1762, 1645, 1563, 1499, 1484, 1509, 1538, 1621, 1712, 1897, 2036, 2222, 2492, 2885, 2524, 2231, 2036, 1907, 1780, 1684, 1630, 1628, 1646, 1697, 1784, 1886, 1987, 2157, 2398, 2830, 3550, 2661, 2450, 2174, 2058, 1948, 1829, 1783, 1762, 1778, 1775, 1898, 2013, 2160, 2323, 2571, 3573] + }, + "lsc_samples_greenB": { + "uCoeff": [2830, 2410, 2164, 2011, 1833, 1751, 1651, 1614, 1608, 1617, 1655, 1702, 1838, 1928, 2115, 2320, 2830, 2564, 2301, 2033, 1894, 1750, 1642, 1557, 1494, 1480, 1482, 1523, 1600, 1710, 1852, 1984, 2182, 2470, 2404, 2146, 1967, 1787, 1651, 1533, 1438, 1377, 1362, 1361, 1420, 1510, 1619, 1750, 1904, 2098, 2404, 2319, 2067, 1864, 1699, 1539, 1430, 1351, 1270, 1257, 1280, 1325, 1418, 1522, 1661, 1808, 1991, 2245, 2228, 1972, 1807, 1628, 1464, 1354, 1246, 1181, 1165, 1175, 1226, 1335, 1448, 1582, 1737, 1921, 2190, 2206, 1944, 1760, 1553, 1418, 1271, 1179, 1110, 1093, 1112, 1173, 1255, 1392, 1546, 1685, 1894, 2085, 2165, 1898, 1705, 1537, 1362, 1227, 1137, 1067, 1043, 1077, 1118, 1232, 1351, 1490, 1659, 1840, 2082, 2122, 1903, 1704, 1499, 1334, 1204, 1109, 1034, 1035, 1052, 1096, 1185, 1329, 1483, 1634, 1825, 2102, 2104, 1905, 1676, 1517, 1334, 1201, 1100, 1043, 1024, 1043, 1098, 1179, 1329, 1461, 1647, 1846, 2045, 2180, 1903, 1726, 1522, 1366, 1228, 1123, 1072, 1043, 1052, 1109, 1211, 1336, 1486, 1646, 1805, 2062, 2195, 1953, 1736, 1555, 1406, 1250, 1152, 1085, 1074, 1085, 1154, 1257, 1381, 1540, 1700, 1876, 2096, 2261, 1992, 1798, 1631, 1451, 1326, 1217, 1160, 1153, 1160, 1213, 1321, 1445, 1564, 1725, 1934, 2198, 2397, 2053, 1894, 1681, 1541, 1407, 1294, 1251, 1220, 1242, 1311, 1401, 1530, 1651, 1817, 2040, 2251, 2436, 2186, 1957, 1770, 1620, 1499, 1413, 1330, 1318, 1360, 1401, 1477, 1616, 1761, 1934, 2074, 2311, 2643, 2292, 2073, 1894, 1723, 1614, 1511, 1463, 1434, 1470, 1522, 1591, 1709, 1851, 1985, 2213, 2512, 2832, 2464, 2184, 1990, 1841, 1726, 1661, 1604, 1591, 1596, 1633, 1735, 1806, 1949, 2148, 2326, 2752, 3676, 2604, 2375, 2179, 2023, 1862, 1777, 1775, 1741, 1734, 1796, 1879, 1975, 2158, 2256, 2582, 3653] + }, + "lsc_samples_blue": { + "uCoeff": [2584, 2276, 1975, 1834, 1641, 1560, 1506, 1511, 1505, 1488, 1561, 1536, 1641, 1822, 1988, 2119, 2439, 2263, 2074, 1885, 1706, 1614, 1504, 1439, 1416, 1378, 1416, 1432, 1512, 1563, 1667, 1793, 1987, 2244, 2224, 1943, 1727, 1619, 1513, 1435, 1339, 1318, 1296, 1312, 1357, 1402, 1467, 1560, 1706, 1893, 2106, 2115, 1863, 1664, 1539, 1449, 1310, 1276, 1235, 1202, 1226, 1260, 1328, 1394, 1539, 1664, 1816, 2053, 1972, 1764, 1611, 1486, 1362, 1304, 1202, 1170, 1139, 1170, 1207, 1276, 1362, 1464, 1611, 1764, 1985, 1944, 1732, 1584, 1441, 1330, 1221, 1157, 1089, 1097, 1097, 1135, 1221, 1312, 1434, 1543, 1712, 1944, 1953, 1709, 1564, 1398, 1270, 1208, 1109, 1077, 1062, 1066, 1136, 1156, 1275, 1372, 1516, 1699, 1915, 1907, 1703, 1512, 1393, 1277, 1157, 1081, 1062, 1024, 1062, 1089, 1161, 1261, 1381, 1512, 1683, 1870, 1922, 1685, 1520, 1394, 1272, 1152, 1097, 1035, 1028, 1054, 1077, 1157, 1272, 1375, 1536, 1685, 1860, 1907, 1683, 1567, 1381, 1277, 1185, 1106, 1062, 1046, 1046, 1110, 1175, 1255, 1374, 1543, 1713, 1858, 1902, 1709, 1564, 1445, 1321, 1193, 1122, 1066, 1078, 1062, 1109, 1203, 1315, 1404, 1548, 1699, 1967, 2013, 1785, 1593, 1469, 1361, 1236, 1185, 1109, 1110, 1122, 1171, 1242, 1336, 1462, 1593, 1743, 1985, 1999, 1842, 1675, 1508, 1394, 1293, 1221, 1175, 1175, 1185, 1242, 1321, 1401, 1493, 1628, 1775, 1985, 2148, 1912, 1712, 1588, 1462, 1377, 1315, 1262, 1236, 1284, 1304, 1384, 1462, 1588, 1712, 1875, 2083, 2224, 1998, 1801, 1674, 1552, 1471, 1395, 1366, 1343, 1361, 1382, 1463, 1536, 1655, 1769, 1998, 2206, 2495, 2188, 1962, 1767, 1659, 1576, 1474, 1464, 1452, 1443, 1490, 1543, 1623, 1746, 1910, 2059, 2567, 3208, 2276, 2076, 1893, 1707, 1620, 1604, 1511, 1552, 1550, 1586, 1656, 1717, 1834, 1975, 2239, 3088] + } + }, { + "name": "3264x2448_GRAY_0", + "resolution": "3264x2448", + "illumination": "GRAY", + "vignetting": 0, + "lsc_samples_red": { + "uCoeff": [1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024] + }, + "lsc_samples_greenR": { + "uCoeff": [1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024] + }, + "lsc_samples_greenB": { + "uCoeff": [1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024] + }, + "lsc_samples_blue": { + "uCoeff": [1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024] + } + }], + "tableAll_len": 15 + } + }, + "colorAsGrey": { + "param": { + "enable": 0 + } + }, + "lumaDetect": { + "luma_detect_en": 1, + "fixed_times": 0, + "mutation_threshold": 0.0002, + "mutation_threshold_level2": 1000 + }, + "aldch": { + "param": { + "ldch_en": 0, + "meshfile": "LDCH_mesh_2688_1520_os04a10_4IR", + "correct_level": 255, + "correct_level_max": 255, + "light_center": [1351.12, 739.486], + "coefficient": [-1830.26, 0.000423795, -2.50767e-07, 1.27247e-10] + } + }, + "ccm_calib": { + "control": { + "enable": 1, + "mode": "CALIB_CCM_MODE_AUTO", + "wbgain_tolerance": 0.1, + "gain_tolerance": 0.2 + }, + "lumaCCM": { + "rgb2y_para": [38, 75, 15], + "low_bound_pos_bit": 8, + "y_alpha_curve": [0, 64, 128, 192, 256, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024], + "gain_alphaScale_curve": { + "gain": [1, 2, 4, 8, 16, 32, 64, 128, 256], + "scale": [1, 0.8, 0.8, 0.9, 1, 1, 1, 1, 1] + } + }, + "manualPara": { + "ccMatrix": [1, 0, 0, 0, 1, 0, 0, 0, 1], + "ccOffsets": [0, 0, 0] + }, + "TuningPara": { + "damp_enable": 1, + "illu_estim": { + "interp_enable": 0, + "default_illu": "A", + "weightRB": [1, 1], + "prob_limit": 0.2, + "frame_no": 8 + }, + "aCcmCof": [{ + "name": "A", + "awbGain": [1.3452, 2.4161], + "minDist": 0.05, + "matrixUsed": ["A_100", "A_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "CWF", + "awbGain": [1.8123, 2.0694], + "minDist": 0.05, + "matrixUsed": ["CWF_100", "CWF_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "D50", + "awbGain": [2.0413, 1.565], + "minDist": 0.05, + "matrixUsed": ["D50_100", "D50_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "D65", + "awbGain": [2.204, 1.4498], + "minDist": 0.05, + "matrixUsed": ["D65_100", "D65_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "D75", + "awbGain": [2.3379, 1.3483], + "minDist": 0.05, + "matrixUsed": ["D75_100", "D75_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "HZ", + "awbGain": [1.1019, 2.9858], + "minDist": 0.05, + "matrixUsed": ["HZ_100", "HZ_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }, { + "name": "TL84", + "awbGain": [1.7523, 2.1252], + "minDist": 0.05, + "matrixUsed": ["TL84_100", "TL84_74"], + "matrixUsed_len": 2, + "gain_sat_curve": { + "gains": [1, 4, 6, 16], + "sat": [90, 88, 80, 50] + } + }], + "aCcmCof_len": 7, + "matrixAll": [{ + "name": "A_100", + "illumination": "A", + "saturation": 100, + "ccMatrix": [1.6891, -0.5521, -0.137, -0.3788, 1.5903, -0.2116, -0.1644, -0.948, 2.1124], + "ccOffsets": [0, 0, 0] + }, { + "name": "A_74", + "illumination": "A", + "saturation": 74, + "ccMatrix": [1.3186, -0.2377, -0.081, -0.2115, 1.3487, -0.1372, -0.0538, -0.529, 1.5828], + "ccOffsets": [0, 0, 0] + }, { + "name": "CWF_100", + "illumination": "CWF", + "saturation": 100, + "ccMatrix": [2.2712, -1.2488, -0.0224, -0.4072, 1.5721, -0.1649, -0.107, -0.5879, 1.6949], + "ccOffsets": [0, 0, 0] + }, { + "name": "CWF_74", + "illumination": "CWF", + "saturation": 74, + "ccMatrix": [1.792, -0.7994, 0.0074, -0.1898, 1.2888, -0.0989, 0.0311, -0.3086, 1.2775], + "ccOffsets": [0, 0, 0] + }, { + "name": "D50_100", + "illumination": "D50", + "saturation": 100, + "ccMatrix": [1.655, -0.9098, 0.2548, -0.2647, 1.2982, -0.0335, 0.16, -0.7713, 1.6113], + "ccOffsets": [0, 0, 0] + }, { + "name": "D50_74", + "illumination": "D50", + "saturation": 74, + "ccMatrix": [1.5565, -0.5177, -0.0389, -0.0858, 1.3389, -0.2531, 0.0647, -0.2656, 1.201], + "ccOffsets": [0, 0, 0] + }, { + "name": "D65_100", + "illumination": "D65", + "saturation": 100, + "ccMatrix": [2.0667, -1.0499, -0.0168, -0.2201, 1.594, -0.3739, -0.0537, -0.4778, 1.5315], + "ccOffsets": [0, 0, 0] + }, { + "name": "D65_74", + "illumination": "D65", + "saturation": 74, + "ccMatrix": [1.6549, -0.6301, -0.0248, -0.0372, 1.327, -0.2899, 0.0849, -0.2052, 1.1202], + "ccOffsets": [0, 0, 0] + }, { + "name": "D75_100", + "illumination": "D75", + "saturation": 100, + "ccMatrix": [2.155, -1.122, -0.033, -0.2227, 1.6076, -0.3849, -0.0495, -0.4337, 1.4832], + "ccOffsets": [0, 0, 0] + }, { + "name": "D75_74", + "illumination": "D75", + "saturation": 74, + "ccMatrix": [1.7269, -0.6857, -0.0411, -0.0325, 1.3349, -0.3024, 0.0946, -0.1747, 1.0801], + "ccOffsets": [0, 0, 0] + }, { + "name": "HZ_100", + "illumination": "HZ", + "saturation": 100, + "ccMatrix": [1.5916, -0.3465, -0.2451, -0.4361, 1.5559, -0.1198, -0.4226, -1.2969, 2.7195], + "ccOffsets": [0, 0, 0] + }, { + "name": "HZ_74", + "illumination": "HZ", + "saturation": 74, + "ccMatrix": [1.2224, -0.0853, -0.1371, -0.2778, 1.3236, -0.0457, -0.2688, -0.787, 2.0558], + "ccOffsets": [0, 0, 0] + }, { + "name": "TL84_100", + "illumination": "TL84", + "saturation": 100, + "ccMatrix": [1.935, -0.8598, -0.0752, -0.3278, 1.5314, -0.2036, -0.1164, -0.5772, 1.6936], + "ccOffsets": [0, 0, 0] + }, { + "name": "TL84_74", + "illumination": "TL84", + "saturation": 74, + "ccMatrix": [1.5289, -0.4872, -0.0417, -0.1454, 1.283, -0.1376, 0.01, -0.2765, 1.2665], + "ccOffsets": [0, 0, 0] + }], + "matrixAll_len": 14 + } + }, + "lut3d_calib": { + "common": { + "enable": 0, + "mode": "CALIB_Lut3D_MODE_AUTO", + "gain_tolerance": 0.1, + "wbgain_tolerance": 1 + }, + "MLut3D": { + "Table": { + "look_up_table_r": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "look_up_table_g": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "look_up_table_b": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + } + }, + "ALut3D": { + "damp_en": 1, + "lutAll": [{ + "name": "Normal", + "awbGain": [1, 1], + "gain_alpha": { + "gain": [1, 2, 4, 8, 16, 32, 64, 128, 256], + "alpha": [1, 1, 1, 1, 1, 1, 1, 1, 1] + }, + "Table": { + "look_up_table_r": [0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 20, 205, 416, 626, 829, 1023, 1023, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 20, 205, 416, 626, 829, 1023, 1023, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 509, 511, 541, 616, 724, 850, 971, 1023, 1023, 677, 678, 687, 714, 759, 821, 897, 983, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 509, 510, 541, 616, 724, 850, 970, 1023, 1023, 677, 678, 687, 714, 759, 821, 897, 983, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 511, 512, 539, 614, 723, 849, 969, 1023, 1023, 677, 678, 686, 713, 758, 820, 896, 982, 1023, 0, 20, 205, 416, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 357, 567, 773, 971, 1023, 1023, 0, 17, 178, 357, 567, 773, 971, 1023, 1023, 0, 17, 178, 357, 567, 773, 971, 1023, 1023, 1, 17, 178, 357, 567, 773, 971, 1023, 1023, 516, 518, 544, 610, 718, 845, 965, 1023, 1023, 678, 679, 687, 710, 755, 817, 893, 979, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 357, 567, 773, 971, 1023, 1023, 0, 17, 178, 357, 537, 745, 944, 1023, 1023, 0, 17, 178, 357, 537, 745, 944, 1023, 1023, 0, 17, 178, 357, 537, 745, 944, 1023, 1023, 526, 528, 554, 618, 713, 841, 957, 1023, 1023, 680, 680, 688, 711, 750, 811, 888, 974, 1023, 0, 20, 205, 416, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 0, 17, 178, 357, 567, 773, 971, 1023, 1023, 0, 17, 178, 357, 537, 745, 944, 1023, 1023, 0, 17, 178, 357, 537, 715, 916, 1023, 1023, 0, 17, 178, 357, 537, 715, 916, 1023, 1023, 543, 544, 569, 632, 725, 838, 947, 1023, 1023, 682, 682, 691, 713, 751, 804, 880, 967, 1023, 0, 20, 205, 415, 626, 829, 1023, 1023, 1023, 0, 17, 202, 413, 623, 826, 1023, 1023, 1023, 0, 17, 178, 386, 596, 800, 997, 1023, 1023, 1, 17, 178, 357, 567, 773, 971, 1023, 1023, 0, 17, 178, 357, 537, 745, 944, 1023, 1023, 0, 17, 178, 357, 537, 715, 916, 1023, 1023, 1, 17, 178, 357, 537, 715, 886, 1023, 1023, 569, 570, 594, 654, 745, 853, 935, 1023, 1023, 685, 686, 694, 716, 754, 806, 871, 957, 1023, 71, 83, 214, 402, 599, 791, 976, 1023, 1023, 72, 82, 212, 401, 597, 790, 975, 1023, 1023, 84, 93, 201, 386, 582, 776, 963, 1023, 1023, 114, 121, 215, 368, 561, 755, 942, 1023, 1023, 161, 166, 243, 384, 544, 735, 920, 1023, 1023, 230, 234, 293, 415, 563, 719, 900, 1023, 1023, 344, 347, 388, 482, 608, 747, 889, 1023, 1023, 608, 610, 632, 689, 776, 855, 936, 1023, 1023, 689, 690, 698, 720, 757, 808, 872, 945, 1023, 247, 250, 299, 407, 545, 693, 840, 978, 1023, 248, 251, 299, 407, 545, 693, 840, 978, 1023, 268, 271, 311, 413, 547, 693, 837, 975, 1023, 321, 323, 356, 435, 558, 695, 833, 968, 1023, 402, 403, 428, 489, 578, 700, 830, 960, 1023, 478, 479, 498, 546, 620, 711, 829, 951, 1023, 556, 557, 571, 608, 667, 743, 832, 943, 1023, 630, 630, 641, 669, 715, 777, 853, 936, 1023, 695, 695, 703, 725, 761, 811, 874, 946, 1023], + "look_up_table_g": [0, 0, 0, 1, 0, 1, 1, 637, 1771, 78, 78, 78, 78, 78, 78, 78, 663, 1778, 821, 820, 821, 821, 821, 821, 821, 1036, 1899, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1703, 2192, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2442, 2596, 3317, 3317, 3317, 3317, 3317, 3317, 3317, 3170, 3049, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3837, 3501, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3923, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 0, 0, 1, 1, 1, 0, 0, 637, 1771, 78, 69, 69, 69, 69, 69, 69, 660, 1778, 820, 810, 810, 810, 810, 810, 810, 1033, 1898, 1662, 1650, 1650, 1650, 1650, 1650, 1650, 1700, 2191, 2503, 2491, 2491, 2491, 2491, 2491, 2491, 2439, 2595, 3317, 3305, 3305, 3305, 3305, 3305, 3305, 3168, 3049, 4095, 4091, 4091, 4091, 4091, 4091, 4091, 3836, 3501, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3923, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 0, 1, 0, 1, 1, 1, 0, 640, 1775, 78, 69, 69, 69, 69, 69, 69, 663, 1781, 821, 810, 713, 713, 713, 713, 713, 990, 1890, 1662, 1650, 1543, 1543, 1543, 1543, 1543, 1658, 2183, 2503, 2491, 2383, 2383, 2383, 2383, 2383, 2404, 2587, 3317, 3305, 3202, 3202, 3202, 3202, 3202, 3143, 3042, 4095, 4091, 3990, 3990, 3990, 3990, 3990, 3821, 3495, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3918, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 1, 1, 1, 0, 1, 0, 2, 650, 1786, 78, 69, 69, 69, 69, 69, 69, 673, 1792, 821, 810, 713, 713, 713, 713, 713, 996, 1899, 1662, 1650, 1543, 1428, 1428, 1428, 1428, 1579, 2161, 2503, 2491, 2383, 2267, 2267, 2267, 2267, 2331, 2567, 3317, 3305, 3202, 3091, 3091, 3091, 3091, 3085, 3023, 4095, 4091, 3990, 3882, 3882, 3882, 3882, 3783, 3479, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3904, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 0, 1, 1, 1, 0, 1, 0, 668, 1805, 78, 69, 69, 69, 69, 69, 69, 690, 1811, 821, 810, 713, 713, 713, 713, 713, 1008, 1916, 1662, 1650, 1543, 1428, 1428, 1428, 1428, 1587, 2174, 2503, 2491, 2383, 2267, 2149, 2149, 2149, 2242, 2534, 3317, 3305, 3202, 3091, 2978, 2978, 2978, 3008, 2993, 4095, 4091, 3990, 3882, 3775, 3775, 3775, 3727, 3452, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3881, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 1, 0, 1, 0, 1, 1, 0, 697, 1834, 78, 69, 69, 69, 69, 69, 69, 718, 1840, 821, 810, 713, 713, 713, 713, 713, 1028, 1942, 1662, 1650, 1543, 1428, 1428, 1428, 1428, 1599, 2194, 2503, 2491, 2383, 2267, 2149, 2149, 2149, 2251, 2548, 3317, 3305, 3202, 3091, 2978, 2860, 2860, 2920, 2952, 4095, 4091, 3990, 3882, 3775, 3663, 3663, 3660, 3415, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3848, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 1, 0, 0, 2, 0, 0, 3, 737, 1874, 78, 69, 69, 69, 69, 69, 69, 758, 1880, 821, 810, 713, 713, 713, 713, 713, 1056, 1979, 1662, 1650, 1543, 1428, 1428, 1428, 1428, 1618, 2223, 2503, 2491, 2383, 2267, 2149, 2149, 2149, 2264, 2567, 3317, 3305, 3202, 3091, 2978, 2860, 2860, 2931, 2964, 4095, 4091, 3990, 3882, 3775, 3663, 3545, 3586, 3368, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3805, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 283, 284, 299, 339, 405, 501, 628, 793, 1927, 334, 328, 342, 378, 439, 529, 651, 812, 1932, 866, 861, 802, 820, 852, 903, 981, 1096, 2026, 1624, 1619, 1561, 1474, 1492, 1522, 1570, 1645, 2260, 2403, 2400, 2351, 2268, 2177, 2197, 2230, 2284, 2593, 3155, 3152, 3117, 3047, 2964, 2877, 2903, 2948, 2980, 3847, 3846, 3823, 3771, 3702, 3627, 3557, 3606, 3377, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3754, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 988, 989, 1014, 1082, 1198, 1367, 1588, 1785, 1992, 1003, 1003, 1027, 1094, 1209, 1377, 1596, 1791, 1997, 1245, 1244, 1243, 1299, 1396, 1543, 1724, 1899, 2086, 1751, 1750, 1745, 1741, 1813, 1918, 2029, 2161, 2307, 2354, 2354, 2347, 2330, 2313, 2366, 2437, 2525, 2626, 2923, 2923, 2916, 2898, 2873, 2846, 2887, 2939, 3000, 3449, 3449, 3442, 3425, 3399, 3365, 3328, 3355, 3387, 3916, 3915, 3910, 3894, 3869, 3834, 3792, 3745, 3758, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095], + "look_up_table_b": [0, 0, 0, 0, 0, 0, 0, 159, 443, 0, 0, 0, 0, 0, 0, 0, 160, 443, 0, 0, 0, 0, 0, 0, 0, 168, 452, 0, 0, 0, 0, 0, 0, 1, 193, 476, 0, 0, 0, 0, 0, 0, 0, 237, 514, 0, 0, 0, 0, 0, 0, 0, 313, 563, 0, 0, 0, 1, 0, 0, 1, 461, 617, 509, 509, 515, 531, 563, 623, 709, 724, 673, 677, 677, 678, 680, 684, 691, 700, 711, 725, 20, 20, 20, 20, 20, 20, 20, 165, 444, 20, 17, 17, 17, 17, 17, 17, 165, 444, 20, 17, 17, 17, 17, 17, 17, 173, 453, 20, 17, 17, 17, 17, 17, 17, 197, 477, 20, 17, 17, 17, 17, 17, 17, 240, 515, 20, 17, 17, 17, 17, 17, 17, 316, 564, 20, 17, 17, 17, 17, 17, 17, 462, 618, 510, 510, 516, 532, 565, 623, 709, 725, 673, 678, 678, 678, 681, 685, 691, 700, 711, 725, 205, 205, 205, 205, 205, 205, 205, 254, 467, 205, 202, 202, 202, 202, 202, 202, 253, 467, 205, 202, 178, 178, 178, 178, 178, 247, 472, 205, 202, 178, 178, 178, 178, 178, 264, 495, 205, 202, 178, 178, 178, 178, 178, 297, 530, 205, 202, 178, 178, 178, 178, 178, 359, 576, 205, 202, 178, 178, 178, 178, 178, 490, 628, 537, 537, 539, 554, 584, 640, 720, 734, 681, 687, 687, 686, 689, 693, 699, 707, 718, 731, 415, 415, 415, 416, 415, 416, 415, 417, 525, 415, 413, 413, 413, 413, 413, 413, 416, 525, 415, 413, 386, 386, 386, 386, 386, 407, 529, 416, 413, 386, 357, 357, 357, 357, 395, 540, 415, 413, 386, 357, 357, 357, 357, 415, 570, 416, 413, 386, 357, 357, 357, 357, 458, 610, 415, 413, 386, 357, 357, 357, 357, 557, 656, 606, 606, 606, 610, 636, 684, 747, 760, 704, 712, 712, 712, 710, 714, 719, 727, 737, 749, 626, 626, 626, 626, 626, 626, 626, 601, 614, 626, 623, 623, 623, 623, 623, 623, 600, 614, 626, 623, 596, 596, 596, 596, 596, 590, 616, 626, 623, 596, 567, 567, 567, 567, 573, 622, 626, 623, 596, 567, 537, 537, 537, 560, 634, 626, 623, 596, 567, 537, 537, 537, 587, 665, 626, 623, 596, 567, 537, 537, 537, 654, 702, 706, 706, 706, 707, 713, 752, 793, 803, 741, 755, 755, 755, 753, 750, 754, 761, 769, 780, 829, 829, 829, 829, 829, 829, 829, 789, 724, 829, 826, 826, 826, 826, 826, 826, 788, 724, 829, 826, 800, 800, 800, 800, 800, 777, 724, 829, 826, 800, 773, 773, 773, 773, 759, 726, 829, 826, 800, 773, 745, 745, 745, 741, 730, 829, 826, 800, 773, 745, 715, 715, 730, 738, 829, 826, 800, 773, 745, 715, 715, 771, 765, 829, 829, 827, 825, 825, 838, 856, 863, 794, 816, 816, 815, 813, 809, 804, 809, 816, 823, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 973, 848, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 972, 848, 1023, 1023, 997, 997, 997, 997, 997, 961, 846, 1023, 1023, 997, 971, 971, 971, 971, 942, 843, 1023, 1023, 997, 971, 944, 944, 944, 921, 841, 1023, 1023, 997, 971, 944, 916, 916, 902, 840, 1023, 1023, 997, 971, 944, 916, 886, 897, 842, 961, 961, 959, 953, 947, 946, 935, 938, 861, 893, 893, 892, 889, 884, 878, 871, 875, 880, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 977, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 977, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 975, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 969, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 961, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 952, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 945, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 938, 982, 982, 980, 977, 972, 965, 956, 945, 948, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023] + } + }], + "lutAll_len": 1 + } + }, + "af": { + "TuningPara": { + "af_mode": "CalibDbV2_AF_MODE_NOT_SET", + "win_h_offs": 0, + "win_v_offs": 0, + "win_h_size": 0, + "win_v_size": 0, + "fixed_mode": { + "code": 8 + }, + "macro_mode": { + "code": 32 + }, + "infinity_mode": { + "code": 32 + }, + "contrast_af": { + "enable": 1, + "Afss": "CalibDbV2_CAM_AFM_FSS_ADAPTIVE_RANGE", + "FullDir": "CalibDbV2_CAM_AFM_ADAPTIVE_SEARCH", + "FullSteps": 9, + "FullRangeTbl": [0, 8, 16, 24, 32, 40, 48, 56, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "AdaptiveDir": "CalibDbV2_CAM_AFM_ADAPTIVE_SEARCH", + "AdaptiveSteps": 9, + "AdaptRangeTbl": [0, 8, 16, 24, 32, 40, 48, 56, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "TrigThers": 0.075, + "LumaTrigThers": 0, + "StableThers": 0.02, + "StableFrames": 3, + "StableTime": 200, + "SceneDiffEnable": 0, + "SceneDiffThers": 0, + "SceneDiffBlkThers": 0, + "CenterSceneDiffThers": 0, + "ValidMaxMinRatio": 0, + "ValidValueThers": 0, + "OutFocusValue": 50, + "OutFocusPos": 30, + "WeightEnable": 0, + "Weight": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "SearchPauseLumaEnable": 0, + "SearchPauseLumaThers": 0, + "SearchLumaStableFrames": 0, + "SearchLumaStableThers": 0, + "FlatValue": 0 + }, + "laser_af": { + "enable": 0, + "vcmDot": [0, 16, 32, 40, 48, 56, 64], + "distanceDot": [0.2, 0.24, 0.34, 0.4, 0.66, 1, 3] + }, + "pdaf": { + "enable": 0 + }, + "vcmcfg": { + "start_current": -1, + "rated_current": -1, + "step_mode": -1, + "extra_delay": 0 + }, + "measiso_cfg": [{ + "iso": 50, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 100, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 200, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 400, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 800, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 1600, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 3200, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 6400, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 12800, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 25600, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 51200, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 102400, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }, { + "iso": 204800, + "afmThres": 4, + "gammaY": [0, 45, 108, 179, 245, 344, 409, 459, 500, 567, 622, 676, 759, 833, 896, 962, 1023], + "gaussWeight": [32, 16, 8] + }], + "zoomfocus_tbl": { + "tbl_len": 0, + "focal_length": [], + "focal_length_len": 0, + "zoom_pos": [], + "zoom_pos_len": 0, + "focus_infpos": [], + "focus_infpos_len": 0, + "focus_macropos": [], + "focus_macropos_len": 0 + } + } + }, + "thumbnails": { + "param": { + "thumbnail_configs": [{ + "owner_cookies": 0, + "stream_type": 0, + "after_nodes": 0, + "before_node": 0, + "format": "NV12\u0002", + "width_intfactor": 2, + "height_intfactor": 2, + "buffer_count": 0 + }, { + "owner_cookies": 1, + "stream_type": 0, + "after_nodes": 0, + "before_node": 0, + "format": "NV12\u0004", + "width_intfactor": 4, + "height_intfactor": 4, + "buffer_count": 0 + }, { + "owner_cookies": 2, + "stream_type": 0, + "after_nodes": 0, + "before_node": 0, + "format": "NV12\b", + "width_intfactor": 8, + "height_intfactor": 8, + "buffer_count": 0 + }], + "thumbnail_configs_len": 3 + } + }, + "bayernr_v2": { + "Version": "", + "CalibPara": { + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Calib_ISO": [{ + "iso": 50, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [440, 385, 336, 292, 226, 191, 187, 202, 220, 235, 241, 238, 224, 203, 176, 155] + }, { + "iso": 100, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [747, 638, 535, 436, 251, 141, 120, 135, 114, 187, 226, 237, 222, 181, 112, 100] + }, { + "iso": 200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [1233, 1094, 966, 850, 657, 526, 459, 448, 464, 483, 490, 477, 440, 383, 313, 262] + }, { + "iso": 400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [1076, 1002, 936, 877, 783, 717, 674, 647, 628, 612, 593, 567, 534, 494, 452, 416] + }, { + "iso": 800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [2708, 2445, 2204, 1986, 1624, 1366, 1209, 1136, 1113, 1104, 1082, 1031, 942, 813, 655, 512] + }, { + "iso": 1600, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 3200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 6400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 12800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 25600, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 51200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 102400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 204800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }], + "Calib_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Calib_ISO": [{ + "iso": 50, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [329, 292, 258, 227, 176, 141, 124, 121, 127, 133, 137, 135, 127, 113, 94, 75] + }, { + "iso": 100, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [747, 638, 535, 436, 251, 141, 120, 135, 114, 187, 226, 237, 222, 181, 112, 100] + }, { + "iso": 200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [835, 721, 614, 514, 336, 194, 120, 147, 207, 256, 284, 288, 267, 221, 148, 120] + }, { + "iso": 400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [789, 703, 625, 553, 435, 354, 311, 301, 308, 318, 321, 312, 288, 249, 198, 147] + }, { + "iso": 800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [761, 707, 658, 614, 542, 490, 454, 430, 414, 401, 386, 366, 341, 309, 273, 238] + }, { + "iso": 1600, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 3200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 6400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 12800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 25600, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 51200, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 102400, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }, { + "iso": 204800, + "lumapoint": [512, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336], + "sigma": [768, 768, 768, 768, 640, 640, 640, 640, 512, 512, 512, 512, 512, 512, 512, 384] + }], + "Calib_ISO_len": 13 + }], + "Setting_len": 2 + }, + "Bayernr2D": { + "enable": 1, + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Tuning_ISO": [{ + "iso": 50, + "gauss_guide": 1, + "filter_strength": 15, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 100, + "gauss_guide": 1, + "filter_strength": 15, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 200, + "gauss_guide": 1, + "filter_strength": 15, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 400, + "gauss_guide": 1, + "filter_strength": 15, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 800, + "gauss_guide": 1, + "filter_strength": 15, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 1600, + "gauss_guide": 1, + "filter_strength": 0.8, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 3200, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 6400, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 12800, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 25600, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 51200, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 102400, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 204800, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }], + "Tuning_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Tuning_ISO": [{ + "iso": 50, + "gauss_guide": 0, + "filter_strength": 4, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 100, + "gauss_guide": 0, + "filter_strength": 4, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 200, + "gauss_guide": 0, + "filter_strength": 4, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 400, + "gauss_guide": 0, + "filter_strength": 4, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 800, + "gauss_guide": 0, + "filter_strength": 4, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 1600, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 3200, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 6400, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 12800, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 25600, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 51200, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 102400, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }, { + "iso": 204800, + "gauss_guide": 1, + "filter_strength": 0.7, + "edgesofts": 2, + "ratio": 0.01, + "weight": 1 + }], + "Tuning_ISO_len": 13 + }], + "Setting_len": 2 + }, + "Bayernr3D": { + "enable": 0, + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Tuning_ISO": [{ + "iso": 50, + "filter_strength": 0.5, + "sp_filter_strength": 0.55, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.88, + "softwgt": 0 + }, { + "iso": 100, + "filter_strength": 0.5, + "sp_filter_strength": 0.55, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.88, + "softwgt": 0 + }, { + "iso": 200, + "filter_strength": 0.5, + "sp_filter_strength": 0.6, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.88, + "softwgt": 0 + }, { + "iso": 400, + "filter_strength": 0.5, + "sp_filter_strength": 0.6, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.88, + "softwgt": 0 + }, { + "iso": 800, + "filter_strength": 0.5, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.88, + "softwgt": 0 + }, { + "iso": 1600, + "filter_strength": 0.1, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 3200, + "filter_strength": 0.1, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 6400, + "filter_strength": 0.5, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 12800, + "filter_strength": 0.5, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 25600, + "filter_strength": 0.6, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 51200, + "filter_strength": 0.6, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 102400, + "filter_strength": 0.7, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 204800, + "filter_strength": 0.7, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }], + "Tuning_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Tuning_ISO": [{ + "iso": 50, + "filter_strength": 0.1, + "sp_filter_strength": 0.55, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 100, + "filter_strength": 0.1, + "sp_filter_strength": 0.55, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 200, + "filter_strength": 0.1, + "sp_filter_strength": 0.6, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 400, + "filter_strength": 0.1, + "sp_filter_strength": 0.6, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 800, + "filter_strength": 0.1, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 1600, + "filter_strength": 0.1, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.9, + "hi_clipwgt": 0.9, + "softwgt": 0 + }, { + "iso": 3200, + "filter_strength": 0.1, + "sp_filter_strength": 0.65, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 6400, + "filter_strength": 0.5, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 12800, + "filter_strength": 0.5, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 25600, + "filter_strength": 0.6, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 51200, + "filter_strength": 0.6, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 102400, + "filter_strength": 0.7, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }, { + "iso": 204800, + "filter_strength": 0.7, + "sp_filter_strength": 0.7, + "lo_clipwgt": 0.5, + "hi_clipwgt": 0.5, + "softwgt": 0 + }], + "Tuning_ISO_len": 13 + }], + "Setting_len": 2 + } + }, + "cnr_v1": { + "Version": "", + "TuningPara": { + "enable": 1, + "Kernel_Coeff": { + "kernel_5x5": [1, 0.8825, 0.7788, 0.6065, 0.3679] + }, + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Tuning_ISO": [{ + "iso": 50, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 30, + "color_sat_adj_alpha": 0.4, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 50, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 30, + "thumb_color_sat": 4, + "lf_denoise_strength": 40, + "lf_color_sat": 4, + "lf_denoise_alpha": 0.5 + }, { + "iso": 100, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 30, + "color_sat_adj_alpha": 0.4, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 50, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 30, + "thumb_color_sat": 4, + "lf_denoise_strength": 40, + "lf_color_sat": 4, + "lf_denoise_alpha": 0.5 + }, { + "iso": 200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 30, + "color_sat_adj_alpha": 0.4, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 50, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 30, + "thumb_color_sat": 4, + "lf_denoise_strength": 40, + "lf_color_sat": 4, + "lf_denoise_alpha": 0.5 + }, { + "iso": 400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 30, + "color_sat_adj_alpha": 0.4, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 50, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 30, + "thumb_color_sat": 4, + "lf_denoise_strength": 40, + "lf_color_sat": 4, + "lf_denoise_alpha": 0.5 + }, { + "iso": 800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 30, + "color_sat_adj_alpha": 0.4, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 50, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 30, + "thumb_color_sat": 4, + "lf_denoise_strength": 40, + "lf_color_sat": 4, + "lf_denoise_alpha": 0.5 + }, { + "iso": 1600, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 3200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 6400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 12800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 25600, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 51200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 102400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 204800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }], + "Tuning_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Tuning_ISO": [{ + "iso": 50, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 100, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 1600, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 3200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 6400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 12800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 25600, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 51200, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 102400, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }, { + "iso": 204800, + "hf_bypass": 0, + "lf_bypass": 0, + "cnr_exgain": 1, + "cnr_g_gain": 1, + "color_sat_adj": 40, + "color_sat_adj_alpha": 0.8, + "hf_spikes_reducion_strength": 0.5, + "hf_denoise_strength": 10.2, + "hf_color_sat": 1.5, + "hf_denoise_alpha": 0, + "hf_bf_wgt_clip": 0, + "thumb_spikes_reducion_strength": 0.2, + "thumb_denoise_strength": 4, + "thumb_color_sat": 4, + "lf_denoise_strength": 4, + "lf_color_sat": 4, + "lf_denoise_alpha": 1 + }], + "Tuning_ISO_len": 13 + }], + "Setting_len": 2 + } + }, + "ynr_v2": { + "Version": "", + "CalibPara": { + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Calib_ISO": [{ + "iso": 50, + "sigma_curve": [5.26063e-13, -4.31051e-09, 6.01295e-06, 0.00733553, 30.2968], + "ynr_ci_l": 0.35887, + "ynr_ci_h": 0.218965 + }, { + "iso": 100, + "sigma_curve": [-8.51864e-13, 8.4477e-09, -3.1173e-05, 0.0431732, 20.4729], + "ynr_ci_l": 0.266861, + "ynr_ci_h": 0.176977 + }, { + "iso": 200, + "sigma_curve": [-1.91013e-12, 1.68572e-08, -5.42127e-05, 0.0644649, 50.8293], + "ynr_ci_l": 0.264338, + "ynr_ci_h": 0.176603 + }, { + "iso": 400, + "sigma_curve": [-1.39053e-12, 1.37088e-08, -5.30971e-05, 0.0730568, 77.3162], + "ynr_ci_l": 0.260614, + "ynr_ci_h": 0.169545 + }, { + "iso": 800, + "sigma_curve": [-7.56352e-13, 8.08215e-09, -4.17244e-05, 0.0722224, 122.519], + "ynr_ci_l": 0.292136, + "ynr_ci_h": 0.186536 + }, { + "iso": 1600, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 3200, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 6400, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 12800, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 25600, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 51200, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 102400, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 204800, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }], + "Calib_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Calib_ISO": [{ + "iso": 50, + "sigma_curve": [-3.79338e-13, 4.20139e-09, -1.65728e-05, 0.0227778, 17.7731], + "ynr_ci_l": 0.264599, + "ynr_ci_h": 0.186359 + }, { + "iso": 100, + "sigma_curve": [-8.51864e-13, 8.4477e-09, -3.1173e-05, 0.0431732, 20.4729], + "ynr_ci_l": 0.266861, + "ynr_ci_h": 0.176977 + }, { + "iso": 200, + "sigma_curve": [-1.01774e-12, 1.07758e-08, -4.22101e-05, 0.0597135, 28.7999], + "ynr_ci_l": 0.259483, + "ynr_ci_h": 0.166846 + }, { + "iso": 400, + "sigma_curve": [-1.32816e-12, 1.29829e-08, -4.53493e-05, 0.0511179, 55.0177], + "ynr_ci_l": 0.254945, + "ynr_ci_h": 0.156095 + }, { + "iso": 800, + "sigma_curve": [-1.76225e-12, 1.64389e-08, -5.4805e-05, 0.0586055, 72.3208], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 1600, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 3200, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 6400, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 12800, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 25600, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 51200, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 102400, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }, { + "iso": 204800, + "sigma_curve": [-7.80229e-13, 6.77367e-09, -2.20431e-05, 0.0298751, 10.9382], + "ynr_ci_l": 0.267207, + "ynr_ci_h": 0.157733 + }], + "Calib_ISO_len": 13 + }], + "Setting_len": 2 + }, + "TuningPara": { + "enable": 1, + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Tuning_ISO": [{ + "iso": 50, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 20, + "low_bf_1": 20, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.1, + "low_dist_adj": 8, + "low_weight": 1, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.9, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 20, + "high_weight": 1, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3, 3.5, 4] + }, { + "iso": 100, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 20, + "low_bf_1": 20, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.1, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.9, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 20, + "high_weight": 1, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3, 3.5, 4] + }, { + "iso": 200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 20, + "low_bf_1": 20, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.1, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.9, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 20, + "high_weight": 1, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3, 3.5, 4] + }, { + "iso": 400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 20, + "low_bf_1": 20, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.1, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.9, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 20, + "high_weight": 1, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3, 3.5, 4] + }, { + "iso": 800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 20, + "low_bf_1": 20, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.1, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.9, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 20, + "high_weight": 1, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3, 3.5, 4] + }, { + "iso": 1600, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 5, + "low_bf_1": 5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.5, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1.05, 1.1, 1.1, 1.2, 1.4, 1.6, 1.8, 2, 2.2, 2.4, 2.8, 3.5] + }, { + "iso": 3200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.95, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 6400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 12800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1.1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 25600, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1.1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 51200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1.1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 102400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1.1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 204800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 1.1, + "low_bf_1": 0.5, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }], + "Tuning_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Tuning_ISO": [{ + "iso": 50, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0.5, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 100, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 1600, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 3200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 6400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 12800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 25600, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 51200, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 102400, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }, { + "iso": 204800, + "ynr_bft3x3_bypass": 0, + "ynr_lbft5x5_bypass": 0, + "ynr_lgft3x3_bypass": 0, + "ynr_flt1x1_bypass": 0, + "ynr_sft5x5_bypass": 0, + "low_bf_0": 0.5, + "low_bf_1": 0.6, + "low_thred_adj": 0.25, + "low_peak_supress": 0.5, + "low_edge_adj_thresh": 7, + "low_center_weight": 0.4, + "low_dist_adj": 8, + "low_weight": 0, + "low_filt_strength_0": 0.7, + "low_filt_strength_1": 0.85, + "low_bi_weight": 0.2, + "base_filter_weight_0": 0.28, + "base_filter_weight_1": 0.46, + "base_filter_weight_2": 0.26, + "high_thred_adj": 1, + "high_weight": 0.78, + "hi_min_adj": 0.9, + "hi_edge_thed": 100, + "high_direction_weight": [1, 1, 1, 1, 0.5, 0.5, 0.5, 0.5], + "rnr_strength": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + }], + "Tuning_ISO_len": 13 + }], + "Setting_len": 2 + } + }, + "sharp_v3": { + "Version": "", + "TuningPara": { + "enable": 1, + "Setting": [{ + "SNR_Mode": "LSNR", + "Sensor_Mode": "lcg", + "Tuning_ISO": [{ + "iso": 50, + "pbf_gain": 0.8, + "pbf_ratio": 0.5, + "pbf_add": 1, + "gaus_ratio": 0.5, + "sharp_ratio": 10, + "bf_gain": 2, + "bf_ratio": 5, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [12, 16, 20, 24, 28, 24, 20, 20], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 100, + "pbf_gain": 0.8, + "pbf_ratio": 0.5, + "pbf_add": 1, + "gaus_ratio": 0.5, + "sharp_ratio": 10, + "bf_gain": 3, + "bf_ratio": 5, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [24, 32, 40, 48, 56, 48, 48, 40], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 200, + "pbf_gain": 0.8, + "pbf_ratio": 0.5, + "pbf_add": 1, + "gaus_ratio": 0.5, + "sharp_ratio": 10, + "bf_gain": 3, + "bf_ratio": 5, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [24, 32, 40, 48, 56, 48, 48, 40], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 400, + "pbf_gain": 0.8, + "pbf_ratio": 0.5, + "pbf_add": 1, + "gaus_ratio": 0.5, + "sharp_ratio": 10, + "bf_gain": 4, + "bf_ratio": 5, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [32, 40, 48, 56, 64, 56, 48, 40], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 800, + "pbf_gain": 0.8, + "pbf_ratio": 0.5, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 10, + "bf_gain": 4, + "bf_ratio": 5, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [40, 48, 56, 64, 80, 64, 56, 48], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 1600, + "pbf_gain": 0.8, + "pbf_ratio": 0.2, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [256, 256, 256, 256, 256, 256, 256, 256] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 3200, + "pbf_gain": 0.8, + "pbf_ratio": 0.2, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 6400, + "pbf_gain": 0.8, + "pbf_ratio": 0.3, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 12800, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 25600, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 51200, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 102400, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 204800, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 128, 160, 192, 160, 128, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }], + "Tuning_ISO_len": 13 + }, { + "SNR_Mode": "HSNR", + "Sensor_Mode": "hcg", + "Tuning_ISO": [{ + "iso": 50, + "pbf_gain": 0.8, + "pbf_ratio": 0, + "pbf_add": 1, + "gaus_ratio": 0, + "sharp_ratio": 6, + "bf_gain": 2, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [8, 12, 16, 16, 24, 20, 16, 16], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 100, + "pbf_gain": 0.8, + "pbf_ratio": 0, + "pbf_add": 1, + "gaus_ratio": 0, + "sharp_ratio": 6, + "bf_gain": 3, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [12, 16, 20, 24, 28, 24, 20, 20], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [1023, 1023, 1023, 1023, 1023, 1023, 1023, 1023] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 200, + "pbf_gain": 0.8, + "pbf_ratio": 0, + "pbf_add": 1, + "gaus_ratio": 0, + "sharp_ratio": 6, + "bf_gain": 3, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [24, 32, 40, 48, 56, 48, 48, 40], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 400, + "pbf_gain": 0.8, + "pbf_ratio": 0, + "pbf_add": 1, + "gaus_ratio": 0, + "sharp_ratio": 7, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [32, 40, 48, 56, 64, 56, 48, 40], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 800, + "pbf_gain": 0.8, + "pbf_ratio": 0.2, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 7, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [40, 48, 56, 64, 80, 64, 56, 48], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [512, 512, 512, 512, 512, 512, 512, 512] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 1600, + "pbf_gain": 0.8, + "pbf_ratio": 0.2, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [256, 256, 256, 256, 256, 256, 256, 256] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 3200, + "pbf_gain": 0.8, + "pbf_ratio": 0.2, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 6400, + "pbf_gain": 0.8, + "pbf_ratio": 0.3, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 12800, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 25600, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 51200, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 102400, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }, { + "iso": 204800, + "pbf_gain": 0.8, + "pbf_ratio": 0.4, + "pbf_add": 1, + "gaus_ratio": 1, + "sharp_ratio": 8, + "bf_gain": 4, + "bf_ratio": 1, + "bf_add": 32, + "luma_para": { + "luma_point": [0, 64, 128, 256, 384, 640, 896, 1024], + "luma_sigma": [48, 56, 64, 80, 96, 80, 64, 56], + "hf_clip": [64, 96, 12, 16, 19, 16, 12, 0], + "local_sharp_strength": [128, 128, 128, 128, 128, 128, 128, 128] + }, + "kernel_para": { + "prefilter_coeff": [0.2042, 0.1238, 0.0751], + "GaussianFilter_coeff": [0.2042, 0.1238, 0.0751], + "hfBilateralFilter_coeff": [0.2042, 0.1238, 0.0751] + } + }], + "Tuning_ISO_len": 13 + }], + "Setting_len": 2 + } + } + } + }], + "sub_scene_len": 1 + }], + "main_scene_len": 1, + "uapi": [], + "uapi_len": 0, + "sys_static_cfg": { + "algoSwitch": { + "enable": 0, + "enable_algos": [], + "enable_algos_len": 0 + } + } +} \ No newline at end of file diff --git a/hardware/isp/lib/librkaiq.z.so b/hardware/isp/lib/librkaiq.z.so new file mode 100644 index 0000000000000000000000000000000000000000..1e0c605527c700a956590c94d43864d164714432 Binary files /dev/null and b/hardware/isp/lib/librkaiq.z.so differ diff --git a/hardware/isp/lib64/librkaiq.z.so b/hardware/isp/lib64/librkaiq.z.so new file mode 100644 index 0000000000000000000000000000000000000000..6a54322a23aae1482288894795f23f7086e32ec1 Binary files /dev/null and b/hardware/isp/lib64/librkaiq.z.so differ diff --git a/hardware/mpp/BUILD.gn b/hardware/mpp/BUILD.gn new file mode 100755 index 0000000000000000000000000000000000000000..17b48da92f7c8925f97c2b07da44bf1a67661dde --- /dev/null +++ b/hardware/mpp/BUILD.gn @@ -0,0 +1,30 @@ +# Copyright (C) 2021 HiHope Open Source Organization . +# 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. + +import("//build/ohos.gni") +import("//build/ohos/ndk/ndk.gni") + +ohos_prebuilt_shared_library("libmpp") { + if (target_cpu == "arm") { + source = "lib/librockchip_mpp.z.so" + } else { + source = "lib64/librockchip_mpp.so" + } + install_images = [ chipset_base_dir ] + part_name = "rockchip_products" + install_enable = true +} + +group("mpp") { + deps = [ ":libmpp" ] +} diff --git a/hardware/mpp/include/mpi_enc_utils.h b/hardware/mpp/include/mpi_enc_utils.h new file mode 100644 index 0000000000000000000000000000000000000000..751025008475c7bc7f6bdf3befa005fb074a0fc1 --- /dev/null +++ b/hardware/mpp/include/mpi_enc_utils.h @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPI_ENC_UTILS_H__ +#define __MPI_ENC_UTILS_H__ + +#include + +#include "rk_venc_cmd.h" + +typedef struct MpiEncTestArgs_t { + MppCodingType type; + MppFrameFormat format; + + RK_S32 width; + RK_S32 height; +} MpiEncTestArgs; + +typedef struct { + // global flow control flag + RK_U32 frm_eos; + RK_U32 pkt_eos; + RK_S32 frame_count; + RK_U64 stream_size; + + // base flow context + MppCtx ctx; + MppApi *mpi; + MppEncCfg cfg; + + // input / output + MppBufferGroup buf_grp; + MppBuffer pkt_buf; + MppEncSeiMode sei_mode; + MppEncHeaderMode header_mode; + + // paramter for resource malloc + RK_U32 width; + RK_U32 height; + RK_U32 hor_stride; + RK_U32 ver_stride; + MppFrameFormat fmt; + MppCodingType type; + RK_S32 num_frames; + + // resources + size_t frame_size; + + RK_U32 split_mode; + RK_U32 split_arg; + + // rate control runtime parameter + + RK_S32 fps_in_flex; + RK_S32 fps_in_den; + RK_S32 fps_in_num; + RK_S32 fps_out_flex; + RK_S32 fps_out_den; + RK_S32 fps_out_num; + RK_S32 bps; + RK_S32 bps_max; + RK_S32 bps_min; + RK_S32 rc_mode; + RK_S32 gop_mode; + RK_S32 gop_len; + RK_S32 vi_len; +} MpiEncTestData; + +int hal_mpp_get_sps(void *ctx, unsigned char *buf, size_t *buf_size); +int hal_mpp_encode(void *ctx, int dma_fd, unsigned char *buf, size_t *buf_size); + +void *hal_mpp_ctx_create(MpiEncTestArgs *args); +void hal_mpp_ctx_delete(void *ctx); + +#endif /* __MPI_ENC_UTILS_H__ */ diff --git a/hardware/mpp/include/mpp_allocator.h b/hardware/mpp/include/mpp_allocator.h new file mode 100755 index 0000000000000000000000000000000000000000..85cff8ca86ecfc8c7ca0692528c9fb79dd73779f --- /dev/null +++ b/hardware/mpp/include/mpp_allocator.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_ALLOCATOR_H__ +#define __MPP_ALLOCATOR_H__ + +#include "rk_type.h" +#include "mpp_buffer.h" + +typedef void *MppAllocator; + +typedef struct MppAllocatorCfg_t { + // input + size_t alignment; + RK_U32 flags; +} MppAllocatorCfg; + +typedef struct MppAllocatorApi_t { + RK_U32 size; + RK_U32 version; + + MPP_RET (*alloc)(MppAllocator allocator, MppBufferInfo *data); + MPP_RET (*free)(MppAllocator allocator, MppBufferInfo *data); + MPP_RET (*import)(MppAllocator allocator, MppBufferInfo *data); + MPP_RET (*release)(MppAllocator allocator, MppBufferInfo *data); + MPP_RET (*mmap)(MppAllocator allocator, MppBufferInfo *data); +} MppAllocatorApi; + +#ifdef __cplusplus +extern "C" { +#endif + +MPP_RET mpp_allocator_get(MppAllocator *allocator, + MppAllocatorApi **api, MppBufferType type); +MPP_RET mpp_allocator_put(MppAllocator *allocator); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_ALLOCATOR_H__ */ + diff --git a/hardware/mpp/include/mpp_buffer.h b/hardware/mpp/include/mpp_buffer.h new file mode 100644 index 0000000000000000000000000000000000000000..e7bec934105e452e426af9c65201178594f6c3ff --- /dev/null +++ b/hardware/mpp/include/mpp_buffer.h @@ -0,0 +1,318 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_BUFFER_H__ +#define __MPP_BUFFER_H__ + +#include "rk_type.h" +#include "mpp_err.h" + +/* + * MppBuffer module has several functions: + * + * 1. buffer get / put / reference management / external commit / get info. + * this part is the basic user interface for MppBuffer. + * + * function: + * + * mpp_buffer_get + * mpp_buffer_put + * mpp_buffer_inc_ref + * mpp_buffer_commit + * mpp_buffer_info_get + * + * 2. user buffer working flow control abstraction. + * buffer should attach to certain group, and buffer mode control the buffer usage flow. + * this part is also a part of user interface. + * + * function: + * + * mpp_buffer_group_get + * mpp_buffer_group_normal_get + * mpp_buffer_group_limit_get + * mpp_buffer_group_put + * mpp_buffer_group_limit_config + * + * 3. buffer allocator management + * this part is for allocator on different os, it does not have user interface + * it will support normal buffer, ion buffer, Linux v4l2 vb2 buffer + * user can only use MppBufferType to choose. + * + */ + +/* + * mpp buffer group support two work flow mode: + * + * normal flow: all buffer are generated by MPP + * under this mode, buffer pool is maintained internally + * + * typical call flow: + * + * mpp_buffer_group_get() return A + * mpp_buffer_get(A) return a ref +1 -> used + * mpp_buffer_inc_ref(a) ref +1 + * mpp_buffer_put(a) ref -1 + * mpp_buffer_put(a) ref -1 -> unused + * mpp_buffer_group_put(A) + * + * commit flow: all buffer are commited out of MPP + * under this mode, buffers is commit by external api. + * normally MPP only use it but not generate it. + * + * typical call flow: + * + * ==== external allocator ==== + * mpp_buffer_group_get() return A + * mpp_buffer_commit(A, x) + * mpp_buffer_commit(A, y) + * + * ======= internal user ====== + * mpp_buffer_get(A) return a + * mpp_buffer_get(A) return b + * mpp_buffer_put(a) + * mpp_buffer_put(b) + * + * ==== external allocator ==== + * mpp_buffer_group_put(A) + * + * NOTE: commit interface required group handle to record group information + */ + +/* + * mpp buffer group has two buffer limit mode: normal and limit + * + * normal mode: allows any buffer size and always general new buffer is no unused buffer + * is available. + * This mode normally use with normal flow and is used for table / stream buffer + * + * limit mode : restrict the buffer's size and count in the buffer group. if try to calloc + * buffer with different size or extra count it will fail. + * This mode normally use with commit flow and is used for frame buffer + */ + +/* + * NOTE: normal mode is recommanded to work with normal flow, working with limit mode is not. + * limit mode is recommanded to work with commit flow, working with normal mode is not. + */ +typedef enum { + MPP_BUFFER_INTERNAL, + MPP_BUFFER_EXTERNAL, + MPP_BUFFER_MODE_BUTT, +} MppBufferMode; + +/* + * the mpp buffer has serval types: + * + * normal : normal malloc buffer for unit test or hardware simulation + * ion : use ion device under Linux, MppBuffer will encapsulte ion file handle + * ext_dma : the DMABUF(DMA buffers) come from the application + * drm : use the drm device interface for memory management + */ +typedef enum { + MPP_BUFFER_TYPE_NORMAL, + MPP_BUFFER_TYPE_ION, + MPP_BUFFER_TYPE_EXT_DMA, + MPP_BUFFER_TYPE_DRM, + MPP_BUFFER_TYPE_BUTT, +} MppBufferType; + +#define MPP_BUFFER_TYPE_MASK 0x0000FFFF + +/* + * MPP_BUFFER_FLAGS cooperate with MppBufferType + * 16 high bits of MppBufferType are used in flags + * + * eg: + * DRM CMA buffer : MPP_BUFFER_TYPE_DRM | MPP_BUFFER_FLAGS_CONTIG + * = 0x00010003 + * DRM SECURE buffer: MPP_BUFFER_TYPE_DRM | MPP_BUFFER_FLAGS_SECURE + * = 0x00080003 + * + * flags originate from drm_rockchip_gem_mem_type + */ + +#define MPP_BUFFER_FLAGS_MASK 0x000f0000 // ROCKCHIP_BO_MASK << 16 +#define MPP_BUFFER_FLAGS_CONTIG 0x00010000 // ROCKCHIP_BO_CONTIG << 16 +#define MPP_BUFFER_FLAGS_CACHABLE 0x00020000 // ROCKCHIP_BO_CACHABLE << 16 +#define MPP_BUFFER_FLAGS_WC 0x00040000 // ROCKCHIP_BO_WC << 16 +#define MPP_BUFFER_FLAGS_SECURE 0x00080000 // ROCKCHIP_BO_SECURE << 16 + +/* + * MppBufferInfo variable's meaning is different in different MppBufferType + * + * Common + * index - the buffer index used to track buffer in buffer pool + * size - the buffer size + * + * MPP_BUFFER_TYPE_NORMAL + * + * ptr - virtual address of normal malloced buffer + * fd - unused and set to -1, the allocator would return its + * internal buffer counter number + * + * MPP_BUFFER_TYPE_ION + * + * ptr - virtual address of ion buffer in user space + * hnd - ion handle in user space + * fd - ion buffer file handle for map / unmap + * + */ +typedef struct MppBufferInfo_t { + MppBufferType type; + size_t size; + void *ptr; + void *hnd; + int fd; + int index; +} MppBufferInfo; + +#define BUFFER_GROUP_SIZE_DEFAULT (SZ_1M*80) + +/* + * mpp_buffer_import_with_tag(MppBufferGroup group, MppBufferInfo *info, MppBuffer *buffer) + * + * 1. group - specified the MppBuffer to be attached to. + * group can be NULL then this buffer will attached to default legecy group + * Default to NULL on mpp_buffer_import case + * + * 2. info - input information for the output MppBuffer + * info can NOT be NULL. It must contain at least one of ptr/fd. + * + * 3. buffer - generated MppBuffer from MppBufferInfo. + * buffer can be NULL then the buffer is commit to group with unused status. + * Otherwise generated buffer will be directly got and ref_count increased. + * Default to NULL on mpp_buffer_commit case + * + * mpp_buffer_commit usage: + * + * Add a external buffer info to group. This buffer will be on unused status. + * Typical usage is on MediaPlayer gralloc Graphic buffer then commit these buffer + * to decoder's buffer group. Then decoder will recycle these buffer and return buffer reference + * to MediaPlayer for display. + * + * mpp_buffer_import usage: + * + * Transfer a external buffer info to MppBuffer but it is not expected to attached to certain + * buffer group. So the group is set to NULL. Then this buffer can be used for MppFrame/MppPacket. + * Typical usage is for image processing. Image processing normally will be a oneshot operation + * It does not need complicated group management. But in other hand mpp still need to know the + * imported buffer is leak or not and trace its usage inside mpp process. So we attach this kind + * of buffer to default misc buffer group for management. + */ +#define mpp_buffer_commit(group, info) \ + mpp_buffer_import_with_tag(group, info, NULL, MODULE_TAG, __FUNCTION__) + +#define mpp_buffer_import(buffer, info) \ + mpp_buffer_import_with_tag(NULL, info, buffer, MODULE_TAG, __FUNCTION__) + +#define mpp_buffer_get(group, buffer, size) \ + mpp_buffer_get_with_tag(group, buffer, size, MODULE_TAG, __FUNCTION__) + +#define mpp_buffer_put(buffer) \ + mpp_buffer_put_with_caller(buffer, __FUNCTION__) + +#define mpp_buffer_inc_ref(buffer) \ + mpp_buffer_inc_ref_with_caller(buffer, __FUNCTION__) + +#define mpp_buffer_info_get(buffer, info) \ + mpp_buffer_info_get_with_caller(buffer, info, __FUNCTION__) + +#define mpp_buffer_read(buffer, offset, data, size) \ + mpp_buffer_read_with_caller(buffer, offset, data, size, __FUNCTION__) + +#define mpp_buffer_write(buffer, offset, data, size) \ + mpp_buffer_write_with_caller(buffer, offset, data, size, __FUNCTION__) + +#define mpp_buffer_get_ptr(buffer) \ + mpp_buffer_get_ptr_with_caller(buffer, __FUNCTION__) + +#define mpp_buffer_get_fd(buffer) \ + mpp_buffer_get_fd_with_caller(buffer, __FUNCTION__) + +#define mpp_buffer_get_size(buffer) \ + mpp_buffer_get_size_with_caller(buffer, __FUNCTION__) + +#define mpp_buffer_get_index(buffer) \ + mpp_buffer_get_index_with_caller(buffer, __FUNCTION__) + +#define mpp_buffer_set_index(buffer, index) \ + mpp_buffer_set_index_with_caller(buffer, index, __FUNCTION__) + +#define mpp_buffer_get_offset(buffer) \ + mpp_buffer_get_offset_with_caller(buffer, __FUNCTION__) + +#define mpp_buffer_set_offset(buffer, offset) \ + mpp_buffer_set_offset_with_caller(buffer, offset, __FUNCTION__) + +#define mpp_buffer_group_get_internal(group, type, ...) \ + mpp_buffer_group_get(group, type, MPP_BUFFER_INTERNAL, MODULE_TAG, __FUNCTION__) + +#define mpp_buffer_group_get_external(group, type, ...) \ + mpp_buffer_group_get(group, type, MPP_BUFFER_EXTERNAL, MODULE_TAG, __FUNCTION__) + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * MppBuffer interface + * these interface will change value of group and buffer so before calling functions + * parameter need to be checked. + * + * IMPORTANT: + * mpp_buffer_import_with_tag - compounded interface for commit and import + * + */ +MPP_RET mpp_buffer_import_with_tag(MppBufferGroup group, MppBufferInfo *info, MppBuffer *buffer, + const char *tag, const char *caller); +MPP_RET mpp_buffer_get_with_tag(MppBufferGroup group, MppBuffer *buffer, size_t size, + const char *tag, const char *caller); +MPP_RET mpp_buffer_put_with_caller(MppBuffer buffer, const char *caller); +MPP_RET mpp_buffer_inc_ref_with_caller(MppBuffer buffer, const char *caller); + +MPP_RET mpp_buffer_info_get_with_caller(MppBuffer buffer, MppBufferInfo *info, const char *caller); +MPP_RET mpp_buffer_read_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller); +MPP_RET mpp_buffer_write_with_caller(MppBuffer buffer, size_t offset, void *data, size_t size, const char *caller); +void *mpp_buffer_get_ptr_with_caller(MppBuffer buffer, const char *caller); +int mpp_buffer_get_fd_with_caller(MppBuffer buffer, const char *caller); +size_t mpp_buffer_get_size_with_caller(MppBuffer buffer, const char *caller); +int mpp_buffer_get_index_with_caller(MppBuffer buffer, const char *caller); +MPP_RET mpp_buffer_set_index_with_caller(MppBuffer buffer, int index, const char *caller); +size_t mpp_buffer_get_offset_with_caller(MppBuffer buffer, const char *caller); +MPP_RET mpp_buffer_set_offset_with_caller(MppBuffer buffer, size_t offset, const char *caller); + +MPP_RET mpp_buffer_group_get(MppBufferGroup *group, MppBufferType type, MppBufferMode mode, + const char *tag, const char *caller); +MPP_RET mpp_buffer_group_put(MppBufferGroup group); +MPP_RET mpp_buffer_group_clear(MppBufferGroup group); +RK_S32 mpp_buffer_group_unused(MppBufferGroup group); +size_t mpp_buffer_group_usage(MppBufferGroup group); +MppBufferMode mpp_buffer_group_mode(MppBufferGroup group); +MppBufferType mpp_buffer_group_type(MppBufferGroup group); + +/* + * size : 0 - no limit, other - max buffer size + * count : 0 - no limit, other - max buffer count + */ +MPP_RET mpp_buffer_group_limit_config(MppBufferGroup group, size_t size, RK_S32 count); + +RK_U32 mpp_buffer_total_now(void); +RK_U32 mpp_buffer_total_max(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_BUFFER_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_common.h b/hardware/mpp/include/mpp_common.h new file mode 100644 index 0000000000000000000000000000000000000000..82337f466e7ce8162e95c92b690d9781e4ec9fb2 --- /dev/null +++ b/hardware/mpp/include/mpp_common.h @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_COMMON_H__ +#define __MPP_COMMON_H__ + +#include "rk_type.h" + +#define MPP_TAG_SIZE 32 + +#define MPP_ABS(x) ((x) < (0) ? -(x) : (x)) + +#define MPP_MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MPP_MAX3(a, b, c) MPP_MAX(MPP_MAX(a, b), c) +#define MPP_MAX4(a, b, c, d) MPP_MAX((a), MPP_MAX3((b), (c), (d))) + +#define MPP_MIN(a, b) ((a) > (b) ? (b) : (a)) +#define MPP_MIN3(a, b, c) MPP_MIN(MPP_MIN(a, b), c) +#define MPP_MIN4(a, b, c, d) MPP_MIN((a), MPP_MIN3((b), (c), (d))) + +#define MPP_DIV(a, b) ((b) ? (a) / (b) : (a)) + +#define MPP_CLIP3(l, h, v) ((v) < (l) ? (l) : ((v) > (h) ? (h) : (v))) +#define MPP_SIGN(a) ((a) < (0) ? (-1) : (1)) +#define MPP_DIV_SIGN(a, b) (((a) + (MPP_SIGN(a) * (b)) / 2) / (b)) + +#define MPP_SWAP(type, a, b) do {type SWAP_tmp = b; b = a; a = SWAP_tmp; } while (0) +#define MPP_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) +#define MPP_ALIGN(x, a) (((x)+(a)-1)&~((a)-1)) +#define MPP_VSWAP(a, b) { (a) ^= (b); (b) ^= (a); (a) ^= (b); } + +#define MPP_RB16(x) ((((const RK_U8*)(x))[0] << 8) | ((const RK_U8*)(x))[1]) +#define MPP_WB16(p, d) do { \ + ((RK_U8*)(p))[1] = (d); \ + ((RK_U8*)(p))[0] = (d)>>8; } while (0) + +#define MPP_RL16(x) ((((const RK_U8*)(x))[1] << 8) | \ + ((const RK_U8*)(x))[0]) +#define MPP_WL16(p, d) do { \ + ((RK_U8*)(p))[0] = (d); \ + ((RK_U8*)(p))[1] = (d)>>8; } while (0) + +#define MPP_RB32(x) ((((const RK_U8*)(x))[0] << 24) | \ + (((const RK_U8*)(x))[1] << 16) | \ + (((const RK_U8*)(x))[2] << 8) | \ + ((const RK_U8*)(x))[3]) +#define MPP_WB32(p, d) do { \ + ((RK_U8*)(p))[3] = (d); \ + ((RK_U8*)(p))[2] = (d)>>8; \ + ((RK_U8*)(p))[1] = (d)>>16; \ + ((RK_U8*)(p))[0] = (d)>>24; } while (0) + +#define MPP_RL32(x) ((((const RK_U8*)(x))[3] << 24) | \ + (((const RK_U8*)(x))[2] << 16) | \ + (((const RK_U8*)(x))[1] << 8) | \ + ((const RK_U8*)(x))[0]) +#define MPP_WL32(p, d) do { \ + ((RK_U8*)(p))[0] = (d); \ + ((RK_U8*)(p))[1] = (d)>>8; \ + ((RK_U8*)(p))[2] = (d)>>16; \ + ((RK_U8*)(p))[3] = (d)>>24; } while (0) + +#define MPP_RB64(x) (((RK_U64)((const RK_U8*)(x))[0] << 56) | \ + ((RK_U64)((const RK_U8*)(x))[1] << 48) | \ + ((RK_U64)((const RK_U8*)(x))[2] << 40) | \ + ((RK_U64)((const RK_U8*)(x))[3] << 32) | \ + ((RK_U64)((const RK_U8*)(x))[4] << 24) | \ + ((RK_U64)((const RK_U8*)(x))[5] << 16) | \ + ((RK_U64)((const RK_U8*)(x))[6] << 8) | \ + (RK_U64)((const RK_U8*)(x))[7]) +#define MPP_WB64(p, d) do { \ + ((RK_U8*)(p))[7] = (d); \ + ((RK_U8*)(p))[6] = (d)>>8; \ + ((RK_U8*)(p))[5] = (d)>>16; \ + ((RK_U8*)(p))[4] = (d)>>24; \ + ((RK_U8*)(p))[3] = (d)>>32; \ + ((RK_U8*)(p))[2] = (d)>>40; \ + ((RK_U8*)(p))[1] = (d)>>48; \ + ((RK_U8*)(p))[0] = (d)>>56; } while (0) + +#define MPP_RL64(x) (((RK_U64)((const RK_U8*)(x))[7] << 56) | \ + ((RK_U64)((const RK_U8*)(x))[6] << 48) | \ + ((RK_U64)((const RK_U8*)(x))[5] << 40) | \ + ((RK_U64)((const RK_U8*)(x))[4] << 32) | \ + ((RK_U64)((const RK_U8*)(x))[3] << 24) | \ + ((RK_U64)((const RK_U8*)(x))[2] << 16) | \ + ((RK_U64)((const RK_U8*)(x))[1] << 8) | \ + (RK_U64)((const RK_U8*)(x))[0]) +#define MPP_WL64(p, d) do { \ + ((RK_U8*)(p))[0] = (d); \ + ((RK_U8*)(p))[1] = (d)>>8; \ + ((RK_U8*)(p))[2] = (d)>>16; \ + ((RK_U8*)(p))[3] = (d)>>24; \ + ((RK_U8*)(p))[4] = (d)>>32; \ + ((RK_U8*)(p))[5] = (d)>>40; \ + ((RK_U8*)(p))[6] = (d)>>48; \ + ((RK_U8*)(p))[7] = (d)>>56; } while (0) + +#define MPP_RB24(x) ((((const RK_U8*)(x))[0] << 16) | \ + (((const RK_U8*)(x))[1] << 8) | \ + ((const RK_U8*)(x))[2]) +#define MPP_WB24(p, d) do { \ + ((RK_U8*)(p))[2] = (d); \ + ((RK_U8*)(p))[1] = (d)>>8; \ + ((RK_U8*)(p))[0] = (d)>>16; } while (0) + +#define MPP_RL24(x) ((((const RK_U8*)(x))[2] << 16) | \ + (((const RK_U8*)(x))[1] << 8) | \ + ((const RK_U8*)(x))[0]) + +#define MPP_WL24(p, d) do { \ + ((RK_U8*)(p))[0] = (d); \ + ((RK_U8*)(p))[1] = (d)>>8; \ + ((RK_U8*)(p))[2] = (d)>>16; } while (0) + +#include +#if defined(_WIN32) && !defined(__MINGW32CE__) +#define fseeko _fseeki64 + +#include +#include +#include +#define chdir _chdir +#define mkdir _mkdir +#define access _access +#define off_t _off_t + +#define R_OK 4 /* Test for read permission. */ +#define W_OK 2 /* Test for write permission. */ +#define X_OK 1 /* Test for execute permission. */ +#define F_OK 0 /* Test for existence. */ + +#elif defined(__MINGW32CE__) +#define fseeko fseeko64 +#else +#include +#include +#include +#include +#define mkdir(x) mkdir(x, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) +#endif + +#define container_of(ptr, type, member) \ + ((type *)((char *)(ptr) - offsetof(type, member))) + +#define __RETURN __Return +#define __FAILED __Failed + +#define ARG_T(t) t +#define ARG_N(a, b, c, d, N, ...) N +#define ARG_N_HELPER(...) ARG_T(ARG_N(__VA_ARGS__)) +#define COUNT_ARG(...) ARG_N_HELPER(__VA_ARGS__, 4, 3, 2, 1, 0) + +#define SZ_1K (1024) +#define SZ_2K (SZ_1K*2) +#define SZ_4K (SZ_1K*4) +#define SZ_8K (SZ_1K*8) +#define SZ_16K (SZ_1K*16) +#define SZ_32K (SZ_1K*32) +#define SZ_64K (SZ_1K*64) +#define SZ_128K (SZ_1K*128) +#define SZ_256K (SZ_1K*256) +#define SZ_512K (SZ_1K*512) +#define SZ_1M (SZ_1K*SZ_1K) +#define SZ_2M (SZ_1M*2) +#define SZ_4M (SZ_1M*4) +#define SZ_8M (SZ_1M*8) +#define SZ_16M (SZ_1M*16) +#define SZ_32M (SZ_1M*32) +#define SZ_64M (SZ_1M*64) +#define SZ_80M (SZ_1M*80) +#define SZ_128M (SZ_1M*128) + +#ifdef __cplusplus +extern "C" { +#endif + +RK_S32 mpp_log2(RK_U32 v); +RK_S32 mpp_log2_16bit(RK_U32 v); + +static __inline RK_S32 mpp_ceil_log2(RK_S32 x) +{ + return mpp_log2((x - 1) << 1); +} + +static __inline RK_S32 mpp_clip(RK_S32 a, RK_S32 amin, RK_S32 amax) +{ + if (a < amin) { + return amin; + } else if (a > amax) { + return amax; + } else { + return a; + } +} + +static __inline RK_U32 mpp_is_32bit(void) +{ + return ((sizeof(void *) == 4) ? (1) : (0)); +} + +RK_S32 axb_div_c(RK_S32 a, RK_S32 b, RK_S32 c); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_COMMON_H__ */ diff --git a/hardware/mpp/include/mpp_dev_defs.h b/hardware/mpp/include/mpp_dev_defs.h new file mode 100644 index 0000000000000000000000000000000000000000..3fc52c52703ae1712550842a45afaa5785277517 --- /dev/null +++ b/hardware/mpp/include/mpp_dev_defs.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_DEV_DEFS_H__ +#define __MPP_DEV_DEFS_H__ + +/* + * Platform video codec hardware feature + */ +typedef enum MppClientType_e { + VPU_CLIENT_VDPU1 = 0, /* 0x00000001 */ + VPU_CLIENT_VDPU2 = 1, /* 0x00000002 */ + VPU_CLIENT_VDPU1_PP = 2, /* 0x00000004 */ + VPU_CLIENT_VDPU2_PP = 3, /* 0x00000008 */ + + VPU_CLIENT_HEVC_DEC = 8, /* 0x00000100 */ + VPU_CLIENT_RKVDEC = 9, /* 0x00000200 */ + VPU_CLIENT_AVSPLUS_DEC = 12, /* 0x00001000 */ + VPU_CLIENT_JPEG_DEC = 13, /* 0x00002000 */ + + VPU_CLIENT_RKVENC = 16, /* 0x00010000 */ + VPU_CLIENT_VEPU1 = 17, /* 0x00020000 */ + VPU_CLIENT_VEPU2 = 18, /* 0x00040000 */ + VPU_CLIENT_VEPU2_LITE = 19, /* 0x00080000 */ + VPU_CLIENT_VEPU22 = 24, /* 0x01000000 */ + + IEP_CLIENT_TYPE = 28, /* 0x10000000 */ + + VPU_CLIENT_BUTT, +} MppClientType; + +/* RK combined codec */ +#define HAVE_VDPU1 (1 << VPU_CLIENT_VDPU1) /* 0x00000001 */ +#define HAVE_VDPU2 (1 << VPU_CLIENT_VDPU2) /* 0x00000002 */ +#define HAVE_VDPU1_PP (1 << VPU_CLIENT_VDPU1_PP) /* 0x00000004 */ +#define HAVE_VDPU2_PP (1 << VPU_CLIENT_VDPU2_PP) /* 0x00000008 */ +/* RK standalone decoder */ +#define HAVE_HEVC_DEC (1 << VPU_CLIENT_HEVC_DEC) /* 0x00000100 */ +#define HAVE_RKVDEC (1 << VPU_CLIENT_RKVDEC) /* 0x00000200 */ +#define HAVE_AVSDEC (1 << VPU_CLIENT_AVSPLUS_DEC) /* 0x00001000 */ +#define HAVE_JPEG_DEC (1 << VPU_CLIENT_JPEG_DEC) /* 0x00002000 */ +/* RK standalone encoder */ +#define HAVE_RKVENC (1 << VPU_CLIENT_RKVENC) /* 0x00010000 */ +#define HAVE_VEPU1 (1 << VPU_CLIENT_VEPU1) /* 0x00020000 */ +#define HAVE_VEPU2 (1 << VPU_CLIENT_VEPU2) /* 0x00040000 */ +/* External encoder */ +#define HAVE_VEPU22 (1 << VPU_CLIENT_VEPU22) /* 0x01000000 */ +/* RK Image Enhance Processor for deinterlacing */ +#define HAVE_IEP (1 << IEP_CLIENT_TYPE) /* 0x10000000 */ + +/* Platform image process hardware feature */ +#define HAVE_IPP (0x00000001) +#define HAVE_RGA (0x00000002) +#define HAVE_RGA2 (0x00000004) + +#endif /* __MPP_DEV_DEFS_H__ */ diff --git a/hardware/mpp/include/mpp_device.h b/hardware/mpp/include/mpp_device.h new file mode 100644 index 0000000000000000000000000000000000000000..7f9238df489ec3e2be6cdd512996dac89aa62eb1 --- /dev/null +++ b/hardware/mpp/include/mpp_device.h @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_DEVICE_H__ +#define __MPP_DEVICE_H__ + +#include "mpp_err.h" +#include "mpp_dev_defs.h" + +typedef enum MppDevIoctlCmd_e { + /* device batch mode config */ + MPP_DEV_BATCH_ON, + MPP_DEV_BATCH_OFF, + + /* hardware operation setup config */ + MPP_DEV_REG_WR, + MPP_DEV_REG_RD, + MPP_DEV_REG_OFFSET, + MPP_DEV_RCB_INFO, + MPP_DEV_SET_INFO, + + MPP_DEV_CMD_SEND, + MPP_DEV_CMD_POLL, + + MPP_DEV_IOCTL_CMD_BUTT, +} MppDevIoctlCmd; + +/* for MPP_DEV_REG_WR */ +typedef struct MppDevRegWrCfg_t { + void *reg; + RK_U32 size; + RK_U32 offset; +} MppDevRegWrCfg; + +/* for MPP_DEV_REG_RD */ +typedef struct MppDevRegRdCfg_t { + void *reg; + RK_U32 size; + RK_U32 offset; +} MppDevRegRdCfg; + +/* for MPP_DEV_REG_OFFSET */ +typedef struct MppDevRegOffsetCfg_t { + RK_U32 reg_idx; + RK_U32 offset; +} MppDevRegOffsetCfg; + +/* for MPP_DEV_RCB_INFO */ +typedef struct MppDevRcbInfoCfg_t { + RK_U32 reg_idx; + RK_U32 size; +} MppDevRcbInfoCfg; + +/* for MPP_DEV_SET_INFO */ +typedef struct MppDevSetInfoCfg_t { + RK_U32 type; + RK_U32 flag; + RK_U64 data; +} MppDevInfoCfg; + +typedef struct MppDevApi_t { + const char *name; + RK_U32 ctx_size; + MPP_RET (*init)(void *ctx, MppClientType type); + MPP_RET (*deinit)(void *ctx); + + /* bat mode function */ + MPP_RET (*attach)(void *ctx); + MPP_RET (*detach)(void *ctx); + + /* config the cmd on preparing */ + MPP_RET (*reg_wr)(void *ctx, MppDevRegWrCfg *cfg); + MPP_RET (*reg_rd)(void *ctx, MppDevRegRdCfg *cfg); + MPP_RET (*reg_offset)(void *ctx, MppDevRegOffsetCfg *cfg); + MPP_RET (*rcb_info)(void *ctx, MppDevRcbInfoCfg *cfg); + MPP_RET (*set_info)(void *ctx, MppDevInfoCfg *cfg); + + /* send cmd to hardware */ + MPP_RET (*cmd_send)(void *ctx); + + /* poll cmd from hardware */ + MPP_RET (*cmd_poll)(void *ctx); +} MppDevApi; + +typedef void* MppDev; + +#ifdef __cplusplus +extern "C" { +#endif + +MPP_RET mpp_dev_init(MppDev *ctx, MppClientType type); +MPP_RET mpp_dev_deinit(MppDev ctx); + +MPP_RET mpp_dev_ioctl(MppDev ctx, RK_S32 cmd, void *param); + +/* special helper function for large address offset config */ +MPP_RET mpp_dev_set_reg_offset(MppDev dev, RK_S32 index, RK_U32 offset); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_DEVICE_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_env.h b/hardware/mpp/include/mpp_env.h new file mode 100755 index 0000000000000000000000000000000000000000..12508814591e9fe74e509dd390be961f9506014d --- /dev/null +++ b/hardware/mpp/include/mpp_env.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_ENV_H__ +#define __MPP_ENV_H__ + +#include "rk_type.h" + +#ifdef __cplusplus +extern "C" { +#endif + +RK_S32 mpp_env_get_u32(const char *name, RK_U32 *value, RK_U32 default_value); +RK_S32 mpp_env_get_str(const char *name, const char **value, const char *default_value); + +RK_S32 mpp_env_set_u32(const char *name, RK_U32 value); +RK_S32 mpp_env_set_str(const char *name, char *value); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_ENV_H__ */ + diff --git a/hardware/mpp/include/mpp_err.h b/hardware/mpp/include/mpp_err.h new file mode 100644 index 0000000000000000000000000000000000000000..f68040a23d39ae67b6e216325244b21f5c77e25d --- /dev/null +++ b/hardware/mpp/include/mpp_err.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_ERR_H__ +#define __MPP_ERR_H__ + +#define RK_OK 0 +#define RK_SUCCESS 0 + +typedef enum { + MPP_SUCCESS = RK_SUCCESS, + MPP_OK = RK_OK, + + MPP_NOK = -1, + MPP_ERR_UNKNOW = -2, + MPP_ERR_NULL_PTR = -3, + MPP_ERR_MALLOC = -4, + MPP_ERR_OPEN_FILE = -5, + MPP_ERR_VALUE = -6, + MPP_ERR_READ_BIT = -7, + MPP_ERR_TIMEOUT = -8, + MPP_ERR_PERM = -9, + + MPP_ERR_BASE = -1000, + + /* The error in stream processing */ + MPP_ERR_LIST_STREAM = MPP_ERR_BASE - 1, + MPP_ERR_INIT = MPP_ERR_BASE - 2, + MPP_ERR_VPU_CODEC_INIT = MPP_ERR_BASE - 3, + MPP_ERR_STREAM = MPP_ERR_BASE - 4, + MPP_ERR_FATAL_THREAD = MPP_ERR_BASE - 5, + MPP_ERR_NOMEM = MPP_ERR_BASE - 6, + MPP_ERR_PROTOL = MPP_ERR_BASE - 7, + MPP_FAIL_SPLIT_FRAME = MPP_ERR_BASE - 8, + MPP_ERR_VPUHW = MPP_ERR_BASE - 9, + MPP_EOS_STREAM_REACHED = MPP_ERR_BASE - 11, + MPP_ERR_BUFFER_FULL = MPP_ERR_BASE - 12, + MPP_ERR_DISPLAY_FULL = MPP_ERR_BASE - 13, +} MPP_RET; + +#endif /* __MPP_ERR_H__ */ diff --git a/hardware/mpp/include/mpp_eventfd.h b/hardware/mpp/include/mpp_eventfd.h new file mode 100644 index 0000000000000000000000000000000000000000..ed27db663ce12ed9678be009cb0dbd76d34a5bfd --- /dev/null +++ b/hardware/mpp/include/mpp_eventfd.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_EVENTFD_H__ +#define __MPP_EVENTFD_H__ + +#include "rk_type.h" + +#ifdef __cplusplus +extern "C" { +#endif + +RK_S32 mpp_eventfd_get(RK_U32 init); +RK_S32 mpp_eventfd_put(RK_S32 fd); + +RK_S32 mpp_eventfd_read(RK_S32 fd, RK_U64 *val, RK_S64 timeout); +RK_S32 mpp_eventfd_write(RK_S32 fd, RK_U64 val); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_EVENTFD_H__ */ + diff --git a/hardware/mpp/include/mpp_frame.h b/hardware/mpp/include/mpp_frame.h new file mode 100644 index 0000000000000000000000000000000000000000..a00b4ff4e41b47449f6b50e032f4b96c638d426d --- /dev/null +++ b/hardware/mpp/include/mpp_frame.h @@ -0,0 +1,391 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_FRAME_H__ +#define __MPP_FRAME_H__ + +#include "mpp_buffer.h" + +/* + * bit definition for mode flag in MppFrame + */ +/* progressive frame */ +#define MPP_FRAME_FLAG_FRAME (0x00000000) +/* top field only */ +#define MPP_FRAME_FLAG_TOP_FIELD (0x00000001) +/* bottom field only */ +#define MPP_FRAME_FLAG_BOT_FIELD (0x00000002) +/* paired field */ +#define MPP_FRAME_FLAG_PAIRED_FIELD (MPP_FRAME_FLAG_TOP_FIELD|MPP_FRAME_FLAG_BOT_FIELD) +/* paired field with field order of top first */ +#define MPP_FRAME_FLAG_TOP_FIRST (0x00000004) +/* paired field with field order of bottom first */ +#define MPP_FRAME_FLAG_BOT_FIRST (0x00000008) +/* paired field with unknown field order (MBAFF) */ +#define MPP_FRAME_FLAG_DEINTERLACED (MPP_FRAME_FLAG_TOP_FIRST|MPP_FRAME_FLAG_BOT_FIRST) +#define MPP_FRAME_FLAG_FIELD_ORDER_MASK (0x0000000C) +// for multiview stream +#define MPP_FRAME_FLAG_VIEW_ID_MASK (0x000000f0) + +#define MPP_FRAME_FLAG_IEP_DEI_MASK (0x00000f00) +#define MPP_FRAME_FLAG_IEP_DEI_I2O1 (0x00000100) +#define MPP_FRAME_FLAG_IEP_DEI_I4O2 (0x00000200) +#define MPP_FRAME_FLAG_IEP_DEI_I4O1 (0x00000300) + +/* + * MPEG vs JPEG YUV range. + */ +typedef enum { + MPP_FRAME_RANGE_UNSPECIFIED = 0, + MPP_FRAME_RANGE_MPEG = 1, ///< the normal 219*2^(n-8) "MPEG" YUV ranges + MPP_FRAME_RANGE_JPEG = 2, ///< the normal 2^n-1 "JPEG" YUV ranges + MPP_FRAME_RANGE_NB, ///< Not part of ABI +} MppFrameColorRange; + +typedef enum { + MPP_FRAME_VIDEO_FMT_COMPONEMT = 0, + MPP_FRAME_VIDEO_FMT_PAL = 1, + MPP_FRAME_VIDEO_FMT_NTSC = 2, + MPP_FRAME_VIDEO_FMT_SECAM = 3, + MPP_FRAME_VIDEO_FMT_MAC = 4, + MPP_FRAME_VIDEO_FMT_UNSPECIFIED = 5, + MPP_FRAME_VIDEO_FMT_RESERVED0 = 6, + MPP_FRAME_VIDEO_FMT_RESERVED1 = 7, +} MppFrameVideoFormat; + +/* + * Chromaticity coordinates of the source primaries. + */ +typedef enum { + MPP_FRAME_PRI_RESERVED0 = 0, + MPP_FRAME_PRI_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP177 Annex B + MPP_FRAME_PRI_UNSPECIFIED = 2, + MPP_FRAME_PRI_RESERVED = 3, + MPP_FRAME_PRI_BT470M = 4, ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + + MPP_FRAME_PRI_BT470BG = 5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM + MPP_FRAME_PRI_SMPTE170M = 6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC + MPP_FRAME_PRI_SMPTE240M = 7, ///< functionally identical to above + MPP_FRAME_PRI_FILM = 8, ///< colour filters using Illuminant C + MPP_FRAME_PRI_BT2020 = 9, ///< ITU-R BT2020 + MPP_FRAME_PRI_SMPTEST428_1 = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ) + MPP_FRAME_PRI_SMPTE431 = 11, ///< SMPTE ST 431-2 (2011) / DCI P3 + MPP_FRAME_PRI_SMPTE432 = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3 + MPP_FRAME_PRI_JEDEC_P22 = 22, ///< JEDEC P22 phosphors + MPP_FRAME_PRI_NB, ///< Not part of ABI +} MppFrameColorPrimaries; + +/* + * Color Transfer Characteristic. + */ +typedef enum { + MPP_FRAME_TRC_RESERVED0 = 0, + MPP_FRAME_TRC_BT709 = 1, ///< also ITU-R BT1361 + MPP_FRAME_TRC_UNSPECIFIED = 2, + MPP_FRAME_TRC_RESERVED = 3, + MPP_FRAME_TRC_GAMMA22 = 4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM + MPP_FRAME_TRC_GAMMA28 = 5, ///< also ITU-R BT470BG + ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC + MPP_FRAME_TRC_SMPTE170M = 6, + MPP_FRAME_TRC_SMPTE240M = 7, + MPP_FRAME_TRC_LINEAR = 8, ///< "Linear transfer characteristics" + MPP_FRAME_TRC_LOG = 9, ///< "Logarithmic transfer characteristic (100:1 range)" + MPP_FRAME_TRC_LOG_SQRT = 10, ///< "Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)" + MPP_FRAME_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4 + MPP_FRAME_TRC_BT1361_ECG = 12, ///< ITU-R BT1361 Extended Colour Gamut + MPP_FRAME_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC) + MPP_FRAME_TRC_BT2020_10 = 14, ///< ITU-R BT2020 for 10 bit system + MPP_FRAME_TRC_BT2020_12 = 15, ///< ITU-R BT2020 for 12 bit system + MPP_FRAME_TRC_SMPTEST2084 = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems + MPP_FRAME_TRC_SMPTEST428_1 = 17, ///< SMPTE ST 428-1 + MPP_FRAME_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as "Hybrid log-gamma" + MPP_FRAME_TRC_NB, ///< Not part of ABI +} MppFrameColorTransferCharacteristic; + +/* + * YUV colorspace type. + */ +typedef enum { + MPP_FRAME_SPC_RGB = 0, ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) + MPP_FRAME_SPC_BT709 = 1, ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B + MPP_FRAME_SPC_UNSPECIFIED = 2, + MPP_FRAME_SPC_RESERVED = 3, + MPP_FRAME_SPC_FCC = 4, ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20) + ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 + MPP_FRAME_SPC_BT470BG = 5, + ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above + MPP_FRAME_SPC_SMPTE170M = 6, + MPP_FRAME_SPC_SMPTE240M = 7, + MPP_FRAME_SPC_YCOCG = 8, ///< Used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16 + MPP_FRAME_SPC_BT2020_NCL = 9, ///< ITU-R BT2020 non-constant luminance system + MPP_FRAME_SPC_BT2020_CL = 10, ///< ITU-R BT2020 constant luminance system + MPP_FRAME_SPC_SMPTE2085 = 11, ///< SMPTE 2085, Y'D'zD'x + MPP_FRAME_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system + MPP_FRAME_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system + MPP_FRAME_SPC_ICTCP = 14, ///< ITU-R BT.2100-0, ICtCp + MPP_FRAME_SPC_NB, ///< Not part of ABI +} MppFrameColorSpace; + +/* + * Location of chroma samples. + * + * Illustration showing the location of the first (top left) chroma sample of the + * image, the left shows only luma, the right + * shows the location of the chroma sample, the 2 could be imagined to overlay + * each other but are drawn separately due to limitations of ASCII + * + * 1st 2nd 1st 2nd horizontal luma sample positions + * v v v v + * ______ ______ + * 1st luma line > |X X ... |3 4 X ... X are luma samples, + * | |1 2 1-6 are possible chroma positions + * 2nd luma line > |X X ... |5 6 X ... 0 is undefined/unknown position + */ +typedef enum { + MPP_CHROMA_LOC_UNSPECIFIED = 0, + MPP_CHROMA_LOC_LEFT = 1, ///< mpeg2/4 4:2:0, h264 default for 4:2:0 + MPP_CHROMA_LOC_CENTER = 2, ///< mpeg1 4:2:0, jpeg 4:2:0, h263 4:2:0 + MPP_CHROMA_LOC_TOPLEFT = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2 + MPP_CHROMA_LOC_TOP = 4, + MPP_CHROMA_LOC_BOTTOMLEFT = 5, + MPP_CHROMA_LOC_BOTTOM = 6, + MPP_CHROMA_LOC_NB, ///< Not part of ABI +} MppFrameChromaLocation; + +#define MPP_FRAME_FMT_MASK (0x000fffff) + +#define MPP_FRAME_FMT_COLOR_MASK (0x000f0000) +#define MPP_FRAME_FMT_YUV (0x00000000) +#define MPP_FRAME_FMT_RGB (0x00010000) + +#define MPP_FRAME_FBC_MASK (0x00f00000) +#define MPP_FRAME_FBC_NONE (0x00000000) +/* + * AFBC_V1 is for ISP output. + * It has default payload offset to be calculated * from width and height: + * Payload offset = MPP_ALIGN(MPP_ALIGN(width, 16) * MPP_ALIGN(height, 16) / 16, SZ_4K) + */ +#define MPP_FRAME_FBC_AFBC_V1 (0x00100000) +/* + * AFBC_V2 is for video decoder output. + * It stores payload offset in first 32-bit in header address + * Payload offset is always set to zero. + */ +#define MPP_FRAME_FBC_AFBC_V2 (0x00200000) + +#define MPP_FRAME_FMT_LE_MASK (0x01000000) + +#define MPP_FRAME_FMT_IS_YUV(fmt) ((((fmt) & MPP_FRAME_FMT_COLOR_MASK) == MPP_FRAME_FMT_YUV) && \ + (((fmt) & MPP_FRAME_FMT_MASK) < MPP_FMT_YUV_BUTT)) +#define MPP_FRAME_FMT_IS_RGB(fmt) ((((fmt) & MPP_FRAME_FMT_COLOR_MASK) == MPP_FRAME_FMT_RGB) && \ + (((fmt) & MPP_FRAME_FMT_MASK) < MPP_FMT_RGB_BUTT)) + +/* + * For MPP_FRAME_FBC_AFBC_V1 the 16byte aligned stride is used. + */ +#define MPP_FRAME_FMT_IS_FBC(fmt) ((fmt) & MPP_FRAME_FBC_MASK) + +#define MPP_FRAME_FMT_IS_LE(fmt) (((fmt) & MPP_FRAME_FMT_LE_MASK) == MPP_FRAME_FMT_LE_MASK) +#define MPP_FRAME_FMT_IS_BE(fmt) (((fmt) & MPP_FRAME_FMT_LE_MASK) == 0) + +/* mpp color format index definition */ +typedef enum { + MPP_FMT_YUV420SP = (MPP_FRAME_FMT_YUV + 0), /* YYYY... UV... (NV12) */ + /* + * A rockchip specific pixel format, without gap between pixel aganist + * the P010_10LE/P010_10BE + */ + MPP_FMT_YUV420SP_10BIT = (MPP_FRAME_FMT_YUV + 1), + MPP_FMT_YUV422SP = (MPP_FRAME_FMT_YUV + 2), /* YYYY... UVUV... (NV16) */ + MPP_FMT_YUV422SP_10BIT = (MPP_FRAME_FMT_YUV + 3), ///< Not part of ABI + MPP_FMT_YUV420P = (MPP_FRAME_FMT_YUV + 4), /* YYYY... U...V... (I420) */ + MPP_FMT_YUV420SP_VU = (MPP_FRAME_FMT_YUV + 5), /* YYYY... VUVUVU... (NV21) */ + MPP_FMT_YUV422P = (MPP_FRAME_FMT_YUV + 6), /* YYYY... UU...VV...(422P) */ + MPP_FMT_YUV422SP_VU = (MPP_FRAME_FMT_YUV + 7), /* YYYY... VUVUVU... (NV61) */ + MPP_FMT_YUV422_YUYV = (MPP_FRAME_FMT_YUV + 8), /* YUYVYUYV... (YUY2) */ + MPP_FMT_YUV422_YVYU = (MPP_FRAME_FMT_YUV + 9), /* YVYUYVYU... (YVY2) */ + MPP_FMT_YUV422_UYVY = (MPP_FRAME_FMT_YUV + 10), /* UYVYUYVY... (UYVY) */ + MPP_FMT_YUV422_VYUY = (MPP_FRAME_FMT_YUV + 11), /* VYUYVYUY... (VYUY) */ + MPP_FMT_YUV400 = (MPP_FRAME_FMT_YUV + 12), /* YYYY... */ + MPP_FMT_YUV440SP = (MPP_FRAME_FMT_YUV + 13), /* YYYY... UVUV... */ + MPP_FMT_YUV411SP = (MPP_FRAME_FMT_YUV + 14), /* YYYY... UV... */ + MPP_FMT_YUV444SP = (MPP_FRAME_FMT_YUV + 15), /* YYYY... UVUVUVUV... */ + MPP_FMT_YUV_BUTT, + + MPP_FMT_RGB565 = (MPP_FRAME_FMT_RGB + 0), /* 16-bit RGB */ + MPP_FMT_BGR565 = (MPP_FRAME_FMT_RGB + 1), /* 16-bit RGB */ + MPP_FMT_RGB555 = (MPP_FRAME_FMT_RGB + 2), /* 15-bit RGB */ + MPP_FMT_BGR555 = (MPP_FRAME_FMT_RGB + 3), /* 15-bit RGB */ + MPP_FMT_RGB444 = (MPP_FRAME_FMT_RGB + 4), /* 12-bit RGB */ + MPP_FMT_BGR444 = (MPP_FRAME_FMT_RGB + 5), /* 12-bit RGB */ + MPP_FMT_RGB888 = (MPP_FRAME_FMT_RGB + 6), /* 24-bit RGB */ + MPP_FMT_BGR888 = (MPP_FRAME_FMT_RGB + 7), /* 24-bit RGB */ + MPP_FMT_RGB101010 = (MPP_FRAME_FMT_RGB + 8), /* 30-bit RGB */ + MPP_FMT_BGR101010 = (MPP_FRAME_FMT_RGB + 9), /* 30-bit RGB */ + MPP_FMT_ARGB8888 = (MPP_FRAME_FMT_RGB + 10), /* 32-bit RGB */ + MPP_FMT_ABGR8888 = (MPP_FRAME_FMT_RGB + 11), /* 32-bit RGB */ + MPP_FMT_BGRA8888 = (MPP_FRAME_FMT_RGB + 12), /* 32-bit RGB */ + MPP_FMT_RGBA8888 = (MPP_FRAME_FMT_RGB + 13), /* 32-bit RGB */ + MPP_FMT_RGB_BUTT, + + MPP_FMT_BUTT, +} MppFrameFormat; + +/** + * Rational number (pair of numerator and denominator). + */ +typedef struct MppFrameRational { + RK_S32 num; ///< Numerator + RK_S32 den; ///< Denominator +} MppFrameRational; + +typedef struct MppFrameMasteringDisplayMetadata { + RK_U16 display_primaries[3][2]; + RK_U16 white_point[2]; + RK_U32 max_luminance; + RK_U32 min_luminance; +} MppFrameMasteringDisplayMetadata; + +typedef struct MppFrameContentLightMetadata { + RK_U16 MaxCLL; + RK_U16 MaxFALL; +} MppFrameContentLightMetadata; + +typedef enum { + MPP_FRAME_ERR_UNKNOW = 0x0001, + MPP_FRAME_ERR_UNSUPPORT = 0x0002, +} MPP_FRAME_ERR; + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * MppFrame interface + */ +MPP_RET mpp_frame_init(MppFrame *frame); +MPP_RET mpp_frame_deinit(MppFrame *frame); +MppFrame mpp_frame_get_next(MppFrame frame); + +/* + * normal parameter + * + * offset_x + * <--------> + * + * <---------------+ hor_stride +---------------> + * + * +------------------------------------------------------+ ^ ^ + * | | | | + * | | | | offset_y + * | | | | + * | +--------------------------------+ ^ | | v + * | | | | | | + * | | | + | + + * | | | | + * | | valid data area | height | ver_stride + * | | | | + * | | | + | + + * | | | | | | + * | +--------------------------------+ v | | + * | | | + * | <----------+ width +---------> | | + * | | | + * +------------------------------------------------------+ v + * + */ +RK_U32 mpp_frame_get_width(const MppFrame frame); +void mpp_frame_set_width(MppFrame frame, RK_U32 width); +RK_U32 mpp_frame_get_height(const MppFrame frame); +void mpp_frame_set_height(MppFrame frame, RK_U32 height); +RK_U32 mpp_frame_get_hor_stride(const MppFrame frame); +void mpp_frame_set_hor_stride(MppFrame frame, RK_U32 hor_stride); +RK_U32 mpp_frame_get_ver_stride(const MppFrame frame); +void mpp_frame_set_ver_stride(MppFrame frame, RK_U32 ver_stride); +void mpp_frame_set_hor_stride_pixel(MppFrame frame, RK_U32 hor_stride_pixel); +RK_U32 mpp_frame_get_hor_stride_pixel(const MppFrame frame); + +RK_U32 mpp_frame_get_offset_x(const MppFrame frame); +void mpp_frame_set_offset_x(MppFrame frame, RK_U32 offset_x); +RK_U32 mpp_frame_get_offset_y(const MppFrame frame); +void mpp_frame_set_offset_y(MppFrame frame, RK_U32 offset_y); +RK_U32 mpp_frame_get_mode(const MppFrame frame); +void mpp_frame_set_mode(MppFrame frame, RK_U32 mode); +RK_U32 mpp_frame_get_discard(const MppFrame frame); +void mpp_frame_set_discard(MppFrame frame, RK_U32 discard); +RK_U32 mpp_frame_get_viewid(const MppFrame frame); +void mpp_frame_set_viewid(MppFrame frame, RK_U32 viewid); +RK_U32 mpp_frame_get_poc(const MppFrame frame); +void mpp_frame_set_poc(MppFrame frame, RK_U32 poc); +RK_S64 mpp_frame_get_pts(const MppFrame frame); +void mpp_frame_set_pts(MppFrame frame, RK_S64 pts); +RK_S64 mpp_frame_get_dts(const MppFrame frame); +void mpp_frame_set_dts(MppFrame frame, RK_S64 dts); +RK_U32 mpp_frame_get_errinfo(const MppFrame frame); +void mpp_frame_set_errinfo(MppFrame frame, RK_U32 errinfo); +size_t mpp_frame_get_buf_size(const MppFrame frame); +void mpp_frame_set_buf_size(MppFrame frame, size_t buf_size); +/* + * flow control parmeter + */ +RK_U32 mpp_frame_get_eos(const MppFrame frame); +void mpp_frame_set_eos(MppFrame frame, RK_U32 eos); +RK_U32 mpp_frame_get_info_change(const MppFrame frame); +void mpp_frame_set_info_change(MppFrame frame, RK_U32 info_change); + +/* + * buffer parameter + */ +MppBuffer mpp_frame_get_buffer(const MppFrame frame); +void mpp_frame_set_buffer(MppFrame frame, MppBuffer buffer); + +/* + * meta data parameter + */ +RK_S32 mpp_frame_has_meta(const MppFrame frame); +MppMeta mpp_frame_get_meta(const MppFrame frame); +void mpp_frame_set_meta(MppFrame frame, MppMeta meta); + +/* + * color related parameter + */ +MppFrameColorRange mpp_frame_get_color_range(const MppFrame frame); +void mpp_frame_set_color_range(MppFrame frame, MppFrameColorRange color_range); +MppFrameColorPrimaries mpp_frame_get_color_primaries(const MppFrame frame); +void mpp_frame_set_color_primaries(MppFrame frame, MppFrameColorPrimaries color_primaries); +MppFrameColorTransferCharacteristic mpp_frame_get_color_trc(const MppFrame frame); +void mpp_frame_set_color_trc(MppFrame frame, MppFrameColorTransferCharacteristic color_trc); +MppFrameColorSpace mpp_frame_get_colorspace(const MppFrame frame); +void mpp_frame_set_colorspace(MppFrame frame, MppFrameColorSpace colorspace); +MppFrameChromaLocation mpp_frame_get_chroma_location(const MppFrame frame); +void mpp_frame_set_chroma_location(MppFrame frame, MppFrameChromaLocation chroma_location); +MppFrameFormat mpp_frame_get_fmt(MppFrame frame); +void mpp_frame_set_fmt(MppFrame frame, MppFrameFormat fmt); +MppFrameRational mpp_frame_get_sar(const MppFrame frame); +void mpp_frame_set_sar(MppFrame frame, MppFrameRational sar); +MppFrameMasteringDisplayMetadata mpp_frame_get_mastering_display(const MppFrame frame); +void mpp_frame_set_mastering_display(MppFrame frame, MppFrameMasteringDisplayMetadata mastering_display); +MppFrameContentLightMetadata mpp_frame_get_content_light(const MppFrame frame); +void mpp_frame_set_content_light(MppFrame frame, MppFrameContentLightMetadata content_light); + +/* + * HDR parameter + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_FRAME_H__ */ diff --git a/hardware/mpp/include/mpp_hash.h b/hardware/mpp/include/mpp_hash.h new file mode 100644 index 0000000000000000000000000000000000000000..75b0e7a403039e57afb3b23ce7cb01abd0ed19b3 --- /dev/null +++ b/hardware/mpp/include/mpp_hash.h @@ -0,0 +1,389 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_HASH_H__ +#define __MPP_HASH_H__ + +#include + +#include "rk_type.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define GOLDEN_RATIO_32 0x61C88647 +#define GOLDEN_RATIO_64 0x61C8864680B583EBull + +#if __SIZEOF_POINTER__ == 4 +#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_32 +#define hash_long(val, bits) hash_32(val, bits) +#elif __SIZEOF_POINTER__ == 8 +#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_64 +#define hash_long(val, bits) hash_64(val, bits) +#else +#error __SIZEOF_POINTER__ not 4 or 8 +#endif + +struct hlist_node { + struct hlist_node *next, **pprev; +}; + +struct hlist_head { + struct hlist_node *first; +}; + +#define HLIST_HEAD_INIT { .first = NULL } +#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL } +#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL) + +#define LIST_POISON1 ((void *) 0x100) +#define LIST_POISON2 ((void *) 0x200) + +#define WRITE_ONCE(var, val) \ + (*((volatile typeof(val) *)(&(var))) = (val)) + +#define READ_ONCE(var) (*((volatile typeof(var) *)(&(var)))) + +static inline void INIT_HLIST_NODE(struct hlist_node *h) +{ + h->next = NULL; + h->pprev = NULL; +} + +static inline int hlist_unhashed(const struct hlist_node *h) +{ + return !h->pprev; +} + +static inline int hlist_empty(const struct hlist_head *h) +{ + return !READ_ONCE(h->first); +} + +static inline void _hlist_del(struct hlist_node *n) +{ + struct hlist_node *next = n->next; + struct hlist_node **pprev = n->pprev; + + WRITE_ONCE(*pprev, next); + if (next) { + next->pprev = pprev; + } +} + +static inline void hlist_del(struct hlist_node *n) +{ + _hlist_del(n); + n->next = (struct hlist_node*)LIST_POISON1; + n->pprev = (struct hlist_node**)LIST_POISON2; +} + +static inline void hlist_del_init(struct hlist_node *n) +{ + if (!hlist_unhashed(n)) { + _hlist_del(n); + INIT_HLIST_NODE(n); + } +} + +static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h) +{ + struct hlist_node *first = h->first; + n->next = first; + if (first) { + first->pprev = &n->next; + } + WRITE_ONCE(h->first, n); + n->pprev = &h->first; +} + +static inline void hlist_add_before(struct hlist_node *n, struct hlist_node *next) +{ + n->pprev = next->pprev; + n->next = next; + next->pprev = &n->next; + WRITE_ONCE(*(n->pprev), n); +} + +static inline void hlist_add_behind(struct hlist_node *n, struct hlist_node *prev) +{ + n->next = prev->next; + WRITE_ONCE(prev->next, n); + n->pprev = &prev->next; + + if (n->next) { + n->next->pprev = &n->next; + } +} + +static inline void hlist_add_fake(struct hlist_node *n) +{ + n->pprev = &n->next; +} + +static inline int hlist_fake(struct hlist_node *h) +{ + return h->pprev == &h->next; +} + +static inline int hlist_is_singular_node(struct hlist_node *n, struct hlist_head *h) +{ + return !n->next && n->pprev == &h->first; +} + +static inline void hlist_move_list(struct hlist_head *old, + struct hlist_head *_new) +{ + _new->first = old->first; + if (_new->first) { + _new->first->pprev = &_new->first; + } + old->first = NULL; +} + +#define hlist_entry(ptr, type, member) container_of(ptr, type, member) + +#define hlist_for_each(pos, head) \ + for ((pos) = (head)->first; (pos) ; (pos) = (pos)->next) + +#define hlist_for_each_safe(pos, n, head) \ + for ((pos) = (head)->first; (pos) && ( { n = (pos)->next; 1; } ); \ + (pos) = n) + +#define hlist_entry_safe(ptr, type, member) \ + ( { typeof(ptr) ____ptr = (ptr); \ + ____ptr ? hlist_entry(____ptr, type, member) : NULL; \ + }) + +#define hlist_for_each_entry(pos, head, member) \ + for ((pos) = hlist_entry_safe((head)->first, typeof(*(pos)), member); \ + (pos); \ + (pos) = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) + +#define hlist_for_each_entry_continue(pos, member) \ + for ((pos) = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member); \ + (pos); \ + (pos) = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) + +#define hlist_for_each_entry_from(pos, member) \ + for (; (pos); \ + (pos) = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member)) + +#define hlist_for_each_entry_safe(pos, n, head, member) \ + for ((pos) = hlist_entry_safe((head)->first, typeof(*(pos)), member); \ + (pos) && ( { n = (pos)->member.next; 1; }); \ + (pos) = hlist_entry_safe(n, typeof(*(pos)), member)) + +#define DEFINE_HASHTABLE(name, bits) \ + struct hlist_head name[1 << (bits)] = \ + { [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT } + +#define DECLARE_HASHTABLE(name, bits) \ + struct hlist_head name[1 << (bits)] + +#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0])) + +#define ilog2(n) \ + ( \ + (n) & (1ULL << 63) ? 63 : \ + (n) & (1ULL << 62) ? 62 : \ + (n) & (1ULL << 61) ? 61 : \ + (n) & (1ULL << 60) ? 60 : \ + (n) & (1ULL << 59) ? 59 : \ + (n) & (1ULL << 58) ? 58 : \ + (n) & (1ULL << 57) ? 57 : \ + (n) & (1ULL << 56) ? 56 : \ + (n) & (1ULL << 55) ? 55 : \ + (n) & (1ULL << 54) ? 54 : \ + (n) & (1ULL << 53) ? 53 : \ + (n) & (1ULL << 52) ? 52 : \ + (n) & (1ULL << 51) ? 51 : \ + (n) & (1ULL << 50) ? 50 : \ + (n) & (1ULL << 49) ? 49 : \ + (n) & (1ULL << 48) ? 48 : \ + (n) & (1ULL << 47) ? 47 : \ + (n) & (1ULL << 46) ? 46 : \ + (n) & (1ULL << 45) ? 45 : \ + (n) & (1ULL << 44) ? 44 : \ + (n) & (1ULL << 43) ? 43 : \ + (n) & (1ULL << 42) ? 42 : \ + (n) & (1ULL << 41) ? 41 : \ + (n) & (1ULL << 40) ? 40 : \ + (n) & (1ULL << 39) ? 39 : \ + (n) & (1ULL << 38) ? 38 : \ + (n) & (1ULL << 37) ? 37 : \ + (n) & (1ULL << 36) ? 36 : \ + (n) & (1ULL << 35) ? 35 : \ + (n) & (1ULL << 34) ? 34 : \ + (n) & (1ULL << 33) ? 33 : \ + (n) & (1ULL << 32) ? 32 : \ + (n) & (1ULL << 31) ? 31 : \ + (n) & (1ULL << 30) ? 30 : \ + (n) & (1ULL << 29) ? 29 : \ + (n) & (1ULL << 28) ? 28 : \ + (n) & (1ULL << 27) ? 27 : \ + (n) & (1ULL << 26) ? 26 : \ + (n) & (1ULL << 25) ? 25 : \ + (n) & (1ULL << 24) ? 24 : \ + (n) & (1ULL << 23) ? 23 : \ + (n) & (1ULL << 22) ? 22 : \ + (n) & (1ULL << 21) ? 21 : \ + (n) & (1ULL << 20) ? 20 : \ + (n) & (1ULL << 19) ? 19 : \ + (n) & (1ULL << 18) ? 18 : \ + (n) & (1ULL << 17) ? 17 : \ + (n) & (1ULL << 16) ? 16 : \ + (n) & (1ULL << 15) ? 15 : \ + (n) & (1ULL << 14) ? 14 : \ + (n) & (1ULL << 13) ? 13 : \ + (n) & (1ULL << 12) ? 12 : \ + (n) & (1ULL << 11) ? 11 : \ + (n) & (1ULL << 10) ? 10 : \ + (n) & (1ULL << 9) ? 9 : \ + (n) & (1ULL << 8) ? 8 : \ + (n) & (1ULL << 7) ? 7 : \ + (n) & (1ULL << 6) ? 6 : \ + (n) & (1ULL << 5) ? 5 : \ + (n) & (1ULL << 4) ? 4 : \ + (n) & (1ULL << 3) ? 3 : \ + (n) & (1ULL << 2) ? 2 : \ + (n) & (1ULL << 1) ? 1 : 0 \ + ) + +#define HASH_SIZE(name) (ARRAY_SIZE(name)) +#define HASH_BITS(name) ilog2(HASH_SIZE(name)) + +/* Use hash_32 when possible to allow for fast 32bit hashing in 64bit kernels. */ +#define hash_min(val, bits) \ + (sizeof(val) <= 4 ? hash_32(val, bits) : hash_long(val, bits)) + +#define hash_add(hashtable, node, key) \ + hlist_add_head(node, &(hashtable)[hash_min(key, HASH_BITS(hashtable))]) + +/** + * hash_empty - check whether a hashtable is empty + * @hashtable: hashtable to check + * + * This has to be a macro since HASH_BITS() will not work on pointers since + * it calculates the size during preprocessing. + */ +#define hash_empty(hashtable) __hash_empty(hashtable, HASH_SIZE(hashtable)) + +/** + * hash_for_each - iterate over a hashtable + * @name: hashtable to iterate + * @bkt: integer to use as bucket loop cursor + * @obj: the type * to use as a loop cursor for each entry + * @member: the name of the hlist_node within the struct + */ +#define hash_for_each(name, bkt, obj, member) \ + for ((bkt) = 0, (obj) = NULL; (obj) == NULL && (bkt) < HASH_SIZE(name); \ + (bkt)++) \ + hlist_for_each_entry((obj), &(name)[bkt], member) + +/** + * hash_for_each_safe - iterate over a hashtable safe against removal of + * hash entry + * @name: hashtable to iterate + * @bkt: integer to use as bucket loop cursor + * @tmp: a &struct used for temporary storage + * @obj: the type * to use as a loop cursor for each entry + * @member: the name of the hlist_node within the struct + */ +#define hash_for_each_safe(name, bkt, tmp, obj, member) \ + for ((bkt) = 0, (obj) = NULL; (obj) == NULL && (bkt) < HASH_SIZE(name); \ + (bkt)++) \ + hlist_for_each_entry_safe((obj), tmp, &(name)[bkt], member) + +#define hash_for_each_possible(name, obj, member, key) \ + hlist_for_each_entry((obj), &(name)[hash_min(key, HASH_BITS(name))], member) + +static inline RK_U32 hash_32(RK_U32 val, unsigned int bits) +{ + /* On some cpus multiply is faster, on others gcc will do shifts */ + RK_U32 hash = val * GOLDEN_RATIO_32; + + /* High bits are more random, so use them. */ + return hash >> (32 - bits); // 32:32bits +} + +static inline RK_U32 _hash_32(RK_U32 val) +{ + return val * GOLDEN_RATIO_32; +} + +static inline RK_U32 hash_64(RK_U64 val, unsigned int bits) +{ +#if __SIZEOF_POINTER__ == 8 // 8:sizeof pointer + /* 64x64-bit multiply is efficient on all 64-bit processors */ + return val * GOLDEN_RATIO_64 >> (64 - bits); +#else + /* Hash 64 bits using only 32x32-bit multiply. */ + return hash_32((RK_U32)val ^ ((val >> 32) * GOLDEN_RATIO_32), bits); +#endif +} + +static inline RK_U32 hash_ptr(const void *ptr, unsigned int bits) +{ + return hash_long((unsigned long)ptr, bits); +} + +/* This really should be called fold32_ptr; it does no hashing to speak of. */ +static inline RK_U32 hash32_ptr(const void *ptr) +{ + unsigned long val = (unsigned long)ptr; + +#if __SIZEOF_POINTER__ == 8 + val ^= (val >> 32); // 32:Shift 32 bits right +#endif + return (RK_U32)val; +} + +/** + * hash_hashed - check whether an object is in any hashtable + * @node: the &struct hlist_node of the object to be checked + */ +static inline bool hash_hashed(struct hlist_node *node) +{ + return !hlist_unhashed(node); +} + +static inline bool _hash_empty(struct hlist_head *ht, unsigned int sz) +{ + unsigned int i; + + for (i = 0; i < sz; i++) { + if (!hlist_empty(&ht[i])) { + return false; + } + } + return true; +} + +/** + * hash_del - remove an object from a hashtable + * @node: &struct hlist_node of the object to remove + */ +static inline void hash_del(struct hlist_node *node) +{ + hlist_del_init(node); +} + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_HASH_H__ */ diff --git a/hardware/mpp/include/mpp_list.h b/hardware/mpp/include/mpp_list.h new file mode 100644 index 0000000000000000000000000000000000000000..fa169b5d1fd755d922759848249704c19c6c595b --- /dev/null +++ b/hardware/mpp/include/mpp_list.h @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_LIST_H__ +#define __MPP_LIST_H__ + +#include "rk_type.h" + +#include "mpp_thread.h" + +/* + * two list structures are defined, one for C++, the other for C + */ + +#ifdef __cplusplus + +// desctructor of list node +typedef void *(*node_destructor)(void *); + +struct mpp_list_node; + +class mpp_list : public MppMutexCond { +public: + mpp_list(node_destructor func = NULL); + ~mpp_list(); + + // for FIFO or FILO implement + // adding functions support simple structure like C struct or C++ class pointer, + // do not support C++ object + RK_S32 add_at_head(void *data, RK_S32 size); + RK_S32 add_at_tail(void *data, RK_S32 size); + // deleting function will copy the stored data to input pointer with size as size + // if NULL is passed to deleting functions, the node will be delete directly + RK_S32 del_at_head(void *data, RK_S32 size); + RK_S32 del_at_tail(void *data, RK_S32 size); + + // direct fifo operation + RK_S32 fifo_wr(void *data, RK_S32 size); + RK_S32 fifo_rd(void *data, RK_S32 *size); + + // for status check + RK_S32 list_is_empty(); + RK_S32 list_size(); + + // for vector implement - not implemented yet + // adding function will return a key + RK_S32 add_by_key(void *data, RK_S32 size, RK_U32 *key); + RK_S32 del_by_key(void *data, RK_S32 size, RK_U32 key); + RK_S32 show_by_key(void *data, RK_U32 key); + + RK_S32 flush(); + +private: + node_destructor destroy; + struct mpp_list_node *head; + RK_S32 count; + static RK_U32 keys; + static RK_U32 get_key(); + + mpp_list(const mpp_list &); + mpp_list &operator=(const mpp_list &); +}; +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +struct list_head { + struct list_head *next, *prev; +}; + +#define LIST_HEAD_INIT(name) { &(name), &(name) } + +#define LIST_HEAD(name) \ + struct list_head name = LIST_HEAD_INIT(name) + +#define INIT_LIST_HEAD(ptr) do { \ + (ptr)->next = (ptr); (ptr)->prev = (ptr); \ + } while (0) + + +#define list_for_each_safe(pos, n, head) do { \ + for ((pos) = (head)->next, (n) = (pos)->next; (pos) != (head); \ + (pos) = (n), (n) = (pos)->next) \ + } while (0) + + +#define list_entry(ptr, type, member) \ + ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) + +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->next, type, member) + +#define list_last_entry(ptr, type, member) \ + list_entry((ptr)->prev, type, member) + +#define list_first_entry_or_null(ptr, type, member)({ \ + struct list_head *head__ = (ptr); \ + struct list_head *pos__ = head__->next; \ + pos__ != head__ ? list_entry(pos__, type, member) : NULL; \ +}) + +#define list_next_entry(pos, type, member) \ + list_entry((pos)->member.next, type, member) + +#define list_prev_entry(pos, type, member) \ + list_entry((pos)->member.prev, type, member) + +#define list_for_each_entry(pos, head, type, member) \ + for ((pos) = list_entry((head)->next, type, member); \ + &(pos)->member != (head); \ + (pos) = list_next_entry((pos), type, member)) + +#define list_for_each_entry_safe(pos, n, head, type, member) \ + for ((pos) = list_first_entry(head, type, member), \ + (n) = list_next_entry((pos), type, member); \ + &(pos)->member != (head); \ + (pos) = (n), (n) = list_next_entry(n, type, member)) + +#define list_for_each_entry_reverse(pos, head, type, member) \ + for ((pos) = list_last_entry(head, type, member); \ + &(pos)->member != (head); \ + (pos) = list_prev_entry((pos), type, member)) + +#define list_for_each_entry_safe_reverse(pos, n, head, type, member) \ + for ((pos) = list_last_entry(head, type, member), \ + (n) = list_prev_entry((pos), type, member); \ + &(pos)->member != (head); \ + (pos) = (n), (n) = list_prev_entry(n, type, member)) + +static __inline void _list_add(struct list_head * _new, + struct list_head * prev, + struct list_head * next) +{ + next->prev = _new; + _new->next = next; + _new->prev = prev; + prev->next = _new; +} + +static __inline void list_add(struct list_head *_new, struct list_head *head) +{ + _list_add(_new, head, head->next); +} + +static __inline void list_add_tail(struct list_head *_new, struct list_head *head) +{ + _list_add(_new, head->prev, head); +} + +static __inline void _list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +static __inline void list_del_init(struct list_head *entry) +{ + _list_del(entry->prev, entry->next); + + INIT_LIST_HEAD(entry); +} + +static __inline int list_is_last(const struct list_head *list, const struct list_head *head) +{ + return list->next == head; +} + +static __inline int list_empty(struct list_head *head) +{ + return head->next == head; +} + +#ifdef __cplusplus +} +#endif + + +#endif /* __MPP_LIST_H__ */ diff --git a/hardware/mpp/include/mpp_log.h b/hardware/mpp/include/mpp_log.h new file mode 100644 index 0000000000000000000000000000000000000000..f868f8e2244f3b4b0c7e3d0ae276464d1fc5afd7 --- /dev/null +++ b/hardware/mpp/include/mpp_log.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_LOG_H__ +#define __MPP_LOG_H__ + +#include +#include + +#include "rk_type.h" + +/* + * mpp runtime log system usage: + * mpp_err is for error status message, it will print for sure. + * mpp_log is for important message like open/close/reset/flush, it will print too. + * mpp_dbg is for all optional message. it can be controlled by debug and flag. + */ + +#define mpp_log(fmt, ...) _mpp_log(MODULE_TAG, fmt, NULL, ## __VA_ARGS__) +#define mpp_err(fmt, ...) _mpp_err(MODULE_TAG, fmt, NULL, ## __VA_ARGS__) + +#define _mpp_dbg(debug, flag, fmt, ...) \ + do { \ + if (debug & flag) \ + mpp_log(fmt, ## __VA_ARGS__); \ + } while (0) + +#define mpp_dbg(flag, fmt, ...) _mpp_dbg(mpp_debug, flag, fmt, ## __VA_ARGS__) + +/* + * _f function will add function name to the log + */ +#define mpp_log_f(fmt, ...) _mpp_log(MODULE_TAG, fmt, __FUNCTION__, ## __VA_ARGS__) +#define mpp_err_f(fmt, ...) _mpp_err(MODULE_TAG, fmt, __FUNCTION__, ## __VA_ARGS__) +#define _mpp_dbg_f(debug, flag, fmt, ...) \ + do { \ + if (debug & flag) \ + mpp_log_f(fmt, ## __VA_ARGS__); \ + } while (0) + +#define mpp_dbg_f(flag, fmt, ...) _mpp_dbg_f(mpp_debug, flag, fmt, ## __VA_ARGS__) + + +#define MPP_DBG_TIMING (0x00000001) +#define MPP_DBG_PTS (0x00000002) +#define MPP_DBG_INFO (0x00000004) +#define MPP_DBG_PLATFORM (0x00000010) + +#define MPP_DBG_DUMP_LOG (0x00000100) +#define MPP_DBG_DUMP_IN (0x00000200) +#define MPP_DBG_DUMP_OUT (0x00000400) +#define MPP_DBG_DUMP_CFG (0x00000800) + +#define mpp_dbg_pts(fmt, ...) mpp_dbg(MPP_DBG_PTS, fmt, ## __VA_ARGS__) +#define mpp_dbg_info(fmt, ...) mpp_dbg(MPP_DBG_INFO, fmt, ## __VA_ARGS__) +#define mpp_dbg_platform(fmt, ...) mpp_dbg(MPP_DBG_PLATFORM, fmt, ## __VA_ARGS__) + +#define MPP_ABORT (0x10000000) + +/* + * mpp_dbg usage: + * + * in h264d module define module debug flag variable like: h265d_debug + * then define h265d_dbg macro as follow : + * + * extern RK_U32 h265d_debug; + * + * #define H265D_DBG_FUNCTION (0x00000001) + * #define H265D_DBG_VPS (0x00000002) + * #define H265D_DBG_SPS (0x00000004) + * #define H265D_DBG_PPS (0x00000008) + * #define H265D_DBG_SLICE_HDR (0x00000010) + * + * #define h265d_dbg(flag, fmt, ...) mpp_dbg(h265d_debug, flag, fmt, ## __VA_ARGS__) + * + * finally use environment control the debug flag + * + * mpp_get_env_u32("h264d_debug", &h265d_debug, 0) + * + */ +/* + * sub-module debug flag usage example: + * +------+-------------------+ + * | 8bit | 24bit | + * +------+-------------------+ + * 0~15 bit: software debug print + * 16~23 bit: hardware debug print + * 24~31 bit: information print format + */ + +#define mpp_abort() do { \ + if (mpp_debug & MPP_ABORT) { \ + abort(); \ + } \ +} while (0) + +#define MPP_STRINGS(x) MPP_TO_STRING(x) +#define MPP_TO_STRING(x) #x + +#define mpp_assert(cond) do { \ + if (!(cond)) { \ + mpp_err("Assertion %s failed at %s:%d\n", \ + MPP_STRINGS(cond), __FUNCTION__, __LINE__); \ + mpp_abort(); \ + } \ +} while (0) + + +#ifdef __cplusplus +extern "C" { +#endif + +extern RK_U32 mpp_debug; + +void mpp_log_set_flag(RK_U32 flag); +RK_U32 mpp_log_get_flag(void); + +void _mpp_log(const char *tag, const char *fmt, const char *func, ...); +void _mpp_err(const char *tag, const char *fmt, const char *func, ...); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_LOG_H__ */ diff --git a/hardware/mpp/include/mpp_mem.h b/hardware/mpp/include/mpp_mem.h new file mode 100644 index 0000000000000000000000000000000000000000..a884899627763f4b24a193af9e5f92accc08112a --- /dev/null +++ b/hardware/mpp/include/mpp_mem.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_MEM_H__ +#define __MPP_MEM_H__ + +#include + +#include "rk_type.h" +#include "mpp_err.h" + +#define mpp_malloc_with_caller(type, count, caller) \ + (type*)mpp_osal_malloc(caller, sizeof(type) * (count)) + +#define mpp_malloc(type, count) \ + (type*)mpp_osal_malloc(__FUNCTION__, sizeof(type) * (count)) + +#define mpp_malloc_size(type, size) \ + (type*)mpp_osal_malloc(__FUNCTION__, size) + +#define mpp_calloc_size(type, size) \ + (type*)mpp_osal_calloc(__FUNCTION__, size) + +#define mpp_calloc(type, count) \ + (type*)mpp_osal_calloc(__FUNCTION__, sizeof(type) * (count)) + +#define mpp_realloc(ptr, type, count) \ + (type*)mpp_osal_realloc(__FUNCTION__, ptr, sizeof(type) * (count)) + +#define mpp_free(ptr) \ + mpp_osal_free(__FUNCTION__, ptr) + +#define MPP_FREE(ptr) do { if (ptr) mpp_free(ptr); ptr = NULL; } while (0) +#define MPP_FCLOSE(fp) do { if (fp) fclose(fp); fp = NULL; } while (0) + +#ifdef __cplusplus +extern "C" { +#endif + +void *mpp_osal_malloc(const char *caller, size_t size); +void *mpp_osal_calloc(const char *caller, size_t size); +void *mpp_osal_realloc(const char *caller, void *ptr, size_t size); +void mpp_osal_free(const char *caller, void *ptr); + +void mpp_show_mem_status(void); +RK_U32 mpp_mem_total_now(void); +RK_U32 mpp_mem_total_max(void); + +/* + * mpp memory usage snapshot tool + * + * usage: + * call mpp_mem_get_snapshot on context init get one snapshot + * call mpp_mem_get_snapshot on context deinit get another snapshot + * call mpp_mem_diff_snapshot to show the difference between these two snapshot + * call mpp_mem_put_snapshot twice to release these two snapshot + */ +typedef void* MppMemSnapshot; + +MPP_RET mpp_mem_get_snapshot(MppMemSnapshot *hnd); +MPP_RET mpp_mem_put_snapshot(MppMemSnapshot *hnd); +MPP_RET mpp_mem_squash_snapshot(MppMemSnapshot hnd0, MppMemSnapshot hnd1); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_MEM_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_mem_pool.h b/hardware/mpp/include/mpp_mem_pool.h new file mode 100644 index 0000000000000000000000000000000000000000..ea890a4df71eff2d08b3397c053182d55d510433 --- /dev/null +++ b/hardware/mpp/include/mpp_mem_pool.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_MEM_POOL_H__ +#define __MPP_MEM_POOL_H__ + +#include +#include "mpp_mem.h" +#include "mpp_common.h" + +typedef void* MppMemPool; + +#ifdef __cplusplus +extern "C" { +#endif + +MppMemPool mpp_mem_pool_init(size_t size); +void mpp_mem_pool_deinit(MppMemPool pool); + +void *mpp_mem_pool_get(MppMemPool pool); +void mpp_mem_pool_put(MppMemPool pool, void *p); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_MEM_POOL_H__ */ diff --git a/hardware/mpp/include/mpp_meta.h b/hardware/mpp/include/mpp_meta.h new file mode 100644 index 0000000000000000000000000000000000000000..7b1f9599aecf5692858420dd5fe3dd11e262047e --- /dev/null +++ b/hardware/mpp/include/mpp_meta.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_META_H__ +#define __MPP_META_H__ + +#include +#include "rk_type.h" + +#define FOURCC_META(a, b, c, d) ((RK_U32)(a) << 24 | \ + ((RK_U32)(b) << 16) | \ + ((RK_U32)(c) << 8) | \ + ((RK_U32)(d) << 0)) + +/* + * Mpp Metadata definition + * + * Metadata is for information transmision in mpp. + * Mpp task will contain two meta data: + * + * 1. Data flow metadata + * This metadata contains information of input / output data flow. For example + * A. decoder input side task the input packet must be defined and output frame + * may not be defined. Then decoder will try malloc or use committed buffer to + * complete decoding. + * B. decoder output side task + * + * + * 2. Flow control metadata + * + */ +typedef enum MppMetaDataType_e { + /* + * mpp meta data of data flow + * reference counter will be used for these meta data type + */ + TYPE_FRAME = FOURCC_META('m', 'f', 'r', 'm'), + TYPE_PACKET = FOURCC_META('m', 'p', 'k', 't'), + TYPE_BUFFER = FOURCC_META('m', 'b', 'u', 'f'), + + /* mpp meta data of normal data type */ + TYPE_S32 = FOURCC_META('s', '3', '2', ' '), + TYPE_S64 = FOURCC_META('s', '6', '4', ' '), + TYPE_PTR = FOURCC_META('p', 't', 'r', ' '), +} MppMetaType; + +typedef enum MppMetaKey_e { + /* data flow key */ + KEY_INPUT_FRAME = FOURCC_META('i', 'f', 'r', 'm'), + KEY_INPUT_PACKET = FOURCC_META('i', 'p', 'k', 't'), + KEY_OUTPUT_FRAME = FOURCC_META('o', 'f', 'r', 'm'), + KEY_OUTPUT_PACKET = FOURCC_META('o', 'p', 'k', 't'), + /* output motion information for motion detection */ + KEY_MOTION_INFO = FOURCC_META('m', 'v', 'i', 'f'), + KEY_HDR_INFO = FOURCC_META('h', 'd', 'r', ' '), + + /* flow control key */ + KEY_INPUT_BLOCK = FOURCC_META('i', 'b', 'l', 'k'), + KEY_OUTPUT_BLOCK = FOURCC_META('o', 'b', 'l', 'k'), + KEY_INPUT_IDR_REQ = FOURCC_META('i', 'i', 'd', 'r'), /* input idr frame request flag */ + KEY_OUTPUT_INTRA = FOURCC_META('o', 'i', 'd', 'r'), /* output intra frame indicator */ + + /* mpp_frame / mpp_packet meta data info key */ + KEY_TEMPORAL_ID = FOURCC_META('t', 'l', 'i', 'd'), + KEY_LONG_REF_IDX = FOURCC_META('l', 't', 'i', 'd'), + KEY_ENC_AVERAGE_QP = FOURCC_META('a', 'v', 'g', 'q'), + KEY_ROI_DATA = FOURCC_META('r', 'o', 'i', ' '), + KEY_OSD_DATA = FOURCC_META('o', 's', 'd', ' '), + KEY_OSD_DATA2 = FOURCC_META('o', 's', 'd', '2'), + KEY_USER_DATA = FOURCC_META('u', 's', 'r', 'd'), + KEY_USER_DATAS = FOURCC_META('u', 'r', 'd', 's'), + + /* input motion list for smart p rate control */ + KEY_MV_LIST = FOURCC_META('m', 'v', 'l', 't'), + + /* frame long-term reference frame operation */ + KEY_ENC_MARK_LTR = FOURCC_META('m', 'l', 't', 'r'), + KEY_ENC_USE_LTR = FOURCC_META('u', 'l', 't', 'r'), + + /* MLVEC specified encoder feature */ + KEY_ENC_FRAME_QP = FOURCC_META('f', 'r', 'm', 'q'), + KEY_ENC_BASE_LAYER_PID = FOURCC_META('b', 'p', 'i', 'd'), +} MppMetaKey; + +#define mpp_meta_get(meta) mpp_meta_get_with_tag(meta, MODULE_TAG, __FUNCTION__) + +#include "mpp_frame.h" + +#ifdef __cplusplus +extern "C" { +#endif + +MPP_RET mpp_meta_get_with_tag(MppMeta *meta, const char *tag, const char *caller); +MPP_RET mpp_meta_put(MppMeta meta); +RK_S32 mpp_meta_size(MppMeta meta); + +MPP_RET mpp_meta_set_s32(MppMeta meta, MppMetaKey key, RK_S32 val); +MPP_RET mpp_meta_set_s64(MppMeta meta, MppMetaKey key, RK_S64 val); +MPP_RET mpp_meta_set_ptr(MppMeta meta, MppMetaKey key, void *val); +MPP_RET mpp_meta_get_s32(MppMeta meta, MppMetaKey key, RK_S32 *val); +MPP_RET mpp_meta_get_s64(MppMeta meta, MppMetaKey key, RK_S64 *val); +MPP_RET mpp_meta_get_ptr(MppMeta meta, MppMetaKey key, void **val); + +MPP_RET mpp_meta_set_frame (MppMeta meta, MppMetaKey key, MppFrame frame); +MPP_RET mpp_meta_set_packet(MppMeta meta, MppMetaKey key, MppPacket packet); +MPP_RET mpp_meta_set_buffer(MppMeta meta, MppMetaKey key, MppBuffer buffer); +MPP_RET mpp_meta_get_frame (MppMeta meta, MppMetaKey key, MppFrame *frame); +MPP_RET mpp_meta_get_packet(MppMeta meta, MppMetaKey key, MppPacket *packet); +MPP_RET mpp_meta_get_buffer(MppMeta meta, MppMetaKey key, MppBuffer *buffer); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_META_H__ */ diff --git a/hardware/mpp/include/mpp_packet.h b/hardware/mpp/include/mpp_packet.h new file mode 100644 index 0000000000000000000000000000000000000000..72b27843fc9d37c237543aef67f6f1a4508b4be5 --- /dev/null +++ b/hardware/mpp/include/mpp_packet.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_PACKET_H__ +#define __MPP_PACKET_H__ + +#include "mpp_meta.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * MppPacket interface + * + * mpp_packet_init = mpp_packet_new + mpp_packet_set_data + mpp_packet_set_size + * mpp_packet_copy_init = mpp_packet_init + memcpy + */ +MPP_RET mpp_packet_new(MppPacket *packet); +MPP_RET mpp_packet_init(MppPacket *packet, void *data, size_t size); +MPP_RET mpp_packet_init_with_buffer(MppPacket *packet, MppBuffer buffer); +MPP_RET mpp_packet_copy_init(MppPacket *packet, const MppPacket src); +MPP_RET mpp_packet_deinit(MppPacket *packet); + +/* + * data : ( R/W ) start address of the whole packet memory + * size : ( R/W ) total size of the whole packet memory + * pos : ( R/W ) current access position of the whole packet memory, used for buffer read/write + * length : ( R/W ) the rest length from current position to end of buffer + * NOTE: normally length is updated only by set_pos, + * so set length must be used carefully for special usage + */ +void mpp_packet_set_data(MppPacket packet, void *data); +void mpp_packet_set_size(MppPacket packet, size_t size); +void mpp_packet_set_pos(MppPacket packet, void *pos); +void mpp_packet_set_length(MppPacket packet, size_t size); + +void* mpp_packet_get_data(const MppPacket packet); +void* mpp_packet_get_pos(const MppPacket packet); +size_t mpp_packet_get_size(const MppPacket packet); +size_t mpp_packet_get_length(const MppPacket packet); + + +void mpp_packet_set_pts(MppPacket packet, RK_S64 pts); +RK_S64 mpp_packet_get_pts(const MppPacket packet); +void mpp_packet_set_dts(MppPacket packet, RK_S64 dts); +RK_S64 mpp_packet_get_dts(const MppPacket packet); + +void mpp_packet_set_flag(MppPacket packet, RK_U32 flag); +RK_U32 mpp_packet_get_flag(const MppPacket packet); + +MPP_RET mpp_packet_set_eos(MppPacket packet); +MPP_RET mpp_packet_clr_eos(MppPacket packet); +RK_U32 mpp_packet_get_eos(MppPacket packet); +MPP_RET mpp_packet_set_extra_data(MppPacket packet); + +void mpp_packet_set_buffer(MppPacket packet, MppBuffer buffer); +MppBuffer mpp_packet_get_buffer(const MppPacket packet); + +/* + * data access interface + */ +MPP_RET mpp_packet_read(MppPacket packet, size_t offset, void *data, size_t size); +MPP_RET mpp_packet_write(MppPacket packet, size_t offset, void *data, size_t size); + +/* + * meta data access interface + */ +RK_S32 mpp_packet_has_meta(const MppPacket packet); +MppMeta mpp_packet_get_meta(const MppPacket packet); + +/* + * multi packet sequence interface for slice/split encoding/decoding + * partition - the packet is a part of a while image + * soi - Start Of Image + * eoi - End Of Image + */ +RK_U32 mpp_packet_is_partition(const MppPacket packet); +RK_U32 mpp_packet_is_soi(const MppPacket packet); +RK_U32 mpp_packet_is_eoi(const MppPacket packet); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_PACKET_H__ */ diff --git a/hardware/mpp/include/mpp_platform.h b/hardware/mpp/include/mpp_platform.h new file mode 100644 index 0000000000000000000000000000000000000000..bcf22c43be76bbd4e3a07e613cbb3e452941b683 --- /dev/null +++ b/hardware/mpp/include/mpp_platform.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_PLATFORM__ +#define __MPP_PLATFORM__ + +#include "rk_type.h" +#include "mpp_soc.h" + +/* + * Platform flag detection is for rockchip hardware platform detection + */ +typedef enum MppIoctlVersion_e { + IOCTL_VCODEC_SERVICE, + IOCTL_MPP_SERVICE_V1, + IOCTL_VERSION_BUTT, +} MppIoctlVersion; + +typedef enum MppKernelVersion_e { + KERNEL_UNKNOWN, + KERNEL_3_10, + KERNEL_4_4, + KERNEL_4_19, + KERNEL_VERSION_BUTT, +} MppKernelVersion; + +#ifdef __cplusplus +extern "C" { +#endif + +MppIoctlVersion mpp_get_ioctl_version(void); +MppKernelVersion mpp_get_kernel_version(void); +RK_U32 mpp_get_2d_hw_flag(void); +RK_U32 mpp_get_client_hw_id(RK_S32 client_type); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_PLATFORM__ */ diff --git a/hardware/mpp/include/mpp_queue.h b/hardware/mpp/include/mpp_queue.h new file mode 100755 index 0000000000000000000000000000000000000000..607842766eb552b670e75bf9903561876fa5a810 --- /dev/null +++ b/hardware/mpp/include/mpp_queue.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_QUEUE_H__ +#define __MPP_QUEUE_H__ + +#include "mpp_list.h" + +class MppQueue : public mpp_list { +public: + MppQueue(node_destructor func); + ~MppQueue(); + RK_S32 push(void *data, RK_S32 size); + RK_S32 pull(void *data, RK_S32 size); + RK_S32 flush(); +private: + sem_t mQueuePending; + int mFlushFlag; +}; + +#endif diff --git a/hardware/mpp/include/mpp_rc_api.h b/hardware/mpp/include/mpp_rc_api.h new file mode 100644 index 0000000000000000000000000000000000000000..397b57960e41c5e70294848e3de41676fd1a9e00 --- /dev/null +++ b/hardware/mpp/include/mpp_rc_api.h @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_RC_API_H__ +#define __MPP_RC_API_H__ + +#include "mpp_err.h" +#include "rk_venc_rc.h" +#include "mpp_rc_defs.h" + +/* + * Mpp rate control has three parts: + * + * 1. MPI user config module + * MppEncRcCfg structure is provided to user for overall rate control config + * Mpp will receive MppEncRcCfg from user, check parameter and set it to + * encoder. + * + * 2. Encoder rate control module + * Encoder will implement the rate control strategy required by users + * including CBR, VBR, AVBR and so on. + * This module only implement the target bit calculation behavior and + * quality restriction. And the quality level will be controlled by hal. + * + * 3. Hal rate control module + * Hal will implement the rate control on hardware. Hal will calculate the + * QP parameter for hardware according to the frame level target bit + * specified by the encoder. And the report the real bitrate and quality to + * encoder. + * + * The header defines the communication interfaces and structures used between + * MPI, encoder and hal. + */ + +typedef enum RcMode_e { + RC_VBR, + RC_CBR, + RC_FIXQP, + RC_AVBR, + RC_CVBR, + RC_QVBR, + RC_LEARNING, + RC_MODE_BUTT, +} RcMode; + +typedef enum GopMode_e { + NORMAL_P, + SMART_P, +} GopMode; + +/* + * frame rate parameters have great effect on rate control + * + * fps_in_flex + * 0 - fix input frame rate + * 1 - variable input frame rate + * + * fps_in_num + * input frame rate numerator, if 0 then default 30 + * + * fps_in_denorm + * input frame rate denorminator, if 0 then default 1 + * + * fps_out_flex + * 0 - fix output frame rate + * 1 - variable output frame rate + * + * fps_out_num + * output frame rate numerator, if 0 then default 30 + * + * fps_out_denorm + * output frame rate denorminator, if 0 then default 1 + */ +typedef struct RcFpsCfg_t { + RK_S32 fps_in_flex; + RK_S32 fps_in_num; + RK_S32 fps_in_denorm; + RK_S32 fps_out_flex; + RK_S32 fps_out_num; + RK_S32 fps_out_denorm; +} RcFpsCfg; + +typedef struct RcSuperframeCfg_t { + MppEncRcSuperFrameMode super_mode; + RK_U32 super_i_thd; + RK_U32 super_p_thd; + MppEncRcPriority rc_priority; +} RcSuperframeCfg; + +typedef struct RcDebreathCfg_t { + RK_U32 enable; + RK_U32 strength; +} RcDebreathCfg; + +typedef struct RcHierQPCfg_t { + RK_S32 hier_qp_en; + RK_S32 hier_qp_delta[4]; + RK_S32 hier_frame_num[4]; +} RcHierQPCfg; + +/* + * Control parameter from external config + * + * It will be updated on rc/prep/gopref config changed. + */ +typedef struct RcCfg_s { + /* encode image size */ + RK_S32 width; + RK_S32 height; + + /* Use rc_mode to find different api */ + RcMode mode; + + RcFpsCfg fps; + + GopMode gop_mode; + /* I frame gop len */ + RK_S32 igop; + /* visual gop len */ + RK_S32 vgop; + + /* bitrate parameter */ + RK_S32 bps_min; + RK_S32 bps_target; + RK_S32 bps_max; + RK_S32 stats_time; + + /* max I frame bit ratio to P frame bit */ + RK_S32 max_i_bit_prop; + RK_S32 min_i_bit_prop; + RK_S32 init_ip_ratio; + /* layer bitrate proportion */ + RK_S32 layer_bit_prop[4]; + + /* quality parameter */ + RK_S32 init_quality; + RK_S32 max_quality; + RK_S32 min_quality; + RK_S32 max_i_quality; + RK_S32 min_i_quality; + RK_S32 i_quality_delta; + RK_S32 vi_quality_delta; + /* layer quality proportion */ + RK_S32 layer_quality_delta[4]; + + /* reencode parameter */ + RK_S32 max_reencode_times; + + /* still / motion desision parameter */ + RK_S32 min_still_prop; + RK_S32 max_still_quality; + + /* + * vbr parameter + * + * vbr_hi_prop - high proportion bitrate for reduce quality + * vbr_lo_prop - low proportion bitrate for increase quality + */ + RK_S32 vbr_hi_prop; + RK_S32 vbr_lo_prop; + + MppEncRcDropFrmMode drop_mode; + RK_U32 drop_thd; + RK_U32 drop_gap; + + RcSuperframeCfg super_cfg; + RcDebreathCfg debreath_cfg; + RcHierQPCfg hier_qp_cfg; +} RcCfg; + +/* + * Different rate control strategy will be implemented by different API config + */ +typedef struct RcImplApi_t { + char *name; + MppCodingType type; + RK_U32 ctx_size; + + MPP_RET (*init)(void *ctx, RcCfg *cfg); + MPP_RET (*deinit)(void *ctx); + + MPP_RET (*check_drop)(void *ctx, EncRcTask *task); + MPP_RET (*check_reenc)(void *ctx, EncRcTask *task); + + /* + * frm_start - frame level rate control frm_start. + * The EncRcTaskInfo will be output to hal for hardware to implement. + * frm_end - frame level rate control frm_end. + * The EncRcTaskInfo is returned for real quality and bitrate. + */ + MPP_RET (*frm_start)(void *ctx, EncRcTask *task); + MPP_RET (*frm_end)(void *ctx, EncRcTask *task); + + /* + * hal_start - hardware level rate control start. + * The EncRcTaskInfo will be output to hal for hardware to implement. + * hal_end - hardware level rate control end. + * The EncRcTaskInfo is returned for real quality and bitrate. + */ + MPP_RET (*hal_start)(void *ctx, EncRcTask *task); + MPP_RET (*hal_end)(void *ctx, EncRcTask *task); +} RcImplApi; + +/* + * structures for RC API register and query + */ +typedef struct RcApiBrief_t { + const char *name; + MppCodingType type; +} RcApiBrief; + +typedef struct RcApiQueryAll_t { + /* input param for query */ + RcApiBrief *brief; + RK_S32 max_count; + + /* output query count */ + RK_S32 count; +} RcApiQueryAll; + +typedef struct RcApiQueryType_t { + /* input param for query */ + RcApiBrief *brief; + RK_S32 max_count; + MppCodingType type; + + /* output query count */ + RK_S32 count; +} RcApiQueryType; + +#ifdef __cplusplus +extern "C" { +#endif + +MPP_RET rc_api_add(const RcImplApi *api); +MPP_RET rc_brief_get_all(RcApiQueryAll *query); +MPP_RET rc_brief_get_by_type(RcApiQueryType *query); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_RC_API_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_rc_defs.h b/hardware/mpp/include/mpp_rc_defs.h new file mode 100644 index 0000000000000000000000000000000000000000..57ad2a8d62bfac01e6362bc7041990b2b5b5014c --- /dev/null +++ b/hardware/mpp/include/mpp_rc_defs.h @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_RC_DEFS_H__ +#define __MPP_RC_DEFS_H__ + +#include "rk_venc_ref.h" + +#define MAX_CPB_REFS (8) + +/* + * EncFrmStatus controls record the encoding frame status and also control + * work flow of encoder. It is the communicat channel between encoder implement + * module, rate control module and hardware module. + * + * bit 0 ~ 31 frame status + * 0 ~ 15 current frame status + * 16 ~ 31 reference frame status + * bit 32 ~ 63 encoding flow control + */ +typedef union EncFrmStatus_u { + struct { + /* + * bit 0 ~ 31 frame status + */ + /* status flag */ + RK_U32 valid : 1; + /* + * 0 - write the reconstructed frame pixel to memory + * 1 - do not write the reconstructed frame pixel to memory + */ + RK_U32 non_recn : 1; + RK_U32 reserved0 : 2; + + /* reference status flag */ + /* + * 0 - inter frame + * 1 - intra frame + */ + RK_U32 is_intra : 1; + + /* + * Valid when is_intra is true + * 0 - normal intra frame + * 1 - IDR frame + */ + RK_U32 is_idr : 1; + + /* + * 0 - mark as reference frame + * 1 - mark as non-refernce frame + */ + RK_U32 is_non_ref : 1; + + /* + * Valid when is_non_ref is false + * 0 - mark as short-term reference frame + * 1 - mark as long-term refernce frame + */ + RK_U32 is_lt_ref : 1; + + /* bit 8 - 15 */ + RK_U32 lt_idx : 4; + RK_U32 temporal_id : 4; + + /* distance between current frame and reference frame */ + MppEncRefMode ref_mode : 6; + RK_S32 ref_arg : 8; + RK_S32 ref_dist : 2; + + /* + * bit 32 ~ 63 encoder flow control flags + */ + /* + * 0 - normal frame encoding + * 1 - current frame will be dropped + */ + RK_U32 drop : 1; + + /* + * 0 - rate control module does not change frame type parameter + * 1 - rate control module changes frame type parameter reencode is needed + * to reprocess the dpb process. Also this means dpb module will follow + * the frame status parameter provided by rate control module. + */ + RK_U32 re_dpb_proc : 1; + + /* + * 0 - current frame encoding is in normal flow + * 1 - current frame encoding is in reencode flow + */ + RK_U32 reencode : 1; + + /* + * When true current frame size is super large then the frame should be reencoded. + */ + RK_U32 super_frame : 1; + + /* + * When true currnet frame is force to encoded as software skip frame + */ + RK_U32 force_pskip : 1; + RK_U32 reserved1 : 3; + + /* reencode times */ + RK_U32 reencode_times : 8; + + /* sequential index for each frame */ + RK_U32 seq_idx : 16; + }; + RK_U64 val; +} EncFrmStatus; + +typedef struct EncCpbStatus_t { + RK_S32 seq_idx; + + EncFrmStatus curr; + EncFrmStatus refr; + + /* initial cpb status for current frame encoding */ + EncFrmStatus init[MAX_CPB_REFS]; + /* final cpb status after current frame encoding */ + EncFrmStatus final[MAX_CPB_REFS]; +} EncCpbStatus; + +#define ENC_RC_FORCE_QP (0x00000001) + +typedef struct EncRcForceCfg_t { + RK_U32 force_flag; + RK_S32 force_qp; + RK_U32 reserve[6]; +} EncRcForceCfg; + +/* + * communication channel between rc / hal / hardware + * + * rc -> hal bit_target / bit_max / bit_min + * hal -> hw quality_target / quality_max / quality_min + * hw -> rc / hal bit_real / quality_real / madi / madp + */ +typedef struct EncRcCommonInfo_t { + /* rc to hal */ + RK_S32 bit_target; + RK_S32 bit_max; + RK_S32 bit_min; + + RK_S32 quality_target; + RK_S32 quality_max; + RK_S32 quality_min; + + /* rc from hardware */ + RK_S32 bit_real; + RK_S32 quality_real; + RK_S32 madi; + RK_S32 madp; + + RK_U32 iblk4_prop; // scale 256 + RK_S32 reserve[15]; +} EncRcTaskInfo; + +typedef struct EncRcTask_s { + EncCpbStatus cpb; + EncFrmStatus frm; + EncRcTaskInfo info; + EncRcForceCfg force; + MppFrame frame; +} EncRcTask; + +#endif /* __MPP_RC_DEFS_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_runtime.h b/hardware/mpp/include/mpp_runtime.h new file mode 100644 index 0000000000000000000000000000000000000000..ef8a337cd09d700be2e22cb3579f0f5a2f9cb807 --- /dev/null +++ b/hardware/mpp/include/mpp_runtime.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_RUNTIME__ +#define __MPP_RUNTIME__ + +#include "mpp_buffer.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Runtime function detection is to support different binary on different + * runtime environment. This is usefull on product environemnt. + */ +RK_U32 mpp_rt_allcator_is_valid(MppBufferType type); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_RUNTIME__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_server.h b/hardware/mpp/include/mpp_server.h new file mode 100644 index 0000000000000000000000000000000000000000..049b8871dcb66127dc15612fb47bb7e02fc2cfbe --- /dev/null +++ b/hardware/mpp/include/mpp_server.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_SERVER_H__ +#define __MPP_SERVER_H__ + +#include "mpp_device.h" + +#ifdef __cplusplus +extern "C" { +#endif + +MPP_RET mpp_server_attach(MppDev ctx); +MPP_RET mpp_server_detach(MppDev ctx); + +MPP_RET mpp_server_send_task(MppDev ctx); +MPP_RET mpp_server_wait_task(MppDev ctx, RK_S64 timeout); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_SERVER_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_service.h b/hardware/mpp/include/mpp_service.h new file mode 100644 index 0000000000000000000000000000000000000000..89bc40f82d7acd456dfd4720ce8d03fcfd02fd70 --- /dev/null +++ b/hardware/mpp/include/mpp_service.h @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_SERVICE_H__ +#define __MPP_SERVICE_H__ + +#include +#include "rk_type.h" + +/* Use 'v' as magic number */ +#define MPP_IOC_MAGIC 'v' +#define MPP_IOC_CFG_V1 _IOW(MPP_IOC_MAGIC, 1, unsigned int) +#define MAX_REQ_NUM 16 + +#if __SIZEOF_POINTER__ == 4 +#define REQ_DATA_PTR(ptr) ((RK_U32)(ptr)) +#elif __SIZEOF_POINTER__ == 8 +#define REQ_DATA_PTR(ptr) ((RK_U64)(ptr)) +#endif + +/* define flags for mpp_request */ +#define MPP_FLAGS_MULTI_MSG (0x00000001) +#define MPP_FLAGS_LAST_MSG (0x00000002) +#define MPP_FLAGS_REG_FD_NO_TRANS (0x00000004) +#define MPP_FLAGS_SCL_FD_NO_TRANS (0x00000008) +#define MPP_FLAGS_REG_OFFSET_ALONE (0x00000010) +#define MPP_FLAGS_POLL_NON_BLOCK (0x00000020) +#define MPP_FLAGS_SECURE_MODE (0x00010000) + +/* mpp service capability description */ +typedef enum MppDevCmd_e { + MPP_DEV_GET_START = 0, + MPP_DEV_GET_MAX_WIDTH, + MPP_DEV_GET_MAX_HEIGHT, + MPP_DEV_GET_MIN_WIDTH, + MPP_DEV_GET_MIN_HEIGHT, + MPP_DEV_GET_MMU_STATUS, + + MPP_DEV_SET_START = 0x01000000, + MPP_DEV_SET_HARD_PLATFORM, // set paltform by user + MPP_DEV_ENABLE_POSTPROCCESS, + + MPP_DEV_PROP_BUTT, +} MppDevCmd; + +typedef enum MppServiceCmdType_e { + MPP_CMD_QUERY_BASE = 0, + MPP_CMD_PROBE_HW_SUPPORT = MPP_CMD_QUERY_BASE + 0, + MPP_CMD_QUERY_HW_ID = MPP_CMD_QUERY_BASE + 1, + MPP_CMD_QUERY_CMD_SUPPORT = MPP_CMD_QUERY_BASE + 2, + MPP_CMD_QUERY_BUTT, + + MPP_CMD_INIT_BASE = 0x100, + MPP_CMD_INIT_CLIENT_TYPE = MPP_CMD_INIT_BASE + 0, + MPP_CMD_INIT_DRIVER_DATA = MPP_CMD_INIT_BASE + 1, + MPP_CMD_INIT_TRANS_TABLE = MPP_CMD_INIT_BASE + 2, + MPP_CMD_INIT_BUTT, + + MPP_CMD_SEND_BASE = 0x200, + MPP_CMD_SET_REG_WRITE = MPP_CMD_SEND_BASE + 0, + MPP_CMD_SET_REG_READ = MPP_CMD_SEND_BASE + 1, + MPP_CMD_SET_REG_ADDR_OFFSET = MPP_CMD_SEND_BASE + 2, + MPP_CMD_SET_RCB_INFO = MPP_CMD_SEND_BASE + 3, + /* for batch process start a task of one session */ + MPP_CMD_SET_SESSION_FD = MPP_CMD_SEND_BASE + 4, + MPP_CMD_SEND_BUTT, + + MPP_CMD_POLL_BASE = 0x300, + MPP_CMD_POLL_HW_FINISH = MPP_CMD_POLL_BASE + 0, + MPP_CMD_POLL_BUTT, + + MPP_CMD_CONTROL_BASE = 0x400, + MPP_CMD_RESET_SESSION = MPP_CMD_CONTROL_BASE + 0, + MPP_CMD_TRANS_FD_TO_IOVA = MPP_CMD_CONTROL_BASE + 1, + MPP_CMD_RELEASE_FD = MPP_CMD_CONTROL_BASE + 2, + MPP_CMD_SEND_CODEC_INFO = MPP_CMD_CONTROL_BASE + 3, + MPP_CMD_BAT_CMD = MPP_CMD_CONTROL_BASE + 4, + MPP_CMD_CONTROL_BUTT, + + MPP_CMD_BUTT, +} MppServiceCmdType; + +typedef struct mppReqV1_t { + RK_U32 cmd; + RK_U32 flag; + RK_U32 size; + RK_U32 offset; + RK_U64 data_ptr; +} MppReqV1; + +typedef struct MppServiceCmdCap_t { + RK_U32 support_cmd; + RK_U32 query_cmd; + RK_U32 init_cmd; + RK_U32 send_cmd; + RK_U32 poll_cmd; + RK_U32 ctrl_cmd; +} MppServiceCmdCap; + +#ifdef __cplusplus +extern "C" { +#endif + +void check_mpp_service_cap(RK_U32 *codec_type, RK_U32 *hw_ids, MppServiceCmdCap *cap); +const MppServiceCmdCap *mpp_get_mpp_service_cmd_cap(void); +const char *mpp_get_mpp_service_name(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_SERVICE_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_service_api.h b/hardware/mpp/include/mpp_service_api.h new file mode 100644 index 0000000000000000000000000000000000000000..6b861b0a8aa795a44cbd5c974aaa5f2e89e39672 --- /dev/null +++ b/hardware/mpp/include/mpp_service_api.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_SERVICE_API_H__ +#define __MPP_SERVICE_API_H__ + +#include "mpp_device.h" + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_SERVICE_API_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_soc.h b/hardware/mpp/include/mpp_soc.h new file mode 100644 index 0000000000000000000000000000000000000000..14d7f2c222c23a4dea98796242f4fb8517843067 --- /dev/null +++ b/hardware/mpp/include/mpp_soc.h @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_SOC_H__ +#define __MPP_SOC_H__ + +#include "mpp_dev_defs.h" + +/* Do NOT use this outside MPP it may be changed in new version */ +typedef enum RockchipSocType_e { + ROCKCHIP_SOC_AUTO, + ROCKCHIP_SOC_RK3036, + ROCKCHIP_SOC_RK3066, + ROCKCHIP_SOC_RK3188, + ROCKCHIP_SOC_RK3288, + ROCKCHIP_SOC_RK312X, + ROCKCHIP_SOC_RK3368, + ROCKCHIP_SOC_RK3399, + ROCKCHIP_SOC_RK3228H, + ROCKCHIP_SOC_RK3328, + ROCKCHIP_SOC_RK3228, + ROCKCHIP_SOC_RK3229, + ROCKCHIP_SOC_RV1108, + ROCKCHIP_SOC_RV1109, + ROCKCHIP_SOC_RV1126, + ROCKCHIP_SOC_RK3326, + ROCKCHIP_SOC_RK3128H, + ROCKCHIP_SOC_PX30, + ROCKCHIP_SOC_RK1808, + ROCKCHIP_SOC_RK3566, + ROCKCHIP_SOC_RK3568, + ROCKCHIP_SOC_BUTT, +} RockchipSocType; + +typedef struct MppDecHwCap_t { + RK_U32 cap_coding; + + MppClientType type : 8; + + RK_U32 cap_fbc : 4; + RK_U32 cap_4k : 1; + RK_U32 cap_8k : 1; + RK_U32 cap_colmv_buf : 1; + RK_U32 cap_hw_h265_rps : 1; + RK_U32 cap_hw_vp9_prob : 1; + RK_U32 cap_jpg_pp_out : 1; + RK_U32 cap_10bit : 1; + RK_U32 reserved : 13; +} MppDecHwCap; + +typedef struct MppEncHwCap_t { + RK_U32 cap_coding; + + MppClientType type : 8; + + RK_U32 cap_fbc : 4; + RK_U32 cap_4k : 1; + RK_U32 cap_8k : 1; + RK_U32 cap_hw_osd : 1; + RK_U32 cap_hw_roi : 1; + RK_U32 reserved : 16; +} MppEncHwCap; + +typedef struct { + const char *compatible; + const RockchipSocType soc_type; + const RK_U32 vcodec_type; + + /* Max 4 decoder cap */ + const MppDecHwCap *dec_caps[4]; + /* Max 4 encoder cap */ + const MppEncHwCap *enc_caps[4]; +} MppSocInfo; + +#ifdef __cplusplus +extern "C" { +#endif + +const char *mpp_get_soc_name(void); +RockchipSocType mpp_get_soc_type(void); +RK_U32 mpp_get_vcodec_type(void); + +const MppSocInfo *mpp_get_soc_info(void); +RK_U32 mpp_check_soc_cap(MppCtxType type, MppCodingType coding); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_SOC_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_task.h b/hardware/mpp/include/mpp_task.h new file mode 100644 index 0000000000000000000000000000000000000000..48de2d0866776d580530e076841de2ddd1d90b5d --- /dev/null +++ b/hardware/mpp/include/mpp_task.h @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_TASK_H__ +#define __MPP_TASK_H__ + +#include "mpp_meta.h" + +/* + * Advanced task flow + * Advanced task flow introduces three concepts: port, task and item + * + * Port is from OpenMAX + * Port has two type: input port and output port which are all for data transaction. + * Port work like a queue. task will be dequeue from or enqueue to one port. + * On input side user will dequeue task from input port, setup task and enqueue task + * back to input port. + * On output side user will dequeue task from output port, get the information from + * and then enqueue task back to output port. + * + * Task indicates one transaction on the port. + * Task has two working mode: async mode and sync mode + * If mpp is work in sync mode on task enqueue function return the task has been done + * If mpp is work in async mode on task enqueue function return the task is just put + * on the task queue for process. + * Task can carry different items. Task just like a container of items + * + * Item indicates MppPacket or MppFrame which is contained in one task + */ + +/* + * One mpp task queue has two ports: input and output + * + * The whole picture is: + * Top layer mpp has two ports: mpp_input_port and mpp_output_port + * But internally these two ports belongs to two task queue. + * The mpp_input_port is the mpp_input_task_queue's input port. + * The mpp_output_port is the mpp_output_task_queue's output port. + * + * Each port uses its task queue to communication + */ +typedef enum { + MPP_PORT_INPUT, + MPP_PORT_OUTPUT, + MPP_PORT_BUTT, +} MppPortType; + +/* + * Advance task work flow mode: + ****************************************************************************** + * 1. async mode (default_val) + * + * mpp_init(type, coding, MPP_WORK_ASYNC) + * + * input thread + * a - poll(input) + * b - dequeue(input, *task) + * c - task_set_item(packet/frame) + * d - enqueue(input, task) // when enqueue return the task is not done yet + * + * output thread + * a - poll(output) + * b - dequeue(output, *task) + * c - task_get_item(frame/packet) + * d - enqueue(output, task) + ****************************************************************************** + * 2. sync mode + * + * mpp_init(type, coding, MPP_WORK_SYNC) + * + * a - poll(input) + * b - dequeue(input, *task) + * c - task_set_item(packet/frame) + * d - enqueue(task) // when enqueue return the task is finished + ****************************************************************************** + */ +typedef enum { + MPP_TASK_ASYNC, + MPP_TASK_SYNC, + MPP_TASK_WORK_MODE_BUTT, +} MppTaskWorkMode; + +/* + * Mpp port poll type + * + * MPP_POLL_BLOCK - for block poll + * MPP_POLL_NON_BLOCK - for non-block poll + * small than MPP_POLL_MAX - for poll with timeout in ms + * small than MPP_POLL_BUTT or larger than MPP_POLL_MAX is invalid value + */ +typedef enum { + MPP_POLL_BUTT = -2, + MPP_POLL_BLOCK = -1, + MPP_POLL_NON_BLOCK = 0, + MPP_POLL_MAX = 8000, +} MppPollType; + +/* + * Mpp timeout define + * MPP_TIMEOUT_BLOCK - for block poll + * MPP_TIMEOUT_NON_BLOCK - for non-block poll + * small than MPP_TIMEOUT_MAX - for poll with timeout in ms + * small than MPP_TIMEOUT_BUTT or larger than MPP_TIMEOUT_MAX is invalid value + */ +#define MPP_TIMEOUT_BUTT (-2L) +#define MPP_TIMEOUT_BLOCK (-1L) +#define MPP_TIMEOUT_NON_BLOCK (0L) +#define MPP_TIMEOUT_MAX (8000L) + +/* + * MppTask is descriptor of a task which send to mpp for process + * mpp can support different type of work mode, for example: + * + * decoder: + * + * 1. typical decoder mode: + * input - MppPacket (normal cpu buffer, need cpu copy) + * output - MppFrame (ion/drm buffer in external/internal mode) + * 2. secure decoder mode: + * input - MppPacket (externel ion/drm buffer, cpu can not access) + * output - MppFrame (ion/drm buffer in external/internal mode, cpu can not access) + * + * interface usage: + * + * typical flow + * input side: + * task_dequeue(ctx, PORT_INPUT, &task); + * task_put_item(task, MODE_INPUT, packet) + * task_enqueue(ctx, PORT_INPUT, task); + * output side: + * task_dequeue(ctx, PORT_OUTPUT, &task); + * task_get_item(task, MODE_OUTPUT, &frame) + * task_enqueue(ctx, PORT_OUTPUT, task); + * + * secure flow + * input side: + * task_dequeue(ctx, PORT_INPUT, &task); + * task_put_item(task, MODE_INPUT, packet) + * task_put_item(task, MODE_OUTPUT, frame) // buffer will be specified here + * task_enqueue(ctx, PORT_INPUT, task); + * output side: + * task_dequeue(ctx, PORT_OUTPUT, &task); + * task_get_item(task, MODE_OUTPUT, &frame) + * task_enqueue(ctx, PORT_OUTPUT, task); + * + * encoder: + * + * 1. typical encoder mode: + * input - MppFrame (ion/drm buffer in external mode) + * output - MppPacket (normal cpu buffer, need cpu copy) + * 2. user input encoder mode: + * input - MppFrame (normal cpu buffer, need to build hardware table for this buffer) + * output - MppPacket (normal cpu buffer, need cpu copy) + * 3. secure encoder mode: + * input - MppFrame (ion/drm buffer in external mode, cpu can not access) + * output - MppPacket (externel ion/drm buffer, cpu can not access) + * + * typical / user input flow + * input side: + * task_dequeue(ctx, PORT_INPUT, &task); + * task_put_item(task, MODE_INPUT, frame) + * task_enqueue(ctx, PORT_INPUT, task); + * output side: + * task_dequeue(ctx, PORT_OUTPUT, &task); + * task_get_item(task, MODE_OUTPUT, &packet) + * task_enqueue(ctx, PORT_OUTPUT, task); + * + * secure flow + * input side: + * task_dequeue(ctx, PORT_INPUT, &task); + * task_put_item(task, MODE_OUTPUT, packet) // buffer will be specified here + * task_put_item(task, MODE_INPUT, frame) + * task_enqueue(ctx, PORT_INPUT, task); + * output side: + * task_dequeue(ctx, PORT_OUTPUT, &task); + * task_get_item(task, MODE_OUTPUT, &packet) + * task_get_item(task, MODE_OUTPUT, &frame) + * task_enqueue(ctx, PORT_OUTPUT, task); + * + * NOTE: this flow can specify the output frame. User will setup both intput frame and output packet + * buffer at the input side. Then at output side when user gets a finished task user can get the output + * packet and corresponding released input frame. + * + * image processing + * + * 1. typical image process mode: + * input - MppFrame (ion/drm buffer in external mode) + * output - MppFrame (ion/drm buffer in external mode) + * + * typical / user input flow + * input side: + * task_dequeue(ctx, PORT_INPUT, &task); + * task_put_item(task, MODE_INPUT, frame) + * task_enqueue(ctx, PORT_INPUT, task); + * output side: + * task_dequeue(ctx, PORT_OUTPUT, &task); + * task_get_item(task, MODE_OUTPUT, &frame) + * task_enqueue(ctx, PORT_OUTPUT, task); + */ +/* NOTE: use index rather then handle to descripbe task */ + +#ifdef __cplusplus +extern "C" { +#endif + +MPP_RET mpp_task_meta_set_s32(MppTask task, MppMetaKey key, RK_S32 val); +MPP_RET mpp_task_meta_set_s64(MppTask task, MppMetaKey key, RK_S64 val); +MPP_RET mpp_task_meta_set_ptr(MppTask task, MppMetaKey key, void *val); +MPP_RET mpp_task_meta_set_frame (MppTask task, MppMetaKey key, MppFrame frame); +MPP_RET mpp_task_meta_set_packet(MppTask task, MppMetaKey key, MppPacket packet); +MPP_RET mpp_task_meta_set_buffer(MppTask task, MppMetaKey key, MppBuffer buffer); + +MPP_RET mpp_task_meta_get_s32(MppTask task, MppMetaKey key, RK_S32 *val, RK_S32 default_val); +MPP_RET mpp_task_meta_get_s64(MppTask task, MppMetaKey key, RK_S64 *val, RK_S64 default_val); +MPP_RET mpp_task_meta_get_ptr(MppTask task, MppMetaKey key, void **val, void *default_val); +MPP_RET mpp_task_meta_get_frame (MppTask task, MppMetaKey key, MppFrame *frame); +MPP_RET mpp_task_meta_get_packet(MppTask task, MppMetaKey key, MppPacket *packet); +MPP_RET mpp_task_meta_get_buffer(MppTask task, MppMetaKey key, MppBuffer *buffer); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_QUEUE_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/mpp_thread.h b/hardware/mpp/include/mpp_thread.h new file mode 100644 index 0000000000000000000000000000000000000000..521b4b59a0df72295fb11ec45dede927ca824974 --- /dev/null +++ b/hardware/mpp/include/mpp_thread.h @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_THREAD_H__ +#define __MPP_THREAD_H__ + +#if defined(_WIN32) && !defined(__MINGW32CE__) + +/* + * NOTE: POSIX Threads for Win32 + * Downloaded from http://www.sourceware.org/pthreads-win32/ + */ +#include "semaphore.h" +#include "pthread.h" +#pragma comment(lib, "pthreadVC2.lib") + +/* + * add pthread_setname_np for windows + */ +int pthread_setname_np(pthread_t thread, const char *name); + +#else + +#include +#include +#include +#include + +#ifndef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP +#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER +#endif + +#endif + +#define THREAD_NAME_LEN 16 + +typedef void *(*MppThreadFunc)(void *); + +typedef enum { + MPP_THREAD_UNINITED, + MPP_THREAD_RUNNING, + MPP_THREAD_WAITING, + MPP_THREAD_STOPPING, +} MppThreadStatus; + +#ifdef __cplusplus + +#include "mpp_log.h" + +class Mutex; +class Condition; + +/* + * for shorter type name and function name + */ +class Mutex { +public: + Mutex(); + ~Mutex(); + + void lock(); + void unlock(); + int trylock(); + + class Autolock { + public: + inline Autolock(Mutex* mutex, RK_U32 enable = 1) + : mEnabled(enable), mLock(*mutex) + { + if (mEnabled) + mLock.lock(); + } + inline ~Autolock() + { + if (mEnabled) + mLock.unlock(); + } + private: + RK_S32 mEnabled; + Mutex& mLock; + }; + +private: + friend class Condition; + + pthread_mutex_t mMutex; + + Mutex(const Mutex &); + Mutex &operator = (const Mutex&); +}; + +inline Mutex::Mutex() +{ + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&mMutex, &attr); + pthread_mutexattr_destroy(&attr); +} +inline Mutex::~Mutex() +{ + pthread_mutex_destroy(&mMutex); +} +inline void Mutex::lock() +{ + pthread_mutex_lock(&mMutex); +} +inline void Mutex::unlock() +{ + pthread_mutex_unlock(&mMutex); +} +inline int Mutex::trylock() +{ + return pthread_mutex_trylock(&mMutex); +} + +typedef Mutex::Autolock AutoMutex; + + +/* + * for shorter type name and function name + */ +class Condition { +public: + Condition(); + Condition(int type); + ~Condition(); + RK_S32 wait(Mutex& mutex); + RK_S32 wait(Mutex* mutex); + RK_S32 timedwait(Mutex& mutex, RK_S64 timeout); + RK_S32 timedwait(Mutex* mutex, RK_S64 timeout); + RK_S32 signal(); + RK_S32 broadcast(); + +private: + pthread_cond_t mCond; +}; + +inline Condition::Condition() +{ + pthread_cond_init(&mCond, NULL); +} +inline Condition::~Condition() +{ + pthread_cond_destroy(&mCond); +} +inline RK_S32 Condition::wait(Mutex& mutex) +{ + return pthread_cond_wait(&mCond, &mutex.mMutex); +} +inline RK_S32 Condition::wait(Mutex* mutex) +{ + return pthread_cond_wait(&mCond, &mutex->mMutex); +} +inline RK_S32 Condition::timedwait(Mutex& mutex, RK_S64 timeout) +{ + return timedwait(&mutex, timeout); +} +inline RK_S32 Condition::timedwait(Mutex* mutex, RK_S64 timeout) +{ + struct timespec ts; + + clock_gettime(CLOCK_REALTIME_COARSE, &ts); + + ts.tv_sec += timeout / 1000; // 1000:Get milliseconds + ts.tv_nsec += (timeout % 1000) * 1000000; // 1000:Get milliseconds // 1000000:Get seconds + /* Prevent the out of range at nanoseconds field */ + ts.tv_sec += ts.tv_nsec / 1000000000; // 1000000000:Get seconds + ts.tv_nsec %= 1000000000; // 1000000000:Get Get nanoseconds + + return pthread_cond_timedwait(&mCond, &mutex->mMutex, &ts); +} +inline RK_S32 Condition::signal() +{ + return pthread_cond_signal(&mCond); +} +inline RK_S32 Condition::broadcast() +{ + return pthread_cond_broadcast(&mCond); +} + +class MppMutexCond { +public: + MppMutexCond() {}; + ~MppMutexCond() {}; + + void lock() + { + mLock.lock(); + } + void unlock() + { + mLock.unlock(); + } + void trylock() + { + mLock.trylock(); + } + void wait() + { + mCondition.wait(mLock); + } + RK_S32 wait(RK_S64 timeout) + { + return mCondition.timedwait(mLock, timeout); + } + void signal() + { + mCondition.signal(); + } + void broadcast() + { + mCondition.broadcast(); + } + Mutex *mutex() + { + return &mLock; + } + +private: + Mutex mLock; + Condition mCondition; +}; + +// Thread lock / signal is distinguished by its source +typedef enum MppThreadSignal_e { + THREAD_WORK, // for working loop + THREAD_INPUT, // for thread input + THREAD_OUTPUT, // for thread output + THREAD_CONTROL, // for thread async control (reset) + THREAD_SIGNAL_BUTT, +} MppThreadSignal; + +#define THREAD_NORMAL 0 +#define THRE 0 + +class MppThread { +public: + MppThread(MppThreadFunc func, void *ctx, const char *name = NULL); + ~MppThread() {}; + + MppThreadStatus get_status(MppThreadSignal id = THREAD_WORK); + void set_status(MppThreadStatus status, MppThreadSignal id = THREAD_WORK); + void dump_status(); + + void start(); + void stop(); + + void lock(MppThreadSignal id = THREAD_WORK) + { + mpp_assert(id < THREAD_SIGNAL_BUTT); + mMutexCond[id].lock(); + } + + void unlock(MppThreadSignal id = THREAD_WORK) + { + mpp_assert(id < THREAD_SIGNAL_BUTT); + mMutexCond[id].unlock(); + } + + void wait(MppThreadSignal id = THREAD_WORK) + { + mpp_assert(id < THREAD_SIGNAL_BUTT); + MppThreadStatus status = mStatus[id]; + + mStatus[id] = MPP_THREAD_WAITING; + mMutexCond[id].wait(); + + // check the status is not changed then restore status + if (mStatus[id] == MPP_THREAD_WAITING) + mStatus[id] = status; + } + + void signal(MppThreadSignal id = THREAD_WORK) + { + mpp_assert(id < THREAD_SIGNAL_BUTT); + mMutexCond[id].signal(); + } + + Mutex *mutex(MppThreadSignal id = THREAD_WORK) + { + mpp_assert(id < THREAD_SIGNAL_BUTT); + return mMutexCond[id].mutex(); + } + +private: + pthread_t mThread; + MppMutexCond mMutexCond[THREAD_SIGNAL_BUTT]; + MppThreadStatus mStatus[THREAD_SIGNAL_BUTT]; + + MppThreadFunc mFunction; + char mName[THREAD_NAME_LEN]; + void *mContext; + + MppThread(); + MppThread(const MppThread &); + MppThread &operator=(const MppThread &); +}; + +#endif + +#endif /* __MPP_THREAD_H__ */ diff --git a/hardware/mpp/include/mpp_time.h b/hardware/mpp/include/mpp_time.h new file mode 100644 index 0000000000000000000000000000000000000000..0ef1c07cddbbab49916923d06fe9879992691b93 --- /dev/null +++ b/hardware/mpp/include/mpp_time.h @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_TIME_H__ +#define __MPP_TIME_H__ + +#include "rk_type.h" +#include "mpp_thread.h" + +#if defined(_WIN32) && !defined(__MINGW32CE__) +#include +#define msleep Sleep +#define sleep(x) Sleep((x)*1000) +#else +#include +#define msleep(x) usleep((x)*1000) +#endif + +typedef void* MppClock; +typedef void* MppTimer; +typedef void* MppStopwatch; + +#ifdef __cplusplus +extern "C" { +#endif + +RK_S64 mpp_time(void); +void mpp_time_diff(RK_S64 start, RK_S64 end, RK_S64 limit, const char *fmt); + +/* + * Clock create / destroy / enable / disable function + * Note when clock is create it is default disabled user need to call enable + * fucntion with enable = 1 to enable the clock. + * User can use enable function with enable = 0 to disable the clock. + */ +MppClock mpp_clock_get(const char *name); +void mpp_clock_put(MppClock clock); +void mpp_clock_enable(MppClock clock, RK_U32 enable); + +/* + * Clock basic operation function + * start : let clock start timing counter + * pause : let clock pause and return the diff to start time + * reset : let clock counter to all zero + */ +RK_S64 mpp_clock_start(MppClock clock); +RK_S64 mpp_clock_pause(MppClock clock); +RK_S64 mpp_clock_reset(MppClock clock); + +/* + * These clock helper function can only be call when clock is paused: + * mpp_clock_get_sum - Return clock sum up total value + * mpp_clock_get_count - Return clock sum up counter value + * mpp_clock_get_name - Return clock name + */ +RK_S64 mpp_clock_get_sum(MppClock clock); +RK_S64 mpp_clock_get_count(MppClock clock); +const char *mpp_clock_get_name(MppClock clock); + +/* + * MppTimer is for timer with callback function + * It will provide the ability to repeat doing something until it is + * disalble or put. + * + * Timer work flow + * + * 1. mpp_timer_get + * 2. mpp_timer_set_callback + * 3. mpp_timer_set_timing(initial, interval) + * 4. mpp_timer_set_enable(initial, 1) + * ... running ... + * 5. mpp_timer_set_enable(initial, 0) + * 6. mpp_timer_put + */ +MppTimer mpp_timer_get(const char *name); +void mpp_timer_set_callback(MppTimer timer, MppThreadFunc func, void *ctx); +void mpp_timer_set_timing(MppTimer timer, RK_S32 initial, RK_S32 interval); +void mpp_timer_set_enable(MppTimer timer, RK_S32 enable); +void mpp_timer_put(MppTimer timer); + +/* + * MppStopwatch is for timer to record event and time + * + * Stopwatch work flow + * + * 1. mpp_stopwatch_get + * 2. mpp_stopwatch_setup(max_count, show_on_exit) + * 3. mpp_stopwatch_record(event) + * ... running ... + * 4. mpp_stopwatch_record(event) + * 5. mpp_stopwatch_put (show events and time) + */ +MppStopwatch mpp_stopwatch_get(const char *name); +void mpp_stopwatch_set_show_on_exit(MppStopwatch stopwatch, RK_S32 show_on_exit); +void mpp_stopwatch_record(MppStopwatch stopwatch, const char *event); +void mpp_stopwatch_put(MppStopwatch timer); +RK_S64 mpp_stopwatch_elapsed_time(MppStopwatch stopwatch); + +#ifdef __cplusplus +} +#endif + +#ifdef __cplusplus +class mpp_time { +public: + mpp_time(const char *name = __FUNCTION__); + ~mpp_time(); +private: + const char *mName; + RK_S64 mStart; + RK_S64 mEnd; + + mpp_time(const AutoTiming &); + mpp_time &operator = (const AutoTiming&); +}; + +#endif + +#define AUTO_TIMER_STRING(name, cnt) name ## cnt +#define AUTO_TIMER_NAME_STRING(name, cnt) AUTO_TIMER_STRING(name, cnt) +#define AUTO_TIMER_NAME(name) AUTO_TIMER_NAME_STRING(name, __COUNTER__) +#define AUTO_TIMING() AutoTiming AUTO_TIMER_NAME(auto_timing)(__FUNCTION__) + +#endif /* __MPP_TIME_H__ */ diff --git a/hardware/mpp/include/mpp_trace.h b/hardware/mpp/include/mpp_trace.h new file mode 100644 index 0000000000000000000000000000000000000000..a65a98ac49ea6dfb35ed3cc6aaff8a5bd0d46395 --- /dev/null +++ b/hardware/mpp/include/mpp_trace.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __MPP_TRACE_H__ +#define __MPP_TRACE_H__ + +#include "rk_type.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void mpp_trace_begin(const char* name); +void mpp_trace_end(const char* name); +void mpp_trace_async_begin(const char* name, RK_S32 cookie); +void mpp_trace_async_end(const char* name, RK_S32 cookie); +void mpp_trace_int32(const char* name, RK_S32 value); +void mpp_trace_int64(const char* name, RK_S64 value); + +#ifdef __cplusplus +} +#endif + +#endif /* __MPP_TRACE_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/osal_2str.h b/hardware/mpp/include/osal_2str.h new file mode 100644 index 0000000000000000000000000000000000000000..b9084563726887b711ddc7a477c044eb2735f3ce --- /dev/null +++ b/hardware/mpp/include/osal_2str.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __OSAL_2STR_H__ +#define __OSAL_2STR_H__ + +#include "mpp_dev_defs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +const char *strof_client_type(MppClientType type); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/hardware/mpp/include/rk_mpi.h b/hardware/mpp/include/rk_mpi.h new file mode 100644 index 0000000000000000000000000000000000000000..0429f69fa62e5a29af6679cc28930da6dfdb1276 --- /dev/null +++ b/hardware/mpp/include/rk_mpi.h @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __RK_MPI_H__ +#define __RK_MPI_H__ + +/** + * @addtogroup rk_mpi + * @brief Rockchip Media Process Interface + * @details Media Process Platform(MPP) provides application programming + * interface for the application layer, by which applications can + * call hardware encode and decode. Current MPP fully supports + * chipset RK3288/RK3228/RK3229/RK3399/RK3328/RV1108. Old chipset + * like RK29xx/RK30xx/RK31XX/RK3368 is partly supported due to lack + * of some hardware register generation module. + */ + +#include "rk_mpi_cmd.h" +#include "mpp_task.h" + +/** + * @ingroup rk_mpi + * @brief MPP main work function set + * @details all api function are seperated into two sets: data io api set + * and control api set + * + * (1). the data api set is for data input/output flow including: + * + * (1.1) simple data api set: + * + * decode : both send video stream packet to decoder and get video frame from + * decoder at the same time. + * + * encode : both send video frame to encoder and get encoded video stream from + * encoder at the same time. + * + * decode_put_packet: send video stream packet to decoder only, async interface + * + * decode_get_frame : get video frame from decoder only, async interface + * + * encode_put_frame : send video frame to encoder only, async interface + * + * encode_get_packet: get encoded video packet from encoder only, async interface + * + * (1.2) advanced task api set: + * + * poll : poll port for dequeue + * + * dequeue : pop a task from mpp task queue + * + * enqueue : push a task to mpp task queue + * + * (2). the control api set is for mpp context control including: + * + * control : similiar to ioctl in kernel driver, setup or get mpp internal parameter + * + * reset : clear all data in mpp context, discard all packet and frame, + * reset all components to initialized status + */ +typedef struct MppApi_t { + /** + * @brief size of struct MppApi + */ + RK_U32 size; + /** + * @brief mpp api version, generated by Git + */ + RK_U32 version; + + // simple data flow interface + /** + * @brief both send video stream packet to decoder and get video frame from + * decoder at the same time + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @param[in] packet The input video stream, its usage can refer mpp_packet.h. + * @param[out] frame The output picture, its usage can refer mpp_frame.h. + * @return 0 and positive for success, negative for failure. The return + * value is an error code. For details, please refer mpp_err.h. + */ + MPP_RET (*decode)(MppCtx ctx, MppPacket packet, MppFrame *frame); + /** + * @brief send video stream packet to decoder only, async interface + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @param[in] packet The input video stream, its usage can refer mpp_packet.h. + * @return 0 and positive for success, negative for failure. The return + * value is an error code. For details, please refer mpp_err.h. + */ + MPP_RET (*decode_put_packet)(MppCtx ctx, MppPacket packet); + /** + * @brief get video frame from decoder only, async interface + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @param[out] frame The output picture, its usage can refer mpp_frame.h. + * @return 0 and positive for success, negative for failure. The return + * value is an error code. For details, please refer mpp_err.h. + */ + MPP_RET (*decode_get_frame)(MppCtx ctx, MppFrame *frame); + /** + * @brief both send video frame to encoder and get encoded video stream from + * encoder at the same time + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @param[in] frame The input video data, its usage can refer mpp_frame.h. + * @param[out] packet The output compressed data, its usage can refer mpp_packet.h. + * @return 0 and positive for success, negative for failure. The return + * value is an error code. For details, please refer mpp_err.h. + */ + MPP_RET (*encode)(MppCtx ctx, MppFrame frame, MppPacket *packet); + /** + * @brief send video frame to encoder only, async interface + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @param[in] frame The input video data, its usage can refer mpp_frame.h. + * @return 0 and positive for success, negative for failure. The return + * value is an error code. For details, please refer mpp_err.h. + */ + MPP_RET (*encode_put_frame)(MppCtx ctx, MppFrame frame); + /** + * @brief get encoded video packet from encoder only, async interface + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @param[out] packet The output compressed data, its usage can refer mpp_packet.h. + * @return 0 and positive for success, negative for failure. The return + * value is an error code. For details, please refer mpp_err.h. + */ + MPP_RET (*encode_get_packet)(MppCtx ctx, MppPacket *packet); + + /** + * @brief ISP interface, will be supported in the future. + */ + MPP_RET (*isp)(MppCtx ctx, MppFrame dst, MppFrame src); + /** + * @brief ISP interface, will be supported in the future. + */ + MPP_RET (*isp_put_frame)(MppCtx ctx, MppFrame frame); + /** + * @brief ISP interface, will be supported in the future. + */ + MPP_RET (*isp_get_frame)(MppCtx ctx, MppFrame *frame); + + // advance data flow interface + /** + * @brief poll port for dequeue + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @param[in] type input port or output port which are both for data transaction + * @param[in] timeout mpp poll type, its usage can refer mpp_task.h. + * @return 0 and positive for success, negative for failure. The return + * value is an error code. For details, please refer mpp_err.h. + */ + MPP_RET (*poll)(MppCtx ctx, MppPortType type, MppPollType timeout); + /** + * @brief dequeue MppTask, pop a task from mpp task queue + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @param[in] type input port or output port which are both for data transaction + * @param[out] task MppTask popped from mpp task queue, its usage can refer mpp_task.h. + * @return 0 and positive for success, negative for failure. The return + * value is an error code. For details, please refer mpp_err.h. + */ + MPP_RET (*dequeue)(MppCtx ctx, MppPortType type, MppTask *task); + /** + * @brief enqueue MppTask, push a task to mpp task queue + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @param[in] type input port or output port which are both for data transaction + * @param[in] task MppTask which is sent to mpp for process, its usage can refer mpp_task.h. + * @return 0 and positive for success, negative for failure. The return + * value is an error code. For details, please refer mpp_err.h. + */ + MPP_RET (*enqueue)(MppCtx ctx, MppPortType type, MppTask task); + + // control interface + /** + * @brief discard all packet and frame, reset all component, + * for both decoder and encoder + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @return 0 for success, others for failure. The return value is an + * error code. For details, please refer mpp_err.h. + */ + MPP_RET (*reset)(MppCtx ctx); + /** + * @brief control function for mpp property setting + * @param[in] ctx The context of mpp, created by mpp_create() and initiated + * by mpp_init(). + * @param[in] cmd The mpi command, its definition can refer rk_mpi_cmd.h. + * @param[in,out] param The mpi command parameter + * @return 0 for success, others for failure. The return value is an + * error code. For details, please refer mpp_err.h. + */ + MPP_RET (*control)(MppCtx ctx, MpiCmd cmd, MppParam param); + + /** + * @brief The reserved segment, may be used in the future + */ + RK_U32 reserv[16]; +} MppApi; + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup rk_mpi + * @brief Create empty context structure and mpi function pointers. + * Use functions in MppApi to access mpp services. + * @param[in,out] ctx pointer of the mpp context, refer to MpiImpl_t. + * @param[in,out] mpi pointer of mpi function, refer to MppApi. + * @return 0 for success, others for failure. The return value is an + * error code. For details, please refer mpp_err.h. + * @note This interface creates base flow context, all function calls + * are based on it. + */ +MPP_RET mpp_create(MppCtx *ctx, MppApi **mpi); +/** + * @ingroup rk_mpi + * @brief Call after mpp_create to setup mpp type and video format. + * This function will call internal context init function. + * @param[in] ctx The context of mpp, created by mpp_create(). + * @param[in] type specify decoder or encoder, refer to MppCtxType. + * @param[in] coding specify video compression coding, refer to MppCodingType. + * @return 0 for success, others for failure. The return value is an + * error code. For details, please refer mpp_err.h. + */ +MPP_RET mpp_init(MppCtx ctx, MppCtxType type, MppCodingType coding); +/** + * @ingroup rk_mpi + * @brief Call after mpp_init to start mpp working. + * Control SET_CFG can be called both before and after mpp_start. + * Before mpp_start is called both global param and dynamic param can be set. + * After mpp_start is called only dynamic param can be set. + * This funciton purpose is to stop recieving global param and do + * preparation for processing data flow. + * This function will call internal context start function. + * @param[in] ctx The context of mpp, created by mpp_create(). + * @return 0 for success, others for failure. The return value is an + * error code. For details, please refer mpp_err.h. + */ +MPP_RET mpp_start(MppCtx ctx); +/** + * @ingroup rk_mpi + * @brief Call before mpp_destroy to stop mpp working. + * Control SET_CFG can be called after starting. + * Before mpp_stop is called only dynamic param can be set. + * After mpp_stop is called both global param and dynamic param can be set. + * This funciton purpose is to stop processing data and do preparation + * to receive global param. + * @param[in] ctx The context of mpp, created by mpp_create(). + * @return 0 for success, others for failure. The return value is an + * error code. For details, please refer mpp_err.h. + */ +MPP_RET mpp_stop(MppCtx ctx); +/** + * @ingroup rk_mpi + * @brief Destroy mpp context and free both context and mpi structure, + * it matches with mpp_init(). + * @param[in] ctx The context of mpp, created by mpp_create(). + * @return 0 for success, others for failure. The return value is an + * error code. For details, please refer mpp_err.h. + */ +MPP_RET mpp_destroy(MppCtx ctx); +/** + * @ingroup rk_mpi + * @brief judge given format is supported or not by MPP. + * @param[in] type specify decoder or encoder, refer to MppCtxType. + * @param[in] coding specify video compression coding, refer to MppCodingType. + * @return 0 for support, -1 for unsupported. + */ +MPP_RET mpp_check_support_format(MppCtxType type, MppCodingType coding); +/** + * @ingroup rk_mpi + * @brief List all formats supported by MPP + * @param NULL no need to input parameter + * @return No return value. This function just prints format information supported + * by MPP on standard output. + */ +void mpp_show_support_format(void); +void mpp_show_color_format(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __RK_MPI_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/rk_mpi_cmd.h b/hardware/mpp/include/rk_mpi_cmd.h new file mode 100644 index 0000000000000000000000000000000000000000..09a45529f69ab221ba314b9a016a9a7bbbe3fba6 --- /dev/null +++ b/hardware/mpp/include/rk_mpi_cmd.h @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __RK_MPI_CMD_H__ +#define __RK_MPI_CMD_H__ + +/* + * Command id bit usage is defined as follows: + * bit 20 - 23 - module id + * bit 16 - 19 - contex id + * bit 0 - 15 - command id + */ +#define CMD_MODULE_ID_MASK (0x00F00000) +#define CMD_MODULE_OSAL (0x00100000) +#define CMD_MODULE_MPP (0x00200000) +#define CMD_MODULE_CODEC (0x00300000) +#define CMD_MODULE_HAL (0x00400000) + +#define CMD_CTX_ID_MASK (0x000F0000) +#define CMD_CTX_ID_DEC (0x00010000) +#define CMD_CTX_ID_ENC (0x00020000) +#define CMD_CTX_ID_ISP (0x00030000) + +/* separate encoder / decoder control command to different segment */ +#define CMD_CFG_ID_MASK (0x0000FF00) + +/* decoder control command */ +#define CMD_DEC_CFG_ALL (0x00000000) +#define CMD_DEC_QUERY (0x00000100) +#define CMD_DEC_CFG (0x00000200) + +/* encoder control command */ +#define CMD_ENC_CFG_ALL (0x00000000) +#define CMD_ENC_CFG_RC_API (0x00000100) + +#define CMD_ENC_CFG_MISC (0x00008000) +#define CMD_ENC_CFG_SPLIT (0x00008100) +#define CMD_ENC_CFG_REF (0x00008200) +#define CMD_ENC_CFG_ROI (0x00008300) +#define CMD_ENC_CFG_OSD (0x00008400) + +typedef enum { + MPP_OSAL_CMD_BASE = CMD_MODULE_OSAL, + MPP_OSAL_CMD_END, + + MPP_CMD_BASE = CMD_MODULE_MPP, + MPP_ENABLE_DEINTERLACE, + MPP_SET_INPUT_BLOCK, /* deprecated */ + MPP_SET_INTPUT_BLOCK_TIMEOUT, /* deprecated */ + MPP_SET_OUTPUT_BLOCK, /* deprecated */ + MPP_SET_OUTPUT_BLOCK_TIMEOUT, /* deprecated */ + /* + * timeout setup, refer to MPP_TIMEOUT_XXX + * zero - non block + * negative - block with no timeout + * positive - timeout in milisecond + */ + MPP_SET_INPUT_TIMEOUT, /* parameter type RK_S64 */ + MPP_SET_OUTPUT_TIMEOUT, /* parameter type RK_S64 */ + MPP_CMD_END, + + MPP_CODEC_CMD_BASE = CMD_MODULE_CODEC, + MPP_CODEC_GET_FRAME_INFO, + MPP_CODEC_CMD_END, + + MPP_DEC_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_DEC, + MPP_DEC_SET_FRAME_INFO, /* vpu api legacy control for buffer slot dimension init */ + MPP_DEC_SET_EXT_BUF_GROUP, /* IMPORTANT: set external buffer group to mpp decoder */ + MPP_DEC_SET_INFO_CHANGE_READY, + MPP_DEC_SET_PRESENT_TIME_ORDER, /* use input time order for output */ + MPP_DEC_SET_PARSER_SPLIT_MODE, /* Need to setup before init */ + MPP_DEC_SET_PARSER_FAST_MODE, /* Need to setup before init */ + MPP_DEC_GET_STREAM_COUNT, + MPP_DEC_GET_VPUMEM_USED_COUNT, + MPP_DEC_SET_VC1_EXTRA_DATA, + MPP_DEC_SET_OUTPUT_FORMAT, + MPP_DEC_SET_DISABLE_ERROR, /* When set it will disable sw/hw error (H.264 / H.265) */ + MPP_DEC_SET_IMMEDIATE_OUT, + MPP_DEC_SET_ENABLE_DEINTERLACE, /* MPP enable deinterlace by default. Vpuapi can disable it */ + + MPP_DEC_CMD_QUERY = CMD_MODULE_CODEC | CMD_CTX_ID_DEC | CMD_DEC_QUERY, + /* query decoder runtime information for decode stage */ + MPP_DEC_QUERY, /* set and get MppDecQueryCfg structure */ + + CMD_DEC_CMD_CFG = CMD_MODULE_CODEC | CMD_CTX_ID_DEC | CMD_DEC_CFG, + MPP_DEC_SET_CFG, /* set MppDecCfg structure */ + MPP_DEC_GET_CFG, /* get MppDecCfg structure */ + + MPP_DEC_CMD_END, + + MPP_ENC_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_ENC, + /* basic encoder setup control */ + MPP_ENC_SET_CFG, /* set MppEncCfg structure */ + MPP_ENC_GET_CFG, /* get MppEncCfg structure */ + MPP_ENC_SET_PREP_CFG, /* deprecated set MppEncPrepCfg structure, use MPP_ENC_SET_CFG instead */ + MPP_ENC_GET_PREP_CFG, /* deprecated get MppEncPrepCfg structure, use MPP_ENC_GET_CFG instead */ + MPP_ENC_SET_RC_CFG, /* deprecated set MppEncRcCfg structure, use MPP_ENC_SET_CFG instead */ + MPP_ENC_GET_RC_CFG, /* deprecated get MppEncRcCfg structure, use MPP_ENC_GET_CFG instead */ + MPP_ENC_SET_CODEC_CFG, /* deprecated set MppEncCodecCfg structure, use MPP_ENC_SET_CFG instead */ + MPP_ENC_GET_CODEC_CFG, /* deprecated get MppEncCodecCfg structure, use MPP_ENC_GET_CFG instead */ + /* runtime encoder setup control */ + MPP_ENC_SET_IDR_FRAME, /* next frame will be encoded as intra frame */ + MPP_ENC_SET_OSD_LEGACY_0, /* deprecated */ + MPP_ENC_SET_OSD_LEGACY_1, /* deprecated */ + MPP_ENC_SET_OSD_LEGACY_2, /* deprecated */ + MPP_ENC_GET_HDR_SYNC, /* get vps / sps / pps which has better sync behavior parameter is MppPacket */ + MPP_ENC_GET_EXTRA_INFO, /* deprecated */ + MPP_ENC_SET_SEI_CFG, /* SEI: Supplement Enhancemant Information, parameter is MppSeiMode */ + MPP_ENC_GET_SEI_DATA, /* SEI: Supplement Enhancemant Information, parameter is MppPacket */ + MPP_ENC_PRE_ALLOC_BUFF, /* deprecated */ + MPP_ENC_SET_QP_RANGE, /* used for adjusting qp range, the parameter can be 1 or 2 */ + MPP_ENC_SET_ROI_CFG, /* set MppEncROICfg structure */ + MPP_ENC_SET_CTU_QP, /* for H265 Encoder,set CTU's size and QP */ + + /* User define rate control stategy API control */ + MPP_ENC_CFG_RC_API = CMD_MODULE_CODEC | CMD_CTX_ID_ENC | CMD_ENC_CFG_RC_API, + /* + * Get RcApiQueryAll structure + * Get all available rate control stategy string and count + */ + MPP_ENC_GET_RC_API_ALL = MPP_ENC_CFG_RC_API + 1, + /* + * Get RcApiQueryType structure + * Get available rate control stategy string with certain type + */ + MPP_ENC_GET_RC_API_BY_TYPE = MPP_ENC_CFG_RC_API + 2, + /* + * Set RcImplApi structure + * Add new or update rate control stategy function pointers + */ + MPP_ENC_SET_RC_API_CFG = MPP_ENC_CFG_RC_API + 3, + /* + * Get RcApiBrief structure + * Get current used rate control stategy brief information (type and name) + */ + MPP_ENC_GET_RC_API_CURRENT = MPP_ENC_CFG_RC_API + 4, + /* + * Set RcApiBrief structure + * Set current used rate control stategy brief information (type and name) + */ + MPP_ENC_SET_RC_API_CURRENT = MPP_ENC_CFG_RC_API + 5, + + MPP_ENC_CFG_MISC = CMD_MODULE_CODEC | CMD_CTX_ID_ENC | CMD_ENC_CFG_MISC, + /* set MppEncHeaderMode */ + MPP_ENC_SET_HEADER_MODE, + /* get MppEncHeaderMode */ + MPP_ENC_GET_HEADER_MODE, + + MPP_ENC_CFG_SPLIT = CMD_MODULE_CODEC | CMD_CTX_ID_ENC | CMD_ENC_CFG_SPLIT, + /* set MppEncSliceSplit structure */ + MPP_ENC_SET_SPLIT, + /* get MppEncSliceSplit structure */ + MPP_ENC_GET_SPLIT, + + MPP_ENC_CFG_REF = CMD_MODULE_CODEC | CMD_CTX_ID_ENC | CMD_ENC_CFG_REF, + /* set MppEncRefCfg structure */ + MPP_ENC_SET_REF_CFG, + + MPP_ENC_CFG_OSD = CMD_MODULE_CODEC | CMD_CTX_ID_ENC | CMD_ENC_CFG_OSD, + /* set OSD palette, parameter should be pointer to MppEncOSDPltCfg */ + MPP_ENC_SET_OSD_PLT_CFG, + /* get OSD palette, parameter should be pointer to MppEncOSDPltCfg */ + MPP_ENC_GET_OSD_PLT_CFG, + /* set OSD data with at most 8 regions, parameter should be pointer to MppEncOSDData */ + MPP_ENC_SET_OSD_DATA_CFG, + + MPP_ENC_CMD_END, + + MPP_ISP_CMD_BASE = CMD_MODULE_CODEC | CMD_CTX_ID_ISP, + MPP_ISP_CMD_END, + + MPP_HAL_CMD_BASE = CMD_MODULE_HAL, + MPP_HAL_CMD_END, + + MPI_CMD_BUTT, +} MpiCmd; + +#include "rk_vdec_cmd.h" +#include "rk_vdec_cfg.h" +#include "rk_venc_cmd.h" +#include "rk_venc_cfg.h" +#include "rk_venc_ref.h" + +#endif /* __RK_MPI_CMD_H__ */ diff --git a/hardware/mpp/include/rk_type.h b/hardware/mpp/include/rk_type.h new file mode 100644 index 0000000000000000000000000000000000000000..9adf3d0d987e494e73bee3bb4f612bbf98bf524e --- /dev/null +++ b/hardware/mpp/include/rk_type.h @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __RK_TYPE_H__ +#define __RK_TYPE_H__ + +#include + +#if defined(_WIN32) && !defined(__MINGW32CE__) + +typedef unsigned char RK_U8; +typedef unsigned short RK_U16; +typedef unsigned int RK_U32; +typedef unsigned long RK_ULONG; +typedef unsigned __int64 RK_U64; + +typedef signed char RK_S8; +typedef signed short RK_S16; +typedef signed int RK_S32; +typedef signed long RK_LONG; +typedef signed __int64 RK_S64; + +#else + +typedef unsigned char RK_U8; +typedef unsigned short RK_U16; +typedef unsigned int RK_U32; +typedef unsigned long RK_ULONG; +typedef unsigned long long int RK_U64; + + +typedef signed char RK_S8; +typedef signed short RK_S16; +typedef signed int RK_S32; +typedef signed long RK_LONG; +typedef signed long long int RK_S64; + +#endif + +#ifndef MODULE_TAG +#define MODULE_TAG NULL +#endif + +/** + * @ingroup rk_mpi + * @brief The type of mpp context + * @details This type is used when calling mpp_init(), which including decoder, + * encoder and Image Signal Process(ISP). So far decoder and encoder + * are supported perfectly, and ISP will be supported in the future. + */ +typedef enum { + MPP_CTX_DEC, /**< decoder */ + MPP_CTX_ENC, /**< encoder */ + MPP_CTX_ISP, /**< isp */ + MPP_CTX_BUTT, /**< undefined */ +} MppCtxType; + +/** + * @ingroup rk_mpi + * @brief Enumeration used to define the possible video compression codings. + * sync with the omx_video.h + * + * @note This essentially refers to file extensions. If the coding is + * being used to specify the ENCODE type, then additional work + * must be done to configure the exact flavor of the compression + * to be used. For decode cases where the user application can + * not differentiate between MPEG-4 and H.264 bit streams, it is + * up to the codec to handle this. + */ +typedef enum { + MPP_VIDEO_CodingUnused, /**< Value when coding is N/A */ + MPP_VIDEO_CodingAutoDetect, /**< Autodetection of coding type */ + MPP_VIDEO_CodingMPEG2, /**< AKA: H.262 */ + MPP_VIDEO_CodingH263, /**< H.263 */ + MPP_VIDEO_CodingMPEG4, /**< MPEG-4 */ + MPP_VIDEO_CodingWMV, /**< Windows Media Video (WMV1,WMV2,WMV3)*/ + MPP_VIDEO_CodingRV, /**< all versions of Real Video */ + MPP_VIDEO_CodingAVC, /**< H.264/AVC */ + MPP_VIDEO_CodingMJPEG, /**< Motion JPEG */ + MPP_VIDEO_CodingVP8, /**< VP8 */ + MPP_VIDEO_CodingVP9, /**< VP9 */ + MPP_VIDEO_CodingVC1 = 0x01000000, /**< Windows Media Video (WMV1,WMV2,WMV3)*/ + MPP_VIDEO_CodingFLV1, /**< Sorenson H.263 */ + MPP_VIDEO_CodingDIVX3, /**< DIVX3 */ + MPP_VIDEO_CodingVP6, + MPP_VIDEO_CodingHEVC, /**< H.265/HEVC */ + MPP_VIDEO_CodingAVSPLUS, /**< AVS+ */ + MPP_VIDEO_CodingAVS, /**< AVS profile=0x20 */ + MPP_VIDEO_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + MPP_VIDEO_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + MPP_VIDEO_CodingMax = 0x7FFFFFFF +} MppCodingType; + +/* + * All external interface object list here. + * The interface object is defined as void * for expandability + * The cross include between these objects will introduce extra + * compiling difficulty. So we move them together in this header. + * + * Object interface header list: + * + * MppCtx - rk_mpi.h + * MppParam - rk_mpi.h + * + * MppFrame - mpp_frame.h + * MppPacket - mpp_packet.h + * + * MppBuffer - mpp_buffer.h + * MppBufferGroup - mpp_buffer.h + * + * MppTask - mpp_task.h + * MppMeta - mpp_meta.h + */ + +typedef void* MppCtx; +typedef void* MppParam; + +typedef void* MppFrame; +typedef void* MppPacket; + +typedef void* MppBuffer; +typedef void* MppBufferGroup; + +typedef void* MppTask; +typedef void* MppMeta; + +#endif /* __RK_TYPE_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/rk_vdec_cfg.h b/hardware/mpp/include/rk_vdec_cfg.h new file mode 100644 index 0000000000000000000000000000000000000000..a9b772d2e15ec26b3776a41430e7417909e1623e --- /dev/null +++ b/hardware/mpp/include/rk_vdec_cfg.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __RK_VDEC_CFG_H__ +#define __RK_VDEC_CFG_H__ + +#include "rk_type.h" +#include "mpp_err.h" + +typedef void* MppDecCfg; + +#ifdef __cplusplus +extern "C" { +#endif + +MPP_RET mpp_dec_cfg_init(MppDecCfg *cfg); +MPP_RET mpp_dec_cfg_deinit(MppDecCfg cfg); + +MPP_RET mpp_dec_cfg_set_s32(MppDecCfg cfg, const char *name, RK_S32 val); +MPP_RET mpp_dec_cfg_set_u32(MppDecCfg cfg, const char *name, RK_U32 val); +MPP_RET mpp_dec_cfg_set_s64(MppDecCfg cfg, const char *name, RK_S64 val); +MPP_RET mpp_dec_cfg_set_u64(MppDecCfg cfg, const char *name, RK_U64 val); +MPP_RET mpp_dec_cfg_set_ptr(MppDecCfg cfg, const char *name, void *val); + +MPP_RET mpp_dec_cfg_get_s32(MppDecCfg cfg, const char *name, RK_S32 *val); +MPP_RET mpp_dec_cfg_get_u32(MppDecCfg cfg, const char *name, RK_U32 *val); +MPP_RET mpp_dec_cfg_get_s64(MppDecCfg cfg, const char *name, RK_S64 *val); +MPP_RET mpp_dec_cfg_get_u64(MppDecCfg cfg, const char *name, RK_U64 *val); +MPP_RET mpp_dec_cfg_get_ptr(MppDecCfg cfg, const char *name, void **val); + +void mpp_dec_cfg_show(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __RK_VDEC_CFG_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/rk_vdec_cmd.h b/hardware/mpp/include/rk_vdec_cmd.h new file mode 100644 index 0000000000000000000000000000000000000000..f34dab6555b42e364d449761a81973b0ac18565c --- /dev/null +++ b/hardware/mpp/include/rk_vdec_cmd.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __RK_VDEC_CMD_H__ +#define __RK_VDEC_CMD_H__ + +#include "rk_type.h" + +/* + * decoder query interface is only for debug usage + */ +#define MPP_DEC_QUERY_STATUS (0x00000001) +#define MPP_DEC_QUERY_WAIT (0x00000002) +#define MPP_DEC_QUERY_FPS (0x00000004) +#define MPP_DEC_QUERY_BPS (0x00000008) +#define MPP_DEC_QUERY_DEC_IN_PKT (0x00000010) +#define MPP_DEC_QUERY_DEC_WORK (0x00000020) +#define MPP_DEC_QUERY_DEC_OUT_FRM (0x00000040) + +#define MPP_DEC_QUERY_ALL (MPP_DEC_QUERY_STATUS | \ + MPP_DEC_QUERY_WAIT | \ + MPP_DEC_QUERY_FPS | \ + MPP_DEC_QUERY_BPS | \ + MPP_DEC_QUERY_DEC_IN_PKT | \ + MPP_DEC_QUERY_DEC_WORK | \ + MPP_DEC_QUERY_DEC_OUT_FRM) + +typedef struct MppDecQueryCfg_t { + /* + * 32 bit query flag for query data check + * Each bit represent a query data switch. + * bit 0 - for querying decoder runtime status + * bit 1 - for querying decoder runtime waiting status + * bit 2 - for querying decoder realtime decode fps + * bit 3 - for querying decoder realtime input bps + * bit 4 - for querying decoder input packet count + * bit 5 - for querying decoder start hardware times + * bit 6 - for querying decoder output frame count + */ + RK_U32 query_flag; + + /* 64 bit query data output */ + RK_U32 rt_status; + RK_U32 rt_wait; + RK_U32 rt_fps; + RK_U32 rt_bps; + RK_U32 dec_in_pkt_cnt; + RK_U32 dec_hw_run_cnt; + RK_U32 dec_out_frm_cnt; +} MppDecQueryCfg; + +#endif /* __RK_VDEC_CMD_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/rk_venc_cfg.h b/hardware/mpp/include/rk_venc_cfg.h new file mode 100644 index 0000000000000000000000000000000000000000..c81ef8123693783ab1661013f6a50340d0766113 --- /dev/null +++ b/hardware/mpp/include/rk_venc_cfg.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __RK_VENC_CFG_H__ +#define __RK_VENC_CFG_H__ + +#include "rk_type.h" +#include "mpp_err.h" + +typedef void* MppEncCfg; + +#ifdef __cplusplus +extern "C" { +#endif + +MPP_RET mpp_enc_cfg_init(MppEncCfg *cfg); +MPP_RET mpp_enc_cfg_deinit(MppEncCfg cfg); + +MPP_RET mpp_enc_cfg_set_s32(MppEncCfg cfg, const char *name, RK_S32 val); +MPP_RET mpp_enc_cfg_set_u32(MppEncCfg cfg, const char *name, RK_U32 val); +MPP_RET mpp_enc_cfg_set_s64(MppEncCfg cfg, const char *name, RK_S64 val); +MPP_RET mpp_enc_cfg_set_u64(MppEncCfg cfg, const char *name, RK_U64 val); +MPP_RET mpp_enc_cfg_set_ptr(MppEncCfg cfg, const char *name, void *val); +MPP_RET mpp_enc_cfg_set_st(MppEncCfg cfg, const char *name, void *val); + +MPP_RET mpp_enc_cfg_get_s32(MppEncCfg cfg, const char *name, RK_S32 *val); +MPP_RET mpp_enc_cfg_get_u32(MppEncCfg cfg, const char *name, RK_U32 *val); +MPP_RET mpp_enc_cfg_get_s64(MppEncCfg cfg, const char *name, RK_S64 *val); +MPP_RET mpp_enc_cfg_get_u64(MppEncCfg cfg, const char *name, RK_U64 *val); +MPP_RET mpp_enc_cfg_get_ptr(MppEncCfg cfg, const char *name, void **val); +MPP_RET mpp_enc_cfg_get_st(MppEncCfg cfg, const char *name, void *val); + +void mpp_enc_cfg_show(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __RK_VENC_CFG_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/rk_venc_cmd.h b/hardware/mpp/include/rk_venc_cmd.h new file mode 100644 index 0000000000000000000000000000000000000000..ee2594a91527ee8c0d7b003595174f25427c5a8e --- /dev/null +++ b/hardware/mpp/include/rk_venc_cmd.h @@ -0,0 +1,1215 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __RK_VENC_CMD_H__ +#define __RK_VENC_CMD_H__ + +#include "mpp_frame.h" +#include "rk_venc_rc.h" + +/* + * Configure of encoder is very complicated. So we divide configures into + * four parts: + * + * 1. Rate control parameter + * This is quality and bitrate request from user. + * + * 2. Data source MppFrame parameter + * This is data source buffer information. + * Now it is PreP config + * PreP : Encoder Preprocess configuration + * + * 3. Video codec infomation + * This is user custormized stream information. + * including: + * H.264 / H.265 / vp8 / mjpeg + * + * 4. Misc parameter + * including: + * Split : Slice split configuration + * GopRef: Reference gop configuration + * ROI : Region Of Interest + * OSD : On Screen Display + * MD : Motion Detection + * + * The module transcation flow is as follows: + * + * + + + * User | Mpi/Mpp | EncImpl + * | | Hal + * | | + * +----------+ | +---------+ | +-----------+ + * | | | | +-----RcCfg-----> | + * | RcCfg +---------> | | | EncImpl | + * | | | | | +-Frame-----> | + * +----------+ | | | | | +--+-----^--+ + * | | | | | | | + * | | | | | | | + * +----------+ | | | | | syntax | + * | | | | | | | | | + * | MppFrame +---------> MppEnc +---+ | | result + * | | | | | | | | | + * +----------+ | | | | | | | + * | | | | | +--v-----+--+ + * | | | +-Frame-----> | + * +----------+ | | | | | | + * | | | | +---CodecCfg----> Hal | + * | CodecCfg +---------> | | | | + * | | | | <-----Extra-----> | + * +----------+ | +---------+ | +-----------+ + * | | + * | | + * + + + * + * The function call flow is shown below: + * + * mpi mpp_enc controller hal + * + + + + + * | | | | + * | | | | + * +----------init------------> | | + * | | | | + * | | | | + * | PrepCfg | | | + * +---------control----------> PrepCfg | | + * | +-----control-----> | + * | | | PrepCfg | + * | +--------------------------control--------> + * | | | allocate + * | | | buffer + * | | | | + * | RcCfg | | | + * +---------control----------> RcCfg | | + * | +-----control-----> | + * | | rc_init | + * | | | | + * | | | | + * | CodecCfg | | | + * +---------control----------> | CodecCfg | + * | +--------------------------control--------> + * | | | generate + * | | | sps/pps + * | | | Get extra info | + * | +--------------------------control--------> + * | Get extra info | | | + * +---------control----------> | | + * | | | | + * | | | | + * | ROICfg | | | + * +---------control----------> | ROICfg | + * | +--------------------------control--------> + * | | | | + * | OSDCfg | | | + * +---------control----------> | OSDCfg | + * | +--------------------------control--------> + * | | | | + * | MDCfg | | | + * +---------control----------> | MDCfg | + * | +--------------------------control--------> + * | | | | + * | Set extra info | | | + * +---------control----------> | Set extra info | + * | +--------------------------control--------> + * | | | | + * | task | | | + * +----------encode----------> task | | + * | +-----encode------> | + * | | encode | + * | | | syntax | + * | +--------------------------gen_reg--------> + * | | | | + * | | | | + * | +---------------------------start---------> + * | | | | + * | | | | + * | +---------------------------wait----------> + * | | | | + * | | callback | | + * | +-----------------> | + * +--OSD-MD--encode----------> | | + * | . | | | + * | . | | | + * | . | | | + * +--OSD-MD--encode----------> | | + * | | | | + * +----------deinit----------> | | + * + + + + + */ + +/* + * base working mode parameter + */ +typedef enum MppEncBaseCfgChange_e { + MPP_ENC_BASE_CFG_CHANGE_LOW_DELAY = (1 << 0), + MPP_ENC_BASE_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppEncBaseCfgChange; + +typedef struct MppEncBaseCfg_t { + RK_U32 change; + + RK_S32 low_delay; +} MppEncBaseCfg; + +/* + * Rate control parameter + */ +typedef enum MppEncRcCfgChange_e { + MPP_ENC_RC_CFG_CHANGE_RC_MODE = (1 << 0), + MPP_ENC_RC_CFG_CHANGE_QUALITY = (1 << 1), + MPP_ENC_RC_CFG_CHANGE_BPS = (1 << 2), /* change on bps target / max / min */ + MPP_ENC_RC_CFG_CHANGE_FPS_IN = (1 << 5), /* change on fps in flex / numerator / denorminator */ + MPP_ENC_RC_CFG_CHANGE_FPS_OUT = (1 << 6), /* change on fps out flex / numerator / denorminator */ + MPP_ENC_RC_CFG_CHANGE_GOP = (1 << 7), + MPP_ENC_RC_CFG_CHANGE_SKIP_CNT = (1 << 8), + MPP_ENC_RC_CFG_CHANGE_MAX_REENC = (1 << 9), + MPP_ENC_RC_CFG_CHANGE_DROP_FRM = (1 << 10), + MPP_ENC_RC_CFG_CHANGE_MAX_I_PROP = (1 << 11), + MPP_ENC_RC_CFG_CHANGE_MIN_I_PROP = (1 << 12), + MPP_ENC_RC_CFG_CHANGE_INIT_IP_RATIO = (1 << 13), + MPP_ENC_RC_CFG_CHANGE_PRIORITY = (1 << 14), + MPP_ENC_RC_CFG_CHANGE_SUPER_FRM = (1 << 15), + /* qp related change flag */ + MPP_ENC_RC_CFG_CHANGE_QP_INIT = (1 << 16), + MPP_ENC_RC_CFG_CHANGE_QP_RANGE = (1 << 17), + MPP_ENC_RC_CFG_CHANGE_QP_RANGE_I = (1 << 18), + MPP_ENC_RC_CFG_CHANGE_QP_MAX_STEP = (1 << 19), + MPP_ENC_RC_CFG_CHANGE_QP_IP = (1 << 20), + MPP_ENC_RC_CFG_CHANGE_QP_VI = (1 << 21), + MPP_ENC_RC_CFG_CHANGE_QP_ROW = (1 << 22), + MPP_ENC_RC_CFG_CHANGE_QP_ROW_I = (1 << 23), + MPP_ENC_RC_CFG_CHANGE_DEBREATH = (1 << 24), + MPP_ENC_RC_CFG_CHANGE_HIER_QP = (1 << 25), + MPP_ENC_RC_CFG_CHANGE_ST_TIME = (1 << 26), + MPP_ENC_RC_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppEncRcCfgChange; + +typedef enum MppEncRcQuality_e { + MPP_ENC_RC_QUALITY_WORST, + MPP_ENC_RC_QUALITY_WORSE, + MPP_ENC_RC_QUALITY_MEDIUM, + MPP_ENC_RC_QUALITY_BETTER, + MPP_ENC_RC_QUALITY_BEST, + MPP_ENC_RC_QUALITY_CQP, + MPP_ENC_RC_QUALITY_AQ_ONLY, + MPP_ENC_RC_QUALITY_BUTT +} MppEncRcQuality; + +typedef struct MppEncRcCfg_t { + RK_U32 change; + + /* + * rc_mode - rate control mode + * + * mpp provide two rate control mode: + * + * Constant Bit Rate (CBR) mode + * - paramter 'bps*' define target bps + * - paramter quality and qp will not take effect + * + * Variable Bit Rate (VBR) mode + * - paramter 'quality' define 5 quality levels + * - paramter 'bps*' is used as reference but not strict condition + * - special Constant QP (CQP) mode is under VBR mode + * CQP mode will work with qp in CodecCfg. But only use for test + * + * default: CBR + */ + MppEncRcMode rc_mode; + + /* + * quality - quality parameter, only takes effect in VBR mode + * + * Mpp does not give the direct parameter in different protocol. + * + * Mpp provide total 5 quality level: + * Worst - worse - Medium - better - best + * + * extra CQP level means special constant-qp (CQP) mode + * + * default value: Medium + */ + MppEncRcQuality quality; + + /* + * bit rate parameters + * mpp gives three bit rate control parameter for control + * bps_target - target bit rate, unit: bit per second + * bps_max - maximun bit rate, unit: bit per second + * bps_min - minimun bit rate, unit: bit per second + * if user need constant bit rate set parameters to the similar value + * if user need variable bit rate set parameters as they need + */ + RK_S32 bps_target; + RK_S32 bps_max; + RK_S32 bps_min; + + /* + * frame rate parameters have great effect on rate control + * + * fps_in_flex + * 0 - fix input frame rate + * 1 - variable input frame rate + * + * fps_in_num + * input frame rate numerator, if 0 then default 30 + * + * fps_in_denorm + * input frame rate denorminator, if 0 then default 1 + * + * fps_out_flex + * 0 - fix output frame rate + * 1 - variable output frame rate + * + * fps_out_num + * output frame rate numerator, if 0 then default 30 + * + * fps_out_denorm + * output frame rate denorminator, if 0 then default 1 + */ + RK_S32 fps_in_flex; + RK_S32 fps_in_num; + RK_S32 fps_in_denorm; + RK_S32 fps_out_flex; + RK_S32 fps_out_num; + RK_S32 fps_out_denorm; + + /* + * gop - group of picture, gap between Intra frame + * 0 for only 1 I frame the rest are all P frames + * 1 for all I frame + * 2 for I P I P I P + * 3 for I P P I P P + * etc... + */ + RK_S32 gop; + + /* + * skip_cnt - max continuous frame skip count + * 0 - frame skip is not allow + */ + RK_S32 skip_cnt; + + /* + * max_reenc_times - max reencode time for one frame + * 0 - reencode is not allowed + * 1~3 max reencode time is limited to 3 + */ + RK_U32 max_reenc_times; + + /* + * stats_time - the time of bitrate statistics + */ + RK_S32 stats_time; + + /* + * drop frame parameters + * used on bitrate is far over the max bitrate + * + * drop_mode + * + * MPP_ENC_RC_DROP_FRM_DISABLED + * - do not drop frame when bitrate overflow. + * MPP_ENC_RC_DROP_FRM_NORMAL + * - do not encode the dropped frame when bitrate overflow. + * MPP_ENC_RC_DROP_FRM_PSKIP + * - encode a all skip frame when bitrate overflow. + * + * drop_threshold + * + * The percentage threshold over max_bitrate for trigger frame drop. + * + * drop_gap + * The max continuous frame drop number + */ + MppEncRcDropFrmMode drop_mode; + RK_U32 drop_threshold; + RK_U32 drop_gap; + + MppEncRcSuperFrameMode super_mode; + RK_U32 super_i_thd; + RK_U32 super_p_thd; + + MppEncRcPriority rc_priority; + + RK_U32 debreath_en; + RK_U32 debre_strength; + RK_S32 max_i_prop; + RK_S32 min_i_prop; + RK_S32 init_ip_ratio; + + /* general qp control */ + RK_S32 qp_init; + RK_S32 qp_max; + RK_S32 qp_max_i; + RK_S32 qp_min; + RK_S32 qp_min_i; + RK_S32 qp_max_step; /* delta qp between each two P frame */ + RK_S32 qp_delta_ip; /* delta qp between I and P */ + RK_S32 qp_delta_vi; /* delta qp between vi and P */ + + RK_S32 hier_qp_en; + RK_S32 hier_qp_delta[4]; + RK_S32 hier_frame_num[4]; +} MppEncRcCfg; + + +typedef enum MppEncHwCfgChange_e { + /* qp related hardware config flag */ + MPP_ENC_HW_CFG_CHANGE_QP_ROW = (1 << 0), + MPP_ENC_HW_CFG_CHANGE_QP_ROW_I = (1 << 1), + MPP_ENC_HW_CFG_CHANGE_AQ_THRD_I = (1 << 2), + MPP_ENC_HW_CFG_CHANGE_AQ_THRD_P = (1 << 3), + MPP_ENC_HW_CFG_CHANGE_AQ_STEP_I = (1 << 4), + MPP_ENC_HW_CFG_CHANGE_AQ_STEP_P = (1 << 5), + MPP_ENC_HW_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppEncHwCfgChange; + +/* + * Hardware related rate control config + * + * This config will open some detail feature to external user to control + * hardware behavior directly. + */ +typedef struct MppEncHwCfg_t { + RK_U32 change; + + /* vepu541/vepu540 */ + RK_S32 qp_delta_row; /* delta qp between two row in P frame */ + RK_S32 qp_delta_row_i; /* delta qp between two row in I frame */ + RK_U32 aq_thrd_i[16]; + RK_U32 aq_thrd_p[16]; + RK_S32 aq_step_i[16]; + RK_S32 aq_step_p[16]; +} MppEncHwCfg; + +/* + * Mpp preprocess parameter + */ +typedef enum MppEncPrepCfgChange_e { + MPP_ENC_PREP_CFG_CHANGE_INPUT = (1 << 0), /* change on input config */ + MPP_ENC_PREP_CFG_CHANGE_FORMAT = (1 << 2), /* change on format */ + /* transform parameter */ + MPP_ENC_PREP_CFG_CHANGE_ROTATION = (1 << 4), /* change on ration */ + MPP_ENC_PREP_CFG_CHANGE_MIRRORING = (1 << 5), /* change on mirroring */ + /* enhancement parameter */ + MPP_ENC_PREP_CFG_CHANGE_DENOISE = (1 << 8), /* change on denoise */ + MPP_ENC_PREP_CFG_CHANGE_SHARPEN = (1 << 9), /* change on denoise */ + /* color related parameter */ + MPP_ENC_PREP_CFG_CHANGE_COLOR_RANGE = (1 << 16), /* change on color range */ + MPP_ENC_PREP_CFG_CHANGE_COLOR_SPACE = (1 << 17), /* change on color range */ + MPP_ENC_PREP_CFG_CHANGE_COLOR_PRIME = (1 << 18), /* change on color primaries */ + MPP_ENC_PREP_CFG_CHANGE_COLOR_TRC = (1 << 19), /* change on color transfer */ + + MPP_ENC_PREP_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppEncPrepCfgChange; + +/* + * Preprocess sharpen parameter + * + * 5x5 sharpen core + * + * enable_y - enable luma sharpen + * enable_uv - enable chroma sharpen + */ +typedef struct { + RK_U32 enable_y; + RK_U32 enable_uv; + RK_S32 coef[5]; + RK_S32 div; + RK_S32 threshold; +} MppEncPrepSharpenCfg; + +/* + * input frame rotation parameter + * 0 - disable rotation + * 1 - 90 degree + * 2 - 180 degree + * 3 - 270 degree + */ +typedef enum MppEncRotationCfg_e { + MPP_ENC_ROT_0, + MPP_ENC_ROT_90, + MPP_ENC_ROT_180, + MPP_ENC_ROT_270, + MPP_ENC_ROT_BUTT +} MppEncRotationCfg; + +typedef struct MppEncPrepCfg_t { + RK_U32 change; + + /* + * Mpp encoder input data dimension config + * + * width / height / hor_stride / ver_stride / format + * These information will be used for buffer allocation and rc config init + * The output format is always YUV420. So if input is RGB then color + * conversion will be done internally + */ + RK_S32 width; + RK_S32 height; + RK_S32 hor_stride; + RK_S32 ver_stride; + + /* + * Mpp encoder input data format config + */ + MppFrameFormat format; + MppFrameColorSpace color; + MppFrameColorPrimaries colorprim; + MppFrameColorTransferCharacteristic colortrc; + MppFrameColorRange range; + + MppEncRotationCfg rotation; + + /* + * input frame mirroring parameter + * 0 - disable mirroring + * 1 - horizontal mirroring + * 2 - vertical mirroring + */ + RK_S32 mirroring; + + RK_S32 denoise; + + MppEncPrepSharpenCfg sharpen; +} MppEncPrepCfg; + +/* + * Mpp Motion Detection parameter + * + * Mpp can output Motion Detection infomation for each frame. + * If user euqueue a encode task with KEY_MOTION_INFO by following function + * then encoder will output Motion Detection information to the buffer. + * + * mpp_task_meta_set_buffer(task, KEY_MOTION_INFO, buffer); + * + * Motion Detection information will be organized in this way: + * 1. Each 16x16 block will have a 32 bit block information which contains + * 15 bit SAD(Sum of Abstract Difference value + * 9 bit signed horizontal motion vector + * 8 bit signed vertical motion vector + * 2. The sequence of MD information in the buffer is corresponding to the + * block position in the frame, left-to right, top-to-bottom. + * 3. If the width of the frame is not a multiple of 256 pixels (16 macro + * blocks), DMA would extend the frame to a multiple of 256 pixels and + * the extended blocks' MD information are 32'h0000_0000. + * 4. Buffer must be ion buffer and 1024 byte aligned. + */ +typedef struct MppEncMDBlkInfo_t { + RK_U32 sad : 15; /* bit 0~14 - SAD */ + RK_S32 mvx : 9; /* bit 15~23 - signed horizontal mv */ + RK_S32 mvy : 8; /* bit 24~31 - signed vertical mv */ +} MppEncMDBlkInfo; + +typedef enum MppEncHeaderMode_e { + /* default mode: attach vps/sps/pps only on first frame */ + MPP_ENC_HEADER_MODE_DEFAULT, + /* IDR mode: attach vps/sps/pps on each IDR frame */ + MPP_ENC_HEADER_MODE_EACH_IDR, + MPP_ENC_HEADER_MODE_BUTT, +} MppEncHeaderMode; + +typedef enum MppEncSeiMode_e { + MPP_ENC_SEI_MODE_DISABLE, /* default mode, SEI writing is disabled */ + MPP_ENC_SEI_MODE_ONE_SEQ, /* one sequence has only one SEI */ + MPP_ENC_SEI_MODE_ONE_FRAME /* one frame may have one SEI, if SEI info has changed */ +} MppEncSeiMode; + +/* + * Mpp codec parameter + * parameter is defined from here + */ + +/* + * H.264 configurable parameter + */ +typedef enum MppEncH264CfgChange_e { + /* change on stream type */ + MPP_ENC_H264_CFG_STREAM_TYPE = (1 << 0), + /* change on svc / profile / level */ + MPP_ENC_H264_CFG_CHANGE_PROFILE = (1 << 1), + /* change on entropy_coding_mode / cabac_init_idc */ + MPP_ENC_H264_CFG_CHANGE_ENTROPY = (1 << 2), + + /* change on transform8x8_mode */ + MPP_ENC_H264_CFG_CHANGE_TRANS_8x8 = (1 << 4), + /* change on constrained_intra_pred_mode */ + MPP_ENC_H264_CFG_CHANGE_CONST_INTRA = (1 << 5), + /* change on chroma_cb_qp_offset/ chroma_cr_qp_offset */ + MPP_ENC_H264_CFG_CHANGE_CHROMA_QP = (1 << 6), + /* change on deblock_disable / deblock_offset_alpha / deblock_offset_beta */ + MPP_ENC_H264_CFG_CHANGE_DEBLOCKING = (1 << 7), + /* change on use_longterm */ + MPP_ENC_H264_CFG_CHANGE_LONG_TERM = (1 << 8), + /* change on scaling_list_mode */ + MPP_ENC_H264_CFG_CHANGE_SCALING_LIST = (1 << 9), + /* change on poc type */ + MPP_ENC_H264_CFG_CHANGE_POC_TYPE = (1 << 10), + /* change on log2 max poc lsb minus 4 */ + MPP_ENC_H264_CFG_CHANGE_MAX_POC_LSB = (1 << 11), + /* change on log2 max frame number minus 4 */ + MPP_ENC_H264_CFG_CHANGE_MAX_FRM_NUM = (1 << 12), + /* change on gaps_in_frame_num_value_allowed_flag */ + MPP_ENC_H264_CFG_CHANGE_GAPS_IN_FRM_NUM = (1 << 13), + + /* change on max_qp / min_qp */ + MPP_ENC_H264_CFG_CHANGE_QP_LIMIT = (1 << 16), + /* change on max_qp_i / min_qp_i */ + MPP_ENC_H264_CFG_CHANGE_QP_LIMIT_I = (1 << 17), + /* change on max_qp_step */ + MPP_ENC_H264_CFG_CHANGE_MAX_QP_STEP = (1 << 18), + /* change on qp_delta_ip */ + MPP_ENC_H264_CFG_CHANGE_QP_DELTA = (1 << 19), + /* change on intra_refresh_mode / intra_refresh_arg */ + MPP_ENC_H264_CFG_CHANGE_INTRA_REFRESH = (1 << 20), + /* change on max long-term reference frame count */ + MPP_ENC_H264_CFG_CHANGE_MAX_LTR = (1 << 21), + /* change on max temporal id */ + MPP_ENC_H264_CFG_CHANGE_MAX_TID = (1 << 22), + /* change on adding prefix nal */ + MPP_ENC_H264_CFG_CHANGE_ADD_PREFIX = (1 << 23), + /* change on base layer priority id */ + MPP_ENC_H264_CFG_CHANGE_BASE_LAYER_PID = (1 << 24), + + /* change on vui */ + MPP_ENC_H264_CFG_CHANGE_VUI = (1 << 28), + MPP_ENC_H264_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppEncH264CfgChange; + +typedef struct MppEncH264Cfg_t { + RK_U32 change; + + /* + * H.264 stream format + * 0 - H.264 Annex B: NAL unit starts with '00 00 00 01' + * 1 - Plain NAL units without startcode + */ + RK_S32 stream_type; + + /* + * H.264 codec syntax config + * + * do NOT setup the three option below unless you are familiar with encoder detail + * poc_type - picture order count type 0 ~ 2 + * log2_max_poc_lsb - used in sps with poc_type 0, + * log2_max_frame_num - used in sps + */ + RK_U32 poc_type; + RK_U32 log2_max_poc_lsb; + RK_U32 log2_max_frame_num; + RK_U32 gaps_not_allowed; + + /* + * H.264 profile_idc parameter + * 66 - Baseline profile + * 77 - Main profile + * 100 - High profile + */ + RK_S32 profile; + + /* + * H.264 level_idc parameter + * 10 / 11 / 12 / 13 - qcif@15fps / cif@7.5fps / cif@15fps / cif@30fps + * 20 / 21 / 22 - cif@30fps / half-D1@@25fps / D1@12.5fps + * 30 / 31 / 32 - D1@25fps / 720p@30fps / 720p@60fps + * 40 / 41 / 42 - 1080p@30fps / 1080p@30fps / 1080p@60fps + * 50 / 51 / 52 - 4K@30fps + */ + RK_S32 level; + + /* + * H.264 entropy coding method + * 0 - CAVLC + * 1 - CABAC + * When CABAC is select cabac_init_idc can be range 0~2 + */ + RK_S32 entropy_coding_mode; + RK_S32 cabac_init_idc; + + /* + * 8x8 intra prediction and 8x8 transform enable flag + * This flag can only be enable under High profile + * 0 : disable (BP/MP) + * 1 : enable (HP) + */ + RK_S32 transform8x8_mode; + + /* + * 0 : disable + * 1 : enable + */ + RK_S32 constrained_intra_pred_mode; + + /* + * 0 : flat scaling list + * 1 : default scaling list for all cases + * 2 : customized scaling list (not supported) + */ + RK_S32 scaling_list_mode; + + /* + * chroma qp offset (-12 - 12) + */ + RK_S32 chroma_cb_qp_offset; + RK_S32 chroma_cr_qp_offset; + + /* + * H.264 deblock filter mode flag + * 0 : enable + * 1 : disable + * 2 : disable deblocking filter at slice boundaries + * + * deblock filter offset alpha (-6 - 6) + * deblock filter offset beta (-6 - 6) + */ + RK_S32 deblock_disable; + RK_S32 deblock_offset_alpha; + RK_S32 deblock_offset_beta; + + /* + * H.264 long term reference picture enable flag + * 0 - disable + * 1 - enable + */ + RK_S32 use_longterm; + + /* + * quality config + * qp_max - 8 ~ 51 + * qp_max_i - 10 ~ 40 + * qp_min - 8 ~ 48 + * qp_min_i - 10 ~ 40 + * qp_max_step - max delta qp step between two frames + */ + RK_S32 qp_init; + RK_S16 qp_max; + RK_S16 qp_max_i; + RK_S16 qp_min; + RK_S16 qp_min_i; + RK_S16 qp_max_step; + RK_S16 qp_delta_ip; + + /* + * intra fresh config + * + * intra_refresh_mode + * 0 - no intra refresh + * 1 - intra refresh by MB row + * 2 - intra refresh by MB column + * 3 - intra refresh by MB gap + * + * intra_refresh_arg + * mode 0 - no effect + * mode 1 - refresh MB row number + * mode 2 - refresh MB colmn number + * mode 3 - refresh MB gap count + */ + RK_S32 intra_refresh_mode; + RK_S32 intra_refresh_arg; + + /* extra mode config */ + RK_S32 max_ltr_frames; + RK_S32 max_tid; + RK_S32 prefix_mode; + RK_S32 base_layer_pid; +} MppEncH264Cfg; + +#define H265E_MAX_ROI_NUMBER 64 + +typedef struct H265eRect_t { + RK_S32 left; + RK_S32 right; + RK_S32 top; + RK_S32 bottom; +} H265eRect; + +typedef struct H265eRoi_Region_t { + RK_U8 level; + H265eRect rect; +} H265eRoiRegion; + +/* + * roi region only can be setting when rc_enable = 1 + */ +typedef struct MppEncH265RoiCfg_t { + /* + * the value is defined by H265eCtuMethod + */ + + RK_U8 method; + /* + * the number of roi,the value must less than H265E_MAX_ROI_NUMBER + */ + RK_S32 num; + + /* delat qp using in roi region */ + RK_U32 delta_qp; + + /* roi region */ + H265eRoiRegion region[H265E_MAX_ROI_NUMBER]; +} MppEncH265RoiCfg; + +typedef struct H265eCtuQp_t { + /* the qp value using in ctu region */ + RK_U32 qp; + + /* + * define the ctu region + * method = H265E_METHOD_CUT_SIZE, the value of rect is in ctu size + * method = H264E_METHOD_COORDINATE,the value of rect is in coordinates + */ + H265eRect rect; +} H265eCtu; + +typedef struct H265eCtuRegion_t { + /* + * the value is defined by H265eCtuMethod + */ + RK_U8 method; + + /* + * the number of ctu,the value must less than H265E_MAX_ROI_NUMBER + */ + RK_S32 num; + + /* ctu region */ + H265eCtu ctu[H265E_MAX_ROI_NUMBER]; +} MppEncH265CtuCfg; + +/* + * define the method when set CTU/ROI parameters + * this value is using by method in H265eCtuRegion or H265eRoi struct + */ +typedef enum { + H265E_METHOD_CTU_SIZE, + H264E_METHOD_COORDINATE, +} H265eCtuMethod; + +/* + * H.265 configurable parameter + */ +typedef struct MppEncH265VuiCfg_t { + RK_U32 change; + RK_S32 vui_present; + RK_S32 vui_aspect_ratio; + RK_S32 vui_sar_size; + RK_S32 full_range; + RK_S32 time_scale; +} MppEncH265VuiCfg; + +typedef enum MppEncH265CfgChange_e { + /* change on stream type */ + MPP_ENC_H265_CFG_PROFILE_LEVEL_TILER_CHANGE = (1 << 0), + MPP_ENC_H265_CFG_INTRA_QP_CHANGE = (1 << 1), + MPP_ENC_H265_CFG_FRAME_RATE_CHANGE = (1 << 2), + MPP_ENC_H265_CFG_BITRATE_CHANGE = (1 << 3), + MPP_ENC_H265_CFG_GOP_SIZE = (1 << 4), + MPP_ENC_H265_CFG_RC_QP_CHANGE = (1 << 5), + MPP_ENC_H265_CFG_INTRA_REFRESH_CHANGE = (1 << 6), + MPP_ENC_H265_CFG_INDEPEND_SLICE_CHANGE = (1 << 7), + MPP_ENC_H265_CFG_DEPEND_SLICE_CHANGE = (1 << 8), + MPP_ENC_H265_CFG_CTU_CHANGE = (1 << 9), + MPP_ENC_H265_CFG_ROI_CHANGE = (1 << 10), + MPP_ENC_H265_CFG_CU_CHANGE = (1 << 11), + MPP_ENC_H265_CFG_DBLK_CHANGE = (1 << 12), + MPP_ENC_H265_CFG_SAO_CHANGE = (1 << 13), + MPP_ENC_H265_CFG_TRANS_CHANGE = (1 << 14), + MPP_ENC_H265_CFG_SLICE_CHANGE = (1 << 15), + MPP_ENC_H265_CFG_ENTROPY_CHANGE = (1 << 16), + MPP_ENC_H265_CFG_MERGE_CHANGE = (1 << 17), + MPP_ENC_H265_CFG_CHANGE_VUI = (1 << 18), + MPP_ENC_H265_CFG_RC_I_QP_CHANGE = (1 << 19), + MPP_ENC_H265_CFG_RC_MAX_QP_STEP_CHANGE = (1 << 21), + MPP_ENC_H265_CFG_RC_IP_DELTA_QP_CHANGE = (1 << 20), + MPP_ENC_H265_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppEncH265CfgChange; + +typedef struct MppEncH265SliceCfg_t { + /* default value: 0, means no slice split */ + RK_U32 split_enable; + + /* 0: by bits number; 1: by lcu line number */ + RK_U32 split_mode; + + /* + * when splitmode is 0, this value presents bits number, + * when splitmode is 1, this value presents lcu line number + */ + RK_U32 slice_size; + RK_U32 loop_filter_across_slices_enabled_flag; +} MppEncH265SliceCfg; + +typedef struct MppEncH265CuCfg_t { + RK_U32 cu32x32_en; /* default: 1 */ + RK_U32 cu16x16_en; /* default: 1 */ + RK_U32 cu8x8_en; /* default: 1 */ + RK_U32 cu4x4_en; /* default: 1 */ + + // intra pred + RK_U32 constrained_intra_pred_flag; /* default: 0 */ + RK_U32 strong_intra_smoothing_enabled_flag; /* INTRA_SMOOTH */ + RK_U32 pcm_enabled_flag; /* default: 0, enable ipcm */ + RK_U32 pcm_loop_filter_disabled_flag; +} MppEncH265CuCfg; + +typedef struct MppEncH265RefCfg_t { + RK_U32 num_lt_ref_pic; /* default: 0 */ +} MppEncH265RefCfg; + +typedef struct MppEncH265DblkCfg_t { + RK_U32 slice_deblocking_filter_disabled_flag; /* default value: 0. {0,1} */ + RK_S32 slice_beta_offset_div2; /* default value: 0. [-6,+6] */ + RK_S32 slice_tc_offset_div2; /* default value: 0. [-6,+6] */ +} MppEncH265DblkCfg_t; + +typedef struct MppEncH265SaoCfg_t { + RK_U32 slice_sao_luma_flag; + RK_U32 slice_sao_chroma_flag; +} MppEncH265SaoCfg; + +typedef struct MppEncH265TransCfg_t { + RK_U32 transquant_bypass_enabled_flag; + RK_U32 transform_skip_enabled_flag; + RK_U32 defalut_ScalingList_enable; /* default: 0 */ + RK_S32 cb_qp_offset; + RK_S32 cr_qp_offset; +} MppEncH265TransCfg; + +typedef struct MppEncH265MergeCfg_t { + RK_U32 max_mrg_cnd; + RK_U32 merge_up_flag; + RK_U32 merge_left_flag; +} MppEncH265MergesCfg; + +typedef struct MppEncH265EntropyCfg_t { + RK_U32 cabac_init_flag; /* default: 0 */ +} MppEncH265EntropyCfg; + +typedef struct MppEncH265Cfg_t { + RK_U32 change; + + /* H.265 codec syntax config */ + RK_S32 profile; + RK_S32 level; + RK_S32 tier; + + /* constraint intra prediction flag */ + RK_S32 const_intra_pred; + RK_S32 ctu_size; + RK_S32 max_cu_size; + RK_S32 tmvp_enable; + RK_S32 amp_enable; + RK_S32 wpp_enable; + RK_S32 merge_range; + RK_S32 sao_enable; + RK_U32 num_ref; + + /* quality config */ + RK_S32 max_qp; + RK_S32 min_qp; + RK_S32 max_i_qp; + RK_S32 min_i_qp; + RK_S32 ip_qp_delta; + RK_S32 max_delta_qp; + RK_S32 intra_qp; + RK_S32 gop_delta_qp; + RK_S32 qp_init; + RK_S32 qp_max_step; + RK_S32 raw_dealt_qp; + RK_U8 qpmax_map[8]; + RK_U8 qpmin_map[8]; + RK_S32 qpmap_mode; + + /* intra fresh config */ + RK_S32 intra_refresh_mode; + RK_S32 intra_refresh_arg; + + /* slice mode config */ + RK_S32 independ_slice_mode; + RK_S32 independ_slice_arg; + RK_S32 depend_slice_mode; + RK_S32 depend_slice_arg; + + MppEncH265CuCfg cu_cfg; + MppEncH265SliceCfg slice_cfg; + MppEncH265EntropyCfg entropy_cfg; + MppEncH265TransCfg trans_cfg; + MppEncH265SaoCfg sao_cfg; + MppEncH265DblkCfg_t dblk_cfg; + MppEncH265RefCfg ref_cfg; + MppEncH265MergesCfg merge_cfg; + + /* extra info */ + MppEncH265VuiCfg vui; + + MppEncH265CtuCfg ctu; + MppEncH265RoiCfg roi; +} MppEncH265Cfg; + +/* + * motion jpeg configurable parameter + */ +typedef enum MppEncJpegCfgChange_e { + /* change on quant parameter */ + MPP_ENC_JPEG_CFG_CHANGE_QP = (1 << 0), + MPP_ENC_JPEG_CFG_CHANGE_QTABLE = (1 << 1), + MPP_ENC_JPEG_CFG_CHANGE_QFACTOR = (1 << 2), + MPP_ENC_JPEG_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppEncJpegCfgChange; + +typedef struct MppEncJpegCfg_t { + RK_U32 change; + RK_S32 quant; + /* + * quality factor config + * + * q_factor - 1 ~ 99 + * qf_max - 1 ~ 99 + * qf_min - 1 ~ 99 + * qtable_y: qtable for luma + * qtable_u: qtable for chroma + * qtable_v: default equal qtable_u + */ + RK_S32 q_factor; + RK_S32 qf_max; + RK_S32 qf_min; + RK_U8 *qtable_y; + RK_U8 *qtable_u; + RK_U8 *qtable_v; +} MppEncJpegCfg; + +/* + * vp8 configurable parameter + */ +typedef enum MppEncVP8CfgChange_e { + MPP_ENC_VP8_CFG_CHANGE_QP = (1 << 0), + MPP_ENC_VP8_CFG_CHANGE_DIS_IVF = (1 << 1), + MPP_ENC_VP8_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppEncVP8CfgChange; + +typedef struct MppEncVp8Cfg_t { + RK_U32 change; + RK_S32 quant; + + RK_S32 qp_init; + RK_S32 qp_max; + RK_S32 qp_max_i; + RK_S32 qp_min; + RK_S32 qp_min_i; + RK_S32 qp_max_step; + RK_S32 disable_ivf; +} MppEncVp8Cfg; + +/** + * @ingroup rk_mpi + * @brief MPP encoder codec configuration parameters + * @details The encoder codec configuration parameters are different for each + * compression codings. For example, H.264 encoder can configure + * profile, level, qp, etc. while jpeg encoder can configure qp + * only. The detailed parameters can refer the corresponding data + * structure such as MppEncH264Cfg and MppEncJpegCfg. This data + * structure is associated with MPP_ENC_SET_CODEC_CFG command. + */ +typedef struct MppEncCodecCfg_t { + MppCodingType coding; + + union { + RK_U32 change; + MppEncH264Cfg h264; + MppEncH265Cfg h265; + MppEncJpegCfg jpeg; + MppEncVp8Cfg vp8; + }; +} MppEncCodecCfg; + +typedef enum MppEncSliceSplit_e { + /* change on quant parameter */ + MPP_ENC_SPLIT_CFG_CHANGE_MODE = (1 << 0), + MPP_ENC_SPLIT_CFG_CHANGE_ARG = (1 << 1), + MPP_ENC_SPLIT_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppEncSliceSplitChange; + +typedef enum MppEncSplitMode_e { + MPP_ENC_SPLIT_NONE, + MPP_ENC_SPLIT_BY_BYTE, + MPP_ENC_SPLIT_BY_CTU, +} MppEncSplitMode; + +typedef struct MppEncSliceSplit_t { + RK_U32 change; + + /* + * slice split mode + * + * MPP_ENC_SPLIT_NONE - No slice is split + * MPP_ENC_SPLIT_BY_BYTE - Slice is split by byte number + * MPP_ENC_SPLIT_BY_CTU - Slice is split by macroblock / ctu number + */ + RK_U32 split_mode; + + /* + * slice split size parameter + * + * When split by byte number this value is the max byte number for each + * slice. + * When split by macroblock / ctu number this value is the MB/CTU number + * for each slice. + */ + RK_U32 split_arg; +} MppEncSliceSplit; + +/** + * @brief Mpp ROI parameter + * Region configure define a rectangle as ROI + * @note x, y, w, h are calculated in pixels, which had better be 16-pixel aligned. + * These parameters MUST retain in memory when encoder is running. + * Both absolute qp and relative qp are supported in vepu541. + * Only absolute qp is supported in rv1108 + */ +typedef struct MppEncROIRegion_t { + RK_U16 x; /**< horizontal position of top left corner */ + RK_U16 y; /**< vertical position of top left corner */ + RK_U16 w; /**< width of ROI rectangle */ + RK_U16 h; /**< height of ROI rectangle */ + RK_U16 intra; /**< flag of forced intra macroblock */ + RK_S16 quality; /**< absolute / relative qp of macroblock */ + RK_U16 qp_area_idx; /**< qp min max area select*/ + RK_U8 area_map_en; /**< enable area map */ + RK_U8 abs_qp_en; /**< absolute qp enable flag*/ +} MppEncROIRegion; + +/** + * @brief MPP encoder's ROI configuration + */ +typedef struct MppEncROICfg_t { + RK_U32 number; /**< ROI rectangle number */ + MppEncROIRegion *regions; /**< ROI parameters */ +} MppEncROICfg; + +/* + * Mpp OSD parameter + * + * Mpp OSD support total 8 regions + * Mpp OSD support 256-color palette two mode palette: + * 1. Configurable OSD palette + * When palette is set. + * 2. fixed OSD palette + * When palette is NULL. + * + * if MppEncOSDPlt.buf != NULL , palette includes maximun 256 levels, + * every level composed of 32 bits defined below: + * Y : 8 bits + * U : 8 bits + * V : 8 bits + * alpha : 8 bits + */ +#define MPP_ENC_OSD_PLT_WHITE ((255<<24)|(128<<16)|(128<<8)|235) +#define MPP_ENC_OSD_PLT_YELLOW ((255<<24)|(146<<16)|(16<<8)|210) +#define MPP_ENC_OSD_PLT_CYAN ((255<<24)|(16<<16)|(166<<8)|170) +#define MPP_ENC_OSD_PLT_GREEN ((255<<24)|(34<<16)|(54<<8)|145) +#define MPP_ENC_OSD_PLT_TRANS ((0<<24)|(222<<16)|(202<<8)|106) +#define MPP_ENC_OSD_PLT_RED ((255<<24)|(240<<16)|(90<<8)| 81) +#define MPP_ENC_OSD_PLT_BLUE ((255<<24)|(110<<16)|(240<<8)| 41) +#define MPP_ENC_OSD_PLT_BLACK ((255<<24)|(128<<16)|(128<<8)| 16) + +typedef enum MppEncOSDPltType_e { + MPP_ENC_OSD_PLT_TYPE_DEFAULT, + MPP_ENC_OSD_PLT_TYPE_USERDEF, + MPP_ENC_OSD_PLT_TYPE_BUTT, +} MppEncOSDPltType; + +/* OSD palette value define */ +typedef union MppEncOSDPltVal_u { + struct { + RK_U32 v : 8; + RK_U32 u : 8; + RK_U32 y : 8; + RK_U32 alpha : 8; + }; + RK_U32 val; +} MppEncOSDPltVal; + +typedef struct MppEncOSDPlt_t { + MppEncOSDPltVal data[256]; +} MppEncOSDPlt; + +typedef enum MppEncOSDPltCfgChange_e { + MPP_ENC_OSD_PLT_CFG_CHANGE_MODE = (1 << 0), /* change osd plt type */ + MPP_ENC_OSD_PLT_CFG_CHANGE_PLT_VAL = (1 << 1), /* change osd plt table value */ + MPP_ENC_OSD_PLT_CFG_CHANGE_ALL = (0xFFFFFFFF), +} MppEncOSDPltCfgChange; + +typedef struct MppEncOSDPltCfg_t { + RK_U32 change; + MppEncOSDPltType type; + MppEncOSDPlt *plt; +} MppEncOSDPltCfg; + +/* position info is unit in 16 pixels(one MB), and + * x-directon range in pixels = (rd_pos_x - lt_pos_x + 1) * 16; + * y-directon range in pixels = (rd_pos_y - lt_pos_y + 1) * 16; + */ +typedef struct MppEncOSDRegion_t { + RK_U32 enable; + RK_U32 inverse; + RK_U32 start_mb_x; + RK_U32 start_mb_y; + RK_U32 num_mb_x; + RK_U32 num_mb_y; + RK_U32 buf_offset; +} MppEncOSDRegion; + +/* if num_region > 0 && region==NULL + * use old osd data + */ +typedef struct MppEncOSDData_t { + MppBuffer buf; + RK_U32 num_region; + MppEncOSDRegion region[8]; +} MppEncOSDData; + +typedef struct MppEncOSDRegion2_t { + RK_U32 enable; + RK_U32 inverse; + RK_U32 start_mb_x; + RK_U32 start_mb_y; + RK_U32 num_mb_x; + RK_U32 num_mb_y; + RK_U32 buf_offset; + MppBuffer buf; +} MppEncOSDRegion2; + +typedef struct MppEncOSDData2_t { + RK_U32 num_region; + MppEncOSDRegion2 region[8]; +} MppEncOSDData2; + +typedef struct MppEncUserData_t { + RK_U32 len; + void *pdata; +} MppEncUserData; + +typedef struct MppEncUserDataFull_t { + RK_U32 len; + RK_U8 *uuid; + void *pdata; +} MppEncUserDataFull; + +typedef struct MppEncUserDataSet_t { + RK_U32 count; + MppEncUserDataFull *datas; +} MppEncUserDataSet; + +#endif /* __RK_VENC_CMD_H__ */ diff --git a/hardware/mpp/include/rk_venc_rc.h b/hardware/mpp/include/rk_venc_rc.h new file mode 100644 index 0000000000000000000000000000000000000000..d58f9e29c73cd1a468989408c21660e210e384fb --- /dev/null +++ b/hardware/mpp/include/rk_venc_rc.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __RK_VENC_RC_H__ +#define __RK_VENC_RC_H__ + +/* Rate control parameter */ +typedef enum MppEncRcMode_e { + MPP_ENC_RC_MODE_VBR, + MPP_ENC_RC_MODE_CBR, + MPP_ENC_RC_MODE_FIXQP, + MPP_ENC_RC_MODE_AVBR, + MPP_ENC_RC_MODE_BUTT +} MppEncRcMode; + +typedef enum MppEncRcPriority_e { + MPP_ENC_RC_BY_BITRATE_FIRST, + MPP_ENC_RC_BY_FRM_SIZE_FIRST, + MPP_ENC_RC_PRIORITY_BUTT +} MppEncRcPriority; + +typedef enum MppEncRcDropFrmMode_e { + MPP_ENC_RC_DROP_FRM_DISABLED, + MPP_ENC_RC_DROP_FRM_NORMAL, + MPP_ENC_RC_DROP_FRM_PSKIP, + MPP_ENC_RC_DROP_FRM_BUTT +} MppEncRcDropFrmMode; + +typedef enum MppEncRcSuperFrameMode_t { + MPP_ENC_RC_SUPER_FRM_NONE, + MPP_ENC_RC_SUPER_FRM_DROP, + MPP_ENC_RC_SUPER_FRM_REENC, + MPP_ENC_RC_SUPER_FRM_BUTT +} MppEncRcSuperFrameMode; + +typedef enum MppEncRcGopMode_e { + MPP_ENC_RC_NORMAL_P, + MPP_ENC_RC_SMART_P, + MPP_ENC_RC_GOP_MODE_BUTT, +} MppEncRcGopMode; + +#endif /* __RK_VENC_RC_H__ */ diff --git a/hardware/mpp/include/rk_venc_ref.h b/hardware/mpp/include/rk_venc_ref.h new file mode 100644 index 0000000000000000000000000000000000000000..fff7d862c7d6c14307e4d20189475c1303dc20d6 --- /dev/null +++ b/hardware/mpp/include/rk_venc_ref.h @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __RK_VENC_REF_H__ +#define __RK_VENC_REF_H__ + +#include "rk_type.h" +#include "mpp_err.h" + +/* + * MPP reference management system follows the model of H.264/H.265 reference + * frame mangement. + * + * The reference frame is defined into two type: long-term reference frame and + * short-refernce frame (lt_ref and st_ref). + * + * The lt_ref can be only indexed by long-term reference frame index (lt_idx). + * The st_ref can be indexed by its temporal id (tid) and previous count. + * + * MppEncRefMode defined the way for user to reference the required frame. + * + * Normal reference mode without argument + * REF_TO_PREV_REF_FRM - refer to previous reference frame in encode order (No matter Lt or St) + * REF_TO_PREV_ST_REF - refer to previous short-term reference frame + * REF_TO_PREV_LT_REF - refer to previous long-term reference frame + * REF_TO_PREV_INTRA - refer to previous Intra / IDR frame + * REF_TO_ST_REF_SETUP - refer to refernce frame defined in StRefSetup + * + * Normal reference mode with argument + * REF_TO_TEMPORAL_LAYER - refer to previous reference frame with temporal id argument + * REF_TO_LT_REF_IDX - refer to long-term reference frame with lt_ref_idx argument + * REF_TO_ST_PREV_N_REF - refer to short-term reference frame with diff frame_num argument + * + * Long-term reference only mode + * REF_TO_ST_REF_SETUP - use corresponding mode of original short-term reference frame + * + * Short-term reference only mode + * REF_TO_LT_REF_SETUP - indicate that this frame will be overwrited by long-term config + * + * By combining frames with these modes user can define many kinds of reference hierarchy + * structure. But normally user should use simplified preset hierarchy pattern. + * + * The rules for virtual cpb management is similiar to H.264/H.265 + * 1. When one frame is marked as long-term reference frame it will be kept in cpb until + * it is replaced by other frame with the same lt_idx or IDR frame. + * 2. When one frame is marked as short-term reference frame it will be inert into cpb when + * there is enough storage space. When the number of total sum of long-term and short-term + * reference frame excess the cpb size limit the oldest short-term frame will be removed. + * This is call sliding window in H.264. + */ + +/* max 4 temporal layer */ +#define MPP_ENC_MAX_TEMPORAL_LAYER_NUM 4 +/* max 4 long-term reference frame */ +#define MPP_ENC_MAX_LT_REF_NUM 16 + +/* + * Group Of Picture (GOP) config is separated into three parts: + * + * 1. Intra / IDR frame config + * igop - the interval of two intra / IDR frames + * + * 2. Long-term reference config (MppEncRefLtFrmCfg) + * + * Setup long-term reference index max lt_idx, loop interval and reference + * mode for auto long-term reference frame generation. The encoder will + * mark frame to be long-term reference frame with given interval. + * + * 2.1 lt_idx + * The long-term reference frame index is unique identifier for a long-term + * reference frame. + * The max long-term reference frame index should NOT larger than + * max_num_ref_frames in sps. + * + * 2.2 lt_gap + * When lt_gap is zero the long-term reference frame generation is disabled. + * When lt_gap is non-zero (usually 2~3 second interval) then the long-term + * reference frame will be generated for error recovery or smart hierarchy. + * + * 2.2 lt_delay + * The lt_delay is the delay time for generation of long-term reference frame. + * The start point of lt_delay is the IDR/intra frame genertaed by igop. + * + * 2.4 ref_mode: Long-term refernce frame reference mode + * NOTE: temporal id of longterm reference frame is always zero. + * + * Examples: + * Sequence has only one lt_ref 0 and setup one long-term reference frame + * every 300 frame. + * { + * .lt_idx = 0, + * .lt_gap = 300, + * .lt_delay = 0, + * } + * result: + * frame 0 ...... 299 300 301 ...... 599 600 601 + * lt_idx 0 xxxxxx x 0 x xxxxxx x 0 x + * + * Sequence has lt_ref from 0 to 2 and setup a long-term reference frame + * every 100 frame. + * { + * .lt_idx = 0, + * .lt_gap = 300, + * .lt_delay = 0, + * } + * { + * .lt_idx = 1, + * .lt_gap = 300, + * .lt_delay = 100, + * } + * { + * .lt_idx = 2, + * .lt_gap = 300, + * .lt_delay = 200, + * } + * result: + * frame 0 ... 99 100 101 ... 199 200 201 ... 299 300 301 + * lt_idx 0 xxx x 1 x xxx x 2 x xxx x 0 x + * + * 3. Short-term reference config (MppEncStRefSetup) + * + * 3.1 is_non_ref + * The is_non_ref indicated the current frame is reference frame or not. + * + * 3.2 temporal_id + * The temporal id of the current frame configure. + * + * 3.3 ref_mode: short-term refernce frame reference mode + * + * 3.4 repeat + * The repeat time of the short-term reference frame configure. + * The overall frame count with the same config is repeat + 1. + * + * Examples: + * + */ + +#define REF_MODE_MODE_MASK (0x1F) +#define REF_MODE_ARG_MASK (0xFFFF0000) + +typedef enum MppEncRefMode_e { + /* max 32 mode in 32-bit */ + /* for default ref global config */ + REF_MODE_GLOBAL, + REF_TO_PREV_REF_FRM = REF_MODE_GLOBAL, + REF_TO_PREV_ST_REF, + REF_TO_PREV_LT_REF, + REF_TO_PREV_INTRA, + + /* for global config with args */ + REF_MODE_GLOBAL_WITH_ARG = 0x4, + /* with ref arg as temporal layer id */ + REF_TO_TEMPORAL_LAYER = REF_MODE_GLOBAL_WITH_ARG, + /* with ref arg as long-term reference picture index */ + REF_TO_LT_REF_IDX, + /* with ref arg as short-term reference picture difference frame_num */ + REF_TO_ST_PREV_N_REF, + REF_MODE_GLOBAL_BUTT, + + /* for lt-ref */ + REF_MODE_LT = 0x18, + REF_TO_ST_REF_SETUP, + REF_MODE_LT_BUTT, + + /* for st-ref */ + REF_MODE_ST = 0x1C, + REF_TO_LT_REF_SETUP, + REF_MODE_ST_BUTT, +} MppEncRefMode; + +typedef struct MppEncRefLtFrmCfg_t { + RK_S32 lt_idx; /* lt_idx of the reference frame */ + RK_S32 temporal_id; /* temporal_id of the reference frame */ + MppEncRefMode ref_mode; + RK_S32 ref_arg; + RK_S32 lt_gap; /* gap between two lt-ref with same lt_idx */ + RK_S32 lt_delay; /* delay offset to igop start frame */ +} MppEncRefLtFrmCfg; + +typedef struct MppEncRefStFrmCfg_t { + RK_S32 is_non_ref; + RK_S32 temporal_id; + MppEncRefMode ref_mode; + RK_S32 ref_arg; + RK_S32 repeat; /* repeat times */ +} MppEncRefStFrmCfg; + +typedef struct MppEncRefPreset_t { + /* input parameter for query */ + const char *name; + RK_S32 max_lt_cnt; + RK_S32 max_st_cnt; + MppEncRefLtFrmCfg *lt_cfg; + MppEncRefStFrmCfg *st_cfg; + + /* output parameter */ + RK_S32 lt_cnt; + RK_S32 st_cnt; +} MppEncRefPreset; + +typedef void* MppEncRefCfg; + +#ifdef __cplusplus +extern "C" { +#endif + +MPP_RET mpp_enc_ref_cfg_init(MppEncRefCfg *ref); +MPP_RET mpp_enc_ref_cfg_deinit(MppEncRefCfg *ref); + +MPP_RET mpp_enc_ref_cfg_reset(MppEncRefCfg ref); +MPP_RET mpp_enc_ref_cfg_set_cfg_cnt(MppEncRefCfg ref, RK_S32 lt_cnt, RK_S32 st_cnt); +MPP_RET mpp_enc_ref_cfg_add_lt_cfg(MppEncRefCfg ref, RK_S32 cnt, MppEncRefLtFrmCfg *frm); +MPP_RET mpp_enc_ref_cfg_add_st_cfg(MppEncRefCfg ref, RK_S32 cnt, MppEncRefStFrmCfg *frm); +MPP_RET mpp_enc_ref_cfg_check(MppEncRefCfg ref); + +/* + * A new reference configure will restart a new gop and clear cpb by default. + * The keep cpb function will let encoder keeps the current cpb status and do NOT + * reset all the reference frame in cpb. + */ +MPP_RET mpp_enc_ref_cfg_set_keep_cpb(MppEncRefCfg ref, RK_S32 keep); +MPP_RET mpp_enc_ref_cfg_get_preset(MppEncRefPreset *preset); +MPP_RET mpp_enc_ref_cfg_show(MppEncRefCfg ref); + +#ifdef __cplusplus +} +#endif + +#endif /* __RK_VENC_REF_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/vcodec_service.h b/hardware/mpp/include/vcodec_service.h new file mode 100644 index 0000000000000000000000000000000000000000..5d4bc075c60ea63cc7098c978a3c86f019614cb9 --- /dev/null +++ b/hardware/mpp/include/vcodec_service.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __VCODEC_SERVICE_H__ +#define __VCODEC_SERVICE_H__ + +#include "rk_type.h" + +#define EXTRA_INFO_MAGIC (0x4C4A46) + +#define VPU_IOC_MAGIC 'l' + +#define VPU_IOC_SET_CLIENT_TYPE _IOW(VPU_IOC_MAGIC, 1, unsigned long) +#define VPU_IOC_GET_HW_FUSE_STATUS _IOW(VPU_IOC_MAGIC, 2, unsigned long) +#define VPU_IOC_SET_REG _IOW(VPU_IOC_MAGIC, 3, unsigned long) +#define VPU_IOC_GET_REG _IOW(VPU_IOC_MAGIC, 4, unsigned long) + +#define VPU_IOC_SET_CLIENT_TYPE_U32 _IOW(VPU_IOC_MAGIC, 1, unsigned int) + +#define VPU_IOC_WRITE(nr, size) _IOC(_IOC_WRITE, VPU_IOC_MAGIC, (nr), (size)) + +#define VDPU1_REGISTERS (101) +#define VDPU2_REGISTERS (159) +#define VDPU1_PP_REGISTERS (164) +#define VDPU2_PP_REGISTERS (184) +#define RKHEVC_REGISTERS (68) +#define RKVDEC_REGISTERS (78) +#define AVSD_REGISTERS (60) + +#define VEPU1_REGISTERS (164) +#define VEPU2_REGISTERS (184) +#define RKVENC_REGISTERS (140) + +#define EXTRA_INFO_SIZE (sizeof(RK_U32) * 34) + +#ifdef __cplusplus +extern "C" { +#endif + +const char *mpp_get_vcodec_dev_name(MppCtxType type, MppCodingType coding); + +#ifdef __cplusplus +} +#endif + +#endif /* __VCODEC_SERVICE_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/vcodec_service_api.h b/hardware/mpp/include/vcodec_service_api.h new file mode 100644 index 0000000000000000000000000000000000000000..1bff2cf1020c80f6dd0842d4c05e2f61c9759293 --- /dev/null +++ b/hardware/mpp/include/vcodec_service_api.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __VCODEC_SERVICE_API_H__ +#define __VCODEC_SERVICE_API_H__ + +#include "mpp_device.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern const MppDevApi vcodec_service_api; + +#ifdef __cplusplus +} +#endif + +#endif /* __VCODEC_SERVICE_API_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/vpu.h b/hardware/mpp/include/vpu.h new file mode 100644 index 0000000000000000000000000000000000000000..8c2ea49e8199624275433fb56c1dfc7ff1fdcd44 --- /dev/null +++ b/hardware/mpp/include/vpu.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __VPU_H__ +#define __VPU_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "rk_type.h" + +#define VPU_SUCCESS (0) +#define VPU_FAILURE (-1) + +#define VPU_HW_WAIT_OK VPU_SUCCESS +#define VPU_HW_WAIT_ERROR VPU_FAILURE +#define VPU_HW_WAIT_TIMEOUT 1 + +// vpu decoder 60 registers, size 240B +#define VPU_REG_NUM_DEC (60) +// vpu post processor 41 registers, size 164B +#define VPU_REG_NUM_PP (41) +// vpu decoder + post processor 101 registers, size 404B +#define VPU_REG_NUM_DEC_PP (VPU_REG_NUM_DEC+VPU_REG_NUM_PP) +// vpu encoder 96 registers, size 384B +#define VPU_REG_NUM_ENC (96) + +typedef enum { + VPU_ENC = 0x0, + VPU_DEC = 0x1, + VPU_PP = 0x2, + VPU_DEC_PP = 0x3, + VPU_DEC_HEVC = 0x4, + VPU_DEC_RKV = 0x5, + VPU_ENC_RKV = 0x6, + VPU_DEC_AVS = 0x7, + VPU_ENC_VEPU22 = 0x8, + VPU_TYPE_BUTT, +} VPU_CLIENT_TYPE; + +/* Hardware decoder configuration description */ + +typedef struct VPUHwDecConfig { + RK_U32 maxDecPicWidth; /* Maximum video decoding width supported */ + RK_U32 maxPpOutPicWidth; /* Maximum output width of Post-Processor */ + RK_U32 h264Support; /* HW supports h.264 */ + RK_U32 jpegSupport; /* HW supports JPEG */ + RK_U32 mpeg4Support; /* HW supports MPEG-4 */ + RK_U32 customMpeg4Support; /* HW supports custom MPEG-4 features */ + RK_U32 vc1Support; /* HW supports VC-1 Simple */ + RK_U32 mpeg2Support; /* HW supports MPEG-2 */ + RK_U32 ppSupport; /* HW supports post-processor */ + RK_U32 ppConfig; /* HW post-processor functions bitmask */ + RK_U32 sorensonSparkSupport; /* HW supports Sorenson Spark */ + RK_U32 refBufSupport; /* HW supports reference picture buffering */ + RK_U32 vp6Support; /* HW supports VP6 */ + RK_U32 vp7Support; /* HW supports VP7 */ + RK_U32 vp8Support; /* HW supports VP8 */ + RK_U32 avsSupport; /* HW supports AVS */ + RK_U32 jpegESupport; /* HW supports JPEG extensions */ + RK_U32 rvSupport; /* HW supports REAL */ + RK_U32 mvcSupport; /* HW supports H264 MVC extension */ +} VPUHwDecConfig_t; + +/* Hardware encoder configuration description */ + +typedef struct VPUHwEndConfig { + RK_U32 maxEncodedWidth; /* Maximum supported width for video encoding (not JPEG) */ + RK_U32 h264Enabled; /* HW supports H.264 */ + RK_U32 jpegEnabled; /* HW supports JPEG */ + RK_U32 mpeg4Enabled; /* HW supports MPEG-4 */ + RK_U32 vsEnabled; /* HW supports video stabilization */ + RK_U32 rgbEnabled; /* HW supports RGB input */ + RK_U32 reg_size; /* HW bus type in use */ + RK_U32 reserv[2]; +} VPUHwEncConfig_t; + +typedef enum { + // common command + VPU_CMD_REGISTER, + VPU_CMD_REGISTER_ACK_OK, + VPU_CMD_REGISTER_ACK_FAIL, + VPU_CMD_UNREGISTER, + + VPU_SEND_CONFIG, + VPU_SEND_CONFIG_ACK_OK, + VPU_SEND_CONFIG_ACK_FAIL, + + VPU_GET_HW_INFO, + VPU_GET_HW_INFO_ACK_OK, + VPU_GET_HW_INFO_ACK_FAIL, + + VPU_CMD_BUTT, +} VPU_CMD_TYPE; + +int VPUClientInit(VPU_CLIENT_TYPE type); +RK_S32 VPUClientRelease(int socket); +RK_S32 VPUClientSendReg(int socket, RK_U32 *regs, RK_U32 nregs); +RK_S32 VPUClientSendReg2(RK_S32 socket, RK_S32 offset, RK_S32 size, void *param); +RK_S32 VPUClientWaitResult(int socket, RK_U32 *regs, RK_U32 nregs, VPU_CMD_TYPE *cmd, RK_S32 *len); +RK_S32 VPUClientGetHwCfg(int socket, RK_U32 *cfg, RK_U32 cfg_size); +RK_S32 VPUClientGetIOMMUStatus(void); +RK_U32 VPUCheckSupportWidth(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __VPU_H__ */ \ No newline at end of file diff --git a/hardware/mpp/include/vpu_api.h b/hardware/mpp/include/vpu_api.h new file mode 100644 index 0000000000000000000000000000000000000000..cf0f76d80c33ffe801c4e1280b66e50ca793eaed --- /dev/null +++ b/hardware/mpp/include/vpu_api.h @@ -0,0 +1,467 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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 __VPU_API_H__ +#define __VPU_API_H__ + +#include "rk_type.h" + +/** + * @brief rockchip media process interface + */ + +#define VPU_API_NOPTS_VALUE (0x8000000000000000LL) + +/* + * bit definition of ColorType in structure VPU_FRAME + */ +#define VPU_OUTPUT_FORMAT_TYPE_MASK (0x0000ffff) +#define VPU_OUTPUT_FORMAT_ARGB8888 (0x00000000) +#define VPU_OUTPUT_FORMAT_ABGR8888 (0x00000001) +#define VPU_OUTPUT_FORMAT_RGB888 (0x00000002) +#define VPU_OUTPUT_FORMAT_RGB565 (0x00000003) +#define VPU_OUTPUT_FORMAT_RGB555 (0x00000004) +#define VPU_OUTPUT_FORMAT_YUV420_SEMIPLANAR (0x00000005) +#define VPU_OUTPUT_FORMAT_YUV420_PLANAR (0x00000006) +#define VPU_OUTPUT_FORMAT_YUV422 (0x00000007) +#define VPU_OUTPUT_FORMAT_YUV444 (0x00000008) +#define VPU_OUTPUT_FORMAT_YCH420 (0x00000009) +#define VPU_OUTPUT_FORMAT_BIT_MASK (0x000f0000) +#define VPU_OUTPUT_FORMAT_BIT_8 (0x00000000) +#define VPU_OUTPUT_FORMAT_BIT_10 (0x00010000) +#define VPU_OUTPUT_FORMAT_BIT_12 (0x00020000) +#define VPU_OUTPUT_FORMAT_BIT_14 (0x00030000) +#define VPU_OUTPUT_FORMAT_BIT_16 (0x00040000) +#define VPU_OUTPUT_FORMAT_COLORSPACE_MASK (0x00f00000) +#define VPU_OUTPUT_FORMAT_COLORSPACE_BT709 (0x00100000) +#define VPU_OUTPUT_FORMAT_COLORSPACE_BT2020 (0x00200000) +#define VPU_OUTPUT_FORMAT_DYNCRANGE_MASK (0x0f000000) +#define VPU_OUTPUT_FORMAT_DYNCRANGE_SDR (0x00000000) +#define VPU_OUTPUT_FORMAT_DYNCRANGE_HDR10 (0x01000000) +#define VPU_OUTPUT_FORMAT_DYNCRANGE_HDR_HLG (0x02000000) +#define VPU_OUTPUT_FORMAT_DYNCRANGE_HDR_DOLBY (0x03000000) + +/** + * @brief input picture type + */ +typedef enum { + ENC_INPUT_YUV420_PLANAR = 0, /**< YYYY... UUUU... VVVV */ + ENC_INPUT_YUV420_SEMIPLANAR = 1, /**< YYYY... UVUVUV... */ + ENC_INPUT_YUV422_INTERLEAVED_YUYV = 2, /**< YUYVYUYV... */ + ENC_INPUT_YUV422_INTERLEAVED_UYVY = 3, /**< UYVYUYVY... */ + ENC_INPUT_RGB565 = 4, /**< 16-bit RGB */ + ENC_INPUT_BGR565 = 5, /**< 16-bit RGB */ + ENC_INPUT_RGB555 = 6, /**< 15-bit RGB */ + ENC_INPUT_BGR555 = 7, /**< 15-bit RGB */ + ENC_INPUT_RGB444 = 8, /**< 12-bit RGB */ + ENC_INPUT_BGR444 = 9, /**< 12-bit RGB */ + ENC_INPUT_RGB888 = 10, /**< 24-bit RGB */ + ENC_INPUT_BGR888 = 11, /**< 24-bit RGB */ + ENC_INPUT_RGB101010 = 12, /**< 30-bit RGB */ + ENC_INPUT_BGR101010 = 13 /**< 30-bit RGB */ +} EncInputPictureType; + +typedef enum VPU_API_CMD { + VPU_API_ENC_SETCFG, + VPU_API_ENC_GETCFG, + VPU_API_ENC_SETFORMAT, + VPU_API_ENC_SETIDRFRAME, + + VPU_API_ENABLE_DEINTERLACE, + VPU_API_SET_VPUMEM_CONTEXT, + VPU_API_USE_PRESENT_TIME_ORDER, + VPU_API_SET_DEFAULT_WIDTH_HEIGH, + VPU_API_SET_INFO_CHANGE, + VPU_API_USE_FAST_MODE, + VPU_API_DEC_GET_STREAM_COUNT, + VPU_API_GET_VPUMEM_USED_COUNT, + VPU_API_GET_FRAME_INFO, + VPU_API_SET_OUTPUT_BLOCK, + VPU_API_GET_EOS_STATUS, + VPU_API_SET_OUTPUT_MODE, + + /* get sps/pps header */ + VPU_API_GET_EXTRA_INFO = 0x200, + + VPU_API_SET_IMMEDIATE_OUT = 0x1000, + VPU_API_SET_PARSER_SPLIT_MODE, /* NOTE: should control before init */ + + VPU_API_ENC_VEPU22_START = 0x2000, + VPU_API_ENC_SET_VEPU22_CFG, + VPU_API_ENC_GET_VEPU22_CFG, + VPU_API_ENC_SET_VEPU22_CTU_QP, + VPU_API_ENC_SET_VEPU22_ROI, + + /* mlvec dynamic configure */ + VPU_API_ENC_MLVEC_CFG = 0x4000, + VPU_API_ENC_SET_MAX_TID, + VPU_API_ENC_SET_MARK_LTR, + VPU_API_ENC_SET_USE_LTR, + VPU_API_ENC_SET_FRAME_QP, + VPU_API_ENC_SET_BASE_LAYER_PID, +} VPU_API_CMD; + +typedef struct { + RK_U32 TimeLow; + RK_U32 TimeHigh; +} TIME_STAMP; + +typedef struct { + RK_U32 CodecType; + RK_U32 ImgWidth; + RK_U32 ImgHeight; + RK_U32 ImgHorStride; + RK_U32 ImgVerStride; + RK_U32 BufSize; +} VPU_GENERIC; + +typedef struct VPUMem { + RK_U32 phy_addr; + RK_U32 *vir_addr; + RK_U32 size; + RK_U32 *offset; +} VPUMemLinear_t; + +typedef struct tVPU_FRAME { + RK_U32 FrameBusAddr[2]; // 0: Y address; 1: UV address; + RK_U32 FrameWidth; // buffer horizontal stride + RK_U32 FrameHeight; // buffer vertical stride + RK_U32 OutputWidth; // deprecated + RK_U32 OutputHeight; // deprecated + RK_U32 DisplayWidth; // valid width for display + RK_U32 DisplayHeight; // valid height for display + RK_U32 CodingType; + RK_U32 FrameType; // frame; top_field_first; bot_field_first + RK_U32 ColorType; + RK_U32 DecodeFrmNum; + TIME_STAMP ShowTime; + RK_U32 ErrorInfo; // error information + RK_U32 employ_cnt; + VPUMemLinear_t vpumem; + struct tVPU_FRAME *next_frame; + union { + struct { + RK_U32 Res0[2]; + struct { + RK_U32 ColorPrimaries : 8; + RK_U32 ColorTransfer : 8; + RK_U32 ColorCoeffs : 8; + RK_U32 ColorRange : 1; + RK_U32 Res1 : 7; + }; + + RK_U32 Res2; + }; + + RK_U32 Res[4]; + }; +} VPU_FRAME; + +typedef struct VideoPacket { + RK_S64 pts; /* with unit of us */ + RK_S64 dts; /* with unit of us */ + RK_U8 *data; + RK_S32 size; + RK_U32 capability; + RK_U32 nFlags; +} VideoPacket_t; + +typedef struct DecoderOut { + RK_U8 *data; + RK_U32 size; + RK_S64 timeUs; + RK_S32 nFlags; +} DecoderOut_t; + +typedef struct ParserOut { + RK_U8 *data; + RK_U32 size; + RK_S64 timeUs; + RK_U32 nFlags; + RK_U32 width; + RK_U32 height; +} ParserOut_t; + +typedef struct EncInputStream { + RK_U8 *buf; + RK_S32 size; + RK_U32 bufPhyAddr; + RK_S64 timeUs; + RK_U32 nFlags; +} EncInputStream_t; + +typedef struct EncoderOut { + RK_U8 *data; + RK_S32 size; + RK_S64 timeUs; + RK_S32 keyFrame; +} EncoderOut_t; + +/* + * @brief Enumeration used to define the possible video compression codings. + * @note This essentially refers to file extensions. If the coding is + * being used to specify the ENCODE type, then additional work + * must be done to configure the exact flavor of the compression + * to be used. For decode cases where the user application can + * not differentiate between MPEG-4 and H.264 bit streams, it is + * up to the codec to handle this. + * + * sync with the omx_video.h + */ +typedef enum OMX_RK_VIDEO_CODINGTYPE { + OMX_RK_VIDEO_CodingUnused, /**< Value when coding is N/A */ + OMX_RK_VIDEO_CodingAutoDetect, /**< Autodetection of coding type */ + OMX_RK_VIDEO_CodingMPEG2, /**< AKA: H.262 */ + OMX_RK_VIDEO_CodingH263, /**< H.263 */ + OMX_RK_VIDEO_CodingMPEG4, /**< MPEG-4 */ + OMX_RK_VIDEO_CodingWMV, /**< Windows Media Video (WMV1,WMV2,WMV3)*/ + OMX_RK_VIDEO_CodingRV, /**< all versions of Real Video */ + OMX_RK_VIDEO_CodingAVC, /**< H.264/AVC */ + OMX_RK_VIDEO_CodingMJPEG, /**< Motion JPEG */ + OMX_RK_VIDEO_CodingVP8, /**< VP8 */ + OMX_RK_VIDEO_CodingVP9, /**< VP9 */ + OMX_RK_VIDEO_CodingVC1 = 0x01000000, /**< Windows Media Video (WMV1,WMV2,WMV3)*/ + OMX_RK_VIDEO_CodingFLV1, /**< Sorenson H.263 */ + OMX_RK_VIDEO_CodingDIVX3, /**< DIVX3 */ + OMX_RK_VIDEO_CodingVP6, + OMX_RK_VIDEO_CodingHEVC, /**< H.265/HEVC */ + OMX_RK_VIDEO_CodingAVS, /**< AVS+ */ + OMX_RK_VIDEO_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ + OMX_RK_VIDEO_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */ + OMX_RK_VIDEO_CodingMax = 0x7FFFFFFF +} OMX_RK_VIDEO_CODINGTYPE; + +typedef enum CODEC_TYPE { + CODEC_NONE, + CODEC_DECODER, + CODEC_ENCODER, + CODEC_BUTT, +} CODEC_TYPE; + +typedef enum VPU_API_ERR { + VPU_API_OK = 0, + VPU_API_ERR_UNKNOW = -1, + VPU_API_ERR_BASE = -1000, + VPU_API_ERR_LIST_STREAM = VPU_API_ERR_BASE - 1, + VPU_API_ERR_INIT = VPU_API_ERR_BASE - 2, + VPU_API_ERR_VPU_CODEC_INIT = VPU_API_ERR_BASE - 3, + VPU_API_ERR_STREAM = VPU_API_ERR_BASE - 4, + VPU_API_ERR_FATAL_THREAD = VPU_API_ERR_BASE - 5, + VPU_API_EOS_STREAM_REACHED = VPU_API_ERR_BASE - 11, + + VPU_API_ERR_BUTT, +} VPU_API_ERR; + +typedef enum VPU_FRAME_ERR { + VPU_FRAME_ERR_UNKNOW = 0x0001, + VPU_FRAME_ERR_UNSUPPORT = 0x0002, +} VPU_FRAME_ERR; + +typedef struct EncParameter { + RK_S32 width; + RK_S32 height; + RK_S32 rc_mode; /* 0 - CQP mode; 1 - CBR mode; 2 - FIXQP mode */ + RK_S32 bitRate; /* target bitrate */ + RK_S32 framerate; + RK_S32 qp; + RK_S32 enableCabac; + RK_S32 cabacInitIdc; + RK_S32 format; + RK_S32 intraPicRate; + RK_S32 framerateout; + RK_S32 profileIdc; + RK_S32 levelIdc; + RK_S32 reserved[3]; +} EncParameter_t; + +typedef struct EXtraCfg { + RK_S32 vc1extra_size; + RK_S32 vp6codeid; + RK_S32 tsformat; + RK_U32 ori_vpu; /* use origin vpu framework */ + /* below used in decode */ + RK_U32 mpp_mode; /* use mpp framework */ + RK_U32 bit_depth; /* 8 or 10 bit */ + RK_U32 yuv_format; /* 0:420 1:422 2:444 */ + RK_U32 reserved[16]; +} EXtraCfg_t; + +/** + * @brief vpu function interface + */ +typedef struct VpuCodecContext { + void* vpuApiObj; + + CODEC_TYPE codecType; + OMX_RK_VIDEO_CODINGTYPE videoCoding; + + RK_U32 width; + RK_U32 height; + void *extradata; + RK_S32 extradata_size; + + RK_U8 enableparsing; + + RK_S32 no_thread; + EXtraCfg_t extra_cfg; + + void* private_data; + + /* + ** 1: error state(not working) 0: working + */ + RK_S32 decoder_err; + + /** + * Allocate and initialize an VpuCodecContext. + * + * @param ctx The context of vpu api, allocated in this function. + * @param extraData The extra data of codec, some codecs need / can + * use extradata like Huffman tables, also live VC1 codec can + * use extradata to initialize itself. + * @param extra_size The size of extra data. + * + * @return 0 for init success, others for failure. + * @note check whether ctx has been allocated success after you do init. + */ + RK_S32 (*init)(struct VpuCodecContext *ctx, RK_U8 *extraData, RK_U32 extra_size); + /** + * @brief both send video stream packet to decoder and get video frame from + * decoder at the same time + * @param ctx The context of vpu codec + * @param pkt[in] Stream to be decoded + * @param aDecOut[out] Decoding frame + * @return 0 for decode success, others for failure. + */ + RK_S32 (*decode)(struct VpuCodecContext *ctx, VideoPacket_t *pkt, DecoderOut_t *aDecOut); + /** + * @brief both send video frame to encoder and get encoded video stream from + * encoder at the same time. + * @param ctx The context of vpu codec + * @param aEncInStrm[in] Frame to be encoded + * @param aEncOut[out] Encoding stream + * @return 0 for encode success, others for failure. + */ + RK_S32 (*encode)(struct VpuCodecContext *ctx, EncInputStream_t *aEncInStrm, EncoderOut_t *aEncOut); + /** + * @brief flush codec while do fast forward playing. + * @param ctx The context of vpu codec + * @return 0 for flush success, others for failure. + */ + RK_S32 (*flush)(struct VpuCodecContext *ctx); + RK_S32 (*control)(struct VpuCodecContext *ctx, VPU_API_CMD cmdType, void* param); + /** + * @brief send video stream packet to decoder only, async interface + * @param ctx The context of vpu codec + * @param pkt Stream to be decoded + * @return 0 for success, others for failure. + */ + RK_S32 (*decode_sendstream)(struct VpuCodecContext *ctx, VideoPacket_t *pkt); + /** + * @brief get video frame from decoder only, async interface + * @param ctx The context of vpu codec + * @param aDecOut Decoding frame + * @return 0 for success, others for failure. + */ + RK_S32 (*decode_getframe)(struct VpuCodecContext *ctx, DecoderOut_t *aDecOut); + /** + * @brief send video frame to encoder only, async interface + * @param ctx The context of vpu codec + * @param aEncInStrm Frame to be encoded + * @return 0 for success, others for failure. + */ + RK_S32 (*encoder_sendframe)(struct VpuCodecContext *ctx, EncInputStream_t *aEncInStrm); + /** + * @brief get encoded video packet from encoder only, async interface + * @param ctx The context of vpu codec + * @param aEncOut Encoding stream + * @return 0 for success, others for failure. + */ + RK_S32 (*encoder_getstream)(struct VpuCodecContext *ctx, EncoderOut_t *aEncOut); +} VpuCodecContext_t; + +/* allocated vpu codec context */ +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @brief open context of vpu + * @param ctx pointer of vpu codec context + */ +RK_S32 vpu_open_context(struct VpuCodecContext **ctx); +/** + * @brief close context of vpu + * @param ctx pointer of vpu codec context + */ +RK_S32 vpu_close_context(struct VpuCodecContext **ctx); + +#ifdef __cplusplus +} +#endif + +/* + * vpu_mem api + */ +#define vpu_display_mem_pool_FIELDS \ + RK_S32 (*commit_hdl)(vpu_display_mem_pool *p, RK_S32 hdl, RK_S32 size); \ + void* (*get_free)(vpu_display_mem_pool *p); \ + RK_S32 (*inc_used)(vpu_display_mem_pool *p, void *hdl); \ + RK_S32 (*put_used)(vpu_display_mem_pool *p, void *hdl); \ + RK_S32 (*reset)(vpu_display_mem_pool *p); \ + RK_S32 (*get_unused_num)(vpu_display_mem_pool *p); \ + RK_S32 buff_size; \ + float version; \ + RK_S32 res[18]; + +typedef struct vpu_display_mem_pool vpu_display_mem_pool; + +struct vpu_display_mem_pool { + vpu_display_mem_pool_FIELDS +}; + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* + * vpu memory handle interface + */ +RK_S32 VPUMemJudgeIommu(void); +RK_S32 VPUMallocLinear(VPUMemLinear_t *p, RK_U32 size); +RK_S32 VPUFreeLinear(VPUMemLinear_t *p); +RK_S32 VPUMemDuplicate(VPUMemLinear_t *dst, VPUMemLinear_t *src); +RK_S32 VPUMemLink(VPUMemLinear_t *p); +RK_S32 VPUMemFlush(VPUMemLinear_t *p); +RK_S32 VPUMemClean(VPUMemLinear_t *p); +RK_S32 VPUMemInvalidate(VPUMemLinear_t *p); +RK_S32 VPUMemGetFD(VPUMemLinear_t *p); +RK_S32 VPUMallocLinearFromRender(VPUMemLinear_t *p, RK_U32 size, void *ctx); + +/* + * vpu memory allocator and manager interface + */ +vpu_display_mem_pool* open_vpu_memory_pool(void); +void close_vpu_memory_pool(vpu_display_mem_pool *p); +int create_vpu_memory_pool_allocator(vpu_display_mem_pool **ipool, int num, int size); +void release_vpu_memory_pool_allocator(vpu_display_mem_pool *ipool); + +#ifdef __cplusplus +} +#endif + +#endif /* __VPU_API_H__ */ diff --git a/hardware/mpp/lib/librockchip_mpp.z.so b/hardware/mpp/lib/librockchip_mpp.z.so new file mode 100755 index 0000000000000000000000000000000000000000..d9a331ed071b9d12d3deedc6498d44e4295ab389 Binary files /dev/null and b/hardware/mpp/lib/librockchip_mpp.z.so differ diff --git a/hardware/mpp/lib64/librockchip_mpp.so b/hardware/mpp/lib64/librockchip_mpp.so new file mode 100644 index 0000000000000000000000000000000000000000..97ba171d4c725c36ce692077e8c93645ab3f592e Binary files /dev/null and b/hardware/mpp/lib64/librockchip_mpp.so differ diff --git a/hardware/mpp/src/mpi_enc_utils.c b/hardware/mpp/src/mpi_enc_utils.c new file mode 100644 index 0000000000000000000000000000000000000000..e8c4643e963558abae6779542cb32bef25de5c7d --- /dev/null +++ b/hardware/mpp/src/mpi_enc_utils.c @@ -0,0 +1,900 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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. + */ + +#define MODULE_TAG "mpi_enc_utils" + +#include +#include "securec.h" +#include "mpp_mem.h" +#include "mpp_log.h" +#include "mpp_buffer.h" +#include "rk_mpi.h" +#include "mpp_common.h" +#include "mpi_enc_utils.h" + +static MPP_RET mpi_enc_gen_ref_cfg(MppEncRefCfg ref, RK_S32 gop_mode) +{ + MppEncRefLtFrmCfg lt_ref[4]; + MppEncRefStFrmCfg st_ref[16]; + RK_S32 lt_cnt = 0; + RK_S32 st_cnt = 0; + MPP_RET ret = 0; + + errno_t eok = memset_s(<_ref, sizeof(lt_ref), 0, sizeof(lt_ref)); + if (eok != EOK) { + mpp_err("memset_s failed\n"); + return MPP_NOK; + } + eok = memset_s(&st_ref, sizeof(st_ref), 0, sizeof(st_ref)); + if (eok != EOK) { + mpp_err("memset_s failed\n"); + return MPP_NOK; + } + + switch (gop_mode) { + case 3 : { + // tsvc4 + // /-> P1 /-> P3 /-> P5 /-> P7 + // / / / / + // //--------> P2 //--------> P6 + // // // + // ///---------------------> P4 + // /// + // P0 ------------------------------------------------> P8 + lt_cnt = 1; + + /* set 8 frame lt-ref gap */ + lt_ref[0].lt_idx = 0; + lt_ref[0].temporal_id = 0; + lt_ref[0].ref_mode = REF_TO_PREV_LT_REF; + lt_ref[0].lt_gap = 8; // 8:set 8 frame + lt_ref[0].lt_delay = 0; + + st_cnt = 9; + /* set tsvc4 st-ref struct */ + /* st 0 layer 0 - ref */ + st_ref[0].is_non_ref = 0; + st_ref[0].temporal_id = 0; + st_ref[0].ref_mode = REF_TO_TEMPORAL_LAYER; + st_ref[0].ref_arg = 0; + st_ref[0].repeat = 0; + /* st 1 layer 3 - non-ref */ + st_ref[1].is_non_ref = 1; + st_ref[1].temporal_id = 3; + st_ref[1].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[1].ref_arg = 0; + st_ref[1].repeat = 0; + /* st 2 layer 2 - ref */ + st_ref[2].is_non_ref = 0; + st_ref[2].temporal_id = 2; + st_ref[2].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[2].ref_arg = 0; + st_ref[2].repeat = 0; + /* st 3 layer 3 - non-ref */ + st_ref[3].is_non_ref = 1; + st_ref[3].temporal_id = 3; + st_ref[3].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[3].ref_arg = 0; + st_ref[3].repeat = 0; + /* st 4 layer 1 - ref */ + st_ref[4].is_non_ref = 0; + st_ref[4].temporal_id = 1; + st_ref[4].ref_mode = REF_TO_PREV_LT_REF; + st_ref[4].ref_arg = 0; + st_ref[4].repeat = 0; + /* st 5 layer 3 - non-ref */ + st_ref[5].is_non_ref = 1; + st_ref[5].temporal_id = 3; + st_ref[5].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[5].ref_arg = 0; + st_ref[5].repeat = 0; + /* st 6 layer 2 - ref */ + st_ref[6].is_non_ref = 0; + st_ref[6].temporal_id = 2; + st_ref[6].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[6].ref_arg = 0; + st_ref[6].repeat = 0; + /* st 7 layer 3 - non-ref */ + st_ref[7].is_non_ref = 1; + st_ref[7].temporal_id = 3; + st_ref[7].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[7].ref_arg = 0; + st_ref[7].repeat = 0; + /* st 8 layer 0 - ref */ + st_ref[8].is_non_ref = 0; + st_ref[8].temporal_id = 0; + st_ref[8].ref_mode = REF_TO_TEMPORAL_LAYER; + st_ref[8].ref_arg = 0; + st_ref[8].repeat = 0; + } + break; + case 2 : { + // tsvc3 + // /-> P1 /-> P3 + // / / + // //--------> P2 + // // + // P0/---------------------> P4 + lt_cnt = 0; + + st_cnt = 5; + /* set tsvc4 st-ref struct */ + /* st 0 layer 0 - ref */ + st_ref[0].is_non_ref = 0; + st_ref[0].temporal_id = 0; + st_ref[0].ref_mode = REF_TO_TEMPORAL_LAYER; + st_ref[0].ref_arg = 0; + st_ref[0].repeat = 0; + /* st 1 layer 2 - non-ref */ + st_ref[1].is_non_ref = 1; + st_ref[1].temporal_id = 2; + st_ref[1].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[1].ref_arg = 0; + st_ref[1].repeat = 0; + /* st 2 layer 1 - ref */ + st_ref[2].is_non_ref = 0; + st_ref[2].temporal_id = 1; + st_ref[2].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[2].ref_arg = 0; + st_ref[2].repeat = 0; + /* st 3 layer 2 - non-ref */ + st_ref[3].is_non_ref = 1; + st_ref[3].temporal_id = 2; + st_ref[3].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[3].ref_arg = 0; + st_ref[3].repeat = 0; + /* st 4 layer 0 - ref */ + st_ref[4].is_non_ref = 0; + st_ref[4].temporal_id = 0; + st_ref[4].ref_mode = REF_TO_TEMPORAL_LAYER; + st_ref[4].ref_arg = 0; + st_ref[4].repeat = 0; + } + break; + case 1 : { + // tsvc2 + // /-> P1 + // / + // P0--------> P2 + lt_cnt = 0; + + st_cnt = 3; + /* set tsvc4 st-ref struct */ + /* st 0 layer 0 - ref */ + st_ref[0].is_non_ref = 0; + st_ref[0].temporal_id = 0; + st_ref[0].ref_mode = REF_TO_TEMPORAL_LAYER; + st_ref[0].ref_arg = 0; + st_ref[0].repeat = 0; + /* st 1 layer 2 - non-ref */ + st_ref[1].is_non_ref = 1; + st_ref[1].temporal_id = 1; + st_ref[1].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[1].ref_arg = 0; + st_ref[1].repeat = 0; + /* st 2 layer 1 - ref */ + st_ref[2].is_non_ref = 0; + st_ref[2].temporal_id = 0; + st_ref[2].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[2].ref_arg = 0; + st_ref[2].repeat = 0; + } + break; + default : { + mpp_err_f("unsupport gop mode %d\n", gop_mode); + } + break; + } + + if (lt_cnt || st_cnt) { + ret = mpp_enc_ref_cfg_set_cfg_cnt(ref, lt_cnt, st_cnt); + + if (lt_cnt) + ret = mpp_enc_ref_cfg_add_lt_cfg(ref, lt_cnt, lt_ref); + + if (st_cnt) + ret = mpp_enc_ref_cfg_add_st_cfg(ref, st_cnt, st_ref); + + /* check and get dpb size */ + ret = mpp_enc_ref_cfg_check(ref); + } + + return ret; +} + +static MPP_RET mpi_enc_gen_smart_gop_ref_cfg(MppEncRefCfg ref, RK_S32 gop_len, RK_S32 vi_len) +{ + MppEncRefLtFrmCfg lt_ref[4]; + MppEncRefStFrmCfg st_ref[16]; + RK_S32 lt_cnt = 1; + RK_S32 st_cnt = 8; + RK_S32 pos = 0; + MPP_RET ret = 0; + + errno_t eok = memset_s(<_ref, sizeof(lt_ref), 0, sizeof(lt_ref)); + if (eok != EOK) { + mpp_err("memset_s failed\n"); + return MPP_NOK; + } + eok = memset_s(&st_ref, sizeof(st_ref), 0, sizeof(st_ref)); + if (eok != EOK) { + mpp_err("memset_s failed\n"); + return MPP_NOK; + } + + ret = mpp_enc_ref_cfg_set_cfg_cnt(ref, lt_cnt, st_cnt); + + /* set 8 frame lt-ref gap */ + lt_ref[0].lt_idx = 0; + lt_ref[0].temporal_id = 0; + lt_ref[0].ref_mode = REF_TO_PREV_LT_REF; + lt_ref[0].lt_gap = gop_len; + lt_ref[0].lt_delay = 0; + + mpp_enc_ref_cfg_add_lt_cfg(ref, 1, lt_ref); + + /* st 0 layer 0 - ref */ + st_ref[pos].is_non_ref = 0; + st_ref[pos].temporal_id = 0; + st_ref[pos].ref_mode = REF_TO_PREV_INTRA; + st_ref[pos].ref_arg = 0; + st_ref[pos].repeat = 0; + pos++; + + /* st 1 layer 1 - non-ref */ + if (vi_len > 1) { + st_ref[pos].is_non_ref = 0; + st_ref[pos].temporal_id = 1; + st_ref[pos].ref_mode = REF_TO_PREV_REF_FRM; + st_ref[pos].ref_arg = 0; + st_ref[pos].repeat = vi_len - 2; + pos++; + } + + st_ref[pos].is_non_ref = 0; + st_ref[pos].temporal_id = 0; + st_ref[pos].ref_mode = REF_TO_PREV_INTRA; + st_ref[pos].ref_arg = 0; + st_ref[pos].repeat = 0; + pos++; + + mpp_enc_ref_cfg_add_st_cfg(ref, pos, st_ref); + + /* check and get dpb size */ + ret = mpp_enc_ref_cfg_check(ref); + + return ret; +} + +/* ���˱������õ�һЩ����������ߣ�����ͼ���ʽ����������ʽ�ȣ�����������֪��ֱ����0 + * test_mpp_enc_cfg_setup�������Զ�����Ĭ�ϵIJ�����bps�� gop�Ȳ��� + */ +static MPP_RET test_ctx_init(MpiEncTestData **data, MpiEncTestArgs *cmd) +{ + MpiEncTestData *p = NULL; + MPP_RET ret = 0; + + if (!data || !cmd) { + mpp_err_f("invalid input data %p cmd %p\n", data, cmd); + return MPP_ERR_NULL_PTR; + } + + p = mpp_calloc(MpiEncTestData, 1); + if (!p) { + mpp_err_f("create MpiEncTestData failed\n"); + ret = MPP_ERR_MALLOC; + *data = p; + return ret; + } + + // get paramter from cmd + p->width = cmd->width; + p->height = cmd->height; + p->hor_stride = MPP_ALIGN(cmd->width, 16); // 16:hor_stride + p->ver_stride = MPP_ALIGN(cmd->height, 16); // 16:ver_stride + p->fmt = cmd->format; + p->type = cmd->type; + + // update resource parameter + switch (p->fmt & MPP_FRAME_FMT_MASK) { + case MPP_FMT_YUV420SP: + case MPP_FMT_YUV420P: { + p->frame_size = MPP_ALIGN(p->hor_stride, 64) * MPP_ALIGN(p->ver_stride, 64) * 3 / 2; + } + break; + + case MPP_FMT_YUV422_YUYV : + case MPP_FMT_YUV422_YVYU : + case MPP_FMT_YUV422_UYVY : + case MPP_FMT_YUV422_VYUY : + case MPP_FMT_YUV422P : + case MPP_FMT_YUV422SP : + case MPP_FMT_RGB444 : + case MPP_FMT_BGR444 : + case MPP_FMT_RGB555 : + case MPP_FMT_BGR555 : + case MPP_FMT_RGB565 : + case MPP_FMT_BGR565 : { + p->frame_size = MPP_ALIGN(p->hor_stride, 64) * MPP_ALIGN(p->ver_stride, 64) * 2; + } + break; + default: { + p->frame_size = MPP_ALIGN(p->hor_stride, 64) * MPP_ALIGN(p->ver_stride, 64) * 4; + } + break; + } + *data = p; + return ret; +} + +static MPP_RET test_ctx_deinit(MpiEncTestData **data) +{ + MpiEncTestData *p = NULL; + + if (!data) { + mpp_err_f("invalid input data %p\n", data); + return MPP_ERR_NULL_PTR; + } + p = *data; + if (p) { + MPP_FREE(p); + *data = NULL; + } + return MPP_OK; +} + +static MPP_RET test_mpp_enc_cfg_setup(MpiEncTestData *p) +{ + MPP_RET ret; + MppApi *mpi; + MppCtx ctx; + MppEncCfg cfg; + + if (p == NULL) + return MPP_ERR_NULL_PTR; + + mpi = p->mpi; + ctx = p->ctx; + cfg = p->cfg; + + /* setup default parameter */ + if (p->fps_in_den == 0) + p->fps_in_den = 1; + if (p->fps_in_num == 0) + p->fps_in_num = 30; + if (p->fps_out_den == 0) + p->fps_out_den = 1; + if (p->fps_out_num == 0) + p->fps_out_num = 30; + + /* ����Ĭ��bps */ + if (!p->bps) + p->bps = p->width * p->height / 8 * (p->fps_out_num / p->fps_out_den); + + mpp_enc_cfg_set_s32(cfg, "prep:width", p->width); + mpp_enc_cfg_set_s32(cfg, "prep:height", p->height); + mpp_enc_cfg_set_s32(cfg, "prep:hor_stride", p->hor_stride); + mpp_enc_cfg_set_s32(cfg, "prep:ver_stride", p->ver_stride); + mpp_enc_cfg_set_s32(cfg, "prep:format", p->fmt); + + mpp_enc_cfg_set_s32(cfg, "rc:mode", p->rc_mode); + + /* fix input / output frame rate */ + mpp_enc_cfg_set_s32(cfg, "rc:fps_in_flex", p->fps_in_flex); + mpp_enc_cfg_set_s32(cfg, "rc:fps_in_num", p->fps_in_num); + mpp_enc_cfg_set_s32(cfg, "rc:fps_in_denorm", p->fps_in_den); + mpp_enc_cfg_set_s32(cfg, "rc:fps_out_flex", p->fps_out_flex); + mpp_enc_cfg_set_s32(cfg, "rc:fps_out_num", p->fps_out_num); + mpp_enc_cfg_set_s32(cfg, "rc:fps_out_denorm", p->fps_out_den); + mpp_enc_cfg_set_s32(cfg, "rc:gop", p->gop_len ? p->gop_len : p->fps_out_num * 2); + + /* drop frame or not when bitrate overflow */ + mpp_enc_cfg_set_u32(cfg, "rc:drop_mode", MPP_ENC_RC_DROP_FRM_DISABLED); + mpp_enc_cfg_set_u32(cfg, "rc:drop_thd", 20); /* 20% of max bps */ + mpp_enc_cfg_set_u32(cfg, "rc:drop_gap", 1); /* Do not continuous drop frame */ + + /* setup bitrate for different rc_mode */ + mpp_enc_cfg_set_s32(cfg, "rc:bps_target", p->bps); + switch (p->rc_mode) { + case MPP_ENC_RC_MODE_FIXQP : { + /* do not setup bitrate on FIXQP mode */ + } + break; + case MPP_ENC_RC_MODE_CBR : { + /* CBR mode has narrow bound */ + mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16); + mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 15 / 16); + } + break; + case MPP_ENC_RC_MODE_VBR : + case MPP_ENC_RC_MODE_AVBR : { + /* VBR mode has wide bound */ + mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16); + mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 1 / 16); + } + break; + default : { + /* default use CBR mode */ + mpp_enc_cfg_set_s32(cfg, "rc:bps_max", p->bps_max ? p->bps_max : p->bps * 17 / 16); + mpp_enc_cfg_set_s32(cfg, "rc:bps_min", p->bps_min ? p->bps_min : p->bps * 15 / 16); + } + break; + } + + /* setup qp for different codec and rc_mode */ + switch (p->type) { + case MPP_VIDEO_CodingAVC : + case MPP_VIDEO_CodingHEVC : { + switch (p->rc_mode) { + case MPP_ENC_RC_MODE_FIXQP : { + mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 20); // 20:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 20); // 20:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 20); // 20:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 20); // 20:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 20); // 20:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 2); + } + break; + case MPP_ENC_RC_MODE_CBR : + case MPP_ENC_RC_MODE_VBR : + case MPP_ENC_RC_MODE_AVBR : { + mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 26); // 26:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 51); // 51:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 10); // 10:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 51); // 51:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 10); // 10:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 2); + } + break; + default : { + mpp_err_f("unsupport encoder rc mode %d\n", p->rc_mode); + } + break; + } + } + break; + case MPP_VIDEO_CodingVP8 : { + /* vp8 only setup base qp range */ + mpp_enc_cfg_set_s32(cfg, "rc:qp_init", 40); // 40:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_max", 127); // 127:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_min", 0); + mpp_enc_cfg_set_s32(cfg, "rc:qp_max_i", 127); // 127:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "rc:qp_min_i", 0); + mpp_enc_cfg_set_s32(cfg, "rc:qp_ip", 6); // 6:mpp cfg value + } + break; + case MPP_VIDEO_CodingMJPEG : { + /* jpeg use special codec config to control qtable */ + mpp_enc_cfg_set_s32(cfg, "jpeg:q_factor", 80); // 80:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "jpeg:qf_max", 99); // 99:mpp cfg value + mpp_enc_cfg_set_s32(cfg, "jpeg:qf_min", 1); + } + break; + default : { + } + break; + } + + /* setup codec */ + mpp_enc_cfg_set_s32(cfg, "codec:type", p->type); + switch (p->type) { + case MPP_VIDEO_CodingAVC : { + /* + * H.264 profile_idc parameter + * 66 - Baseline profile + * 77 - Main profile + * 100 - High profile + */ + mpp_enc_cfg_set_s32(cfg, "h264:profile", 100); + /* + * H.264 level_idc parameter + * 10 / 11 / 12 / 13 - qcif@15fps / cif@7.5fps / cif@15fps / cif@30fps + * 20 / 21 / 22 - cif@30fps / half-D1@@25fps / D1@12.5fps + * 30 / 31 / 32 - D1@25fps / 720p@30fps / 720p@60fps + * 40 / 41 / 42 - 1080p@30fps / 1080p@30fps / 1080p@60fps + * 50 / 51 / 52 - 4K@30fps + */ + mpp_enc_cfg_set_s32(cfg, "h264:level", 40); + mpp_enc_cfg_set_s32(cfg, "h264:cabac_en", 1); + mpp_enc_cfg_set_s32(cfg, "h264:cabac_idc", 0); + mpp_enc_cfg_set_s32(cfg, "h264:trans8x8", 1); + } + break; + case MPP_VIDEO_CodingHEVC : + case MPP_VIDEO_CodingMJPEG : + case MPP_VIDEO_CodingVP8 : { + } + break; + default : { + mpp_err_f("unsupport encoder coding type %d\n", p->type); + } + break; + } + + p->split_mode = 0; + p->split_arg = 0; + + mpp_env_get_u32("split_mode", &p->split_mode, MPP_ENC_SPLIT_NONE); + mpp_env_get_u32("split_arg", &p->split_arg, 0); + + if (p->split_mode) { + mpp_log("%p split_mode %d split_arg %d\n", ctx, p->split_mode, p->split_arg); + mpp_enc_cfg_set_s32(cfg, "split:mode", p->split_mode); + mpp_enc_cfg_set_s32(cfg, "split:arg", p->split_arg); + } + + ret = mpi->control(ctx, MPP_ENC_SET_CFG, cfg); + if (ret) { + mpp_err("mpi control enc set cfg failed ret %d\n", ret); + return ret; + } + + /* optional */ + p->sei_mode = MPP_ENC_SEI_MODE_ONE_FRAME; + ret = mpi->control(ctx, MPP_ENC_SET_SEI_CFG, &p->sei_mode); + if (ret) { + mpp_err("mpi control enc set sei cfg failed ret %d\n", ret); + return ret; + } + + if (p->type == MPP_VIDEO_CodingAVC || p->type == MPP_VIDEO_CodingHEVC) { + p->header_mode = MPP_ENC_HEADER_MODE_EACH_IDR; + ret = mpi->control(ctx, MPP_ENC_SET_HEADER_MODE, &p->header_mode); + if (ret) { + mpp_err("mpi control enc set header mode failed ret %d\n", ret); + return ret; + } + } + + RK_U32 gop_mode = p->gop_mode; + + mpp_env_get_u32("gop_mode", &gop_mode, gop_mode); + if (gop_mode) { + MppEncRefCfg ref; + + mpp_enc_ref_cfg_init(&ref); + + if (p->gop_mode < 4) { + mpi_enc_gen_ref_cfg(ref, gop_mode); + } else { + mpi_enc_gen_smart_gop_ref_cfg(ref, p->gop_len, p->vi_len); + } + ret = mpi->control(ctx, MPP_ENC_SET_REF_CFG, ref); + if (ret) { + mpp_err("mpi control enc set ref cfg failed ret %d\n", ret); + return ret; + } + mpp_enc_ref_cfg_deinit(&ref); + } + return ret; +} + +static void test_mpp_frame_set_param(MppFrame frame, MpiEncTestData *p) +{ + mpp_frame_set_width(frame, p->width); + mpp_frame_set_height(frame, p->height); + mpp_frame_set_hor_stride(frame, p->hor_stride); + mpp_frame_set_ver_stride(frame, p->ver_stride); + mpp_frame_set_fmt(frame, p->fmt); + mpp_frame_set_eos(frame, p->frm_eos); +} + +static void test_mpp_ctx_cleanup(MpiEncTestData *p) +{ + if (!p) { + mpp_err("test_mpp_ctx_cleanup p == NULL\n"); + return; + } + + if (p->mpi->reset) { + p->mpi->reset(p->ctx); + } + + if (p->ctx) { + mpp_destroy(p->ctx); + p->ctx = NULL; + } + + if (p->cfg) { + mpp_enc_cfg_deinit(p->cfg); + p->cfg = NULL; + } + + if (p->pkt_buf) { + mpp_buffer_put(p->pkt_buf); + p->pkt_buf = NULL; + } + + if (p->buf_grp) { + mpp_buffer_group_put(p->buf_grp); + p->buf_grp = NULL; + } + + test_ctx_deinit(&p); +} + +int hal_mpp_get_sps(void *ctx, unsigned char *buf, size_t *buf_size) +{ + int ret; + MppApi *mpi; + MppCtx mpp_ctx; + MppPacket packet = NULL; + MpiEncTestData *p = (MpiEncTestData *)ctx; + errno_t eok; + + if (!p) { + mpp_err("mpi control enc get extra info failed\n"); + return MPP_NOK; + } + mpi = p->mpi; + mpp_ctx = p->ctx; + + /* + * Can use packet with normal malloc buffer as input not pkt_buf. + * Please refer to vpu_api_legacy.cpp for normal buffer case. + * Using pkt_buf buffer here is just for simplifing demo. + */ + + mpp_packet_init_with_buffer(&packet, p->pkt_buf); + /* NOTE: It is important to clear output packet length!! */ + mpp_packet_set_length(packet, 0); + + // ����һ��H264��H265ר�õ�һЩ���� + if (p->type == MPP_VIDEO_CodingAVC || p->type == MPP_VIDEO_CodingHEVC) { + ret = mpi->control(mpp_ctx, MPP_ENC_GET_HDR_SYNC, packet); + if (ret) { + mpp_err("mpi control enc get extra info failed\n"); + ret = MPP_NOK; + mpp_packet_deinit(&packet); + return ret; + } + } + + void *ptr = mpp_packet_get_pos(packet); + size_t len = mpp_packet_get_length(packet); + if (*buf_size < len) { + mpp_err("mpi buffer size too small\n"); + ret = MPP_NOK; + mpp_packet_deinit(&packet); + return ret; + } + + eok = memcpy_s(buf, len, ptr, len); + if (eok != EOK) { + mpp_err("memcpy_s failed\n"); + return MPP_NOK; + } + + *buf_size = len; + + ret = MPP_OK; + mpp_packet_deinit(&packet); + return ret; +} + +int hal_mpp_encode(void *ctx, int dma_fd, unsigned char *buf, size_t *buf_size) +{ + if (!ctx) { + mpp_err("memset_s failed\n"); + return MPP_NOK; + } + + MPP_RET ret = 0; + MppFrame frame = NULL; + MppMeta meta = NULL; + MppPacket packet = NULL; + MpiEncTestData *p = (MpiEncTestData *)ctx; + MppApi *mpi = p->mpi; + RK_U32 eoi = 1; + RK_U32 packet_num = 0; + MppBuffer cam_buf = NULL; + MppBufferInfo info; + + errno_t eok = memset_s(&info, sizeof(MppBufferInfo), 0, sizeof(MppBufferInfo)); + if (eok != EOK) { + mpp_err("memset_s failed\n"); + return MPP_NOK; + } + info.type = MPP_BUFFER_TYPE_EXT_DMA; + info.fd = dma_fd; + info.size = p->frame_size & 0x07ffffff; + info.index = (p->frame_size & 0xf8000000) >> 27; + + ret = mpp_buffer_import(&cam_buf, &info); + if (ret != MPP_SUCCESS) { + mpp_err_f("mpp_buffer_import failed\n"); + return MPP_NOK; + } + + ret = mpp_frame_init(&frame); + if (ret) { + mpp_err_f("mpp_frame_init failed\n"); + return MPP_NOK; + } + + /* set frame size info */ + test_mpp_frame_set_param(frame, p); + + /* set frame data include fd */ + mpp_frame_set_buffer(frame, cam_buf); + + /* packet init */ + mpp_packet_init_with_buffer(&packet, p->pkt_buf); + /* NOTE: It is important to clear output packet length!! */ + mpp_packet_set_length(packet, 0); + + meta = mpp_frame_get_meta(frame); + mpp_meta_set_packet(meta, KEY_OUTPUT_PACKET, packet); + + /* + * NOTE: in non-block mode the frame can be resent. + * The default input timeout mode is block. + * + * User should release the input frame to meet the requirements of + * resource creator must be the resource destroyer. + */ + ret = mpi->encode_put_frame(p->ctx, frame); + if (ret) { + mpp_err("mpp encode put frame failed\n"); + mpp_frame_deinit(&frame); + if (cam_buf) { + mpp_buffer_put(cam_buf); + } + mpp_packet_deinit(&packet); + return ret; + } + + mpp_frame_deinit(&frame); + + packet_num = 0; + + do { + ret = mpi->encode_get_packet(p->ctx, &packet); + if (ret) { + mpp_err("mpp encode get packet failed\n"); + if (cam_buf) { + mpp_buffer_put(cam_buf); + } + mpp_packet_deinit(&packet); + return ret; + } + + mpp_assert(packet); + + if (packet) { + /* for low delay partition encoding */ + if (mpp_packet_is_partition(packet)) { + eoi = mpp_packet_is_eoi(packet); + } + + p->frame_count += eoi; + packet_num++; + } + } while (!eoi); + + void *ptr = mpp_packet_get_pos(packet); + size_t len = mpp_packet_get_length(packet); + + if (packet_num != 1) { + mpp_err("packet_num %u != 1\n"); + ret = MPP_NOK; + if (cam_buf) { + mpp_buffer_put(cam_buf); + } + mpp_packet_deinit(&packet); + return ret; + } + + if (*buf_size < len) { + mpp_err("mpi buffer size too small\n"); + ret = MPP_NOK; + if (cam_buf) { + mpp_buffer_put(cam_buf); + } + mpp_packet_deinit(&packet); + return ret; + } + + eok = memcpy_s(buf, len, ptr, len); + if (eok != EOK) { + mpp_err("memcpy_s failed\n"); + return MPP_NOK; + } + + *buf_size = len; + + ret = MPP_OK; + if (cam_buf) + mpp_buffer_put(cam_buf); + + mpp_packet_deinit(&packet); + return ret; +} + +void *hal_mpp_ctx_create(MpiEncTestArgs *args) +{ + MPP_RET ret = 0; + MpiEncTestData *p = NULL; + MppPollType timeout = MPP_POLL_BLOCK; + + /* ��ʼ��һ�³��õIJ������ã�cmd�����ñȽ϶� */ + ret = test_ctx_init(&p, args); + if (ret) { + mpp_err_f("test data init failed ret %d\n", ret); + mpp_err("%p mpi_enc_test failed ret %d\n", p->ctx, ret); + return NULL; + } + + ret = mpp_buffer_group_get_internal(&p->buf_grp, MPP_BUFFER_TYPE_DRM); + if (ret) { + mpp_err_f("failed to get mpp buffer group ret %d\n", ret); + mpp_err("%p mpi_enc_test failed ret %d\n", p->ctx, ret); + return NULL; + } + + /* pkt_buf�����Ա���?���Ǹ�packetʹ�õ�buffer */ + ret = mpp_buffer_get(p->buf_grp, &p->pkt_buf, p->frame_size); + if (ret) { + mpp_err_f("failed to get buffer for output packet ret %d\n", ret); + mpp_err("%p mpi_enc_test failed ret %d\n", p->ctx, ret); + return NULL; + } + + // encoder demo + ret = mpp_create(&p->ctx, &p->mpi); + if (ret) { + mpp_err("mpp_create failed ret %d\n", ret); + mpp_err("%p mpi_enc_test failed ret %d\n", p->ctx, ret); + return NULL; + } + + mpp_log("%p mpi_enc_test encoder test start w %d h %d type %d\n", + p->ctx, p->width, p->height, p->type); + + ret = p->mpi->control(p->ctx, MPP_SET_OUTPUT_TIMEOUT, &timeout); + if (MPP_OK != ret) { + mpp_err("mpi control set output timeout %d ret %d\n", timeout, ret); + mpp_err("%p mpi_enc_test failed ret %d\n", p->ctx, ret); + return NULL; + } + + ret = mpp_init(p->ctx, MPP_CTX_ENC, p->type); + if (ret) { + mpp_err("mpp_init failed ret %d\n", ret); + mpp_err("%p mpi_enc_test failed ret %d\n", p->ctx, ret); + return NULL; + } + + ret = mpp_enc_cfg_init(&p->cfg); + if (ret) { + mpp_err_f("mpp_enc_cfg_init failed ret %d\n", ret); + mpp_err("%p mpi_enc_test failed ret %d\n", p->ctx, ret); + return NULL; + } + + ret = test_mpp_enc_cfg_setup(p); + if (ret) { + mpp_err_f("test mpp setup failed ret %d\n", ret); + mpp_err("%p mpi_enc_test failed ret %d\n", p->ctx, ret); + return NULL; + } + + return p; +} + +void hal_mpp_ctx_delete(void *ctx) +{ + test_mpp_ctx_cleanup(ctx); +} diff --git a/hardware/rga/BUILD.gn b/hardware/rga/BUILD.gn new file mode 100755 index 0000000000000000000000000000000000000000..9a671167fe4b7d98f31e59953b303bda9e3e0827 --- /dev/null +++ b/hardware/rga/BUILD.gn @@ -0,0 +1,27 @@ +# Copyright (C) 2021 HiHope Open Source Organization . +# 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. + +import("//build/ohos.gni") +import("//build/ohos/ndk/ndk.gni") + +ohos_prebuilt_shared_library("librga") { + if (target_cpu == "arm") { + source = "lib/librga.z.so" + } else if (target_cpu == "arm64") { + source = "lib64/librga.z.so" + } + install_images = [ chipset_base_dir ] + subsystem_name = "hdf" + part_name = "camera_device_driver" + install_enable = true +} diff --git a/hardware/rga/include/GrallocOps.h b/hardware/rga/include/GrallocOps.h new file mode 100755 index 0000000000000000000000000000000000000000..4c5ca522b0f4d5233bce42af87566c800b66d259 --- /dev/null +++ b/hardware/rga/include/GrallocOps.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. + * Authors: + * Zhiqin Wei + * + * 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 _rk_graphic_buffer_h_ +#define _rk_graphic_buffer_h_ +#endif // _rk_graphic_buffer_h_ diff --git a/hardware/rga/include/RgaApi.h b/hardware/rga/include/RgaApi.h new file mode 100755 index 0000000000000000000000000000000000000000..9acb9541a90883b2ef98a9ffefbc7b04cfb8d213 --- /dev/null +++ b/hardware/rga/include/RgaApi.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. + * Authors: + * Zhiqin Wei + * + * 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 _rockchip_rga_c_h_ +#define _rockchip_rga_c_h_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "drmrga.h" +#include "rga.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +/* + * Compatible with the old version of C interface.The new + * version of the C interface no longer requires users to + * initialize rga, so RgaInit and RgaDeInit are just for + * compatibility with the old C interface, so please do + * not use ctx, because it is usually a NULL. + */ +#define RgaInit(ctx) ( { \ + int ret = 0; \ + ret = c_RkRgaInit(); \ + c_RkRgaGetContext(ctx); \ + ret; \ +}) +#define RgaDeInit(ctx) { \ + (void)(ctx); /* unused */ \ + c_RkRgaDeInit(); \ +} +#define RgaBlit(...) c_RkRgaBlit(__VA_ARGS__) +#define RgaCollorFill(...) c_RkRgaColorFill(__VA_ARGS__) +#define RgaFlush() c_RkRgaFlush() + +int c_RkRgaInit(void); +void c_RkRgaDeInit(void); +void c_RkRgaGetContext(void **ctx); +int c_RkRgaBlit(rga_info_t *src, rga_info_t *dst, rga_info_t *src1); +int c_RkRgaColorFill(rga_info_t *dst); +int c_RkRgaFlush(void); + +int c_RkRgaGetAllocBuffer(bo_t *bo_info, int width, int height, int bpp); +int c_RkRgaGetAllocBufferCache(bo_t *bo_info, int width, int height, int bpp); +int c_RkRgaGetMmap(bo_t *bo_info); +int c_RkRgaUnmap(bo_t *bo_info); +int c_RkRgaFree(bo_t *bo_info); +int c_RkRgaGetBufferFd(bo_t *bo_info, int *fd); + +#ifdef __cplusplus +} +#endif + +#endif /* #ifndef _rockchip_rga_c_h_ */ diff --git a/hardware/rga/include/RgaMutex.h b/hardware/rga/include/RgaMutex.h new file mode 100755 index 0000000000000000000000000000000000000000..092ef94b52ac00f0585eaa86437a42f34a22448c --- /dev/null +++ b/hardware/rga/include/RgaMutex.h @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2020 Rockchip Electronics Co., Ltd. + * Authors: + * PutinLee + * + * 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 _LIBS_RGA_MUTEX_H +#define _LIBS_RGA_MUTEX_H + +#include +#include +#include + +#include + + +// Enable thread safety attributes only with clang. +// The attributes can be safely erased when compiling with other compilers. +#if defined(__clang__) && (!defined(SWIG)) +#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) +#else +#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op +#endif + +#define CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(capability(x)) + +#define SCOPED_CAPABILITY THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) + +#define GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) + +#define PT_GUARDED_BY(x) THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) + +#define ACQUIRED_BEFORE(...) THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) + +#define ACQUIRED_AFTER(...) THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__)) + +#define REQUIRES(...) THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(__VA_ARGS__)) + +#define REQUIRES_SHARED(...) THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(__VA_ARGS__)) + +#define ACQUIRE(...) THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(__VA_ARGS__)) + +#define ACQUIRE_SHARED(...) THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(__VA_ARGS__)) + +#define RELEASE(...) THREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__)) + +#define RELEASE_SHARED(...) THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(__VA_ARGS__)) + +#define TRY_ACQUIRE(...) THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__)) + +#define TRY_ACQUIRE_SHARED(...) \ + THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(__VA_ARGS__)) + +#define EXCLUDES(...) THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) + +#define ASSERT_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x)) + +#define ASSERT_SHARED_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x)) + +#define RETURN_CAPABILITY(x) THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) + +#define NO_THREAD_SAFETY_ANALYSIS THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) + +class Condition; + +/* + * NOTE: This class is for code that builds on Win32. Its usage is + * deprecated for code which doesn't build for Win32. New code which + * doesn't build for Win32 should use std::mutex and std::lock_guard instead. + * + * Simple mutex class. The implementation is system-dependent. + * + * The mutex must be unlocked by the thread that locked it. They are not + * recursive, i.e. the same thread can't lock it multiple times. + */ +class CAPABILITY("mutex") Mutex { + public: + enum { + PRIVATE = 0, + SHARED = 1 + }; + + Mutex(); + explicit Mutex(const char* name); + explicit Mutex(int type, const char* name = nullptr); + ~Mutex(); + + // lock or unlock the mutex + int32_t lock() ACQUIRE(); + void unlock() RELEASE(); + + // lock if possible; returns 0 on success, error otherwise + int32_t tryLock() TRY_ACQUIRE(0); + + int32_t timedLock(int64_t timeoutNs) TRY_ACQUIRE(0); + + // Manages the mutex automatically. It'll be locked when Autolock is + // constructed and released when Autolock goes out of scope. + class SCOPED_CAPABILITY Autolock { + public: + inline explicit Autolock(Mutex& mutex) ACQUIRE(mutex) : mLock(mutex) { + mLock.lock(); + } + inline explicit Autolock(Mutex* mutex) ACQUIRE(mutex) : mLock(*mutex) { + mLock.lock(); + } + inline ~Autolock() RELEASE() { + mLock.unlock(); + } + + private: + Mutex& mLock; + // Cannot be copied or moved - declarations only + Autolock(const Autolock&); + Autolock& operator=(const Autolock&); + }; + + private: + friend class Condition; + + // A mutex cannot be copied + Mutex(const Mutex&); + Mutex& operator=(const Mutex&); + + pthread_mutex_t mMutex; +}; + +// --------------------------------------------------------------------------- +inline Mutex::Mutex() { + pthread_mutex_init(&mMutex, nullptr); +} +inline Mutex::Mutex(__attribute__((unused)) const char* name) { + pthread_mutex_init(&mMutex, nullptr); +} +inline Mutex::Mutex(int type, __attribute__((unused)) const char* name) { + if (type == SHARED) { + pthread_mutexattr_t attr; + pthread_mutexattr_init(&attr); + pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); + pthread_mutex_init(&mMutex, &attr); + pthread_mutexattr_destroy(&attr); + } else { + pthread_mutex_init(&mMutex, nullptr); + } +} +inline Mutex::~Mutex() { + pthread_mutex_destroy(&mMutex); +} +inline int32_t Mutex::lock() { + return -pthread_mutex_lock(&mMutex); +} +inline void Mutex::unlock() { + pthread_mutex_unlock(&mMutex); +} +inline int32_t Mutex::tryLock() { + return -pthread_mutex_trylock(&mMutex); +} +inline int32_t Mutex::timedLock(int64_t timeoutNs) { + timespec now; + clock_gettime(CLOCK_REALTIME, &now); + timeoutNs += now.tv_sec * 1000000000 + now.tv_nsec; // 1000000000:unit conversion + const struct timespec ts = { + static_cast(timeoutNs / 1000000000), // 1000000000:unit conversion + static_cast(timeoutNs % 1000000000), // 1000000000:unit conversion + }; + return -pthread_mutex_timedlock(&mMutex, &ts); +} + +// --------------------------------------------------------------------------- + +/* + * Automatic mutex. Declare one of these at the top of a function. + * When the function returns, it will go out of scope, and release the + * mutex. + */ + +typedef Mutex::Autolock AutoMutex; +#endif // _LIBS_RGA_MUTEX_H \ No newline at end of file diff --git a/hardware/rga/include/RgaSingleton.h b/hardware/rga/include/RgaSingleton.h new file mode 100755 index 0000000000000000000000000000000000000000..ff371f1e9fe90483fc871c4ea0f16ea87e22c23d --- /dev/null +++ b/hardware/rga/include/RgaSingleton.h @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. + * Authors: + * Zhiqin Wei + * + * 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 _LIBS_RGA_SINGLETON_H +#define _LIBS_RGA_SINGLETON_H + +#include "RgaMutex.h" + +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wundefined-var-template" +#endif + +template +class Singleton { +public: + static TYPE& getInstance() + { + Mutex::Autolock _l(sLock); + TYPE* instance = sInstance; + if (instance == nullptr) { + instance = new TYPE(); + sInstance = instance; + } + return *instance; + } + static bool hasInstance() + { + Mutex::Autolock _l(sLock); + return sInstance != nullptr; + } + +protected: + ~Singleton() { } + Singleton() { } + +private: + Singleton(const Singleton&); + Singleton& operator = (const Singleton&); + static Mutex sLock; + static TYPE* sInstance; +}; + +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + +#define RGA_SINGLETON_STATIC_INSTANCE(TYPE) \ + template<> ::Mutex \ + (::Singleton< TYPE >::sLock)(::Mutex::PRIVATE); \ + template<> TYPE* ::Singleton< TYPE >::sInstance(nullptr); /* NOLINT */ \ + template class ::Singleton< TYPE >; + +#endif //_LIBS_RGA_SINGLETON_H diff --git a/hardware/rga/include/RgaUtils.h b/hardware/rga/include/RgaUtils.h new file mode 100755 index 0000000000000000000000000000000000000000..27f9394d8e0435a4dd852819e76f3237a850f0c4 --- /dev/null +++ b/hardware/rga/include/RgaUtils.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. + * Authors: + * Zhiqin Wei + * + * 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 _rga_utils_h_ +#define _rga_utils_h_ + +// ------------------------------------------------------------------------------- +float get_bpp_from_format(int format); +int get_buf_from_file(void *buf, int f, int sw, int sh, int index); +int output_buf_data_to_file(void *buf, int f, int sw, int sh, int index); +const char *translate_format_str(int format); +#endif + diff --git a/hardware/rga/include/RockchipRga.h b/hardware/rga/include/RockchipRga.h new file mode 100755 index 0000000000000000000000000000000000000000..f67e96ce41925e3087247f7e3cc12e9243507aa6 --- /dev/null +++ b/hardware/rga/include/RockchipRga.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. + * Authors: + * Zhiqin Wei + * + * 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 _rockchip_rga_h_ +#define _rockchip_rga_h_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "drmrga.h" +#include "GrallocOps.h" +#include "RgaUtils.h" +#include "rga.h" + +////////////////////////////////////////////////////////////////////////////////// +#include "RgaSingleton.h" + +class RockchipRga : public Singleton { +public: + + static inline RockchipRga& get() { + return getInstance(); + } + + int RkRgaInit(); + void RkRgaDeInit(); + void RkRgaGetContext(void **ctx); + int RkRgaAllocBuffer(int drm_fd /* input */, bo_t *bo_info, + int width, int height, int bpp, int flags); + int RkRgaFreeBuffer(int drm_fd /* input */, bo_t *bo_info); + int RkRgaGetAllocBuffer(bo_t *bo_info, int width, int height, int bpp); + int RkRgaGetAllocBufferExt(bo_t *bo_info, int width, int height, int bpp, int flags); + int RkRgaGetAllocBufferCache(bo_t *bo_info, int width, int height, int bpp); + int RkRgaGetMmap(bo_t *bo_info); + int RkRgaUnmap(bo_t *bo_info); + int RkRgaFree(bo_t *bo_info); + int RkRgaGetBufferFd(bo_t *bo_info, int *fd); + int RkRgaBlit(rga_info *src, rga_info *dst, rga_info *src1); + int RkRgaCollorFill(rga_info *dst); + int RkRgaCollorPalette(rga_info *src, rga_info *dst, rga_info *lut); + int RkRgaFlush(); + void RkRgaSetLogOnceFlag(int log) + { + mLogOnce = log; + } + void RkRgaSetAlwaysLogFlag(bool log) + { + mLogAlways = log; + } + void RkRgaLogOutRgaReq(struct rga_req rgaReg); + int RkRgaLogOutUserPara(rga_info *rgaInfo); + inline bool RkRgaIsReady() + { + return mSupportRga; + } + + RockchipRga(); + ~RockchipRga(); +private: + bool mSupportRga; + int mLogOnce; + int mLogAlways; + void *mContext; + + friend class Singleton; +}; +#endif diff --git a/hardware/rga/include/drmrga.h b/hardware/rga/include/drmrga.h new file mode 100755 index 0000000000000000000000000000000000000000..c23db2c5aabd1c4d763982fb67b5edaf4d382bf4 --- /dev/null +++ b/hardware/rga/include/drmrga.h @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. + * Authors: + * Zhiqin Wei + * + * 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 _rk_drm_rga_ +#define _rk_drm_rga_ + +/* flip source image horizontally (around the vertical axis) */ +#define HAL_TRANSFORM_FLIP_H 0x01 +/* flip source image vertically (around the horizontal axis) */ +#define HAL_TRANSFORM_FLIP_V 0x02 +/* rotate source image 90 degrees clockwise */ +#define HAL_TRANSFORM_ROT_90 0x04 +/* rotate source image 180 degrees */ +#define HAL_TRANSFORM_ROT_180 0x03 +/* rotate source image 270 degrees clockwise */ +#define HAL_TRANSFORM_ROT_270 0x07 + +#define HAL_TRANSFORM_FLIP_H_V 0x08 + +/*****************************************************************************/ + +/* for compatibility */ + +#define DRM_RGA_TRANSFORM_ROT_MASK 0x0000000F +#define DRM_RGA_TRANSFORM_ROT_0 0x00000000 +#define DRM_RGA_TRANSFORM_ROT_90 HAL_TRANSFORM_ROT_90 +#define DRM_RGA_TRANSFORM_ROT_180 HAL_TRANSFORM_ROT_180 +#define DRM_RGA_TRANSFORM_ROT_270 HAL_TRANSFORM_ROT_270 + +#define DRM_RGA_TRANSFORM_FLIP_MASK 0x00000003 +#define DRM_RGA_TRANSFORM_FLIP_H HAL_TRANSFORM_FLIP_H +#define DRM_RGA_TRANSFORM_FLIP_V HAL_TRANSFORM_FLIP_V + +enum { + AWIDTH = 0, + AHEIGHT, + ASTRIDE, + AFORMAT, + ASIZE, + ATYPE, +}; +/*****************************************************************************/ + +/* memory type definitions. */ +enum drm_rockchip_gem_mem_type { + /* Physically Continuous memory and used as default. */ + ROCKCHIP_BO_CONTIG = 1 << 0, + /* cachable mapping. */ + ROCKCHIP_BO_CACHABLE = 1 << 1, + /* write-combine mapping. */ + ROCKCHIP_BO_WC = 1 << 2, + ROCKCHIP_BO_SECURE = 1 << 3, + ROCKCHIP_BO_MASK = ROCKCHIP_BO_CONTIG | ROCKCHIP_BO_CACHABLE | + ROCKCHIP_BO_WC | ROCKCHIP_BO_SECURE +}; + +typedef struct bo { + int fd; + void *ptr; + size_t size; + size_t offset; + size_t pitch; + unsigned handle; +} bo_t; + +/* + @value size: user not need care about.For avoid read/write out of memory + */ +typedef struct rga_rect { + int xoffset; + int yoffset; + int width; + int height; + int wstride; + int hstride; + int format; + int size; +} rga_rect_t; + +typedef struct rga_nn { + int nn_flag; + int scale_r; + int scale_g; + int scale_b; + int offset_r; + int offset_g; + int offset_b; +} rga_nn_t; + +typedef struct rga_dither { + int enable; + int mode; + int lut0_l; + int lut0_h; + int lut1_l; + int lut1_h; +} rga_dither_t; + +/* + @value fd: use fd to share memory, it can be ion shard fd,and dma fd. + @value virAddr:userspace address + @value phyAddr:use phy address + @value hnd: use buffer_handle_t + */ +typedef struct rga_info { + int fd; + void *virAddr; + void *phyAddr; + unsigned hnd; + int format; + rga_rect_t rect; + unsigned int blend; + int bufferSize; + int rotation; + int color; + int testLog; + int mmuFlag; + int colorkey_en; + int colorkey_mode; + int colorkey_max; + int colorkey_min; + int scale_mode; + int color_space_mode; + int sync_mode; + rga_nn_t nn; + rga_dither_t dither; + int rop_code; + int reserve[127]; +} rga_info_t; + + +typedef struct drm_rga { + rga_rect_t src; + rga_rect_t dst; +} drm_rga_t; + +/* + @fun rga_set_rect:For use to set the rects esayly + + @param rect:The rect user want to set,like setting the src rect: + drm_rga_t rects; + rga_set_rect(rects.src,0,0,1920,1080,1920,NV12); + mean to set the src rect to the value. + */ +static inline int rga_set_rect(rga_rect_t *rect, int x, int y, int w, int h, int sw, int sh, int f) +{ + if (!rect) { + return -EINVAL; + } + rect->xoffset = x; + rect->yoffset = y; + rect->width = w; + rect->height = h; + rect->wstride = sw; + rect->hstride = sh; + rect->format = f; + return 0; +} + +static inline void rga_set_rotation(rga_info_t *info, int angle) +{ + if (angle == 90) { // 90:HAL_TRANSFORM_ROT + info->rotation = HAL_TRANSFORM_ROT_90; + } else if (angle == 180) { // 180:HAL_TRANSFORM_ROT + info->rotation = HAL_TRANSFORM_ROT_180; + } else if (angle == 270) { // 270:HAL_TRANSFORM_ROT + info->rotation = HAL_TRANSFORM_ROT_270; + } +} +/*****************************************************************************/ + +#endif diff --git a/hardware/rga/include/im2d.h b/hardware/rga/include/im2d.h new file mode 100755 index 0000000000000000000000000000000000000000..640d25770278fc398500a6fbefe6832d43220f40 --- /dev/null +++ b/hardware/rga/include/im2d.h @@ -0,0 +1,908 @@ +/* + * Copyright (C) 2020 Rockchip Electronics Co., Ltd. + * Authors: + * PutinLee + * Cerf Yu + * + * 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 _im2d_h_ +#define _im2d_h_ + +#include "securec.h" +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef IM_API +#define IM_API /* define API export as needed */ +#endif + +typedef enum { + /* Rotation */ + IM_HAL_TRANSFORM_ROT_90 = 1 << 0, + IM_HAL_TRANSFORM_ROT_180 = 1 << 1, + IM_HAL_TRANSFORM_ROT_270 = 1 << 2, + IM_HAL_TRANSFORM_FLIP_H = 1 << 3, + IM_HAL_TRANSFORM_FLIP_V = 1 << 4, + IM_HAL_TRANSFORM_FLIP_H_V = 1 << 5, + IM_HAL_TRANSFORM_MASK = 0x3f, + + /* + * Blend + * Additional blend usage, can be used with both source and target configs. + * If none of the below is set, the default "SRC over DST" is applied. + */ + IM_ALPHA_BLEND_SRC_OVER = 1 << 6, /* Default, Porter-Duff "SRC over DST" */ + IM_ALPHA_BLEND_SRC = 1 << 7, /* Porter-Duff "SRC" */ + IM_ALPHA_BLEND_DST = 1 << 8, /* Porter-Duff "DST" */ + IM_ALPHA_BLEND_SRC_IN = 1 << 9, /* Porter-Duff "SRC in DST" */ + IM_ALPHA_BLEND_DST_IN = 1 << 10, /* Porter-Duff "DST in SRC" */ + IM_ALPHA_BLEND_SRC_OUT = 1 << 11, /* Porter-Duff "SRC out DST" */ + IM_ALPHA_BLEND_DST_OUT = 1 << 12, /* Porter-Duff "DST out SRC" */ + IM_ALPHA_BLEND_DST_OVER = 1 << 13, /* Porter-Duff "DST over SRC" */ + IM_ALPHA_BLEND_SRC_ATOP = 1 << 14, /* Porter-Duff "SRC ATOP" */ + IM_ALPHA_BLEND_DST_ATOP = 1 << 15, /* Porter-Duff "DST ATOP" */ + IM_ALPHA_BLEND_XOR = 1 << 16, /* Xor */ + IM_ALPHA_BLEND_MASK = 0x1ffc0, + + IM_ALPHA_COLORKEY_NORMAL = 1 << 17, + IM_ALPHA_COLORKEY_INVERTED = 1 << 18, + IM_ALPHA_COLORKEY_MASK = 0x60000, + + IM_SYNC = 1 << 19, + IM_ASYNC = 1 << 26, + IM_CROP = 1 << 20, /* Unused */ + IM_COLOR_FILL = 1 << 21, + IM_COLOR_PALETTE = 1 << 22, + IM_NN_QUANTIZE = 1 << 23, + IM_ROP = 1 << 24, + IM_ALPHA_BLEND_PRE_MUL = 1 << 25, +} IM_USAGE; + +typedef enum { + IM_ROP_AND = 0x88, + IM_ROP_OR = 0xee, + IM_ROP_NOT_DST = 0x55, + IM_ROP_NOT_SRC = 0x33, + IM_ROP_XOR = 0xf6, + IM_ROP_NOT_XOR = 0xf9, +} IM_ROP_CODE; + +typedef enum { + IM_RGA_SUPPORT_FORMAT_ERROR_INDEX = 0, + IM_RGA_SUPPORT_FORMAT_RGB_INDEX, + IM_RGA_SUPPORT_FORMAT_RGB_OTHER_INDEX, + IM_RGA_SUPPORT_FORMAT_BPP_INDEX, + IM_RGA_SUPPORT_FORMAT_YUV_8_INDEX, + IM_RGA_SUPPORT_FORMAT_YUV_10_INDEX, + IM_RGA_SUPPORT_FORMAT_YUYV_420_INDEX, + IM_RGA_SUPPORT_FORMAT_YUYV_422_INDEX, + IM_RGA_SUPPORT_FORMAT_YUV_400_INDEX, + IM_RGA_SUPPORT_FORMAT_Y4_INDEX, + IM_RGA_SUPPORT_FORMAT_MASK_INDEX, +} IM_RGA_SUPPORT_FORMAT_INDEX; + +typedef enum { + IM_RGA_SUPPORT_FORMAT_ERROR = 1 << IM_RGA_SUPPORT_FORMAT_ERROR_INDEX, + IM_RGA_SUPPORT_FORMAT_RGB = 1 << IM_RGA_SUPPORT_FORMAT_RGB_INDEX, + IM_RGA_SUPPORT_FORMAT_RGB_OTHER = 1 << IM_RGA_SUPPORT_FORMAT_RGB_OTHER_INDEX, + IM_RGA_SUPPORT_FORMAT_BPP = 1 << IM_RGA_SUPPORT_FORMAT_BPP_INDEX, + IM_RGA_SUPPORT_FORMAT_YUV_8 = 1 << IM_RGA_SUPPORT_FORMAT_YUV_8_INDEX, + IM_RGA_SUPPORT_FORMAT_YUV_10 = 1 << IM_RGA_SUPPORT_FORMAT_YUV_10_INDEX, + IM_RGA_SUPPORT_FORMAT_YUYV_420 = 1 << IM_RGA_SUPPORT_FORMAT_YUYV_420_INDEX, + IM_RGA_SUPPORT_FORMAT_YUYV_422 = 1 << IM_RGA_SUPPORT_FORMAT_YUYV_422_INDEX, + IM_RGA_SUPPORT_FORMAT_YUV_400 = 1 << IM_RGA_SUPPORT_FORMAT_YUV_400_INDEX, + IM_RGA_SUPPORT_FORMAT_Y4 = 1 << IM_RGA_SUPPORT_FORMAT_Y4_INDEX, + IM_RGA_SUPPORT_FORMAT_MASK = ~((~(unsigned int)0x0 << IM_RGA_SUPPORT_FORMAT_MASK_INDEX) | 1), +} IM_RGA_SUPPORT_FORMAT; + +typedef enum { + IM_RGA_SUPPORT_FEATURE_ERROR_INDEX = 0, + IM_RGA_SUPPORT_FEATURE_COLOR_FILL_INDEX, + IM_RGA_SUPPORT_FEATURE_COLOR_PALETTE_INDEX, + IM_RGA_SUPPORT_FEATURE_ROP_INDEX, + IM_RGA_SUPPORT_FEATURE_QUANTIZE_INDEX, + IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC_INDEX, + IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC_INDEX, + IM_RGA_SUPPORT_FEATURE_MASK_INDEX, +} IM_RGA_SUPPORT_FEATURE_INDEX; + +typedef enum { + IM_RGA_SUPPORT_FEATURE_ERROR = 1 << IM_RGA_SUPPORT_FEATURE_ERROR_INDEX, + IM_RGA_SUPPORT_FEATURE_COLOR_FILL = 1 << IM_RGA_SUPPORT_FEATURE_COLOR_FILL_INDEX, + IM_RGA_SUPPORT_FEATURE_COLOR_PALETTE = 1 << IM_RGA_SUPPORT_FEATURE_COLOR_PALETTE_INDEX, + IM_RGA_SUPPORT_FEATURE_ROP = 1 << IM_RGA_SUPPORT_FEATURE_ROP_INDEX, + IM_RGA_SUPPORT_FEATURE_QUANTIZE = 1 << IM_RGA_SUPPORT_FEATURE_QUANTIZE_INDEX, + IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC = 1 << IM_RGA_SUPPORT_FEATURE_SRC1_R2Y_CSC_INDEX, + IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC = 1 << IM_RGA_SUPPORT_FEATURE_DST_FULL_CSC_INDEX, + IM_RGA_SUPPORT_FEATURE_MASK = ~((~(unsigned int)0x0 << IM_RGA_SUPPORT_FEATURE_MASK_INDEX) | 1), +} IM_RGA_SUPPORT_FEATURE; + +/* Status codes, returned by any blit function */ +typedef enum { + IM_STATUS_NOERROR = 2, + IM_STATUS_SUCCESS = 1, + IM_STATUS_NOT_SUPPORTED = -1, + IM_STATUS_OUT_OF_MEMORY = -2, + IM_STATUS_INVALID_PARAM = -3, + IM_STATUS_ILLEGAL_PARAM = -4, + IM_STATUS_FAILED = 0, +} IM_STATUS; + +/* Status codes, returned by any blit function */ +typedef enum { + IM_YUV_TO_RGB_BT601_LIMIT = 1 << 0, + IM_YUV_TO_RGB_BT601_FULL = 2 << 0, + IM_YUV_TO_RGB_BT709_LIMIT = 3 << 0, + IM_YUV_TO_RGB_MASK = 3 << 0, + IM_RGB_TO_YUV_BT601_FULL = 1 << 2, + IM_RGB_TO_YUV_BT601_LIMIT = 2 << 2, + IM_RGB_TO_YUV_BT709_LIMIT = 3 << 2, + IM_RGB_TO_YUV_MASK = 3 << 2, + IM_RGB_TO_Y4 = 1 << 4, + IM_RGB_TO_Y4_DITHER = 2 << 4, + IM_RGB_TO_Y1_DITHER = 3 << 4, + IM_Y4_MASK = 3 << 4, + IM_RGB_FULL = 1 << 8, + IM_RGB_CLIP = 2 << 8, + IM_YUV_BT601_LIMIT_RANGE = 3 << 8, + IM_YUV_BT601_FULL_RANGE = 4 << 8, + IM_YUV_BT709_LIMIT_RANGE = 5 << 8, + IM_YUV_BT709_FULL_RANGE = 6 << 8, + IM_FULL_CSC_MASK = 0xf << 8, + IM_COLOR_SPACE_DEFAULT = 0, +} IM_COLOR_SPACE_MODE; + +typedef enum { + IM_UP_SCALE, + IM_DOWN_SCALE, +} IM_SCALE; + +typedef enum { + INTER_NEAREST, + INTER_LINEAR, + INTER_CUBIC, +} IM_SCALE_MODE; + +/* Get RGA basic information index */ +typedef enum { + RGA_VENDOR = 0, + RGA_VERSION, + RGA_MAX_INPUT, + RGA_MAX_OUTPUT, + RGA_SCALE_LIMIT, + RGA_INPUT_FORMAT, + RGA_OUTPUT_FORMAT, + RGA_FEATURE, + RGA_EXPECTED, + RGA_ALL, +} IM_INFORMATION; + +/*rga version index*/ +typedef enum { + RGA_V_ERR = 0x0, + RGA_1 = 0x1, + RGA_1_PLUS = 0x2, + RGA_2 = 0x3, + RGA_2_LITE0 = 0x4, + RGA_2_LITE1 = 0x5, + RGA_2_ENHANCE = 0x6, +} RGA_VERSION_NUM; + +typedef struct { + RGA_VERSION_NUM version; + unsigned int input_resolution; + unsigned int output_resolution; + unsigned int scale_limit; + unsigned int performance; + unsigned int input_format; + unsigned int output_format; + unsigned int feature; + char reserved[28]; +} rga_info_table_entry; + +/* Rectangle definition */ +typedef struct { + int x; /* upper-left x */ + int y; /* upper-left y */ + int width; /* width */ + int height; /* height */ +} im_rect; + +typedef struct { + int max; /* The Maximum value of the color key */ + int min; /* The minimum value of the color key */ +} im_colorkey_range; + + +typedef struct im_nn { + int scale_r; /* scaling factor on R channal */ + int scale_g; /* scaling factor on G channal */ + int scale_b; /* scaling factor on B channal */ + int offset_r; /* offset on R channal */ + int offset_g; /* offset on G channal */ + int offset_b; /* offset on B channal */ +} im_nn_t; + +/* im_info definition */ +typedef struct { + void* vir_addr; /* virtual address */ + void* phy_addr; /* physical address */ + int fd; /* shared fd */ + int width; /* width */ + int height; /* height */ + int wstride; /* wstride */ + int hstride; /* hstride */ + int format; /* format */ + int color_space_mode; /* color_space_mode */ + int color; /* color, used by color fill */ + int global_alpha; /* global_alpha */ + im_colorkey_range colorkey_range; /* range value of color key */ + im_nn_t nn; + int rop_code; +} rga_buffer_t; + +/* + * @return error message string + */ +#define imStrError(...) \ + ({ \ + const char* err; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + err = imStrError_t(IM_STATUS_INVALID_PARAM); \ + } else if (argc == 1){ \ + err = imStrError_t((IM_STATUS)args[0]); \ + } else { \ + err = ("Fatal error, imStrError() too many parameters\n"); \ + printf("Fatal error, imStrError() too many parameters\n"); \ + } \ + err; \ + }) +IM_API const char* imStrError_t(IM_STATUS status); + +/* + * @return rga_buffer_t + */ +#define wrapbuffer_virtualaddr(vir_addr, width, height, format, ...) \ + ({ \ + rga_buffer_t buffer; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, width, height, format); \ + } else if (argc == 2){ \ + buffer = wrapbuffer_virtualaddr_t(vir_addr, width, height, args[0], args[1], format); \ + } else { \ + printf("invalid parameter\n"); \ + } \ + buffer; \ + }) + +#define wrapbuffer_physicaladdr(phy_addr, width, height, format, ...) \ + ({ \ + rga_buffer_t buffer; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, width, height, format); \ + } else if (argc == 2){ \ + buffer = wrapbuffer_physicaladdr_t(phy_addr, width, height, args[0], args[1], format); \ + } else { \ + printf("invalid parameter\n"); \ + } \ + buffer; \ + }) + +#define wrapbuffer_fd(fd, width, height, format, ...) \ + ({ \ + rga_buffer_t buffer; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + buffer = wrapbuffer_fd_t(fd, width, height, width, height, format); \ + } else if (argc == 2){ \ + buffer = wrapbuffer_fd_t(fd, width, height, args[0], args[1], format); \ + } else { \ + printf("invalid parameter\n"); \ + } \ + buffer; \ + }) + +IM_API rga_buffer_t wrapbuffer_virtualaddr_t( + void* vir_addr, + int width, + int height, + int wstride, + int hstride, + int format); +IM_API rga_buffer_t wrapbuffer_physicaladdr_t(void* phy_addr, + int width, + int height, + int wstride, + int hstride, + int format); +IM_API rga_buffer_t wrapbuffer_fd_t(int fd, int width, int height, int wstride, int hstride, int format); + +/* + * Get RGA basic information, supported resolution, supported format, etc. + * + * @param name + * RGA_VENDOR + * RGA_VERSION + * RGA_MAX_INPUT + * RGA_MAX_OUTPUT + * RGA_INPUT_FORMAT + * RGA_OUTPUT_FORMAT + * RGA_EXPECTED + * RGA_ALL + * + * @returns a usage describing properties of RGA. + */ +IM_API IM_STATUS rga_get_info(rga_info_table_entry *return_table); + +/* + * Query RGA basic information, supported resolution, supported format, etc. + * + * @param name + * RGA_VENDOR + * RGA_VERSION + * RGA_MAX_INPUT + * RGA_MAX_OUTPUT + * RGA_INPUT_FORMAT + * RGA_OUTPUT_FORMAT + * RGA_EXPECTED + * RGA_ALL + * + * @returns a string describing properties of RGA. + */ +IM_API const char* querystring(int name); + +/* + * check RGA basic information, supported resolution, supported format, etc. + * + * @param src + * @param dst + * @param src_rect + * @param dst_rect + * @param mode_usage + * + * @returns no error or else negative error code. + */ +#define imcheck(src, dst, src_rect, dst_rect, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_NOERROR; \ + rga_buffer_t pat; \ + im_rect pat_rect; \ + errno_t eok = memset_s(&pat, sizeof(rga_buffer_t), 0, sizeof(rga_buffer_t)); \ + if (!eok) { \ + printf("memset_s failed!\n"); \ + } \ + eok = memset_s(&pat_rect, sizeof(im_rect), 0, sizeof(im_rect)); \ + if (!eok) { \ + printf("memset_s failed!\n"); \ + } \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, 0); \ + } else if (argc == 1){ \ + ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, args[0]); \ + } else { \ + ret = IM_STATUS_FAILED; \ + printf("check failed\n"); \ + } \ + ret; \ + }) +#define imcheck_composite(src, dst, pat, src_rect, dst_rect, pat_rect, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_NOERROR; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, 0); \ + } else if (argc == 1){ \ + ret = imcheck_t(src, dst, pat, src_rect, dst_rect, pat_rect, args[0]); \ + } else { \ + ret = IM_STATUS_FAILED; \ + printf("check failed\n"); \ + } \ + ret; \ + }) +IM_API IM_STATUS imcheck_t(const rga_buffer_t src, const rga_buffer_t dst, const rga_buffer_t pat, + const im_rect src_rect, const im_rect dst_rect, const im_rect pat_rect, const int mdoe_usage); + +/* + * Resize + * + * @param src + * @param dst + * @param fx + * @param fy + * @param interpolation + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imresize(src, dst, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + double args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(double); \ + if (argc == 0) { \ + ret = imresize_t(src, dst, 0, 0, INTER_LINEAR, 1); \ + } else if (argc == 2){ \ + ret = imresize_t(src, dst, args[0], args[1], INTER_LINEAR, 1); \ + } else if (argc == 3){ \ + ret = imresize_t(src, dst, args[0], args[1], (int)args[2], 1); \ + } else if (argc == 4){ \ + ret = imresize_t(src, dst, args[0], args[1], (int)args[2], (int)args[3]); \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) + +#define impyramid(src, dst, direction) \ + imresize_t(src, \ + dst, \ + (direction) == IM_UP_SCALE ? 0.5 : 2, \ + (direction) == IM_UP_SCALE ? 0.5 : 2, \ + INTER_LINEAR, 1) + +IM_API IM_STATUS imresize_t(const rga_buffer_t src, rga_buffer_t dst, double fx, double fy, int interpolation, int sync); + +/* + * Crop + * + * @param src + * @param dst + * @param rect + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imcrop(src, dst, rect, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imcrop_t(src, dst, rect, 1); \ + } else if (argc == 1){ \ + ret = imcrop_t(src, dst, rect, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) + +IM_API IM_STATUS imcrop_t(const rga_buffer_t src, rga_buffer_t dst, im_rect rect, int sync); + +/* + * rotation + * + * @param src + * @param dst + * @param rotation + * IM_HAL_TRANSFORM_ROT_90 + * IM_HAL_TRANSFORM_ROT_180 + * IM_HAL_TRANSFORM_ROT_270 + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imrotate(src, dst, rotation, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imrotate_t(src, dst, rotation, 1); \ + } else if (argc == 1){ \ + ret = imrotate_t(src, dst, rotation, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) + +IM_API IM_STATUS imrotate_t(const rga_buffer_t src, rga_buffer_t dst, int rotation, int sync); + +/* + * flip + * + * @param src + * @param dst + * @param mode + * IM_HAL_TRANSFORM_FLIP_H + * IM_HAL_TRANSFORM_FLIP_V + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imflip(src, dst, mode, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imflip_t(src, dst, mode, 1); \ + } else if (argc == 1){ \ + ret = imflip_t(src, dst, mode, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) + +IM_API IM_STATUS imflip_t (const rga_buffer_t src, rga_buffer_t dst, int mode, int sync); + +/* + * fill/reset/draw + * + * @param src + * @param dst + * @param rect + * @param color + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imfill(buf, rect, color, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imfill_t(buf, rect, color, 1); \ + } else if (argc == 1){ \ + ret = imfill_t(buf, rect, color, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) + +#define imreset(buf, rect, color, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imfill_t(buf, rect, color, 1); \ + } else if (argc == 1){ \ + ret = imfill_t(buf, rect, color, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) + +#define imdraw(buf, rect, color, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imfill_t(buf, rect, color, 1); \ + } else if (argc == 1){ \ + ret = imfill_t(buf, rect, color, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) +IM_API IM_STATUS imfill_t(rga_buffer_t dst, im_rect rect, int color, int sync); + +/* + * palette + * + * @param src + * @param dst + * @param lut + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define impalette(src, dst, lut, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = impalette_t(src, dst, lut, 1); \ + } else if (argc == 1){ \ + ret = impalette_t(src, dst, lut, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) +IM_API IM_STATUS impalette_t(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t lut, int sync); + +/* + * translate + * + * @param src + * @param dst + * @param x + * @param y + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imtranslate(src, dst, x, y, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imtranslate_t(src, dst, x, y, 1); \ + } else if (argc == 1){ \ + ret = imtranslate_t(src, dst, x, y, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) +IM_API IM_STATUS imtranslate_t(const rga_buffer_t src, rga_buffer_t dst, int x, int y, int sync); + +/* + * copy + * + * @param src + * @param dst + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imcopy(src, dst, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imcopy_t(src, dst, 1); \ + } else if (argc == 1){ \ + ret = imcopy_t(src, dst, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) + +IM_API IM_STATUS imcopy_t(const rga_buffer_t src, rga_buffer_t dst, int sync); + +/* + * blend (SRC + DST -> DST or SRCA + SRCB -> DST) + * + * @param srcA + * @param srcB can be NULL. + * @param dst + * @param mode + * IM_ALPHA_BLEND_MODE + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imblend(srcA, dst, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + rga_buffer_t srcB; \ + errno_t eok = memset_s(&srcB, sizeof(rga_buffer_t), 0x00, sizeof(rga_buffer_t)); \ + if (!eok) { \ + printf("memset_s failed!\n"); \ + } \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1); \ + } else if (argc == 1){ \ + ret = imblend_t(srcA, srcB, dst, args[0], 1); \ + } else if (argc == 2){ \ + ret = imblend_t(srcA, srcB, dst, args[0], args[1]); \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) +#define imcomposite(srcA, srcB, dst, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imblend_t(srcA, srcB, dst, IM_ALPHA_BLEND_SRC_OVER, 1); \ + } else if (argc == 1){ \ + ret = imblend_t(srcA, srcB, dst, args[0], 1); \ + } else if (argc == 2){ \ + ret = imblend_t(srcA, srcB, dst, args[0], args[1]); \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) +IM_API IM_STATUS imblend_t(const rga_buffer_t srcA, const rga_buffer_t srcB, rga_buffer_t dst, int mode, int sync); + +/* + * color key + * + * @param src + * @param dst + * @param colorkey_range + * max color + * min color + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imcolorkey(src, dst, range, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imcolorkey_t(src, dst, range, IM_ALPHA_COLORKEY_NORMAL, 1); \ + } else if (argc == 1){ \ + ret = imcolorkey_t(src, dst, range, args[0], 1); \ + } else if (argc == 2){ \ + ret = imcolorkey_t(src, dst, range, args[0], args[1]); \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) +IM_API IM_STATUS imcolorkey_t(const rga_buffer_t src, rga_buffer_t dst, im_colorkey_range range, int mode, int sync); + +/* + * format convert + * + * @param src + * @param dst + * @param sfmt + * @param dfmt + * @param mode + * color space mode: IM_COLOR_SPACE_MODE + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imcvtcolor(src, dst, sfmt, dfmt, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imcvtcolor_t(src, dst, sfmt, dfmt, IM_COLOR_SPACE_DEFAULT, 1); \ + } else if (argc == 1){ \ + ret = imcvtcolor_t(src, dst, sfmt, dfmt, args[0], 1); \ + } else if (argc == 2){ \ + ret = imcvtcolor_t(src, dst, sfmt, dfmt, args[0], args[1]); \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) + +IM_API IM_STATUS imcvtcolor_t(rga_buffer_t src, rga_buffer_t dst, int sfmt, int dfmt, int mode, int sync); + +/* + * nn quantize + * + * @param src + * @param dst + * @param nninfo + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imquantize(src, dst, nn_info, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imquantize_t(src, dst, nn_info, 1); \ + } else if (argc == 1){ \ + ret = imquantize_t(src, dst, nn_info, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) + +IM_API IM_STATUS imquantize_t(const rga_buffer_t src, rga_buffer_t dst, im_nn_t nn_info, int sync); + +/* + * ROP + * + * @param src + * @param dst + * @param rop_code + * @param sync + * wait until operation complete + * + * @returns success or else negative error code. + */ +#define imrop(src, dst, rop_code, ...) \ + ({ \ + IM_STATUS ret = IM_STATUS_SUCCESS; \ + int args[] = {__VA_ARGS__}; \ + int argc = sizeof(args)/sizeof(int); \ + if (argc == 0) { \ + ret = imrop_t(src, dst, rop_code, 1); \ + } else if (argc == 1){ \ + ret = imrop_t(src, dst, rop_code, args[0]);; \ + } else { \ + ret = IM_STATUS_INVALID_PARAM; \ + printf("invalid parameter\n"); \ + } \ + ret; \ + }) +IM_API IM_STATUS imrop_t(const rga_buffer_t src, rga_buffer_t dst, int rop_code, int sync); + +/* + * process + * + * @param src + * @param dst + * @param usage + * @param ... + * wait until operation complete + * + * @returns success or else negative error code. + */ +IM_API IM_STATUS improcess(rga_buffer_t src, rga_buffer_t dst, rga_buffer_t pat, im_rect srect, im_rect drect, im_rect prect, int usage); + +/* + * block until all execution is complete + * + * @returns success or else negative error code. + */ +IM_API IM_STATUS imsync(void); + +#ifdef __cplusplus +} +#endif +#endif /* _im2d_h_ */ diff --git a/hardware/rga/include/platform_gralloc4.h b/hardware/rga/include/platform_gralloc4.h new file mode 100755 index 0000000000000000000000000000000000000000..2f3ae79cde1b02f88761520d6a67d14f9755b78a --- /dev/null +++ b/hardware/rga/include/platform_gralloc4.h @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2021 Rockchip Electronics 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. + */ + +/* -------------------------------------------------------------------------------------------------------- + * File: platform_gralloc4.h + * + * Desc: 声明对 buffer_handle_t 实例的 get metadata, import_buffer/free_buffer, lock_buffer/unlock_buffer 等接口. + * 这些接口都将基于 IMapper 4.0 (gralloc 4.0) 实现. + * + * ----------------------------------------------------------------------------------- + * < 习语 和 缩略语 > : + * + * ----------------------------------------------------------------------------------- + * Usage: + * + * Note: + * + * Author: ChenZhen + * + * Log: + * init. + ----Fri Aug 28 10:10:14 2020 + * + * -------------------------------------------------------------------------------------------------------- + */ + + +#ifndef __PLATFORM_GRALLOC4_H__ +#define __PLATFORM_GRALLOC4_H__ + + +/* --------------------------------------------------------------------------------------------------------- + * Include Files + * --------------------------------------------------------------------------------------------------------- + */ +#include + +#include + +#include +#include + +#include + +/* --------------------------------------------------------------------------------------------------------- + * Macros Definition + * --------------------------------------------------------------------------------------------------------- + */ + + +namespace gralloc4 { +/* --------------------------------------------------------------------------------------------------------- + * Types and Structures Definition + * --------------------------------------------------------------------------------------------------------- + */ + + +/* --------------------------------------------------------------------------------------------------------- + * Global Functions' Prototype + * --------------------------------------------------------------------------------------------------------- + */ + +/* + * 获取 'handle' 引用的 graphic_buffer 的 internal_format. + */ +uint64_t get_internal_format(buffer_handle_t handle); + +int get_width(buffer_handle_t handle, uint64_t* width); + +int get_height(buffer_handle_t handle, uint64_t* height); + +int get_pixel_stride(buffer_handle_t handle, int* pixel_stride); + +int get_byte_stride(buffer_handle_t handle, int* byte_stride); + +int get_format_requested(buffer_handle_t handle, int* format_requested); + +int get_usage(buffer_handle_t handle, uint64_t* usage); + +int get_allocation_size(buffer_handle_t handle, uint64_t* usage); + +int get_share_fd(buffer_handle_t handle, int* share_fd); + +void unlock(buffer_handle_t bufferHandle); + +void freeBuffer(buffer_handle_t handle); + +/* --------------------------------------------------------------------------------------------------------- + * Inline Functions Implementation + * --------------------------------------------------------------------------------------------------------- + */ +} + +#endif /* __PLATFORM_GRALLOC4_H__ */ diff --git a/hardware/rga/include/rga.h b/hardware/rga/include/rga.h new file mode 100755 index 0000000000000000000000000000000000000000..5a2172845724d3178a3ec3f3c365475bfc913474 --- /dev/null +++ b/hardware/rga/include/rga.h @@ -0,0 +1,654 @@ +/* + * Copyright (C) 2016 Rockchip Electronics Co., Ltd. + * Authors: + * Zhiqin Wei + * + * 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 _RGA_DRIVER_H_ +#define _RGA_DRIVER_H_ +#include +#ifdef __cplusplus +extern "C" +{ +#endif + +#define RGA_BLIT_SYNC 0x5017 +#define RGA_BLIT_ASYNC 0x5018 +#define RGA_FLUSH 0x5019 +#define RGA_GET_RESULT 0x501a +#define RGA_GET_VERSION 0x501b + +#define RGA2_BLIT_SYNC 0x6017 +#define RGA2_BLIT_ASYNC 0x6018 +#define RGA2_FLUSH 0x6019 +#define RGA2_GET_RESULT 0x601a +#define RGA2_GET_VERSION 0x601b +#define RGA2_GET_VERSION 0x601b + +#define RGA_REG_CTRL_LEN 0x8 /* 8 */ +#define RGA_REG_CMD_LEN 0x1c /* 28 */ +#define RGA_CMD_BUF_SIZE 0x700 /* 16*28*4 */ + + + +#ifndef ENABLE +#define ENABLE 1 +#endif + + +#ifndef DISABLE +#define DISABLE 0 +#endif + + + +/* RGA process mode enum */ +enum { + bitblt_mode = 0x0, + color_palette_mode = 0x1, + color_fill_mode = 0x2, + line_point_drawing_mode = 0x3, + blur_sharp_filter_mode = 0x4, + pre_scaling_mode = 0x5, + update_palette_table_mode = 0x6, + update_patten_buff_mode = 0x7, +}; + + +enum { + rop_enable_mask = 0x2, + dither_enable_mask = 0x8, + fading_enable_mask = 0x10, + PD_enbale_mask = 0x20, +}; + +enum { + yuv2rgb_mode0 = 0x0, /* BT.601 MPEG */ + yuv2rgb_mode1 = 0x1, /* BT.601 JPEG */ + yuv2rgb_mode2 = 0x2, /* BT.709 */ + + rgb2yuv_601_full = 0x1 << 8, + rgb2yuv_709_full = 0x2 << 8, + yuv2yuv_601_limit_2_709_limit = 0x3 << 8, + yuv2yuv_601_limit_2_709_full = 0x4 << 8, + yuv2yuv_709_limit_2_601_limit = 0x5 << 8, + yuv2yuv_709_limit_2_601_full = 0x6 << 8, // not support + yuv2yuv_601_full_2_709_limit = 0x7 << 8, + yuv2yuv_601_full_2_709_full = 0x8 << 8, // not support + yuv2yuv_709_full_2_601_limit = 0x9 << 8, // not support + yuv2yuv_709_full_2_601_full = 0xa << 8, // not support + full_csc_mask = 0xf00, +}; + +/* RGA rotate mode */ +enum { + rotate_mode0 = 0x0, /* no rotate */ + rotate_mode1 = 0x1, /* rotate */ + rotate_mode2 = 0x2, /* x_mirror */ + rotate_mode3 = 0x3, /* y_mirror */ +}; + +enum { + color_palette_mode0 = 0x0, /* 1K */ + color_palette_mode1 = 0x1, /* 2K */ + color_palette_mode2 = 0x2, /* 4K */ + color_palette_mode3 = 0x3, /* 8K */ +}; + +enum { + BB_BYPASS = 0x0, /* no rotate */ + BB_ROTATE = 0x1, /* rotate */ + BB_X_MIRROR = 0x2, /* x_mirror */ + BB_Y_MIRROR = 0x3 /* y_mirror */ +}; + +enum { + nearby = 0x0, /* no rotate */ + bilinear = 0x1, /* rotate */ + bicubic = 0x2, /* x_mirror */ +}; + + + + + +/* +// Alpha Red Green Blue +{ 4, 32, {{32,24, 8, 0, 16, 8, 24,16 }}, GGL_RGBA }, // RK_FORMAT_RGBA_8888 +{ 4, 24, {{ 0, 0, 8, 0, 16, 8, 24,16 }}, GGL_RGB }, // RK_FORMAT_RGBX_8888 +{ 3, 24, {{ 0, 0, 8, 0, 16, 8, 24,16 }}, GGL_RGB }, // RK_FORMAT_RGB_888 +{ 4, 32, {{32,24, 24,16, 16, 8, 8, 0 }}, GGL_BGRA }, // RK_FORMAT_BGRA_8888 +{ 2, 16, {{ 0, 0, 16,11, 11, 5, 5, 0 }}, GGL_RGB }, // RK_FORMAT_RGB_565 +{ 2, 16, {{ 1, 0, 16,11, 11, 6, 6, 1 }}, GGL_RGBA }, // RK_FORMAT_RGBA_5551 +{ 2, 16, {{ 4, 0, 16,12, 12, 8, 8, 4 }}, GGL_RGBA }, // RK_FORMAT_RGBA_4444 +{ 3, 24, {{ 0, 0, 24,16, 16, 8, 8, 0 }}, GGL_BGR }, // RK_FORMAT_BGB_888 + +*/ +/* In order to be compatible with RK_FORMAT_XX and HAL_PIXEL_FORMAT_XX, + * RK_FORMAT_XX is shifted to the left by 8 bits to distinguish. */ +typedef enum _Rga_SURF_FORMAT { + RK_FORMAT_RGBA_8888 = 0x0 << 8, + RK_FORMAT_RGBX_8888 = 0x1 << 8, + RK_FORMAT_RGB_888 = 0x2 << 8, + RK_FORMAT_BGRA_8888 = 0x3 << 8, + RK_FORMAT_RGB_565 = 0x4 << 8, + RK_FORMAT_RGBA_5551 = 0x5 << 8, + RK_FORMAT_RGBA_4444 = 0x6 << 8, + RK_FORMAT_BGR_888 = 0x7 << 8, + + RK_FORMAT_YCbCr_422_SP = 0x8 << 8, + RK_FORMAT_YCbCr_422_P = 0x9 << 8, + RK_FORMAT_YCbCr_420_SP = 0xa << 8, + RK_FORMAT_YCbCr_420_P = 0xb << 8, + + RK_FORMAT_YCrCb_422_SP = 0xc << 8, + RK_FORMAT_YCrCb_422_P = 0xd << 8, + RK_FORMAT_YCrCb_420_SP = 0xe << 8, + RK_FORMAT_YCrCb_420_P = 0xf << 8, + + RK_FORMAT_BPP1 = 0x10 << 8, + RK_FORMAT_BPP2 = 0x11 << 8, + RK_FORMAT_BPP4 = 0x12 << 8, + RK_FORMAT_BPP8 = 0x13 << 8, + + RK_FORMAT_Y4 = 0x14 << 8, + RK_FORMAT_YCbCr_400 = 0x15 << 8, + + RK_FORMAT_BGRX_8888 = 0x16 << 8, + + RK_FORMAT_YVYU_422 = 0x18 << 8, + RK_FORMAT_YVYU_420 = 0x19 << 8, + RK_FORMAT_VYUY_422 = 0x1a << 8, + RK_FORMAT_VYUY_420 = 0x1b << 8, + RK_FORMAT_YUYV_422 = 0x1c << 8, + RK_FORMAT_YUYV_420 = 0x1d << 8, + RK_FORMAT_UYVY_422 = 0x1e << 8, + RK_FORMAT_UYVY_420 = 0x1f << 8, + + RK_FORMAT_YCbCr_420_SP_10B = 0x20 << 8, + RK_FORMAT_YCrCb_420_SP_10B = 0x21 << 8, + RK_FORMAT_YCbCr_422_10b_SP = 0x22 << 8, + RK_FORMAT_YCrCb_422_10b_SP = 0x23 << 8, + + RK_FORMAT_BGR_565 = 0x24 << 8, + RK_FORMAT_BGRA_5551 = 0x25 << 8, + RK_FORMAT_BGRA_4444 = 0x26 << 8, + RK_FORMAT_UNKNOWN = 0x100 << 8, +} RgaSURF_FORMAT; + + +typedef struct rga_img_info_t { +#if defined(__arm64__) || defined(__aarch64__) + unsigned long yrgb_addr; /* yrgb mem addr */ + unsigned long uv_addr; /* cb/cr mem addr */ + unsigned long v_addr; /* cr mem addr */ +#else + unsigned int yrgb_addr; /* yrgb mem addr */ + unsigned int uv_addr; /* cb/cr mem addr */ + unsigned int v_addr; /* cr mem addr */ +#endif + unsigned int format; // definition by RK_FORMAT + unsigned short act_w; + unsigned short act_h; + unsigned short x_offset; + unsigned short y_offset; + + unsigned short vir_w; + unsigned short vir_h; + + unsigned short endian_mode; // for BPP + unsigned short alpha_swap; +} +rga_img_info_t; + + +typedef struct mdp_img_act { + unsigned short w; // width + unsigned short h; // height + short x_off; // x offset for the vir + short y_off; // y offset for the vir +} +mdp_img_act; + + + +typedef struct RANGE { + unsigned short min; + unsigned short max; +} +RANGE; + +typedef struct POINT { + unsigned short x; + unsigned short y; +} +POINT; + +typedef struct RECT { + unsigned short xmin; + unsigned short xmax; // width - 1 + unsigned short ymin; + unsigned short ymax; // height - 1 +} RECT; + +typedef struct RGB { + unsigned char r; + unsigned char g; + unsigned char b; + unsigned char res; +}RGB; + + +typedef struct MMU { + unsigned char mmu_en; +#if defined(__arm64__) || defined(__aarch64__) + unsigned long base_addr; +#else + unsigned int base_addr; +#endif + unsigned int mmu_flag; /* [0] mmu enable [1] src_flush [2] dst_flush [3] CMD_flush [4~5] page size */ +} MMU; + + + + +typedef struct COLOR_FILL { + short gr_x_a; + short gr_y_a; + short gr_x_b; + short gr_y_b; + short gr_x_g; + short gr_y_g; + short gr_x_r; + short gr_y_r; +} +COLOR_FILL; + +typedef struct FADING { + unsigned char b; + unsigned char g; + unsigned char r; + unsigned char res; +} +FADING; + + +typedef struct line_draw_t { + POINT start_point; /* LineDraw_start_point */ + POINT end_point; /* LineDraw_end_point */ + unsigned int color; /* LineDraw_color */ + unsigned int flag; /* (enum) LineDrawing mode sel */ + unsigned int line_width; /* range 1~16 */ +} +line_draw_t; + +/* color space convert coefficient. */ +typedef struct csc_coe_t { + int16_t r_v; + int16_t g_y; + int16_t b_u; + int32_t off; +} csc_coe_t; + +typedef struct full_csc_t { + unsigned char flag; + csc_coe_t coe_y; + csc_coe_t coe_u; + csc_coe_t coe_v; +} full_csc_t; + +struct rga_req { + unsigned char render_mode; /* (enum) process mode sel */ + + rga_img_info_t src; /* src image info */ + rga_img_info_t dst; /* dst image info */ + rga_img_info_t pat; /* patten image info */ + +#if defined(__arm64__) || defined(__aarch64__) + unsigned long rop_mask_addr; /* rop4 mask addr */ + unsigned long LUT_addr; /* LUT addr */ +#else + unsigned int rop_mask_addr; /* rop4 mask addr */ + unsigned int LUT_addr; /* LUT addr */ +#endif + + RECT clip; /* dst clip window default value is dst_vir */ + /* value from [0, w-1] / [0, h-1] */ + + int sina; /* dst angle default value 0 16.16 scan from table */ + int cosa; /* dst angle default value 0 16.16 scan from table */ + + unsigned short alpha_rop_flag; /* alpha rop process flag */ + /* ([0] = 1 alpha_rop_enable) */ + /* ([1] = 1 rop enable) */ + /* ([2] = 1 fading_enable) */ + /* ([3] = 1 PD_enable) */ + /* ([4] = 1 alpha cal_mode_sel) */ + /* ([5] = 1 dither_enable) */ + /* ([6] = 1 gradient fill mode sel) */ + /* ([7] = 1 AA_enable) */ + /* ([8] = 1 nn_quantize) */ + /* ([9] = 1 Real color mode) */ + + unsigned char scale_mode; /* 0 nearst / 1 bilnear / 2 bicubic */ + + unsigned int color_key_max; /* color key max */ + unsigned int color_key_min; /* color key min */ + + unsigned int fg_color; /* foreground color */ + unsigned int bg_color; /* background color */ + + COLOR_FILL gr_color; /* color fill use gradient */ + + line_draw_t line_draw_info; + + FADING fading; + + unsigned char PD_mode; /* porter duff alpha mode sel */ + + unsigned char alpha_global_value; /* global alpha value */ + + unsigned short rop_code; /* rop2/3/4 code scan from rop code table */ + + unsigned char bsfilter_flag; /* [2] 0 blur 1 sharp / [1:0] filter_type */ + + unsigned char palette_mode; /* (enum) color palatte 0/1bpp, 1/2bpp 2/4bpp 3/8bpp */ + + unsigned char yuv2rgb_mode; /* (enum) BT.601 MPEG / BT.601 JPEG / BT.709 */ + + unsigned char endian_mode; /* 0/big endian 1/little endian */ + + unsigned char rotate_mode; /* (enum) rotate mode */ + /* 0x0, no rotate */ + /* 0x1, rotate */ + /* 0x2, x_mirror */ + /* 0x3, y_mirror */ + + unsigned char color_fill_mode; /* 0 solid color / 1 patten color */ + + MMU mmu_info; /* mmu information */ + + unsigned char alpha_rop_mode; /* ([0~1] alpha mode) */ + /* ([2~3] rop mode) */ + /* ([4] zero mode en) */ + /* ([5] dst alpha mode) (RGA1) */ + + unsigned char src_trans_mode; + + unsigned char dither_mode; + + full_csc_t full_csc; /* full color space convert */ + + unsigned char CMD_fin_int_enable; + + /* completion is reported through a callback */ + void (*complete)(int retval); +}; + +int RGA_set_src_act_info( + struct rga_req *req, + unsigned int width, /* act width */ + unsigned int height, /* act height */ + unsigned int x_off, /* x_off */ + unsigned int y_off /* y_off */ +); + +#if defined(__arm64__) || defined(__aarch64__) +int RGA_set_src_vir_info( + struct rga_req *req, + unsigned long yrgb_addr, /* yrgb_addr */ + unsigned long uv_addr, /* uv_addr */ + unsigned long v_addr, /* v_addr */ + unsigned int vir_w, /* vir width */ + unsigned int vir_h, /* vir height */ + unsigned char format, /* format */ + unsigned char a_swap_en /* only for 32bit RGB888 format */ +); +#else +int RGA_set_src_vir_info( + struct rga_req *req, + unsigned int yrgb_addr, /* yrgb_addr */ + unsigned int uv_addr, /* uv_addr */ + unsigned int v_addr, /* v_addr */ + unsigned int vir_w, /* vir width */ + unsigned int vir_h, /* vir height */ + unsigned char format, /* format */ + unsigned char a_swap_en /* only for 32bit RGB888 format */ +); +#endif + +int RGA_set_dst_act_info( + struct rga_req *req, + unsigned int width, /* act width */ + unsigned int height, /* act height */ + unsigned int x_off, /* x_off */ + unsigned int y_off /* y_off */ +); + +#if defined(__arm64__) || defined(__aarch64__) +int RGA_set_dst_vir_info( + struct rga_req *msg, + unsigned long yrgb_addr, /* yrgb_addr */ + unsigned long uv_addr, /* uv_addr */ + unsigned long v_addr, /* v_addr */ + unsigned int vir_w, /* vir width */ + unsigned int vir_h, /* vir height */ + RECT *clip, /* clip window */ + unsigned char format, /* format */ + unsigned char a_swap_en +); +#else +int RGA_set_dst_vir_info( + struct rga_req *msg, + unsigned int yrgb_addr, /* yrgb_addr */ + unsigned int uv_addr, /* uv_addr */ + unsigned int v_addr, /* v_addr */ + unsigned int vir_w, /* vir width */ + unsigned int vir_h, /* vir height */ + RECT *clip, /* clip window */ + unsigned char format, /* format */ + unsigned char a_swap_en +); +#endif + +int RGA_set_pat_info( + struct rga_req *msg, + unsigned int width, + unsigned int height, + unsigned int x_off, + unsigned int y_off, + unsigned int pat_format +); + +#if defined(__arm64__) || defined(__aarch64__) +int RGA_set_rop_mask_info( + struct rga_req *msg, + unsigned long rop_mask_addr, + unsigned int rop_mask_endian_mode +); +#else +int RGA_set_rop_mask_info( + struct rga_req *msg, + unsigned int rop_mask_addr, + unsigned int rop_mask_endian_mode +); +#endif + +int RGA_set_alpha_en_info( + struct rga_req *msg, + unsigned int alpha_cal_mode, /* 0:alpha' = alpha + (alpha>>7) | alpha' = alpha */ + unsigned int alpha_mode, /* 0 global alpha / 1 per pixel alpha / 2 mix mode */ + unsigned int global_a_value, + unsigned int PD_en, /* porter duff alpha mode en */ + unsigned int PD_mode, + unsigned int dst_alpha_en ); /* use dst alpha */ + +int RGA_set_rop_en_info( + struct rga_req *msg, + unsigned int ROP_mode, + unsigned int ROP_code, + unsigned int color_mode, + unsigned int solid_color +); + + +int RGA_set_fading_en_info( + struct rga_req *msg, + unsigned char r, + unsigned char g, + unsigned char b +); + +int RGA_set_src_trans_mode_info( + struct rga_req *msg, + unsigned char trans_mode, + unsigned char a_en, + unsigned char b_en, + unsigned char g_en, + unsigned char r_en, + unsigned char color_key_min, + unsigned char color_key_max, + unsigned char zero_mode_en +); + + +int RGA_set_bitblt_mode( + struct rga_req *msg, + unsigned char scale_mode, // 0/near 1/bilnear 2/bicubic + unsigned char rotate_mode, // 0/copy 1/rotate_scale 2/x_mirror 3/y_mirror + unsigned int angle, // rotate angle + unsigned int dither_en, // dither en flag + unsigned int AA_en, // AA flag + unsigned int yuv2rgb_mode +); + + +int RGA_set_color_palette_mode( + struct rga_req *msg, + unsigned char palette_mode, /* 1bpp/2bpp/4bpp/8bpp */ + unsigned char endian_mode, /* src endian mode sel */ + unsigned int bpp1_0_color, /* BPP1 = 0 */ + unsigned int bpp1_1_color /* BPP1 = 1 */ +); + + +int RGA_set_color_fill_mode( + struct rga_req *msg, + COLOR_FILL *gr_color, /* gradient color part */ + unsigned char gr_satur_mode, /* saturation mode */ + unsigned char cf_mode, /* patten fill or solid fill */ + unsigned int color, /* solid color */ + unsigned short pat_width, /* pattern width */ + unsigned short pat_height, /* pattern height */ + unsigned char pat_x_off, /* pattern x offset */ + unsigned char pat_y_off, /* pattern y offset */ + unsigned char aa_en /* alpha en */ +); + + +int RGA_set_line_point_drawing_mode( + struct rga_req *msg, + POINT sp, /* start point */ + POINT ep, /* end point */ + unsigned int color, /* line point drawing color */ + unsigned int line_width, /* line width */ + unsigned char AA_en, /* AA en */ + unsigned char last_point_en /* last point en */ +); + + +int RGA_set_blur_sharp_filter_mode( + struct rga_req *msg, + unsigned char filter_mode, /* blur/sharpness */ + unsigned char filter_type, /* filter intensity */ + unsigned char dither_en /* dither_en flag */ +); + +int RGA_set_pre_scaling_mode( + struct rga_req *msg, + unsigned char dither_en +); + +#if defined(__arm64__) || defined(__aarch64__) +int RGA_update_palette_table_mode( + struct rga_req *msg, + unsigned long LUT_addr, /* LUT table addr */ + unsigned int palette_mode /* 1bpp/2bpp/4bpp/8bpp */ +); +#else +int RGA_update_palette_table_mode( + struct rga_req *msg, + unsigned int LUT_addr, /* LUT table addr */ + unsigned int palette_mode /* 1bpp/2bpp/4bpp/8bpp */ +); +#endif + +int RGA_set_update_patten_buff_mode( + struct rga_req *msg, + unsigned int pat_addr, /* patten addr */ + unsigned int w, /* patten width */ + unsigned int h, /* patten height */ + unsigned int format /* patten format */ +); + +#if defined(__arm64__) || defined(__aarch64__) +int RGA_set_mmu_info( + struct rga_req *msg, + unsigned char mmu_en, + unsigned char src_flush, + unsigned char dst_flush, + unsigned char cmd_flush, + unsigned long base_addr, + unsigned char page_size +); +#else +int RGA_set_mmu_info( + struct rga_req *msg, + unsigned char mmu_en, + unsigned char src_flush, + unsigned char dst_flush, + unsigned char cmd_flush, + unsigned int base_addr, + unsigned char page_size +); +#endif + +void rga_set_fds_offsets( + struct rga_req *rga_request, + unsigned short src_fd, + unsigned short dst_fd, + unsigned int src_offset, + unsigned int dst_offset); + +int RGA_set_src_fence_flag( + struct rga_req *msg, + int acq_fence, + int src_flag +); + + +int RGA_set_dst_fence_flag( + struct rga_req *msg, + int dst_flag +); + +int RGA_get_dst_fence( + struct rga_req *msg +); +#ifdef __cplusplus +} +#endif + +#endif /*_RK29_IPP_DRIVER_H_*/ diff --git a/hardware/rga/lib/librga.z.so b/hardware/rga/lib/librga.z.so new file mode 100644 index 0000000000000000000000000000000000000000..105dea363c24d100a0b45e00e782a5d0a6235675 Binary files /dev/null and b/hardware/rga/lib/librga.z.so differ diff --git a/hardware/rga/lib64/librga.z.so b/hardware/rga/lib64/librga.z.so new file mode 100644 index 0000000000000000000000000000000000000000..aabdcca575804349c72e6ccb0b6b85fb52ca8825 Binary files /dev/null and b/hardware/rga/lib64/librga.z.so differ diff --git a/hardware/wifi/BUILD.gn b/hardware/wifi/BUILD.gn new file mode 100755 index 0000000000000000000000000000000000000000..436c9aae5609ba54223737fcb0cdfc2d427b2eb8 --- /dev/null +++ b/hardware/wifi/BUILD.gn @@ -0,0 +1,101 @@ +# Copyright (C) 2021 HiHope Open Source Organization . +# 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. +import("//build/ohos.gni") + +AP6XXX_ETC_DIR = "//device/soc/rockchip/hardware/wifi/ap6xxx" +DNS_CONFIG_DIR = "//device/soc/rockchip/hardware/wifi" +WIFI_LIB_DIR = "//device/soc/rockchip/hardware/wifi/lib" +WIFI_BIN_DIR = "//device/soc/rockchip/hardware/wifi/bin" + +ohos_prebuilt_etc("clm_bcm43752a2_ag.blob") { + source = "$AP6XXX_ETC_DIR/clm_bcm43752a2_ag.blob" + install_images = [ vendor_base_dir ] + relative_install_dir = "firmware" + part_name = "rockchip_products" + install_enable = true +} + +ohos_prebuilt_etc("fw_bcm43752a2_ag_apsta.bin") { + source = "$AP6XXX_ETC_DIR/fw_bcm43752a2_ag_apsta.bin" + install_images = [ vendor_base_dir ] + relative_install_dir = "firmware" + part_name = "rockchip_products" + install_enable = true +} + +ohos_prebuilt_etc("fw_bcm43752a2_ag.bin") { + source = "$AP6XXX_ETC_DIR/fw_bcm43752a2_ag.bin" + install_images = [ vendor_base_dir ] + relative_install_dir = "firmware" + part_name = "rockchip_products" + install_enable = true +} + +ohos_prebuilt_etc("nvram_ap6275s.txt") { + source = "$AP6XXX_ETC_DIR/nvram_ap6275s.txt" + install_images = [ vendor_base_dir ] + relative_install_dir = "firmware" + part_name = "rockchip_products" + install_enable = true +} + +ohos_prebuilt_etc("resolv.conf") { + source = "$DNS_CONFIG_DIR/etc/resolv.conf" + install_images = [ "system" ] + part_name = "rockchip_products" + install_enable = true +} + +ohos_prebuilt_executable("wpa_cli") { + install_enable = true + source = "$WIFI_BIN_DIR/wpa_cli" + module_install_dir = "bin" + install_images = [ "system" ] + part_name = "rockchip_products" +} + +ohos_prebuilt_executable("wpa_supplicant") { + install_enable = true + source = "$WIFI_BIN_DIR/wpa_supplicant" + module_install_dir = "bin" + install_images = [ "system" ] + part_name = "rockchip_products" +} + +ohos_prebuilt_shared_library("libwpa.z.so") { + source = "$WIFI_LIB_DIR/libwpa.z.so" + module_install_dir = "lib" + install_images = [ "system" ] + part_name = "rockchip_products" +} + +ohos_prebuilt_shared_library("libwpa_client.z.so") { + source = "$WIFI_LIB_DIR/libwpa_client.z.so" + module_install_dir = "lib" + install_images = [ "system" ] + part_name = "rockchip_products" +} + +group("ap6xxx") { + deps = [ + ":clm_bcm43752a2_ag.blob", + ":fw_bcm43752a2_ag.bin", + ":fw_bcm43752a2_ag_apsta.bin", + ":libwpa.z.so", + ":libwpa_client.z.so", + ":nvram_ap6275s.txt", + ":resolv.conf", + ":wpa_cli", + ":wpa_supplicant", + ] +} diff --git a/hardware/wifi/ap6xxx/clm_bcm43752a2_ag.blob b/hardware/wifi/ap6xxx/clm_bcm43752a2_ag.blob new file mode 100644 index 0000000000000000000000000000000000000000..9fabd6346c5231ac9e2e76827d018defb9b37a3e Binary files /dev/null and b/hardware/wifi/ap6xxx/clm_bcm43752a2_ag.blob differ diff --git a/hardware/wifi/ap6xxx/fw_bcm43752a2_ag.bin b/hardware/wifi/ap6xxx/fw_bcm43752a2_ag.bin new file mode 100644 index 0000000000000000000000000000000000000000..41fb330a5a93f6a842c53d55e220e895d7301811 Binary files /dev/null and b/hardware/wifi/ap6xxx/fw_bcm43752a2_ag.bin differ diff --git a/hardware/wifi/ap6xxx/fw_bcm43752a2_ag_apsta.bin b/hardware/wifi/ap6xxx/fw_bcm43752a2_ag_apsta.bin new file mode 100644 index 0000000000000000000000000000000000000000..41fb330a5a93f6a842c53d55e220e895d7301811 Binary files /dev/null and b/hardware/wifi/ap6xxx/fw_bcm43752a2_ag_apsta.bin differ diff --git a/hardware/wifi/ap6xxx/nvram_ap6275s.txt b/hardware/wifi/ap6xxx/nvram_ap6275s.txt new file mode 100644 index 0000000000000000000000000000000000000000..757b436bda59f2f2f797d16d0079d8a2df6be3d4 --- /dev/null +++ b/hardware/wifi/ap6xxx/nvram_ap6275s.txt @@ -0,0 +1,356 @@ +# AP6275S_NVRAM_V1.4_20201116 +# AP6275S v00 WLBGA reference board, iPA version. + +# SSID generated using Alberto's boardssid.py script: +# ********************SUMMARY******************** +# Board Name: AP6275S_V00 +#SSID: 0x086d +#macmid: 0x02df +# Successfully made SSID entry in sromdefs.tcl. +# Successfully made macmid entry in sromdefs.tcl. +# Successfully made SSID entry in tblssid.py. +# ************************************************* +# $ Copyright Broadcom $ +# +# +# <> +NVRAMRev=$Rev: 844050 $ +sromrev=11 +boardrev=0x1213 +boardtype=0x08ed +boardflags=0x00400201 +boardflags2=0xc0800000 +boardflags3=0x40002180 +#boardnum=57410 +macaddr=00:90:4c:12:d0:01 +jtag_irw=38 + +#Regulatory specific +ccode=0 +regrev=0 + +# Board specific +vendid=0x14e4 +devid=0x449d +manfid=0x2d0 +antswitch=0 +pdgain5g=0 +pdgain2g=0 +aa2g=3 +aa5g=3 +agbg0=2 +agbg1=2 +aga0=2 +aga1=2 +extpagain2g=2 +extpagain5g=2 +rxgains2gelnagaina0=0 +rxgains2gtrisoa0=0 +rxgains2gtrelnabypa0=0 +rxgains5gelnagaina0=0 +rxgains5gtrisoa0=0 +rxgains5gtrelnabypa0=0 +rxgains5gmelnagaina0=0 +rxgains5gmtrisoa0=0 +rxgains5gmtrelnabypa0=0 +rxgains5ghelnagaina0=0 +rxgains5ghtrisoa0=0 +rxgains5ghtrelnabypa0=0 +rxgains2gelnagaina1=0 +rxgains2gtrisoa1=0 +rxgains2gtrelnabypa1=0 +rxgains5gelnagaina1=0 +rxgains5gtrisoa1=0 +rxgains5gtrelnabypa1=0 +rxgains5gmelnagaina1=0 +rxgains5gmtrisoa1=0 +rxgains5gmtrelnabypa1=0 +rxgains5ghelnagaina1=0 +rxgains5ghtrisoa1=0 +rxgains5ghtrelnabypa1=0 + +#RSSI related +# 2G +rssicorrnorm_c0=4,4 +rssicorrnorm_c1=4,4 +# 5G +rssicorrnorm5g_c0=5,5,5,5,5,5,5,5,5,5,5,5 +rssicorrnorm5g_c1=4,4,4,4,4,4,4,4,4,4,4,4 + + +#Two range TSSI +tworangetssi2g=0 +tworangetssi5g=0 +lowpowerrange2g=0 +lowpowerrange5g=0 +low_adc_rate_en=1 +# NOTE :================================================================================ +# To run TPC with Two Range TSSI ,set tworangetssi2g = 1 and lowpowerrange2g = 0 +# To run TPC with Single Range TSSI, set tworangetssi2g = 0 +# To run TPC please READ instructions near pa2ga0 and pa2ga1 as well +# To generate PA params for Low Range set tworangetssi2g = 0 and lowpowerrange2g to 1 +# To generate PA params for High Range set tworangetssi2g = 1 and lowpowerrange2g to 1 +# ====================================================================================== + +#Related to FW Download. Host may use this +nocrc=1 + +otpimagesize=502 + +xtalfreq=37400 + +txchain=3 +rxchain=3 + +cckdigfilttype=2 + +#bit mask for slice capability bit 0:2G bit 1:5G +bandcap=3 + +#TXBF Related +rpcal2g=0 +rpcal5gb0=0 +rpcal5gb1=0 +rpcal5gb2=0 +rpcal5gb3=0 + + +#FDSS Related +fdss_level_2g=4,4 +fdss_interp_en=1 +fdss_level_5g=4,4 +fdss_level_11ax_2g=3,3 +fdss_level_11ax_2g_ch1=3,3 +fdss_level_11ax_2g_ch11=3,3 +fdss_level_11ax_5g=3,3 + +#Tempsense Related +tempthresh=110 +tempoffset=40 +rawtempsense=0x1ff +phycal_tempdelta=15 +temps_period=15 +temps_hysteresis=15 + +#------------- TSSI Related ------------- + +tssipos2g=1 +tssipos5g=1 +AvVmid_c0=2,127,4,92,4,91,4,91,4,94 +AvVmid_c1=2,127,4,93,4,93,4,95,3,110 +# CCK in case of multi mode 2 +pa2gccka0=-71,9683,-1064 +pa2gccka1=-59,9596,-1046 +# OFDM in case of multi_mode 2 +pa2ga0=-131,6980,-771 +pa2ga1=-119,7130,-776 +pa5ga0=-150,6098,-730,-141,6312,-729,-127,6151,-723,-136,5935,-702 +#pa5ga0=-150,6098,-730,-141,6312,-729,-136,6050,-713,-179,5504,-688 +#pa5ga1=-143,5954,-705,-136,6243,-722,-100,6496,-727,-89,7190,-798 +pa5ga1=-148,6016,-719,-136,6243,-722,-123,6019,-711,-89,7190,-798 + +# Max power and offsets +maxp2ga0=86 +maxp2ga1=91 +maxp5ga0=75,76,68,68 +maxp5ga1=73,76,70,76 +subband5gver=0x4 +paparambwver=3 +cckpwroffset0=-5 +cckpwroffset1=-3 +pdoffset40ma0=0x4433 +pdoffset80ma0=0x3232 +pdoffset40ma1=0x2333 +pdoffset80ma1=0x1222 +cckbw202gpo=0x1111 +cckbw20ul2gpo=0x0000 +mcsbw202gpo=0x65544332 +mcsbw402gpo=0xEC444332 +dot11agofdmhrbw202gpo=0x4433 +ofdmlrbw202gpo=0x0022 +mcsbw205glpo=0x87544441 +mcsbw405glpo=0xB6443332 +mcsbw805glpo=0xCC553332 +mcsbw1605glpo=0 +mcsbw205gmpo=0x98544440 +mcsbw405gmpo=0xB6443332 +mcsbw805gmpo=0xBB553332 +mcsbw1605gmpo=0 +mcsbw205ghpo=0x98422230 +mcsbw405ghpo=0xB7554442 +mcsbw805ghpo=0xCC442221 +powoffs2gtna0=-3,-2,-2,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,0 +powoffs2gtna1=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0 +mcs1024qam2gpo=0xCCAA +mcs1024qam5glpo=0xFFFFCB +mcs1024qam5gmpo=0xFFEECB +mcs1024qam5ghpo=0xFFFFED +mcs1024qam5gx1po=0xEECCCC +mcs1024qam5gx2po=0xEECCCC +mcs8poexp=0 +mcs9poexp=0 +mcs10poexp=0 + +# 5G power offset per channel for band edge channel +powoffs5g20mtna0=0,0,0,0,0,0,0 +powoffs5g20mtna1=0,0,0,0,0,0,0 +powoffs5g40mtna0=0,0,0,0,0 +powoffs5g40mtna1=0,0,0,0,0 +powoffs5g80mtna0=0,0,0,0,0 +powoffs5g80mtna1=0,0,0,0,0 +mcs11poexp=0 + +#LTE Coex Related +ltecxmux=0 +ltecxpadnum=0x0504 +ltecxfnsel=0x44 +ltecxgcigpio=0x04 +#OOB params +#device_wake_opt=1 +host_wake_opt=0 + +# SWCTRL Related + +swctrlmap_2g=0x10101010,0x06030401,0x04011010,0x000000,0x3FF +swctrlmapext_2g=0x00000000,0x00000000,0x00000000,0x000000,0x000 +swctrlmap_5g=0x80408040,0x21240120,0x01208040,0x000000,0x3FF +swctrlmapext_5g=0x00000000,0x00000000,0x00000000,0x000000,0x000 +clb2gslice0core0=0x01b +clb2gslice1core0=0x000 +clb5gslice0core0=0x064 +clb5gslice1core0=0x000 +clb2gslice0core1=0x056 +clb2gslice1core1=0x000 +clb5gslice0core1=0x0a1 +clb5gslice1core1=0x000 +btc_prisel_ant_mask=0x2 +clb_swctrl_smask_ant0=0x27f +clb_swctrl_smask_ant1=0x2f7 + + +#BT Coex 1:TDM +btc_mode=1 + +# --- PAPD Cal related params ---- +txwbpapden=0 # 0:NBPAPD 1:WBPAPD +# NB PAPD Cal params +nb_eps_offset=470,470 +nb_bbmult=66,66 +nb_papdcalidx=6,6 +nb_txattn=2,2 +nb_rxattn=1,1 +nb_eps_stopidx=63 +epsilonoff_5g20_c0=0,1,1,-1 +epsilonoff_5g40_c0=0,1,1,1 +epsilonoff_5g80_c0=1,0,1,1 +epsilonoff_5g20_c1=1,0,0,-1 +epsilonoff_5g40_c1=0,0,0,0 +epsilonoff_5g80_c1=1,0,1,1 +epsilonoff_2g20_c0=0 +epsilonoff_2g20_c1=0 + +# energy detect threshold +ed_thresh2g=-67 +ed_thresh5g=-67 +# energy detect threshold for EU +eu_edthresh2g=-67 +eu_edthresh5g=-67 + +#rpcal coef for imptxbf +rpcal5gb0=238 +rpcal5gb1=228 +rpcal5gb2=222 +rpcal5gb3=229 +rpcal2g=15 +ocl=0 +bt_coex_chdep_div=1 + +# OLPC Related +disable_olpc=0 +olpc_thresh5g=32 +olpc_anchor5g=40 +olpc_thresh2g=32 +olpc_anchor2g=40 + +#PAPR related +paprdis=0 +paprrmcsgamma2g=500,550,550,-1,-1,-1,-1,-1,-1,-1,-1,-1 +paprrmcsgain2g=128,128,128,0,0,0,0,0,0,0,0,0 +paprrmcsgamma2g_ch13=500,550,550,-1,-1,-1,-1,-1,-1,-1,-1,-1 +paprrmcsgain2g_ch13=128,128,128,0,0,0,0,0,0,0,0,0 +paprrmcsgamma2g_ch1=500,550,550,-1,-1,-1,-1,-1,-1,-1,-1,-1 +paprrmcsgain2g_ch1=128,128,128,0,0,0,0,0,0,0,0,0 +paprrmcsgamma5g20=500,500,500,-1,-1,-1,-1,-1,-1,-1,-1,-1 +paprrmcsgain5g20=128,128,128,0,0,0,0,0,0,0,0,0 +paprrmcsgamma5g40=600,600,600,-1,-1,-1,-1,-1,-1,-1,-1,-1 +paprrmcsgain5g40=128,128,128,0,0,0,0,0,0,0,0,0 +paprrmcsgamma5g80=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +paprrmcsgain5g80=0,0,0,0,0,0,0,0,0,0,0,0 + +# Enable papd for cck when target pwr ge 16dBm +cckpapd_pwrthresh=64 + +## ULOFDMA Board limit PPRs for 2G20 ## +ruppr2g20bpska0=0x8421 +ruppr2g20bpska1=0x8421 +ruppr2g20qpska0=0x8421 +ruppr2g20qpska1=0x8421 +ruppr2g20qam16a0=0x10842 +ruppr2g20qam16a1=0x10842 +ruppr2g20qam64a0=0x18C63 +ruppr2g20qam64a1=0x18C63 +ruppr2g20qam256a0=0x318C6 +ruppr2g20qam256a1=0x318C6 +ruppr2g20qam1024a0=0x5AD6B +ruppr2g20qam1024a1=0x5AD6B +## ULOFDMA Board limit PPRs for 5G20 ## +ruppr5g20bpska0=0x30421 +ruppr5g20bpska1=0x30421 +ruppr5g20qpska0=0x30421 +ruppr5g20qpska1=0x30421 +ruppr5g20qam16a0=0x30842 +ruppr5g20qam16a1=0x30842 +ruppr5g20qam64a0=0x314A5 +ruppr5g20qam64a1=0x314A5 +ruppr5g20qam256a0=0x4A529 +ruppr5g20qam256a1=0x4A529 +ruppr5g20qam1024a0=0x7294A +ruppr5g20qam1024a1=0x7294A +## ULOFDMA Board limit PPRs for 5G40 ## +ruppr5g40bpska0=0x508421 +ruppr5g40bpska1=0x508421 +ruppr5g40qpska0=0x508421 +ruppr5g40qpska1=0x508421 +ruppr5g40qam16a0=0x508421 +ruppr5g40qam16a1=0x508421 +ruppr5g40qam64a0=0x518C63 +ruppr5g40qam64a1=0x518C63 +ruppr5g40qam256a0=0xA42108 +ruppr5g40qam256a1=0xA42108 +ruppr5g40qam1024a0=0xE68421 +ruppr5g40qam1024a1=0xE68421 +## ULOFDMA Board limit PPRs for 5G80 ## +ruppr5g80bpska0=0xC108421 +ruppr5g80bpska1=0xC108421 +ruppr5g80qpska0=0xC108421 +ruppr5g80qpska1=0xC108421 +ruppr5g80qam16a0=0xC108421 +ruppr5g80qam16a1=0xC108421 +ruppr5g80qam64a0=0x14418C63 +ruppr5g80qam64a1=0x14418C63 +ruppr5g80qam256a0=0x2C94A529 +ruppr5g80qam256a1=0x2C94A529 +ruppr5g80qam1024a0=0x3CD60000 +ruppr5g80qam1024a1=0x3CD60000 + +muxenab=0x10 + +# ########### BTC Dynctl profile params ############ +# flags:bit0 - dynctl enabled, bit1 dynamic desense, bit2 dynamic mode, bit 3 TX power control +#btcdyn_flags=1 + +#btcdyn_default_btc_mode=5 +#btcdyn_msw_rows=0 +#btcdyn_dsns_rows=0 +#btc_params1007=100 +#btc_params1017=4 \ No newline at end of file diff --git a/hardware/wifi/bin/wpa_cli b/hardware/wifi/bin/wpa_cli new file mode 100644 index 0000000000000000000000000000000000000000..30892371ed74f2227bb5c9d6a13e78d4562355a4 Binary files /dev/null and b/hardware/wifi/bin/wpa_cli differ diff --git a/hardware/wifi/bin/wpa_supplicant b/hardware/wifi/bin/wpa_supplicant new file mode 100644 index 0000000000000000000000000000000000000000..f2d2c48ee5c0f9049725a35222d97d9fb615ac7b Binary files /dev/null and b/hardware/wifi/bin/wpa_supplicant differ diff --git a/hardware/wifi/etc/resolv.conf b/hardware/wifi/etc/resolv.conf new file mode 100644 index 0000000000000000000000000000000000000000..f5d24a1ad6f3cd7d1f4fbb8b705401518dedbf17 --- /dev/null +++ b/hardware/wifi/etc/resolv.conf @@ -0,0 +1,2 @@ +nameserver 114.114.114.114 +nameserver 8.8.8.8 diff --git a/hardware/wifi/lib/libwpa.z.so b/hardware/wifi/lib/libwpa.z.so new file mode 100644 index 0000000000000000000000000000000000000000..39e61829a77594dcb7b7c15eb79c0c5f1de7c04b Binary files /dev/null and b/hardware/wifi/lib/libwpa.z.so differ diff --git a/hardware/wifi/lib/libwpa_client.z.so b/hardware/wifi/lib/libwpa_client.z.so new file mode 100644 index 0000000000000000000000000000000000000000..94f06e4c43acd705f790cb357415b2e2428866f4 Binary files /dev/null and b/hardware/wifi/lib/libwpa_client.z.so differ diff --git a/hardware/wifi/proc/sys/net/ipv4/ping_group_range b/hardware/wifi/proc/sys/net/ipv4/ping_group_range new file mode 100644 index 0000000000000000000000000000000000000000..f4a3074921b639afe08ccd441bf506df7f65ac7f --- /dev/null +++ b/hardware/wifi/proc/sys/net/ipv4/ping_group_range @@ -0,0 +1 @@ +0 10 \ No newline at end of file