From 7eca206ca11658641587e3217b1247c9d9fd570a Mon Sep 17 00:00:00 2001 From: zhongluping <278527840@qq.com> Date: Wed, 9 Nov 2022 15:07:13 +0800 Subject: [PATCH] add openjpeg Signed-off-by: zhongluping <278527840@qq.com> --- openjpeg/BUILD.gn | 360 ++++++++++++++++++ openjpeg/README.OpenSource | 11 + openjpeg/README_zh.md | 16 + openjpeg/adapter/include/opj_apps_config.h | 15 + openjpeg/adapter/include/opj_config.h | 10 + openjpeg/adapter/include/opj_config_private.h | 49 +++ openjpeg/adapter/include/tiff/tif_config.h | 261 +++++++++++++ openjpeg/adapter/include/tiff/tiffconf.h | 115 ++++++ openjpeg/adapter/script/test_open_jpeg.sh | 166 ++++++++ openjpeg/bundle.json | 33 ++ openjpeg/docs/media/running_result.png | Bin 0 -> 76784 bytes openjpeg/docs/rom_integrate.md | 152 ++++++++ 12 files changed, 1188 insertions(+) create mode 100755 openjpeg/BUILD.gn create mode 100755 openjpeg/README.OpenSource create mode 100755 openjpeg/README_zh.md create mode 100755 openjpeg/adapter/include/opj_apps_config.h create mode 100755 openjpeg/adapter/include/opj_config.h create mode 100755 openjpeg/adapter/include/opj_config_private.h create mode 100755 openjpeg/adapter/include/tiff/tif_config.h create mode 100755 openjpeg/adapter/include/tiff/tiffconf.h create mode 100755 openjpeg/adapter/script/test_open_jpeg.sh create mode 100644 openjpeg/bundle.json create mode 100755 openjpeg/docs/media/running_result.png create mode 100755 openjpeg/docs/rom_integrate.md diff --git a/openjpeg/BUILD.gn b/openjpeg/BUILD.gn new file mode 100755 index 00000000..7bbfed90 --- /dev/null +++ b/openjpeg/BUILD.gn @@ -0,0 +1,360 @@ +# Copyright (c) 2022 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. + +import("//build/ohos.gni") + +declare_args() { + enable_openjpeg_test = false +} + +config("tiff_cflag_config") { + cflags = [ + "-Wno-unused-function", + "-D_FILE_OFFSET_BITS=64", + "-Wno-format", + "-Wno-misleading-indentation", + ] +} + +ohos_static_library("tiff") { + sources = [ + "openjpeg/thirdparty/libtiff/tif_aux.c", + "openjpeg/thirdparty/libtiff/tif_close.c", + "openjpeg/thirdparty/libtiff/tif_codec.c", + "openjpeg/thirdparty/libtiff/tif_color.c", + "openjpeg/thirdparty/libtiff/tif_compress.c", + "openjpeg/thirdparty/libtiff/tif_dir.c", + "openjpeg/thirdparty/libtiff/tif_dirinfo.c", + "openjpeg/thirdparty/libtiff/tif_dirread.c", + "openjpeg/thirdparty/libtiff/tif_dirwrite.c", + "openjpeg/thirdparty/libtiff/tif_dumpmode.c", + "openjpeg/thirdparty/libtiff/tif_error.c", + "openjpeg/thirdparty/libtiff/tif_extension.c", + "openjpeg/thirdparty/libtiff/tif_fax3.c", + "openjpeg/thirdparty/libtiff/tif_fax3sm.c", + "openjpeg/thirdparty/libtiff/tif_flush.c", + "openjpeg/thirdparty/libtiff/tif_getimage.c", + "openjpeg/thirdparty/libtiff/tif_jbig.c", + "openjpeg/thirdparty/libtiff/tif_jpeg.c", + "openjpeg/thirdparty/libtiff/tif_jpeg_12.c", + "openjpeg/thirdparty/libtiff/tif_luv.c", + "openjpeg/thirdparty/libtiff/tif_lzma.c", + "openjpeg/thirdparty/libtiff/tif_lzw.c", + "openjpeg/thirdparty/libtiff/tif_next.c", + "openjpeg/thirdparty/libtiff/tif_ojpeg.c", + "openjpeg/thirdparty/libtiff/tif_open.c", + "openjpeg/thirdparty/libtiff/tif_packbits.c", + "openjpeg/thirdparty/libtiff/tif_pixarlog.c", + "openjpeg/thirdparty/libtiff/tif_predict.c", + "openjpeg/thirdparty/libtiff/tif_print.c", + "openjpeg/thirdparty/libtiff/tif_read.c", + "openjpeg/thirdparty/libtiff/tif_strip.c", + "openjpeg/thirdparty/libtiff/tif_swab.c", + "openjpeg/thirdparty/libtiff/tif_thunder.c", + "openjpeg/thirdparty/libtiff/tif_tile.c", + "openjpeg/thirdparty/libtiff/tif_unix.c", + "openjpeg/thirdparty/libtiff/tif_version.c", + "openjpeg/thirdparty/libtiff/tif_warning.c", + "openjpeg/thirdparty/libtiff/tif_write.c", + "openjpeg/thirdparty/libtiff/tif_zip.c", + ] + include_dirs = [ + "./openjpeg/thirdparty/libtiff", + "./adapter/include/tiff", + ] + configs = [ ":tiff_cflag_config" ] +} + +config("lcms2_cflag_config") { + cflags = [ "-Wno-unused-function" ] +} + +ohos_static_library("lcms2") { + sources = [ + "./openjpeg/thirdparty/liblcms2/src/cmsalpha.c", + "./openjpeg/thirdparty/liblcms2/src/cmscam02.c", + "./openjpeg/thirdparty/liblcms2/src/cmscgats.c", + "./openjpeg/thirdparty/liblcms2/src/cmscnvrt.c", + "./openjpeg/thirdparty/liblcms2/src/cmserr.c", + "./openjpeg/thirdparty/liblcms2/src/cmsgamma.c", + "./openjpeg/thirdparty/liblcms2/src/cmsgmt.c", + "./openjpeg/thirdparty/liblcms2/src/cmshalf.c", + "./openjpeg/thirdparty/liblcms2/src/cmsintrp.c", + "./openjpeg/thirdparty/liblcms2/src/cmsio0.c", + "./openjpeg/thirdparty/liblcms2/src/cmsio1.c", + "./openjpeg/thirdparty/liblcms2/src/cmslut.c", + "./openjpeg/thirdparty/liblcms2/src/cmsmd5.c", + "./openjpeg/thirdparty/liblcms2/src/cmsmtrx.c", + "./openjpeg/thirdparty/liblcms2/src/cmsnamed.c", + "./openjpeg/thirdparty/liblcms2/src/cmsopt.c", + "./openjpeg/thirdparty/liblcms2/src/cmspack.c", + "./openjpeg/thirdparty/liblcms2/src/cmspcs.c", + "./openjpeg/thirdparty/liblcms2/src/cmsplugin.c", + "./openjpeg/thirdparty/liblcms2/src/cmsps2.c", + "./openjpeg/thirdparty/liblcms2/src/cmssamp.c", + "./openjpeg/thirdparty/liblcms2/src/cmssm.c", + "./openjpeg/thirdparty/liblcms2/src/cmstypes.c", + "./openjpeg/thirdparty/liblcms2/src/cmsvirt.c", + "./openjpeg/thirdparty/liblcms2/src/cmswtpnt.c", + "./openjpeg/thirdparty/liblcms2/src/cmsxform.c", + ] + include_dirs = [ + "./openjpeg/thirdparty/liblcms2/include", + "./openjpeg/thirdparty/liblcms2/src", + ] + configs = [ ":lcms2_cflag_config" ] +} + +config("openjpeg_cflag_config") { + cflags = [ + "-Wno-unused-function", + "-Wno-declaration-after-statement", + "-DMUTEX_pthread", + "-Dopenjp2_EXPORTS", + ] +} + +ohos_shared_library("openjp2") { + sources = [ + "./openjpeg/src/lib/openjp2/bio.c", + "./openjpeg/src/lib/openjp2/cio.c", + "./openjpeg/src/lib/openjp2/dwt.c", + "./openjpeg/src/lib/openjp2/event.c", + "./openjpeg/src/lib/openjp2/function_list.c", + "./openjpeg/src/lib/openjp2/ht_dec.c", + "./openjpeg/src/lib/openjp2/image.c", + "./openjpeg/src/lib/openjp2/invert.c", + "./openjpeg/src/lib/openjp2/j2k.c", + "./openjpeg/src/lib/openjp2/jp2.c", + "./openjpeg/src/lib/openjp2/mct.c", + "./openjpeg/src/lib/openjp2/mqc.c", + "./openjpeg/src/lib/openjp2/openjpeg.c", + "./openjpeg/src/lib/openjp2/opj_clock.c", + "./openjpeg/src/lib/openjp2/opj_malloc.c", + "./openjpeg/src/lib/openjp2/pi.c", + "./openjpeg/src/lib/openjp2/sparse_array.c", + "./openjpeg/src/lib/openjp2/t1.c", + "./openjpeg/src/lib/openjp2/t2.c", + "./openjpeg/src/lib/openjp2/tcd.c", + "./openjpeg/src/lib/openjp2/tgt.c", + "./openjpeg/src/lib/openjp2/thread.c", + ] + + include_dirs = [ + "./openjpeg/src/lib/openjp2", + "./adapter/include", + "./adapter/include/tiff", + "./openjpeg/thirdparty/liblcms2/include", + ] + + configs = [ ":openjpeg_cflag_config" ] + + part_name = "openjpeg" +} + +config("openjpeg_test_config") { + cflags = [ + "-Wno-macro-redefined", + "-Wno-unused-variable", + "-DOPJ_HAVE_LIBLCMS2", + "-DOPJ_HAVE_LCMS2_H", + "-DOPJ_HAVE_TIFF_H", + "-DOPJ_HAVE_LIBTIFF", + ] + include_dirs = [ + "./openjpeg/src/lib/openjp2", + "./openjpeg/src/bin/common", + "./openjpeg/src/lib/jp2", + "./openjpeg/src/bin/jp2", + "./adapter/include", + "./adapter/include/tiff", + "./openjpeg/thirdparty/libtiff", + ] +} + +ohos_executable("test_tile_decoder") { + sources = [ + "./openjpeg/src/bin/common/opj_getopt.c", + "./openjpeg/tests/test_tile_decoder.c", + ] + public_configs = [ ":openjpeg_test_config" ] + deps = [ + ":lcms2", + ":openjp2", + ":tiff", + ] + part_name = "openjpeg" +} + +ohos_executable("test_tile_encoder") { + sources = [ + "./openjpeg/src/bin/common/opj_getopt.c", + "./openjpeg/tests/test_tile_encoder.c", + ] + public_configs = [ ":openjpeg_test_config" ] + deps = [ + ":lcms2", + ":openjp2", + ":tiff", + ] + part_name = "openjpeg" +} + +ohos_executable("compare_dump_files") { + sources = [ + "./openjpeg/src/bin/common/opj_getopt.c", + "./openjpeg/tests/compare_dump_files.c", + ] + public_configs = [ ":openjpeg_test_config" ] + deps = [ + ":lcms2", + ":openjp2", + ":tiff", + ] + part_name = "openjpeg" +} + +ohos_executable("compare_images") { + sources = [ + "./openjpeg/src/bin/common/opj_getopt.c", + "./openjpeg/src/bin/jp2/convert.c", + "./openjpeg/src/bin/jp2/converttif.c", + "./openjpeg/tests/compare_images.c", + ] + public_configs = [ ":openjpeg_test_config" ] + deps = [ + ":lcms2", + ":openjp2", + ":tiff", + ] + part_name = "openjpeg" +} + +ohos_executable("compare_raw_files") { + sources = [ + "./openjpeg/src/bin/common/opj_getopt.c", + "./openjpeg/tests/compare_raw_files.c", + ] + + public_configs = [ ":openjpeg_test_config" ] + deps = [ + ":lcms2", + ":openjp2", + ":tiff", + ] + part_name = "openjpeg" +} + +ohos_executable("j2k_random_tile_access") { + sources = [ + "./openjpeg/src/bin/common/opj_getopt.c", + "./openjpeg/tests/j2k_random_tile_access.c", + ] + + public_configs = [ ":openjpeg_test_config" ] + deps = [ + ":lcms2", + ":openjp2", + ":tiff", + ] + part_name = "openjpeg" +} + +ohos_executable("pdf2jp2") { + sources = [ + "./openjpeg/src/bin/common/opj_getopt.c", + "./openjpeg/tests/pdf2jp2.c", + ] + + public_configs = [ ":openjpeg_test_config" ] + deps = [ + ":lcms2", + ":openjp2", + ":tiff", + ] + part_name = "openjpeg" +} + +ohos_executable("test_decode_area") { + sources = [ + "./openjpeg/src/bin/common/opj_getopt.c", + "./openjpeg/tests/test_decode_area.c", + ] + + public_configs = [ ":openjpeg_test_config" ] + deps = [ + ":lcms2", + ":openjp2", + ":tiff", + ] + part_name = "openjpeg" +} + +ohos_executable("ppm2rgb3") { + sources = [ + "./openjpeg/src/bin/common/opj_getopt.c", + "./openjpeg/tests/ppm2rgb3.c", + ] + + public_configs = [ ":openjpeg_test_config" ] + deps = [ + ":lcms2", + ":openjp2", + ":tiff", + ] + part_name = "openjpeg" +} + +ohos_executable("testempty0") { + sources = [ "./openjpeg/tests/unit/testempty0.c" ] + + public_configs = [ ":openjpeg_test_config" ] + deps = [ ":openjp2" ] + part_name = "openjpeg" +} + +ohos_executable("testempty1") { + sources = [ "./openjpeg/tests/unit/testempty1.c" ] + + public_configs = [ ":openjpeg_test_config" ] + deps = [ ":openjp2" ] + part_name = "openjpeg" +} + +ohos_executable("testempty2") { + sources = [ "./openjpeg/tests/unit/testempty2.c" ] + + public_configs = [ ":openjpeg_test_config" ] + deps = [ ":openjp2" ] + part_name = "openjpeg" +} + +group("openjpeg") { + deps = [ ":openjp2" ] + if (enable_openjpeg_test) { + deps += [ + ":compare_dump_files", + ":compare_images", + ":compare_raw_files", + ":j2k_random_tile_access", + ":pdf2jp2", + ":ppm2rgb3", + ":test_decode_area", + ":test_tile_decoder", + ":test_tile_encoder", + ":testempty0", + ":testempty1", + ":testempty2", + ] + } +} diff --git a/openjpeg/README.OpenSource b/openjpeg/README.OpenSource new file mode 100755 index 00000000..30935aae --- /dev/null +++ b/openjpeg/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "openJPEG", + "License": 2-clauses BSD license, + "License File": "LICENSE.TXT", + "Version Number": "v2.5.0", + "Owner": "huangminzhong2@huawei.com", + "Upstream URL": "https://github.com/uclouvain/openjpeg", + "Description": "OpenJPEG is an open-source JPEG 2000 codec written in C language. It has been developed in order to promote the use of JPEG 2000, a still-image compression standard from the Joint Photographic Experts Group (JPEG). Since April 2015, it is officially recognized by ISO/IEC and ITU-T as a JPEG 2000 Reference Software." + } +] diff --git a/openjpeg/README_zh.md b/openjpeg/README_zh.md new file mode 100755 index 00000000..9aa0c5b6 --- /dev/null +++ b/openjpeg/README_zh.md @@ -0,0 +1,16 @@ +# openjpeg 三方库说明 + +## 功能简介 + +OpenJPEG 是用 C 语言编写的开源 JPEG 2000 编解码器。 + +## 使用约束 + +- ROM版本:OpenHarmony3.2 beta1 +- 三方库版本:v2.5.0 +- 当前适配的功能:[JPEG 2000](https://jpeg.org/jpeg2000/) 图像编解码 +- License:[The 2-Clause BSD License](https://github.com/uclouvain/openjpeg/blob/v2.5.0/LICENSE) + +## 集成方式 + +- [系统Rom包集成](./docs/rom_integrate.md)。 diff --git a/openjpeg/adapter/include/opj_apps_config.h b/openjpeg/adapter/include/opj_apps_config.h new file mode 100755 index 00000000..1832c5a5 --- /dev/null +++ b/openjpeg/adapter/include/opj_apps_config.h @@ -0,0 +1,15 @@ +#include "opj_config_private.h" + +/* create opj_apps_config.h for CMake */ + +#define OPJ_HAVE_LIBPNG +#define OPJ_HAVE_PNG_H +#define OPJ_HAVE_LIBTIFF +#define OPJ_HAVE_TIFF_H + +/* #undef OPJ_HAVE_LIBLCMS1 */ +/* #undef OPJ_HAVE_LIBLCMS2 */ +/* #undef OPJ_HAVE_LCMS1_H */ +/* #undef OPJ_HAVE_LCMS2_H */ + + diff --git a/openjpeg/adapter/include/opj_config.h b/openjpeg/adapter/include/opj_config.h new file mode 100755 index 00000000..6eae46c3 --- /dev/null +++ b/openjpeg/adapter/include/opj_config.h @@ -0,0 +1,10 @@ +/* create opj_config.h for CMake */ +#define OPJ_HAVE_STDINT_H 1 + +/*--------------------------------------------------------------------------*/ +/* OpenJPEG Versioning */ + +/* Version number. */ +#define OPJ_VERSION_MAJOR 2 +#define OPJ_VERSION_MINOR 5 +#define OPJ_VERSION_BUILD 0 diff --git a/openjpeg/adapter/include/opj_config_private.h b/openjpeg/adapter/include/opj_config_private.h new file mode 100755 index 00000000..3aad25e6 --- /dev/null +++ b/openjpeg/adapter/include/opj_config_private.h @@ -0,0 +1,49 @@ +/* create opj_config_private.h for CMake */ +#define OPJ_HAVE_INTTYPES_H 1 + +#define OPJ_PACKAGE_VERSION "2.5.0" + +/* Not used by openjp2*/ +/*#define HAVE_MEMORY_H 1*/ +/*#define HAVE_STDLIB_H 1*/ +/*#define HAVE_STRINGS_H 1*/ +/*#define HAVE_STRING_H 1*/ +/*#define HAVE_SYS_STAT_H 1*/ +/*#define HAVE_SYS_TYPES_H 1 */ +/*#define HAVE_UNISTD_H 1*/ + +/* #undef _LARGEFILE_SOURCE */ +/* #undef _LARGE_FILES */ +/* #undef _FILE_OFFSET_BITS */ +#define OPJ_HAVE_FSEEKO ON + +/* find whether or not have */ +#define OPJ_HAVE_MALLOC_H +/* check if function `aligned_alloc` exists */ +/* #undef OPJ_HAVE_ALIGNED_ALLOC */ +/* check if function `_aligned_malloc` exists */ +/* #undef OPJ_HAVE__ALIGNED_MALLOC */ +/* check if function `memalign` exists */ +#define OPJ_HAVE_MEMALIGN +/* check if function `posix_memalign` exists */ +#define OPJ_HAVE_POSIX_MEMALIGN + +#if !defined(_POSIX_C_SOURCE) +#if defined(OPJ_HAVE_FSEEKO) || defined(OPJ_HAVE_POSIX_MEMALIGN) +/* Get declarations of fseeko, ftello, posix_memalign. */ +#define _POSIX_C_SOURCE 200112L +#endif +#endif + +/* Byte order. */ +/* All compilers that support Mac OS X define either __BIG_ENDIAN__ or +__LITTLE_ENDIAN__ to match the endianness of the architecture being +compiled for. This is not necessarily the same as the architecture of the +machine doing the building. In order to support Universal Binaries on +Mac OS X, we prefer those defines to decide the endianness. +On other platforms we use the result of the TRY_RUN. */ +#if !defined(__APPLE__) +/* #undef OPJ_BIG_ENDIAN */ +#elif defined(__BIG_ENDIAN__) +# define OPJ_BIG_ENDIAN +#endif diff --git a/openjpeg/adapter/include/tiff/tif_config.h b/openjpeg/adapter/include/tiff/tif_config.h new file mode 100755 index 00000000..9549075c --- /dev/null +++ b/openjpeg/adapter/include/tiff/tif_config.h @@ -0,0 +1,261 @@ +/* libtiff/tif_config.h.cmake.in. Not generated, but originated from autoheader. */ +/* This file must be kept up-to-date with needed substitutions from libtiff/tif_config.h.in. */ + +/* Support CCITT Group 3 & 4 algorithms */ +#define CCITT_SUPPORT 1 + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#define CHECK_JPEG_YCBCR_SUBSAMPLING 1 + +/* enable partial strip reading for large strips (experimental) */ +/* #undef CHUNKY_STRIP_READ_SUPPORT */ + +/* Support C++ stream API (requires C++ compiler) */ +/* #undef CXX_SUPPORT */ + +/* enable deferred strip/tile offset/size loading (experimental) */ +/* #undef DEFER_STRILE_LOAD */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ASSERT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `floor' function. */ +#define HAVE_FLOOR 1 + +/* Define to 1 if you have the `getopt' function. */ +#define HAVE_GETOPT 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_GLUT_GLUT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_GL_GLUT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_GL_GLU_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_GL_GL_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_IO_H */ + +/* Define to 1 if you have the `isascii' function. */ +#define HAVE_ISASCII 1 + +/* Define to 1 if you have the `jbg_newlen' function. */ +/* #undef HAVE_JBG_NEWLEN */ + +/* Define to 1 if you have the `lfind' function. */ +#define HAVE_LFIND 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `memset' function. */ +#define HAVE_MEMSET 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OPENGL_GLU_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OPENGL_GL_H */ + +/* Define to 1 if you have the `pow' function. */ +#define HAVE_POW 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SEARCH_H 1 + +/* Define to 1 if you have the `setmode' function. */ +/* #undef HAVE_SETMODE */ + +/* Define to 1 if you have the `snprintf' function. */ +#define HAVE_SNPRINTF 1 + +/* Define to 1 if you have the `sqrt' function. */ +#define HAVE_SQRT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strchr' function. */ +#define HAVE_STRCHR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strrchr' function. */ +#define HAVE_STRRCHR 1 + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the `strtol' function. */ +#define HAVE_STRTOL 1 + +/* Define to 1 if you have the `strtoul' function. */ +#define HAVE_STRTOUL 1 + +/* Define to 1 if you have the `strtoull' function. */ +#define HAVE_STRTOULL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* 8/12 bit libjpeg dual mode enabled */ +/* #undef JPEG_DUAL_MODE_8_12 */ + +/* 12bit libjpeg primary include file with path */ +#define LIBJPEG_12_PATH + +/* Support LZMA2 compression */ +/* #undef LZMA_SUPPORT */ + +/* Name of package */ +#define PACKAGE "" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION ""4.0.6"" + +/* The size of `signed int', as computed by sizeof. */ +#define SIZEOF_SIGNED_INT 4 + +/* The size of `signed long', as computed by sizeof. */ +#define SIZEOF_SIGNED_LONG 8 + +/* The size of `signed long long', as computed by sizeof. */ +#define SIZEOF_SIGNED_LONG_LONG 8 + +/* The size of `signed short', as computed by sizeof. */ +#define SIZEOF_SIGNED_SHORT 2 + +/* The size of `unsigned char *', as computed by sizeof. */ +#define SIZEOF_UNSIGNED_CHAR_P 8 + +/* The size of `unsigned int', as computed by sizeof. */ +#define SIZEOF_UNSIGNED_INT 4 + +/* The size of `unsigned long', as computed by sizeof. */ +#define SIZEOF_UNSIGNED_LONG 8 + +/* The size of `unsigned long long', as computed by sizeof. */ +#define SIZEOF_UNSIGNED_LONG_LONG 8 + +/* The size of `unsigned short', as computed by sizeof. */ +#define SIZEOF_UNSIGNED_SHORT 2 + +/* Default size of the strip in bytes (when strip chopping enabled) */ +#define STRIP_SIZE_DEFAULT 8192 + +/* Signed 32-bit type formatter */ +#define TIFF_INT32_FORMAT "%d" + +/* Signed 64-bit type formatter */ +#define TIFF_INT64_FORMAT "%lld" + +/* Pointer difference type formatter */ +#define TIFF_PTRDIFF_FORMAT "%ld" + +/* Unsigned size type formatter */ +#define TIFF_SIZE_FORMAT "" + +/* Signed size type formatter */ +#define TIFF_SSIZE_FORMAT "" + +/* Unsigned 32-bit type formatter */ +#define TIFF_UINT32_FORMAT "%u" + +/* Unsigned 64-bit type formatter */ +#define TIFF_UINT64_FORMAT "%llu" + +/* Unsigned 8-bit type */ +#define TIFF_UINT8_T uint8_t + +/* Define to 1 if you can safely include both and . */ +#undef TIME_WITH_SYS_TIME + +/* Define to 1 if your declares `struct tm'. */ +/* #undef TM_IN_SYS_TIME */ + +/* define to use win32 IO system */ +/* #undef USE_WIN32_FILEIO */ + +/* Version number of package */ +#define VERSION ""4.0.6"" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#define _FILE_OFFSET_BITS 64 + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#define inline inline +#endif + +/* Define to `long int' if does not define. */ +#undef off_t + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/openjpeg/adapter/include/tiff/tiffconf.h b/openjpeg/adapter/include/tiff/tiffconf.h new file mode 100755 index 00000000..45c30839 --- /dev/null +++ b/openjpeg/adapter/include/tiff/tiffconf.h @@ -0,0 +1,115 @@ +/* + Configuration defines for installed libtiff. + This file maintained for backward compatibility. Do not use definitions + from this file in your programs. +*/ + +#ifndef _TIFFCONF_ +#define _TIFFCONF_ + +#include "tif_config.h" +#if defined( HAVE_STDINT_H ) +#include +#endif +#if defined( HAVE_UNISTD_H ) +#include +#endif + +/* Signed 16-bit type */ +#define TIFF_INT16_T int16_t + +/* Signed 32-bit type */ +#define TIFF_INT32_T int32_t + +/* Signed 64-bit type */ +#define TIFF_INT64_T int64_t + +/* Signed 8-bit type */ +#define TIFF_INT8_T int8_t + +/* Unsigned 16-bit type */ +#define TIFF_UINT16_T uint16_t + +/* Unsigned 32-bit type */ +#define TIFF_UINT32_T uint32_t + +/* Unsigned 64-bit type */ +#define TIFF_UINT64_T uint64_t + +/* Unsigned 8-bit type */ +#define TIFF_UINT8_T uint8_t + +/* Unsigned size type */ +#define TIFF_SIZE_T + +/* Signed size type */ +#define TIFF_SSIZE_T ssize_t + +/* Pointer difference type */ +#define TIFF_PTRDIFF_T ptrdiff_t + +/* Define as 0 or 1 according to the floating point format suported by the + machine */ +#define HAVE_IEEEFP 1 + +/* Set the native cpu bit order (FILLORDER_LSB2MSB or FILLORDER_MSB2LSB) */ +#define HOST_FILLORDER FILLORDER_LSB2MSB + +/* Native cpu byte order: 1 if big-endian (Motorola) or 0 if little-endian + (Intel) */ +#define HOST_BIGENDIAN 0 + +/* Support CCITT Group 3 & 4 algorithms */ +#define CCITT_SUPPORT 1 + +/* Support LogLuv high dynamic range encoding */ +#define LOGLUV_SUPPORT 1 + +/* Support LZW algorithm */ +#define LZW_SUPPORT 1 + +/* Support NeXT 2-bit RLE algorithm */ +#define NEXT_SUPPORT 1 + +/* Support Old JPEG compresson (read contrib/ojpeg/README first! Compilation + fails with unpatched IJG JPEG library) */ +/* #undef OJPEG_SUPPORT */ + +/* Support Macintosh PackBits algorithm */ +#define PACKBITS_SUPPORT 1 + +/* Support ThunderScan 4-bit RLE algorithm */ +#define THUNDER_SUPPORT 1 + +/* Support strip chopping (whether or not to convert single-strip uncompressed + images to mutiple strips of ~8Kb to reduce memory usage) */ +#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP + +/* Enable SubIFD tag (330) support */ +#define SUBIFD_SUPPORT 1 + +/* Treat extra sample as alpha (default enabled). The RGBA interface will + treat a fourth sample with no EXTRASAMPLE_ value as being ASSOCALPHA. Many + packages produce RGBA files but don't mark the alpha properly. */ +/*#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1*/ + +/* Pick up YCbCr subsampling info from the JPEG data stream to support files + lacking the tag (default enabled). */ +#define CHECK_JPEG_YCBCR_SUBSAMPLING 1 + +/* Support MS MDI magic number files as TIFF */ +#define MDI_SUPPORT 1 + +/* + * Feature support definitions. + * XXX: These macros are obsoleted. Don't use them in your apps! + * Macros stays here for backward compatibility and should be always defined. + */ +#define COLORIMETRY_SUPPORT +#define YCBCR_SUPPORT +#define CMYK_SUPPORT +#define ICC_SUPPORT +#define PHOTOSHOP_SUPPORT +#define IPTC_SUPPORT + +#endif /* _TIFFCONF_ */ diff --git a/openjpeg/adapter/script/test_open_jpeg.sh b/openjpeg/adapter/script/test_open_jpeg.sh new file mode 100755 index 00000000..892b4f84 --- /dev/null +++ b/openjpeg/adapter/script/test_open_jpeg.sh @@ -0,0 +1,166 @@ +#!/bin/bash + +# Copyright (c) 2022 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. + +j2kRandomTileAccess="j2k_random_tile_access" +testDecodeArea="test_decode_area" +testTileEncoder="test_tile_encoder" +testTileDecoder="test_tile_decoder" +testempty0="testempty0" +testempty1="testempty1" +testempty2="testempty2" + + + +function exe() +{ +exe=$1 +num=$# + + if [ $exe == $j2kRandomTileAccess ] + then + tag=$2 + echo "tag= $tag,exe = $exe" + + if [ -e $tag ] + then + chmod +x $exe + ./$exe $tag + else + echo "$tag is not exist" + fi + elif [ $exe == $testDecodeArea ] + then + if [ $num == 3 ] + then + tag=$2 + flag=$1 + if [ -e $tag ] + then + ./$exe $flag $tag + fi + elif [ $num == 6 ] + then + tag=$5 + if [ -e $tag ] + then + echo "./$*" + ./$* + fi + else + echo "exe $exe cmd failed!" + fi + elif [ $exe == $testTileEncoder ] + then + if [ $num == 1 ] + then + ./$exe + else + echo "./$*" + ./$* + fi + elif [ $exe == $testTileDecoder ] + then + echo "$*" + if [ $num == 1 ] + then + ./$* + elif [ $num == 5 ] + then + if [ -e $5 ] + then + ./$* + fi + fi + else + ./$exe + fi +} + + +function check_result() +{ +exe="md5sum" +tag=$1 +sum=$2 + if [ -e $tag ] + then + tmp=`md5sum $tag` + result=${tmp%% *} + + if [ $result == $sum ] + then + echo "test ok!" + fi + fi +} + + + +function run_test() +{ + exe $testTileEncoder + check_result test.j2k d50d345b669102ce18f7da78dc076546 + exe $testTileEncoder 3 2048 2048 1024 1024 8 1 tte1.j2k + check_result tte1.j2k dcb7dbfc7a3f552f5f01c35fb077a731 + exe $testTileEncoder 3 2048 2048 1024 1024 8 1 tte2.jp2 + check_result tte2.jp2 433f8b10a513510f490651d51637b1c0 + exe $testTileEncoder 1 2048 2048 1024 1024 8 1 tte3.j2k + check_result tte3.j2k 92f6fa2693a01ea0e184a9cb79261935 + exe $testTileEncoder 1 256 256 128 128 8 0 tte4.j2k + check_result tte4.j2k ddbd0406e23e35d9d76d53eec0aba6f7 + exe $testTileEncoder 1 512 512 256 256 8 0 tte5.j2k + check_result tte5.j2k f41e019f8a879220769b3122723448f1 + exe $testTileDecoder + check_result test.j2k d50d345b669102ce18f7da78dc076546 + exe $testTileDecoder 0 0 1024 1024 tte1.j2k + check_result tte1.j2k dcb7dbfc7a3f552f5f01c35fb077a731 + exe $testTileDecoder 0 0 1024 1024 tte2.jp2 + check_result tte2.jp2 433f8b10a513510f490651d51637b1c0 + exe $j2kRandomTileAccess tte1.j2k + exe $j2kRandomTileAccess tte2.jp2 + exe $j2kRandomTileAccess tte3.j2k + exe $j2kRandomTileAccess tte4.j2k + exe $j2kRandomTileAccess tte5.j2k + exe $testTileEncoder 1 256 256 32 32 8 0 reversible_no_precinct.j2k 4 4 3 0 0 0 + check_result reversible_no_precinct.j2k 5a03aed80730bb312b93a373af2619a7 + exe $testDecodeArea -q reversible_no_precinct.j2k + check_result reversible_no_precinct.j2k 5a03aed80730bb312b93a373af2619a7 + exe $testTileEncoder 1 203 201 17 19 8 0 reversible_203_201_17_19_no_precinct.j2k 4 4 3 0 0 0 + check_result reversible_203_201_17_19_no_precinct.j2k 080fe377819420d1bbac8c2a209c3faf + exe $testDecodeArea -q reversible_203_201_17_19_no_precinct.j2k + check_result reversible_203_201_17_19_no_precinct.j2k 080fe377819420d1bbac8c2a209c3faf + exe $testTileEncoder 1 256 256 32 32 8 0 reversible_with_precinct.j2k 4 4 3 0 0 0 16 16 + check_result reversible_with_precinct.j2k 2d7074173d443ad9e348b9f4db955994 + exe $testDecodeArea -q reversible_with_precinct.j2k + check_result reversible_with_precinct.j2k 2d7074173d443ad9e348b9f4db955994 + exe $testTileEncoder 1 256 256 32 32 8 1 irreversible_no_precinct.j2k 4 4 3 0 0 0 + check_result irreversible_no_precinct.j2k 9e8c1ac0e7c920e559a8deb74cc2e094 + exe $testDecodeArea -q irreversible_no_precinct.j2k + check_result irreversible_no_precinct.j2k 9e8c1ac0e7c920e559a8deb74cc2e094 + exe $testTileEncoder 1 203 201 17 19 8 1 irreversible_203_201_17_19_no_precinct.j2k 4 4 3 0 0 0 + check_result irreversible_203_201_17_19_no_precinct.j2k d58da7bdddbbeb733474f30757a31a87 + exe $testDecodeArea -q irreversible_203_201_17_19_no_precinct.j2k + heck_result irreversible_203_201_17_19_no_precinct.j2k d58da7bdddbbeb733474f30757a31a87 + exe $testTileEncoder 1 256 256 256 256 8 0 tda_single_tile.j2k + check_result tda_single_tile.j2k 35737f347486a97cbdd9a545df382584 + exe $testDecodeArea -q -strip_height 3 -strip_check tda_single_tile.j2k + check_result tda_single_tile.j2k 35737f347486a97cbdd9a545df382584 + exe $testempty0 + exe $testempty1 + exe $testempty2 +} + +run_test + diff --git a/openjpeg/bundle.json b/openjpeg/bundle.json new file mode 100644 index 00000000..4d560c74 --- /dev/null +++ b/openjpeg/bundle.json @@ -0,0 +1,33 @@ +{ + "name": "@ohos/openjpeg", + "description": "", + "version": "2.5.0", + "license": "2-Clause BSD", + "publishAs": "code-segment", + "segment": { + "destPath": "third_party/openjpeg" + }, + "dirs": {}, + "scripts": {}, + "readmePath": { + "en": "README" + }, + "component": { + "name": "openjpeg", + "subsystem": "thirdparty", + "syscap": [], + "features": [], + "adapted_system_type": [], + "rom": "", + "ram": "", + "deps": { + "components": [], + "third_party": [] + }, + "build": { + "sub_component": ["//third_party/openjpeg:openjpeg"], + "inner_kits": [], + "test": [] + } + } +} diff --git a/openjpeg/docs/media/running_result.png b/openjpeg/docs/media/running_result.png new file mode 100755 index 0000000000000000000000000000000000000000..1769813e9f02e2a01d07e2288e8dccd6aaf3f356 GIT binary patch literal 76784 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 literal 0 HcmV?d00001 diff --git a/openjpeg/docs/rom_integrate.md b/openjpeg/docs/rom_integrate.md new file mode 100755 index 00000000..23fad823 --- /dev/null +++ b/openjpeg/docs/rom_integrate.md @@ -0,0 +1,152 @@ +# openjpeg如何集成到系统Rom + +## 准备源码工程 + +本库是基于OpenHarmony 3.2 beta1版本,在润和RK3568开发板上验证的。如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 + +### 准备系统Rom源码 + +系统源码获取方法请参照:[OpenHarmony3.2beta1源码下载](https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.2-Beta1/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md#源码获取) + +### 增加构建脚本及配置文件 + +- 下载本仓库代码 + + ```shell + cd ~/ + git clone git@gitee.com:openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` + +- 仓库代码目录结构说明 + + ```shell + cd ~/tpc_c_cplusplus/openjpeg/ # 进入到仓库代码库目录 + ``` + + ```shell + openjpeg + |-- adapter # 存放三方库适配需要的代码文件 + |-- docs # 存放 openjpeg 相关文档的文件夹 + |-- BUILD.gn # 编译构建脚本 + |-- bundle.json # 三方库组件定义文件 + |-- README_zh.md # openjpeg 主页说明文档 + |-- README.OpenSource # openjpeg 源码的下载地址,版本,license等信息 + ``` + +- 将本仓库文件夹拷贝到OpenHarmony源码的third_party目录下 + + ```shell + cp -arf ~/tpc_c_cplusplus/openjpeg ~/OpenHarmony/third_party + ``` + +### 准备三方库源码 + +- 三方库源码下载 + + 将openjpeg-2.5.0源码下载到openjpeg目录并将其解压出来。 + + ```shell + cd ~/OpenHarmony/third_party/openjpeg + git clone https://github.com/uclouvain/openjpeg.git -b v2.5.0 + ``` + +## 系统Rom中引入三方库 + +准备完三方库代码后,我们需要将三方库加入到编译构建体系中。标准系统编译构建可以参考文档[标准系统编译构建指导](https://gitee.com/openharmony/docs/blob/OpenHarmony-3.2-Beta1/zh-cn/device-dev/subsystems/subsys-build-standard-large.md)。
+我们默认三方库是属于OpenHarmony的thirdparty子系统,如果需要自己定义子系统参考文档[如何为三方库组件中添加一个三方库](./add_thirdparty_component.md)。
+新增需要编译的组件,在OpenHarmony源码的vendor/hihope/rk3568/config.json文件中,新增需要编译的组件,如下代码段所示,在thirdparty子系统下面新增openjpeg组件 + +```json +{ + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, + { + "component": "openjpeg", + "features": [] + } + ] +} +``` + +## 系统Rom中引入三方库测试程序 + +如果需要编译测试用例,在OpenHarmony源码的vendor/hihope/rk3568/config.json文件,在对应组件的features中打开编译选项,如下 + +```json +{ + "subsystem": "thirdparty", + "components": [ + { + "component": "musl", + "features": [] + }, + { + "component": "openjpeg", + "features": ["enable_openjpeg_test=true"] + } + ] +} +``` + +## 编译工程 + +- 进入源码根目录 + + ```shell + cd ~/openharmony + ``` + +- 选择产品 + + ```shell + hb set # 运行hb set后会出现产品列表,在此我们选择 rk3568 + ``` + +- 执行编译 + + ```shell + hb build --target-cpu arm #编译32位系统 + hb build --target-cpu arm64 #编译64位系统 + ``` + +- 生成的可执行文件和库文件都在out/rk3568/thirdparty/openjpeg目录下,同时也打包到了镜像中 + +## 运行效果 + +将编译生成的库和测试文件放到板子上运行,为避免每次将文件推入设备都要烧录整个镜像,我们使用hdc_std工具将文件推到开发板上 + +- 首先将hdc_std工具编译出来
+ 执行以下命令进行编译hdc_std工具(工具编译出来所在路径out/sdk/ohos-sdk/windows/toolchains/hdc_std.exe): + + ```shell + hb set #源码根目录下使用hb set 选择产品ohos-sdk + hb build #然后编译 + ``` + +- 将工具拷贝到Windows,可以为工具目录配置环境变量,也可以在工具所在目录打开windows命令行 +- 将原生库测试需要的所有文件打包成openjpeg.tar,并拷贝到windows下 +- 将文件推送到开发板,在windows命令行进行如下操作 + + ```shell + hdc_std shell mount -o remount,rw / #修改系统权限为可读写 + hdc_std file send openjpeg.tar / #将文件包推入开发板 + hdc_std shell #进入开发板 + tar xvf openjpeg.tar #解压 + #注意需要将库拷贝到/system/lib 或者/system/lib64目录下 + ``` + +- 运行测试程序 + 在测试目录运行test_open_jpeg.sh脚本,若日志信息中所有测试项目为test_ok,则说明通过了全部的测试项目,如下图所示:
+  ![image-20220922143536085](./media/running_result.png) + +## 参考资料 + +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 +- [OpenHarmony3.2beta1](https://gitee.com/openharmony/docs/blob/OpenHarmony-v3.2-Beta1/zh-cn/release-notes/OpenHarmony-v3.2-beta1.md)。 +- [OpenHarmony三方库组织地址](https://gitee.com/openharmony-tpc)。 +- [如何为三方库组件中添加一个三方库](https://gitee.com/openharmony-sig/knowledge/blob/master/docs/openharmony_getstarted/port_thirdparty/README.md)。 +- [知识体系](https://gitee.com/openharmony-sig/knowledge)。 -- Gitee