From ba35d5a83369719a20ce3546455aec0e18759c31 Mon Sep 17 00:00:00 2001 From: zxros10 Date: Thu, 15 Apr 2021 10:40:47 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=BA=E8=84=B8=E6=A3=80?= =?UTF-8?q?=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cplusplus/common/README_CN.md | 9 + .../.ipynb_checkpoints/Makefile-checkpoint | 108 + .../Untitled-checkpoint.ipynb | 6 + .../common/atlasutil/.vscode/settings.json | 55 + cplusplus/common/atlasutil/Makefile | 108 + cplusplus/common/atlasutil/README.md | 618 ++ cplusplus/common/atlasutil/Untitled.ipynb | 6 + .../common/atlasutil/include/acl_device.h | 47 + .../common/atlasutil/include/atlas_app.h | 77 + .../common/atlasutil/include/atlas_error.h | 198 + .../common/atlasutil/include/atlas_model.h | 71 + .../common/atlasutil/include/atlas_thread.h | 49 + .../atlasutil/include/atlas_thread_mgr.h | 48 + .../common/atlasutil/include/atlas_type.h | 97 + .../common/atlasutil/include/atlas_utils.h | 342 + .../atlasutil/include/atlas_videocap_base.h | 53 + .../atlasutil/include/atlas_videocapture.h | 53 + .../common/atlasutil/include/dvpp_process.h | 52 + .../common/atlasutil/include/parse_config.h | 9 + .../atlasutil/include/thread_safe_queue.h | 138 + .../common/atlasutil/include/venc_process.h | 96 + .../common/atlasutil/out/arm/libatlasutil.so | Bin 0 -> 481632 bytes .../atlasutil/out/arm/obj/src/acl_device.o | Bin 0 -> 11760 bytes .../atlasutil/out/arm/obj/src/atlas_app.o | Bin 0 -> 35768 bytes .../atlasutil/out/arm/obj/src/atlas_model.o | Bin 0 -> 41168 bytes .../atlasutil/out/arm/obj/src/atlas_thread.o | Bin 0 -> 5360 bytes .../out/arm/obj/src/atlas_thread_mgr.o | Bin 0 -> 28264 bytes .../atlasutil/out/arm/obj/src/atlas_utils.o | Bin 0 -> 338720 bytes .../out/arm/obj/src/atlas_videocapture.o | Bin 0 -> 9568 bytes .../common/atlasutil/out/arm/obj/src/camera.o | Bin 0 -> 27384 bytes .../out/arm/obj/src/dvpp_cropandpaste.o | Bin 0 -> 20288 bytes .../atlasutil/out/arm/obj/src/dvpp_jpegd.o | Bin 0 -> 15472 bytes .../atlasutil/out/arm/obj/src/dvpp_jpege.o | Bin 0 -> 16688 bytes .../atlasutil/out/arm/obj/src/dvpp_mem_mgr.o | Bin 0 -> 21328 bytes .../atlasutil/out/arm/obj/src/dvpp_process.o | Bin 0 -> 11120 bytes .../atlasutil/out/arm/obj/src/dvpp_resize.o | Bin 0 -> 19472 bytes .../out/arm/obj/src/ffmpeg_decoder.o | Bin 0 -> 21416 bytes .../atlasutil/out/arm/obj/src/parse_config.o | Bin 0 -> 20048 bytes .../atlasutil/out/arm/obj/src/vdec_process.o | Bin 0 -> 30768 bytes .../atlasutil/out/arm/obj/src/venc_process.o | Bin 0 -> 50224 bytes .../atlasutil/out/arm/obj/src/video_decode.o | Bin 0 -> 76624 bytes .../atlasutil/out/x86/obj/src/acl_device.o | Bin 0 -> 10736 bytes .../atlasutil/out/x86/obj/src/atlas_app.o | Bin 0 -> 30488 bytes .../atlasutil/out/x86/obj/src/atlas_model.o | Bin 0 -> 35672 bytes .../atlasutil/out/x86/obj/src/atlas_thread.o | Bin 0 -> 4736 bytes .../out/x86/obj/src/atlas_thread_mgr.o | Bin 0 -> 23576 bytes .../atlasutil/out/x86/obj/src/atlas_utils.o | Bin 0 -> 320776 bytes .../out/x86/obj/src/atlas_videocapture.o | Bin 0 -> 7000 bytes .../out/x86/obj/src/dvpp_cropandpaste.o | Bin 0 -> 18144 bytes .../atlasutil/out/x86/obj/src/dvpp_jpegd.o | Bin 0 -> 14120 bytes .../atlasutil/out/x86/obj/src/dvpp_jpege.o | Bin 0 -> 15168 bytes .../atlasutil/out/x86/obj/src/dvpp_mem_mgr.o | Bin 0 -> 18176 bytes .../atlasutil/out/x86/obj/src/dvpp_process.o | Bin 0 -> 9904 bytes .../atlasutil/out/x86/obj/src/dvpp_resize.o | Bin 0 -> 17672 bytes .../out/x86/obj/src/ffmpeg_decoder.o | Bin 0 -> 20840 bytes .../atlasutil/out/x86/obj/src/parse_config.o | Bin 0 -> 18320 bytes .../atlasutil/out/x86/obj/src/vdec_process.o | Bin 0 -> 27472 bytes .../atlasutil/out/x86/obj/src/venc_process.o | Bin 0 -> 44040 bytes .../atlasutil/out/x86/obj/src/video_decode.o | Bin 0 -> 66488 bytes .../Untitled-checkpoint.ipynb | 6 + cplusplus/common/atlasutil/src/Untitled.ipynb | 6 + cplusplus/common/atlasutil/src/acl_device.cpp | 113 + cplusplus/common/atlasutil/src/atlas_app.cpp | 245 + .../common/atlasutil/src/atlas_model.cpp | 374 + .../common/atlasutil/src/atlas_thread.cpp | 43 + .../common/atlasutil/src/atlas_thread_mgr.cpp | 107 + .../common/atlasutil/src/atlas_utils.cpp | 431 + .../atlasutil/src/atlas_videocapture.cpp | 131 + cplusplus/common/atlasutil/src/camera.cpp | 294 + cplusplus/common/atlasutil/src/camera.h | 75 + .../atlasutil/src/dvpp_cropandpaste.cpp | 218 + .../common/atlasutil/src/dvpp_cropandpaste.h | 86 + cplusplus/common/atlasutil/src/dvpp_jpegd.cpp | 112 + cplusplus/common/atlasutil/src/dvpp_jpegd.h | 87 + cplusplus/common/atlasutil/src/dvpp_jpege.cpp | 133 + cplusplus/common/atlasutil/src/dvpp_jpege.h | 66 + .../common/atlasutil/src/dvpp_mem_mgr.cpp | 288 + cplusplus/common/atlasutil/src/dvpp_mem_mgr.h | 124 + .../common/atlasutil/src/dvpp_process.cpp | 115 + .../common/atlasutil/src/dvpp_resize.cpp | 176 + cplusplus/common/atlasutil/src/dvpp_resize.h | 89 + .../common/atlasutil/src/ffmpeg_decoder.cpp | 312 + .../common/atlasutil/src/ffmpeg_decoder.h | 94 + .../common/atlasutil/src/parse_config.cpp | 104 + .../common/atlasutil/src/vdec_process.cpp | 339 + cplusplus/common/atlasutil/src/vdec_process.h | 75 + .../common/atlasutil/src/venc_process.cpp | 409 + .../common/atlasutil/src/video_decode.cpp | 580 + cplusplus/common/atlasutil/src/video_decode.h | 184 + cplusplus/common/presenteragent/Makefile | 93 + cplusplus/common/presenteragent/README_CN.md | 239 + .../ascenddk/presenter/agent/channel.h | 184 + .../include/ascenddk/presenter/agent/errors.h | 84 + .../presenter/agent/presenter_channel.h | 85 + .../presenter/agent/presenter_types.h | 103 + .../proto/presenter_message.pb.cc | 2723 +++++ .../proto/presenter_message.pb.h | 1772 ++++ .../proto/presenter_message.proto | 67 + .../presenter/agent/channel/channel.cpp | 50 + .../agent/channel/default_channel.cpp | 291 + .../presenter/agent/channel/default_channel.h | 192 + .../presenter/agent/codec/message_codec.cpp | 214 + .../presenter/agent/codec/message_codec.h | 101 + .../presenter/agent/connection/connection.cpp | 192 + .../presenter/agent/connection/connection.h | 112 + .../presenter/agent/net/raw_socket.cpp | 63 + .../ascenddk/presenter/agent/net/raw_socket.h | 94 + .../agent/net/raw_socket_factory.cpp | 72 + .../presenter/agent/net/raw_socket_factory.h | 72 + .../ascenddk/presenter/agent/net/socket.cpp | 80 + .../src/ascenddk/presenter/agent/net/socket.h | 97 + .../presenter/agent/net/socket_factory.cpp | 114 + .../presenter/agent/net/socket_factory.h | 94 + .../agent/presenter/presenter_channel.cpp | 197 + .../presenter_channel_init_handler.cpp | 78 + .../presenter_channel_init_handler.h | 84 + .../presenter/presenter_message_helper.cpp | 170 + .../presenter/presenter_message_helper.h | 113 + .../presenter/agent/util/byte_buffer.cpp | 209 + .../presenter/agent/util/byte_buffer.h | 258 + .../ascenddk/presenter/agent/util/logging.h | 57 + .../ascenddk/presenter/agent/util/mem_utils.h | 69 + .../presenter/agent/util/parse_config.cpp | 97 + .../presenter/agent/util/parse_config.h | 10 + .../presenter/agent/util/socket_utils.cpp | 238 + .../presenter/agent/util/socket_utils.h | 117 + cplusplus/environment/README_CN.md | 27 + cplusplus/environment/README_EN.md | 26 + .../atlasutil_install/README_200DK_CN.md | 44 + .../atlasutil_install/README_300_CN.md | 46 + .../opencv_install/README_200DK_CN.md | 78 + .../opencv_install/README_200DK_EN.md | 77 + .../opencv_install/README_300_CN.md | 84 + .../opencv_install/README_300_EN.md | 86 + .../prepare_ENV/README_200DK_CN.md | 197 + .../prepare_ENV/README_200DK_EN.md | 190 + .../environment/prepare_ENV/README_300_CN.md | 114 + .../environment/prepare_ENV/README_300_EN.md | 113 + .../presenteragent_install/README_200DK_CN.md | 61 + .../presenteragent_install/README_200DK_EN.md | 60 + .../presenteragent_install/README_300_CN.md | 49 + .../presenteragent_install/README_300_EN.md | 48 + .../face_recognition_camera/.build_project | 1 + .../face_recognition_camera/.project | 8 + .../.vscode/settings.json | 57 + .../face_recognition_camera/CMakeLists.txt | 9 + .../face_recognition_camera/README_CN.md | 160 + .../face_recognition_camera/README_EN.md | 175 + .../build/intermediates/host/CMakeCache.txt | 330 + .../CMakeFiles/3.10.2/CMakeCCompiler.cmake | 73 + .../CMakeFiles/3.10.2/CMakeCXXCompiler.cmake | 75 + .../3.10.2/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 8248 bytes .../3.10.2/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 9304 bytes .../host/CMakeFiles/3.10.2/CMakeSystem.cmake | 15 + .../3.10.2/CompilerIdC/CMakeCCompilerId.c | 598 ++ .../host/CMakeFiles/3.10.2/CompilerIdC/a.out | Bin 0 -> 8408 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 576 + .../CMakeFiles/3.10.2/CompilerIdCXX/a.out | Bin 0 -> 9480 bytes .../CMakeDirectoryInformation.cmake | 16 + .../host/CMakeFiles/CMakeOutput.log | 628 ++ .../host/CMakeFiles/Makefile.cmake | 46 + .../intermediates/host/CMakeFiles/Makefile2 | 108 + .../host/CMakeFiles/TargetDirectories.txt | 7 + .../host/CMakeFiles/cmake.check_cache | 1 + .../host/CMakeFiles/feature_tests.bin | Bin 0 -> 13352 bytes .../host/CMakeFiles/feature_tests.c | 34 + .../host/CMakeFiles/feature_tests.cxx | 405 + .../host/CMakeFiles/main.dir/CXX.includecache | 2460 +++++ .../host/CMakeFiles/main.dir/DependInfo.cmake | 41 + .../host/CMakeFiles/main.dir/build.make | 302 + .../CMakeFiles/main.dir/cmake_clean.cmake | 17 + .../host/CMakeFiles/main.dir/depend.internal | 1096 ++ .../host/CMakeFiles/main.dir/depend.make | 1096 ++ .../CMakeFiles/main.dir/face_detect.cpp.o | Bin 0 -> 126912 bytes .../CMakeFiles/main.dir/face_detection.cpp.o | Bin 0 -> 339544 bytes .../main.dir/face_feature_mask.cpp.o | Bin 0 -> 371016 bytes .../main.dir/face_post_process.cpp.o | Bin 0 -> 260168 bytes .../main.dir/face_recognition.cpp.o | Bin 0 -> 403128 bytes .../CMakeFiles/main.dir/face_register.cpp.o | Bin 0 -> 409848 bytes .../facial_recognition_message.pb.cc.o | Bin 0 -> 331728 bytes .../host/CMakeFiles/main.dir/flags.make | 10 + .../host/CMakeFiles/main.dir/link.txt | 1 + .../host/CMakeFiles/main.dir/main.cpp.o | Bin 0 -> 228008 bytes .../CMakeFiles/main.dir/mind_camera.cpp.o | Bin 0 -> 314504 bytes .../host/CMakeFiles/main.dir/progress.make | 10 + .../host/CMakeFiles/progress.marks | 1 + .../build/intermediates/host/Makefile | 438 + .../intermediates/host/cmake_install.cmake | 59 + .../face_recognition_camera/data/.keep | 0 .../inc/face_detection.h | 123 + .../inc/face_feature_mask.h | 252 + .../inc/face_feature_train_mean.h | 156 + .../inc/face_feature_train_std.h | 133 + .../inc/face_post_process.h | 135 + .../inc/face_recognition.h | 216 + .../inc/face_recognition_params.h | 150 + .../inc/face_register.h | 133 + .../inc/facial_recognition_message.pb.h | 1834 ++++ .../inc/facial_thread_base.h | 198 + .../face_recognition_camera/inc/mind_camera.h | 97 + .../inc/presenter_channels.h | 186 + .../face_recognition_camera/model/.keep | 0 .../face_recognition_camera/out/main | Bin 0 -> 848816 bytes .../face_recognition_camera/out/param.conf | 40 + .../presenterserver/README | 15 + .../presenterserver/__init__.py | 0 .../presenterserver/common/__init__.py | 0 .../__pycache__/__init__.cpython-36.pyc | Bin 0 -> 238 bytes .../__pycache__/app_manager.cpython-36.pyc | Bin 0 -> 6104 bytes .../channel_handler.cpython-36.pyc | Bin 0 -> 5357 bytes .../channel_manager.cpython-36.pyc | Bin 0 -> 9505 bytes .../parameter_validation.cpython-36.pyc | Bin 0 -> 1778 bytes .../presenter_message_pb2.cpython-36.pyc | Bin 0 -> 8058 bytes .../presenter_socket_server.cpython-36.pyc | Bin 0 -> 12740 bytes .../presenterserver/common/app_manager.py | 209 + .../presenterserver/common/channel_handler.py | 227 + .../presenterserver/common/channel_manager.py | 291 + .../common/parameter_validation.py | 98 + .../common/presenter_message_pb2.py | 525 + .../common/presenter_socket_server.py | 463 + .../facial_recognition/config/config.conf | 20 + .../facial_recognition/config/logging.conf | 27 + .../facial_recognition/src/__init__.py | 0 .../src/__pycache__/__init__.cpython-36.pyc | Bin 0 -> 254 bytes .../__pycache__/config_parser.cpython-36.pyc | Bin 0 -> 2532 bytes .../facial_recognition_handler.cpython-36.pyc | Bin 0 -> 2812 bytes ...ial_recognition_message_pb2.cpython-36.pyc | Bin 0 -> 6750 bytes .../facial_recognition_server.cpython-36.pyc | Bin 0 -> 20089 bytes .../src/__pycache__/web.cpython-36.pyc | Bin 0 -> 11546 bytes .../facial_recognition/src/config_parser.py | 109 + .../src/facial_recognition_handler.py | 132 + .../src/facial_recognition_message_pb2.py | 453 + .../src/facial_recognition_server.py | 730 ++ .../facial_recognition/src/web.py | 525 + .../facial_recognition/ui/static/123.png | Bin 0 -> 51889 bytes .../facial_recognition/ui/static/384_304.jpg | Bin 0 -> 28353 bytes .../ui/static/384_304_02.jpg | Bin 0 -> 23728 bytes .../ui/static/bootstrap/css/bootstrap.min.css | 7 + .../ui/static/bootstrap/js/bootstrap.min.js | 7 + .../ui/static/cropper/cropper.common.js | 3757 +++++++ .../ui/static/cropper/cropper.css | 305 + .../ui/static/cropper/cropper.esm.js | 3753 +++++++ .../ui/static/cropper/cropper.js | 3761 +++++++ .../ui/static/cropper/cropper.min.css | 9 + .../ui/static/cropper/cropper.min.js | 10 + .../facial_recognition/ui/static/css/base.css | 39 + .../ui/static/css/dialog.css | 77 + .../facial_recognition/ui/static/css/face.css | 246 + .../ui/static/css/library.css | 167 + .../facial_recognition/ui/static/css/list.css | 102 + .../ui/static/css/testvideo.css | 71 + .../ui/static/images/loading.gif | Bin 0 -> 8069 bytes .../ui/static/images/logo.png | Bin 0 -> 4039 bytes .../ui/static/images/u1.png | Bin 0 -> 1302 bytes .../ui/static/images/u2.png | Bin 0 -> 1324 bytes .../ui/static/images/u3.png | Bin 0 -> 1604 bytes .../ui/static/images/u4.png | Bin 0 -> 376086 bytes .../ui/static/images/u5.png | Bin 0 -> 1517 bytes .../ui/static/images/u6.png | Bin 0 -> 200 bytes .../facial_recognition/ui/static/js/dialog.js | 97 + .../ui/static/js/dialog.min.js | 1 + .../facial_recognition/ui/static/js/index.js | 0 .../ui/static/js/jquery-1.10.2.min.js | 4 + .../ui/static/js/socket.io.js | 8201 +++++++++++++++ .../ui/static/js/socket.io.min.js | 3 + .../ui/templates/384_304.jpg | Bin 0 -> 28353 bytes .../facial_recognition/ui/templates/home.html | 737 ++ .../templates/home_add_camera_register.html | 1072 ++ .../presenterserver/presenter_server.py | 123 + .../presenterserver/requirements | 3 + .../scripts/facial/ber.jpg | Bin 0 -> 29377 bytes .../scripts/facial/mhc.jpg | Bin 0 -> 16417 bytes .../scripts/facial/registered_faces.json | 1 + .../scripts/facial/ss.jpg | Bin 0 -> 29671 bytes .../scripts/facial/ss1.jpg | Bin 0 -> 26127 bytes .../scripts/facial/zt.jpg | Bin 0 -> 15208 bytes .../scripts/facial_recognition.log | 9331 +++++++++++++++++ .../scripts/host_version.conf | 4 + .../scripts/param.conf | 40 + .../scripts/registered_faces.json | 1 + .../scripts/run_presenter_server.sh | 164 + .../scripts/testcase_200dk.sh | 292 + .../src/CMakeLists.txt | 88 + .../face_recognition_camera/src/acl.json | 1 + .../src/face_detection.cpp | 186 + .../src/face_feature_mask.cpp | 433 + .../src/face_post_process.cpp | 172 + .../src/face_recognition.cpp | 454 + .../src/face_register.cpp | 234 + .../src/facial_recognition_message.pb.cc | 2770 +++++ .../src/facial_recognition_message.proto | 49 + .../face_recognition_camera/src/main.cpp | 150 + .../src/mind_camera.cpp | 139 + 293 files changed, 71232 insertions(+) create mode 100644 cplusplus/common/README_CN.md create mode 100644 cplusplus/common/atlasutil/.ipynb_checkpoints/Makefile-checkpoint create mode 100644 cplusplus/common/atlasutil/.ipynb_checkpoints/Untitled-checkpoint.ipynb create mode 100644 cplusplus/common/atlasutil/.vscode/settings.json create mode 100644 cplusplus/common/atlasutil/Makefile create mode 100644 cplusplus/common/atlasutil/README.md create mode 100644 cplusplus/common/atlasutil/Untitled.ipynb create mode 100644 cplusplus/common/atlasutil/include/acl_device.h create mode 100644 cplusplus/common/atlasutil/include/atlas_app.h create mode 100644 cplusplus/common/atlasutil/include/atlas_error.h create mode 100644 cplusplus/common/atlasutil/include/atlas_model.h create mode 100644 cplusplus/common/atlasutil/include/atlas_thread.h create mode 100644 cplusplus/common/atlasutil/include/atlas_thread_mgr.h create mode 100644 cplusplus/common/atlasutil/include/atlas_type.h create mode 100644 cplusplus/common/atlasutil/include/atlas_utils.h create mode 100644 cplusplus/common/atlasutil/include/atlas_videocap_base.h create mode 100644 cplusplus/common/atlasutil/include/atlas_videocapture.h create mode 100644 cplusplus/common/atlasutil/include/dvpp_process.h create mode 100644 cplusplus/common/atlasutil/include/parse_config.h create mode 100644 cplusplus/common/atlasutil/include/thread_safe_queue.h create mode 100644 cplusplus/common/atlasutil/include/venc_process.h create mode 100644 cplusplus/common/atlasutil/out/arm/libatlasutil.so create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/acl_device.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/atlas_app.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/atlas_model.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/atlas_thread.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/atlas_thread_mgr.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/atlas_utils.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/atlas_videocapture.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/camera.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/dvpp_cropandpaste.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/dvpp_jpegd.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/dvpp_jpege.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/dvpp_mem_mgr.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/dvpp_process.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/dvpp_resize.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/ffmpeg_decoder.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/parse_config.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/vdec_process.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/venc_process.o create mode 100644 cplusplus/common/atlasutil/out/arm/obj/src/video_decode.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/acl_device.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/atlas_app.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/atlas_model.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/atlas_thread.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/atlas_thread_mgr.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/atlas_utils.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/atlas_videocapture.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/dvpp_cropandpaste.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/dvpp_jpegd.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/dvpp_jpege.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/dvpp_mem_mgr.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/dvpp_process.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/dvpp_resize.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/ffmpeg_decoder.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/parse_config.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/vdec_process.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/venc_process.o create mode 100644 cplusplus/common/atlasutil/out/x86/obj/src/video_decode.o create mode 100644 cplusplus/common/atlasutil/src/.ipynb_checkpoints/Untitled-checkpoint.ipynb create mode 100644 cplusplus/common/atlasutil/src/Untitled.ipynb create mode 100644 cplusplus/common/atlasutil/src/acl_device.cpp create mode 100644 cplusplus/common/atlasutil/src/atlas_app.cpp create mode 100644 cplusplus/common/atlasutil/src/atlas_model.cpp create mode 100644 cplusplus/common/atlasutil/src/atlas_thread.cpp create mode 100644 cplusplus/common/atlasutil/src/atlas_thread_mgr.cpp create mode 100644 cplusplus/common/atlasutil/src/atlas_utils.cpp create mode 100644 cplusplus/common/atlasutil/src/atlas_videocapture.cpp create mode 100644 cplusplus/common/atlasutil/src/camera.cpp create mode 100644 cplusplus/common/atlasutil/src/camera.h create mode 100644 cplusplus/common/atlasutil/src/dvpp_cropandpaste.cpp create mode 100644 cplusplus/common/atlasutil/src/dvpp_cropandpaste.h create mode 100644 cplusplus/common/atlasutil/src/dvpp_jpegd.cpp create mode 100644 cplusplus/common/atlasutil/src/dvpp_jpegd.h create mode 100644 cplusplus/common/atlasutil/src/dvpp_jpege.cpp create mode 100644 cplusplus/common/atlasutil/src/dvpp_jpege.h create mode 100644 cplusplus/common/atlasutil/src/dvpp_mem_mgr.cpp create mode 100644 cplusplus/common/atlasutil/src/dvpp_mem_mgr.h create mode 100644 cplusplus/common/atlasutil/src/dvpp_process.cpp create mode 100644 cplusplus/common/atlasutil/src/dvpp_resize.cpp create mode 100644 cplusplus/common/atlasutil/src/dvpp_resize.h create mode 100644 cplusplus/common/atlasutil/src/ffmpeg_decoder.cpp create mode 100644 cplusplus/common/atlasutil/src/ffmpeg_decoder.h create mode 100644 cplusplus/common/atlasutil/src/parse_config.cpp create mode 100644 cplusplus/common/atlasutil/src/vdec_process.cpp create mode 100644 cplusplus/common/atlasutil/src/vdec_process.h create mode 100644 cplusplus/common/atlasutil/src/venc_process.cpp create mode 100644 cplusplus/common/atlasutil/src/video_decode.cpp create mode 100644 cplusplus/common/atlasutil/src/video_decode.h create mode 100644 cplusplus/common/presenteragent/Makefile create mode 100644 cplusplus/common/presenteragent/README_CN.md create mode 100644 cplusplus/common/presenteragent/include/ascenddk/presenter/agent/channel.h create mode 100644 cplusplus/common/presenteragent/include/ascenddk/presenter/agent/errors.h create mode 100644 cplusplus/common/presenteragent/include/ascenddk/presenter/agent/presenter_channel.h create mode 100644 cplusplus/common/presenteragent/include/ascenddk/presenter/agent/presenter_types.h create mode 100644 cplusplus/common/presenteragent/proto/presenter_message.pb.cc create mode 100644 cplusplus/common/presenteragent/proto/presenter_message.pb.h create mode 100644 cplusplus/common/presenteragent/proto/presenter_message.proto create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/channel.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/default_channel.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/default_channel.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/codec/message_codec.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/codec/message_codec.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/connection/connection.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/connection/connection.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket_factory.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket_factory.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket_factory.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket_factory.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel_init_handler.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel_init_handler.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_message_helper.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_message_helper.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/byte_buffer.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/byte_buffer.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/logging.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/mem_utils.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/parse_config.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/parse_config.h create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/socket_utils.cpp create mode 100644 cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/socket_utils.h create mode 100644 cplusplus/environment/README_CN.md create mode 100644 cplusplus/environment/README_EN.md create mode 100644 cplusplus/environment/atlasutil_install/README_200DK_CN.md create mode 100644 cplusplus/environment/atlasutil_install/README_300_CN.md create mode 100644 cplusplus/environment/opencv_install/README_200DK_CN.md create mode 100644 cplusplus/environment/opencv_install/README_200DK_EN.md create mode 100644 cplusplus/environment/opencv_install/README_300_CN.md create mode 100644 cplusplus/environment/opencv_install/README_300_EN.md create mode 100644 cplusplus/environment/prepare_ENV/README_200DK_CN.md create mode 100644 cplusplus/environment/prepare_ENV/README_200DK_EN.md create mode 100644 cplusplus/environment/prepare_ENV/README_300_CN.md create mode 100644 cplusplus/environment/prepare_ENV/README_300_EN.md create mode 100644 cplusplus/environment/presenteragent_install/README_200DK_CN.md create mode 100644 cplusplus/environment/presenteragent_install/README_200DK_EN.md create mode 100644 cplusplus/environment/presenteragent_install/README_300_CN.md create mode 100644 cplusplus/environment/presenteragent_install/README_300_EN.md create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.build_project create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.project create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.vscode/settings.json create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/CMakeLists.txt create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/README_CN.md create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/README_EN.md create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeCache.txt create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeCCompiler.cmake create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeSystem.cmake create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdC/CMakeCCompilerId.c create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdC/a.out create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdCXX/a.out create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeOutput.log create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/Makefile.cmake create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/Makefile2 create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/TargetDirectories.txt create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/cmake.check_cache create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.bin create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.c create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.cxx create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/CXX.includecache create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/DependInfo.cmake create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/build.make create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/cmake_clean.cmake create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/depend.internal create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/depend.make create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_detect.cpp.o create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_detection.cpp.o create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_feature_mask.cpp.o create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_post_process.cpp.o create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_recognition.cpp.o create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_register.cpp.o create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/facial_recognition_message.pb.cc.o create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/flags.make create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/link.txt create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/main.cpp.o create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/mind_camera.cpp.o create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/progress.make create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/progress.marks create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/Makefile create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/cmake_install.cmake create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/data/.keep create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_detection.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_mask.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_train_mean.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_train_std.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_post_process.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_recognition.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_recognition_params.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_register.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/facial_recognition_message.pb.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/facial_thread_base.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/mind_camera.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/presenter_channels.h create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/model/.keep create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/param.conf create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/README create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/__init__.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__init__.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/__init__.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/app_manager.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/channel_handler.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/channel_manager.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/parameter_validation.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/presenter_message_pb2.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/presenter_socket_server.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/app_manager.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/channel_handler.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/channel_manager.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/parameter_validation.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/presenter_message_pb2.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/presenter_socket_server.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/config/config.conf create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/config/logging.conf create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__init__.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/__init__.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/config_parser.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/facial_recognition_handler.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/facial_recognition_message_pb2.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/facial_recognition_server.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/web.cpython-36.pyc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/config_parser.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_handler.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_message_pb2.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_server.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/web.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/123.png create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/384_304.jpg create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/384_304_02.jpg create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/bootstrap/css/bootstrap.min.css create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/bootstrap/js/bootstrap.min.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.common.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.css create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.esm.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.min.css create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.min.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/base.css create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/dialog.css create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/face.css create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/library.css create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/list.css create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/testvideo.css create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/loading.gif create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/logo.png create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u1.png create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u2.png create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u3.png create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u4.png create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u5.png create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u6.png create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/dialog.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/dialog.min.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/index.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/jquery-1.10.2.min.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/socket.io.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/socket.io.min.js create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/templates/384_304.jpg create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/templates/home.html create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/templates/home_add_camera_register.html create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/presenter_server.py create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/requirements create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/facial/ber.jpg create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/facial/mhc.jpg create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/facial/registered_faces.json create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/facial/ss.jpg create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/facial/ss1.jpg create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/facial/zt.jpg create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/facial_recognition.log create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/host_version.conf create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/param.conf create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/registered_faces.json create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/run_presenter_server.sh create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/scripts/testcase_200dk.sh create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/CMakeLists.txt create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/acl.json create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.cpp create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.cpp create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.cpp create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.cpp create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.cpp create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.pb.cc create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.proto create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/main.cpp create mode 100644 cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.cpp diff --git a/cplusplus/common/README_CN.md b/cplusplus/common/README_CN.md new file mode 100644 index 0000000..5c34246 --- /dev/null +++ b/cplusplus/common/README_CN.md @@ -0,0 +1,9 @@ +# 公共代码 + +#### 目录结构与说明 + +本目录为公共代码目录,目录结构和具体说明如下。 + +**./** +├── [atlasutil](./atlasutil):**atlasutil库** +└── [presenteragent](./presenteragent):**presenteragent库** \ No newline at end of file diff --git a/cplusplus/common/atlasutil/.ipynb_checkpoints/Makefile-checkpoint b/cplusplus/common/atlasutil/.ipynb_checkpoints/Makefile-checkpoint new file mode 100644 index 0000000..0702ea3 --- /dev/null +++ b/cplusplus/common/atlasutil/.ipynb_checkpoints/Makefile-checkpoint @@ -0,0 +1,108 @@ +TOPDIR := $(patsubst %,%,$(CURDIR)) + +ifndef DDK_PATH +$(error "Can not find DDK_PATH env, please set it in environment!.") +endif + +ifeq ($(mode),) +mode=AtlasDK +endif + +ifeq ($(mode), AtlasDK) + CC := aarch64-linux-gnu-g++ + arch := arm +else ifeq ($(mode), ASIC) + CC := g++ + + arch_local=$(shell arch) + ifeq ($(arch_local), aarch64) + arch := arm + else + arch := x86 + endif +else + $(error "Unsupported mode: "$(mode)", please input: AtlasDK or ASIC.") +endif + +NPU_HOST_LIB = $(DDK_PATH)/acllib/lib64/stub/ + +LOCAL_MODULE_NAME := libatlasutil.so + +LOCAL_DIR := . +OUT_DIR = ./out/$(arch) +OBJ_DIR = $(OUT_DIR)/obj +DEPS_DIR = $(OUT_DIR)/deps +LOCAL_LIBRARY=$(OUT_DIR)/$(LOCAL_MODULE_NAME) +RPATH_DIR=/home/HwHiAiUser/ascend_ddk/$(arch)/lib + +INC_DIR = \ + -I./include \ + -I$(HOME)/Ascend/driver/ \ + -I$(HOME)/ascend_ddk/$(arch)/include/ \ + -I$(HOME)/ascend_ddk/$(arch)/include/ascenddk/ \ + -I$(HOME)/ascend_ddk/$(arch)/include/ascenddk/presenter/agent/ \ + -I$(DDK_PATH)/acllib/include/ \ + -I$(DDK_PATH)/atc/include/protobuf + +CC_FLAGS := $(INC_DIR) -DENABLE_DVPP_INTERFACE -std=c++11 -fPIC -Wall -O2 +LNK_FLAGS := \ + -Wl,-rpath-link=$(NPU_HOST_LIB) \ + -Wl,-rpath-link=$(HOME)/ascend_ddk/$(arch)/lib \ + -L$(NPU_HOST_LIB) \ + -L$(HOME)/ascend_ddk/$(arch)/lib \ + -lascendcl \ + -lacl_dvpp \ + -lstdc++ \ + -lpthread \ + -lavcodec \ + -lavformat \ + -lavdevice \ + -lavutil \ + -lswresample \ + -lavfilter \ + -lswscale \ + -shared + +ifeq ($(mode), AtlasDK) +LNK_FLAGS += -L$(HOME)/Ascend/driver -lmedia_mini +endif + +SRCS_ALL := $(patsubst $(LOCAL_DIR)/%.cpp, %.cpp, $(shell find $(LOCAL_DIR) -name "*.cpp")) +ifeq ($(mode), AtlasDK) +SRCS := $(SRCS_ALL) +CC_FLAGS += -DENABLE_BOARD_CAMARE +else +SRCS := $(subst src/camera.cpp, ,$(SRCS_ALL)) +endif + +OBJS := $(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o,$(SRCS))) + +ALL_OBJS := $(OBJS) + +all: do_pre_build do_build + +do_pre_build: + $(Q)echo - do [$@] + $(Q)mkdir -p $(OBJ_DIR) + +do_build: $(LOCAL_LIBRARY) | do_pre_build + $(Q)echo - do [$@] + +$(LOCAL_LIBRARY): $(ALL_OBJS) + $(Q)echo [LD] $@ + $(Q)$(CC) $(CC_FLAGS) -o $@ $^ -Wl,--whole-archive -Wl,--no-whole-archive -Wl,--start-group -Wl,--end-group -Wl,-rpath=$(RPATH_DIR) $(LNK_FLAGS) + +$(OBJS): $(OBJ_DIR)/%.o : %.cpp | do_pre_build + $(Q)echo [CC] $@ + $(Q)mkdir -p $(dir $@) + $(Q)$(CC) $(CC_FLAGS) $(INC_DIR) -c -fstack-protector-all $< -o $@ + +install: all + $(Q)echo [INSTALL] $@ + $(Q)mkdir -p $(HOME)/ascend_ddk/$(arch)/include/atlasutil + $(Q)mkdir -p $(HOME)/ascend_ddk/$(arch)/lib + $(Q)cp -R $(LOCAL_DIR)/include/* $(HOME)/ascend_ddk/$(arch)/include/atlasutil/ + $(Q)cp -R $(OUT_DIR)/lib*.so $(HOME)/ascend_ddk/$(arch)/lib/ + +clean: + rm -rf $(TOPDIR)/$(OUT_DIR) diff --git a/cplusplus/common/atlasutil/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/cplusplus/common/atlasutil/.ipynb_checkpoints/Untitled-checkpoint.ipynb new file mode 100644 index 0000000..363fcab --- /dev/null +++ b/cplusplus/common/atlasutil/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/cplusplus/common/atlasutil/.vscode/settings.json b/cplusplus/common/atlasutil/.vscode/settings.json new file mode 100644 index 0000000..f94ace2 --- /dev/null +++ b/cplusplus/common/atlasutil/.vscode/settings.json @@ -0,0 +1,55 @@ +{ + "files.associations": { + "array": "cpp", + "bitset": "cpp", + "string_view": "cpp", + "initializer_list": "cpp", + "regex": "cpp", + "utility": "cpp", + "atomic": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "condition_variable": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "iterator": "cpp", + "map": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "optional": "cpp", + "ratio": "cpp", + "string": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "fstream": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "typeinfo": "cpp" + } +} \ No newline at end of file diff --git a/cplusplus/common/atlasutil/Makefile b/cplusplus/common/atlasutil/Makefile new file mode 100644 index 0000000..0702ea3 --- /dev/null +++ b/cplusplus/common/atlasutil/Makefile @@ -0,0 +1,108 @@ +TOPDIR := $(patsubst %,%,$(CURDIR)) + +ifndef DDK_PATH +$(error "Can not find DDK_PATH env, please set it in environment!.") +endif + +ifeq ($(mode),) +mode=AtlasDK +endif + +ifeq ($(mode), AtlasDK) + CC := aarch64-linux-gnu-g++ + arch := arm +else ifeq ($(mode), ASIC) + CC := g++ + + arch_local=$(shell arch) + ifeq ($(arch_local), aarch64) + arch := arm + else + arch := x86 + endif +else + $(error "Unsupported mode: "$(mode)", please input: AtlasDK or ASIC.") +endif + +NPU_HOST_LIB = $(DDK_PATH)/acllib/lib64/stub/ + +LOCAL_MODULE_NAME := libatlasutil.so + +LOCAL_DIR := . +OUT_DIR = ./out/$(arch) +OBJ_DIR = $(OUT_DIR)/obj +DEPS_DIR = $(OUT_DIR)/deps +LOCAL_LIBRARY=$(OUT_DIR)/$(LOCAL_MODULE_NAME) +RPATH_DIR=/home/HwHiAiUser/ascend_ddk/$(arch)/lib + +INC_DIR = \ + -I./include \ + -I$(HOME)/Ascend/driver/ \ + -I$(HOME)/ascend_ddk/$(arch)/include/ \ + -I$(HOME)/ascend_ddk/$(arch)/include/ascenddk/ \ + -I$(HOME)/ascend_ddk/$(arch)/include/ascenddk/presenter/agent/ \ + -I$(DDK_PATH)/acllib/include/ \ + -I$(DDK_PATH)/atc/include/protobuf + +CC_FLAGS := $(INC_DIR) -DENABLE_DVPP_INTERFACE -std=c++11 -fPIC -Wall -O2 +LNK_FLAGS := \ + -Wl,-rpath-link=$(NPU_HOST_LIB) \ + -Wl,-rpath-link=$(HOME)/ascend_ddk/$(arch)/lib \ + -L$(NPU_HOST_LIB) \ + -L$(HOME)/ascend_ddk/$(arch)/lib \ + -lascendcl \ + -lacl_dvpp \ + -lstdc++ \ + -lpthread \ + -lavcodec \ + -lavformat \ + -lavdevice \ + -lavutil \ + -lswresample \ + -lavfilter \ + -lswscale \ + -shared + +ifeq ($(mode), AtlasDK) +LNK_FLAGS += -L$(HOME)/Ascend/driver -lmedia_mini +endif + +SRCS_ALL := $(patsubst $(LOCAL_DIR)/%.cpp, %.cpp, $(shell find $(LOCAL_DIR) -name "*.cpp")) +ifeq ($(mode), AtlasDK) +SRCS := $(SRCS_ALL) +CC_FLAGS += -DENABLE_BOARD_CAMARE +else +SRCS := $(subst src/camera.cpp, ,$(SRCS_ALL)) +endif + +OBJS := $(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o,$(SRCS))) + +ALL_OBJS := $(OBJS) + +all: do_pre_build do_build + +do_pre_build: + $(Q)echo - do [$@] + $(Q)mkdir -p $(OBJ_DIR) + +do_build: $(LOCAL_LIBRARY) | do_pre_build + $(Q)echo - do [$@] + +$(LOCAL_LIBRARY): $(ALL_OBJS) + $(Q)echo [LD] $@ + $(Q)$(CC) $(CC_FLAGS) -o $@ $^ -Wl,--whole-archive -Wl,--no-whole-archive -Wl,--start-group -Wl,--end-group -Wl,-rpath=$(RPATH_DIR) $(LNK_FLAGS) + +$(OBJS): $(OBJ_DIR)/%.o : %.cpp | do_pre_build + $(Q)echo [CC] $@ + $(Q)mkdir -p $(dir $@) + $(Q)$(CC) $(CC_FLAGS) $(INC_DIR) -c -fstack-protector-all $< -o $@ + +install: all + $(Q)echo [INSTALL] $@ + $(Q)mkdir -p $(HOME)/ascend_ddk/$(arch)/include/atlasutil + $(Q)mkdir -p $(HOME)/ascend_ddk/$(arch)/lib + $(Q)cp -R $(LOCAL_DIR)/include/* $(HOME)/ascend_ddk/$(arch)/include/atlasutil/ + $(Q)cp -R $(OUT_DIR)/lib*.so $(HOME)/ascend_ddk/$(arch)/lib/ + +clean: + rm -rf $(TOPDIR)/$(OUT_DIR) diff --git a/cplusplus/common/atlasutil/README.md b/cplusplus/common/atlasutil/README.md new file mode 100644 index 0000000..45a7560 --- /dev/null +++ b/cplusplus/common/atlasutil/README.md @@ -0,0 +1,618 @@ +# atlasutil库使用说明 + +atlasutil库对当前开源社区样例中 + +1.Atlas200DK板载摄像头 + +2.acl dvpp图像和视频处理 + +3.acl模型推理等进行封装 + +等重复代码进行封装,提供一组公共接口。 + +注意: + +1.本库仅供当前社区开源样例使用,不覆盖ascend平台应用开发的所有场景,不作为用户应用开发的标准库; + +2.仅支持Atlas200DK和Atlas300样例。 + +## 编译方法 + +### 第三方库依赖 + +1. 依赖acl库,使用前需要安装ascend开发环境 + +2. 视频解码使用ffmpeg+dvpp,依赖ffmpeg库。ffmpeg的编译和部署参见[环境准备和依赖安装](../../environment) + +注意:开发环境是指编译应用代码的服务器;运行环境是指运行应用的Atlas200DK开发板或者Atals300云服务器;两者可以在同一个硬件设备上,也可以是分离的 + +### 编译步骤 + +1.进入src目录; + +2.执行编译安装命令。 + +Atlas200DK: + +``` +make +make install +``` + +编译生成的libatalsutil.so将被拷贝到`$HOME/ascend_ddk/arm/lib/`下;头文件拷贝到`$HOME/ascend_ddk/arm/include/atlasutil` + +Atlas300: + +``` +make mode=ASIC +make mode=ASIC install +``` + +编译生成的libatalsutil.so将被拷贝到`$HOME/ascend_ddk/x86/lib/`下;头文件拷贝到`$HOME/ascend_ddk/x86/include/atlasutil` + +## 部署方法 + +1. 将libatlasutil.so拷贝到运行环境/home/HwHiAiUser/ascend_ddk/arm/lib(Atlas200DK设备),或者/home/HwHiAiUser/ascend_ddk/x86/lib(Atlas300设备)下目录; + +2. 在运行环境下切换到 root用户,打开/etc/ld.so.conf.d/mind_so.conf ,将该目录追加到文件末尾,保存后退出,然后执行命令ldconfig + +## 接口说明 + +### AtlasCapture类 + +AtlasCapture类为Atlas200DK板载摄像头、RTSP视频流、mp4文件和H264/H265裸流文件解码提供统一接口。 + +#### AtlasVideoCapture + +方法:AtlasVideoCapture(uint32_t width = 1280, uint32_t height = 720, uint32_t fps = 20) + +说明:在Atlas200DK上打开一个可用的摄像头。如果0槽位摄像头可用,则选择0槽位;否则选择槽位1;如果两个摄像头都不可用,只生成实例,不会打开任何摄 像头。 + +输入参数:width:摄像头分辨率宽 + +​ height:摄像头分辨率高 + +​ fps:帧率, 参数范围为[1, 20] + +返回值:无 + +约束:1. 只支持atlas200dk; + +​ 2. 摄像头默认分辨率参数设置需要符合驱动要求,当前支持5种分辨率:1920 x 1080,1280 x 720,704 x 576,704 x 288,352 x 288。 + +#### AtlasVideoCapture + +方法: AtlasVideoCapture(uint32_t cameraId, uint32_t width = 1280, uint32_t height = 720, uint32_t fps = 20) + +说明: 在Atlas200DK上打开指定槽位的摄像头。如果该摄像头不可用,只生成实例,不会打开摄像头 + +输入参数: cameraId:摄像头id,0 表示CAMERA0槽位的摄像头,1 表示CAMERA1槽位的摄像头 + +​ width:摄像头分辨率宽 + +​ height:摄像头分辨率高 + +​ fps:帧率, 参数范围为[1, 20] + +返回值:无 + +约束: 1. 只支持atlas200dk; + +​ 2. 摄像头默认分辨率参数设置需要符合驱动要求,当前支持5种分辨率:1920 x 1080,1280 x 720,704 x 576,704 x 288,352 x 288。 + +#### AtlasVideoCapture + +方法:AtlasVideoCapture(const string& videoPath, aclrtContext context = nullptr) + +说明:解码视频videoPath + +输入参数:videoPath:视频文件或者rtsp地址; + +​ context:解码器使用dvpp vdec解码时使用的acl context。默认情况下使用当前线程的context + +返回值:无 + +约束: 解码器使用ffmpeg+vdec解码视频,在创建实例前需要初始化acl(aclInit)和设置device(aclrtSetDevice) + +注意事项:无 + +#### IsOpened + +方法: bool IsOpened() + +说明: 判断摄像头或者视频流是否已经打开 + +输入参数: 无 + +返回值: true: 已经打开摄像头,或者可以解码视频流; + +​ false: 摄像头不可用,或者视频流无法解码。 + +约束: 无 + +注意: 无 + +#### Get + +方法: uint32_t Get(StreamProperty key) + +说明: 获取摄像头或者视频解码属性 + +输入参数: key属性,定义如下 + +​ enum StreamProperty { + +​ FRAME_WIDTH = 1, ///视频分辨率宽 + +​ FRAME_HEIGHT = 2,//视频分辨率高 + +​ VIDEO_FPS = 3,//频解码帧率 + +​ ... + +​ }; + +返回值: 属性值 + +约束: 只有视频流解码支持Get获取属性; + +注意: 无 + +#### Set + +方法: AtlasError Set(StreamProperty key, uint32_t value) + +说明: 设置解码属性 + +输入参数: 1.key属性: + +​ enum StreamProperty { + +​ ...... + +​ OUTPUT_IMAGE_FORMAT = 4,//输出图像格式 + +​ RTSP_TRANSPORT = 5 //rtsp传输方式 +​ }; + +​ 2.value 属性值。图像格式支持PIXEL_FORMAT_YUV_SEMIPLANAR_420和PIXEL_FORMAT_YVU_SEMIPLANAR_420; + +​ 传输属性支持RTSP_TRANS_UDP(值为0)和RTSP_TRANS_TCP(值为1) + +返回值: 是否成功 + +约束: 1.只有视频流支持Set设置属性; + +​ 2.Mp4文件和rtsp都支持设置输出图像格式; + +​ 3.只有RTSP流支持设置传输方式 + +注意: 无 + +#### Read + +方法: AtlasError Read(ImageData& frame) + +说明: 读取摄像头或者视频流解码后的一帧视频图像 + +输入: Frame:视频图像数据和属性 + +返回值: ATLAS_OK:读取成功 + +其他: 读取失败。当前解码异常或者已经解码完毕 + +约束说明: 获取的数据内存为DVPP内存,因为内存不能在不同的context间传递,所以创建解码器时传入的context和调用Read接口线程的context必须相同,否则图像数据不可用 + +注意事项: 果返回值不为ATLAS_OK,表示当前解码失败建议不再读取 + +#### Close + +方法: AtlasError Close() + +说明: 停止解码或者关闭摄像头 + +输入参数: 无 + +返回值: ATLAS_OK:关闭/停止成功 + +其他: 关闭/停止失败 + +约束: 无 + +注意事项 + +### DvppProcess类 + +#### DvppProcess + +方法: DvppProcess() + +说明: 创建实例 + +输入参数: 无 + +返回值: 无 + +约束: 无 + +注意事项 + +#### InitResource + +方法: AtlasError InitResource(aclrtStream& stream) + +说明: DvppProcess初始化 + +输入参数: Stream: DvppProcess实例使用的acl stream + +返回值: ATLAS_OK:初始化成功 + +​ 其他: 初始化失败 + +约束: 无 + +注意: 无 + +#### Resize + +方法: AtlasError Resize(ImageData& dest, ImageData& src, uint32_t width, uint32_t height) + +说明: 将图片缩放到指定大小 + +输入参数: dest: resize后的图片数据,格式为Yuv420sp NV12, 图片数据存放在dvpp内存中 + +​ src: 待压缩图片,尺寸满足dvpp对齐要求 + +​ width: 缩放目标大小的宽度 + +​ height: 缩放目标大小的高度 + +返回值: ATLAS_OK: 缩放成功 + +​ 其他: 缩放失败 + +约束: 输入图片内存为dvpp, 并且满足16x2对齐 + +注意事项: acl dvpp在缩放图片时,输出图片是16x2对齐的,所以缩放结果图片不一定和接口参数一致,例如将图片缩放参数是300x300,得到的图片将是304x300 + +#### JpegD + +方法: AtlasError JpegD(ImageData& destYuv, ImageData& srcJpeg) + +说明: 将jpeg图片解码为yuv420sp图片 + +输入参数: destYuv: 解码后的yuv图片 + +​ srcJpeg: 待解码的jpeg图片 + +返回值: ATLAS_OK:解码成功 + +其他: 解码失败 + +约束: 输入图片内存为dvpp,并满足dvpp jpegd约束 + +注意: 输出yuv图片满足16x2对齐,不一定和输入图片尺寸一致 + +#### JpegE + + 方法: AtlasError JpegE(ImageData& destJpeg, ImageData& srcYuv) + +说明: 将yuv图片编码为jpeg图片 + +输入参数: destJpeg:生成的jpeg图片 + +​ SrcYuv:输入的yuv 图片 + +返回值: ATLAS_OK:编码成功 + +其他: 编码失败 + +约束: 无 + +注意事项: 无 + +### AtlasModel类 + +#### AtlasModel + +方法: AtlasModel(const string& modelPath) + +说明: Acl model的封装 + +输入参数: modelPath 离线模型路径 + +返回值: 无 + +约束: 无 + +注意事项: 无 + +#### Init方法 + +方法: AtlasError Init() + +说明: AtlasModel初始化 + +输入参数: 无 + +返回值说明: ATLAS_OK: 初始化成功 + +​ 其他: 初始化失败 + +约束: 无 + +注意事项: 无 + +#### CreateInput + +方法: AtlasError CreateInput(void *input, uint32_t inputSize) + +说明: 创建模型推理输入 + +输入参数: input: 推理数据 + +​ inputSize: 数据大小 + +返回值: ATLAS_OK:创建成功 + +​ 其他: 创建失败 + +约束: 输入数据input在device或者dvpp内存中 + +注意事项: 无 + +#### CreateInput + +方法: AtlasError CreateInput(void* input1, uint32_t input1Size, void* input2, uint32_t input2Size) + +说明: 创建模型推理输入 + +输入参数: input1: 第一个输入 + +​ input1Size: 第一个输入数据大小 + +​ input2: 第二个输入 + +​ input2Size: 第二个输入大小 + +返回值: ATLAS_OK: 创建成功 + +​ 其他: 创建失败 + +约束: 要求输入数据在device或者dvpp内存中 + +注意事项: 无 + +#### CreateInput + +方法: AtlasError CreateInput(vector& inputData) + +说明: 创建模型推理输入。用于输入有多个的模型。 + +输入参数: inputData:输入数据列表 + +​ struct DataInfo { + +​ void* data; + +​ uint32_t size; + +​ }; + +返回值: ATLAS_OK: 创建成功 + +​ 其他: 创建失败 + +约束: 要求数据在device或者dvpp内存中 + +注意事项: 无 + +#### DestroyInput + +方法: void DestroyInput() + +说明: 销毁创建的模型输入 + +输入参数: 无 + +返回值: 无 + +约束: 无 + +注意事项: 只释放CreateInput创建的dataset结构,不会释放输入的数据 + +#### Execute方法 + +方法: AtlasError Execute(vector& inferOutputs); + +说明: 执行模型推理 + +输入参数: inferOutputs 输出参数,推理结果: + +​ struct InferenceOutput { + +​ shared_ptr data = nullptr; + +​ uint32_t size; + +​ }; + +返回值: ATLAS_OK:推理成功 + +​ 其他: 推理成功 + +约束: 无 + +注意事项: 无 + +### 日志 + +#### ATLAS_LOG_ERROR + +方法: ATLAS_LOG_ERROR(fmt, ...) + +说明: 打印acl ERROR级别日志到/var/log/npu/slog/host-0/host-xxxx.log + +输入参数: fmt:格式化字符串 + +返回值: 无 + +约束: 无 + +注意事项: 无 + +#### ATLAS_LOG_INFO + +方法: ATLAS_LOG_INFO(fmt, ...) + +说明: 打印acl INFO级别日志到/var/log/npu/slog/host-0/host-xxxx.log + +输入参数: log_info:打印的日志内容,支持格式化字符串,记录的日志包括函数、文件和行号 + +返回值: 无 + +约束: 无 + +注意事项: 无 + +#### ATLAS_LOG_DEBUG + +方法: ATLAS_LOG_DEBUG(fmt, ...) + +说明: 打印acl DEBUG级别日志到/var/log/npu/slog/host-0/host-xxxx.log + +输入参数: log_info:打印的日志内容,支持格式化字符串,记录的日志包括函数、文件和行号 + +返回值: 无 + +约束: 无 + +注意事项: 无 + +### 其他接口 + +#### ReadConfig + +方法: bool ReadConfig(map& config, const char* configFile) + +说明: 解析配置文件 + +输入参数: config:解析结果 + +​ configFile:配置文件路径 + +返回值: true:解析成功 + +​ false: 解析失败 + +约束: 类似如下的配置文件,要求配置项名称唯一: + +​ [baseconf] + +​ presenter_server_ip=192.168.1.166 + +注意事项: 无 + +#### CopyDataToHost + +方法: void* CopyDataToHost(void* data, uint32_t size, aclrtRunMode curRunMode, MemoryType memType) + +说明: 数据拷贝到host侧 + +输入参数: data:待拷贝数据 + +​ size: 数据大小 + +​ curRunMode:当前的runMode + +​ memType:拷贝目的内存种类 + +​ enum MemoryType { + +​ MEMORY_NORMAL = 0,//使用new申请的uint8_t类型内存 + +​ MEMORY_HOST,//acl接口申请的host内存 + +​ MEMORY_DEVICE,//acl接口申请的device内存 + +​ MEMORY_DVPP, //dvpp内存 + +​ MEMORY_INVALID_TYPE + +​ }; + +返回值: 拷贝后的目的内存指针 + +约束: 不支持Atlas300dk服务器本地内存之间的拷贝 + +注意事项: 无 + +#### CopyDataToDevice + +方法: void* CopyDataToDevice(void* data, uint32_t size, aclrtRunMode curRunMode, MemoryType memType) + +说明: 数据拷贝到device侧 + +输入参数: data:待拷贝数据 + +​ size: 数据大小 + +​ curRunMode:当前的runMode + +​ memType:拷贝目的内存种类 + +​ enum MemoryType { + +​ MEMORY_NORMAL = 0,//使用new申请的uint8_t类型内存 + +​ MEMORY_HOST,//acl接口申请的host内存 + +​ MEMORY_DEVICE,//acl接口申请的device内存 + +​ MEMORY_DVPP, //dvpp内存 + +​ MEMORY_INVALID_TYPE + +​ }; + +返回值: 拷贝后的目的内存指针 + +约束: 无 + +注意事项: 无 + +#### SaveBinFile + +方法: void SaveBinFile(const char* filename, void* data, uint32_t size) + +说明: 将数据保存二进制文件 + +输入参数: filename:带路径的二进制文件名 + +​ Data:二进制数据 + +​ size:数据大小 + +返回值: 拷贝后的目的内存指针 + +约束: 无 + +注意事项: 无 + +#### ReadBinFile + +方法: AtlasError ReadBinFile(const char* filename, void*& data, uint32_t& size) + +说明: 将数据保存二进制文件 + +输入: filename:带路径的二进制文件名 + +​ Data:读取的二进制数据 + +​ size:数据大小 + +返回值: 拷贝后的目的内存指针 + +约束: 无 + +注意事项: 无 \ No newline at end of file diff --git a/cplusplus/common/atlasutil/Untitled.ipynb b/cplusplus/common/atlasutil/Untitled.ipynb new file mode 100644 index 0000000..363fcab --- /dev/null +++ b/cplusplus/common/atlasutil/Untitled.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/cplusplus/common/atlasutil/include/acl_device.h b/cplusplus/common/atlasutil/include/acl_device.h new file mode 100644 index 0000000..2614637 --- /dev/null +++ b/cplusplus/common/atlasutil/include/acl_device.h @@ -0,0 +1,47 @@ +/** +* Copyright 2020 Huawei Technologies 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 utils.h +* Description: handle file operations +*/ +#pragma once + +#include +#include + +#include "acl/acl.h" +#include "atlas_error.h" + +class AclDevice { +public: + AclDevice(); + AclDevice(int32_t devId, const std::string& aclConfigPath, + bool useDefaultCtx = true); + ~AclDevice(); + + AtlasError Init(); + void Release(); + + aclrtRunMode GetRunMode() { return runMode_; } + aclrtContext GetContext() { return context_; } + +private: + int32_t deviceId_; + std::string aclConfig_; + aclrtRunMode runMode_; + aclrtContext context_; + bool useDefaultCtx_; + bool isReleased_; +}; diff --git a/cplusplus/common/atlasutil/include/atlas_app.h b/cplusplus/common/atlasutil/include/atlas_app.h new file mode 100644 index 0000000..9d05058 --- /dev/null +++ b/cplusplus/common/atlasutil/include/atlas_app.h @@ -0,0 +1,77 @@ +/** +* @file sample_process.h +* +* Copyright (C) 2020. Huawei Technologies Co., Ltd. All rights reserved. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ +#pragma once + +#include "acl/acl.h" +#include "atlas_thread_mgr.h" + +namespace { + int kMainThreadId = 0; +} + +typedef int (*AtlasMsgProcess)(uint32_t msgId, shared_ptr msgData, void* userData); + +class AtlasApp { +public: + /** + * @brief Constructor + */ + AtlasApp(); + AtlasApp(const AtlasApp&) = delete; + AtlasApp& operator=(const AtlasApp&) = delete; + + /** + * @brief Destructor + */ + ~AtlasApp(); + + /** + * @brief Get the single instance of AtlasApp + * @return Instance of AtlasApp + */ + static AtlasApp& GetInstance() { + static AtlasApp instance; + return instance; + } + + /** + * @brief Create one app thread * + * @return Result of create thread + */ + int CreateAtlasThread(AtlasThread* thInst, const std::string& instName, + aclrtContext context, aclrtRunMode runMode); + int Start(vector& threadParamTbl); + void Wait(); + void Wait(AtlasMsgProcess msgProcess, void* param); + int GetAtlasThreadIdByName(const std::string& threadName); + AtlasError SendMessage(int dest, int msgId, shared_ptr data); + void WaitEnd() { waitEnd_ = true; } + void Exit(); + +private: + AtlasError Init(); + int CreateAtlasThreadMgr(AtlasThread* thInst, const std::string& instName, + aclrtContext context, aclrtRunMode runMode); + bool CheckThreadAbnormal(); + bool CheckThreadNameUnique(const std::string& theadName); + void ReleaseThreads(); + void DestroyResource(); + +private: + bool isReleased_; + bool waitEnd_; + std::vector threadList_; +}; + +AtlasApp& CreateAtlasAppInstance(); +AtlasApp& GetAtlasAppInstance(); +AtlasError SendMessage(int dest, int msgId, shared_ptr data); +int GetAtlasThreadIdByName(const std::string& threadName); + diff --git a/cplusplus/common/atlasutil/include/atlas_error.h b/cplusplus/common/atlasutil/include/atlas_error.h new file mode 100644 index 0000000..ed9608d --- /dev/null +++ b/cplusplus/common/atlasutil/include/atlas_error.h @@ -0,0 +1,198 @@ +/** +* Copyright 2020 Huawei Technologies 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 utils.h +* Description: handle file operations +*/ +#pragma once + +#include + +typedef int AtlasError; + +const int ATLAS_OK = 0; +const int ATLAS_ERROR = 1; +const int ATLAS_ERROR_INVALID_ARGS = 2; +const int ATLAS_ERROR_SET_ACL_CONTEXT = 3; +const int ATLAS_ERROR_GET_ACL_CONTEXT = 4; +const int ATLAS_ERROR_CREATE_ACL_CONTEXT = 5; +const int ATLAS_ERROR_CREATE_THREAD = 6; +const int ATLAS_ERROR_CREATE_STREAM = 7; +const int ATLAS_ERROR_GET_RUM_MODE = 8; +const int ATLAS_ERROR_APP_INIT = 9; +const int ATLAS_ERROR_DEST_INVALID = 10; +const int ATLAS_ERROR_INITED_ALREADY = 11; +const int ATLAS_ERROR_ENQUEUE = 12; +const int ATLAS_ERROR_WRITE_FILE = 13; +const int ATLAS_ERROR_THREAD_ABNORMAL = 14; +const int ATLAS_ERROR_START_THREAD = 15; +const int ATLAS_ERROR_ADD_THREAD = 16; + +//malloc or new memory failed +const int ATLAS_ERROR_MALLOC = 101; +//aclrtMalloc failed +const int ATLAS_ERROR_MALLOC_DEVICE = 102; + +const int ATLAS_ERROR_MALLOC_DVPP = 103; + +//access file failed +const int ATLAS_ERROR_ACCESS_FILE = 201; +//the file is invalid +const int ATLAS_ERROR_INVALID_FILE = 202; +//open file failed +const int ATLAS_ERROR_OPEN_FILE = 203; + +//load model repeated +const int ATLAS_ERROR_LOAD_MODEL_REPEATED = 301; + +const int ATLAS_ERROR_NO_MODEL_DESC = 302; +//load mode by acl failed +const int ATLAS_ERROR_LOAD_MODEL = 303; + +const int ATLAS_ERROR_CREATE_MODEL_DESC = 304; + +const int ATLAS_ERROR_GET_MODEL_DESC = 305; + +const int ATLAS_ERROR_CREATE_DATASET = 306; + +const int ATLAS_ERROR_CREATE_DATA_BUFFER = 307; + +const int ATLAS_ERROR_ADD_DATASET_BUFFER = 308; + +const int ATLAS_ERROR_EXECUTE_MODEL = 309; + +const int ATLAS_ERROR_GET_DATASET_BUFFER = 310; + +const int ATLAS_ERROR_GET_DATA_BUFFER_ADDR = 311; + +const int ATLAS_ERROR_GET_DATA_BUFFER_SIZE = 312; + +const int ATLAS_ERROR_COPY_DATA = 313; + +const int ATLAS_ERROR_SET_CAMERA = 400; + +const int ATLAS_ERROR_CAMERA_NO_ACCESSABLE = 401; + +const int ATLAS_ERROR_OPEN_CAMERA = 402; + +const int ATLAS_ERROR_READ_CAMERA_FRAME = 403; + +const int ATLAS_ERROR_UNSURPPORT_PROPERTY = 404; + +const int ATLAS_ERROR_INVALID_PROPERTY_VALUE = 405; + +const int ATLAS_ERROR_UNSURPPORT_VIDEO_CAPTURE =406; + +const int ATLAS_ERROR_CREATE_DVPP_CHANNEL_DESC = 501; + +const int ATLAS_ERRROR_CREATE_DVPP_CHANNEL = 502; + +const int ATLAS_ERROR_CREATE_PIC_DESC = 503; + +const int ATLAS_ERROR_CREATE_RESIZE_CONFIG = 504; + +const int ATLAS_ERROR_RESIZE_ASYNC = 505; + +const int ATLAS_ERROR_SYNC_STREAM = 506; + +const int ATLAS_ERROR_JPEGE_ASYNC = 507; + +const int ATLAS_ERROR_JPEGD_ASYNC = 508; + +const int ATLAS_ERROR_FFMPEG_DECODER_INIT = 601; + +const int ATLAS_ERROR_OPEN_VIDEO_UNREADY = 602; + +const int ATLAS_ERROR_TOO_MANY_VIDEO_DECODERS = 603; + +const int ATLAS_ERROR_SET_VDEC_CHANNEL_ID = 604; + +const int ATLAS_ERROR_SET_STREAM_DESC_DATA = 605; + +const int ATLAS_ERROR_SET_VDEC_CHANNEL_THREAD_ID = 606; + +const int ATLAS_ERROR_SET_VDEC_CALLBACK = 607; + +const int ATLAS_ERROR_SET_VDEC_ENTYPE = 608; + +const int ATLAS_ERROR_SET_VDEC_PIC_FORMAT = 609; + +const int ATLAS_ERROR_CREATE_VDEC_CHANNEL = 610; + +const int ATLAS_ERROR_CREATE_STREAM_DESC = 611; + +const int ATLAS_ERROR_SET_STREAM_DESC_EOS = 612; + +const int ATLAS_ERROR_SET_STREAM_DESC_SIZE = 613; + +const int ATLAS_ERROR_SET_PIC_DESC_DATA = 614; + +const int ATLAS_ERROR_SET_PIC_DESC_SIZE = 615; + +const int ATLAS_ERROR_SET_PIC_DESC_FORMAT = 616; + +const int ATLAS_ERROR_VDEC_IS_EXITTING = 617; + +const int ATLAS_ERROR_VDEC_SET_WIDTH = 618; + +const int ATLAS_ERROR_VDEC_WIDTH_INVALID = 619; + +const int ATLAS_ERROR_VDEC_HEIGHT_INVALID = 620; + +const int ATLAS_ERROR_VDEC_SET_HEIGHT = 621; + +const int ATLAS_ERROR_VDEC_ENTYPE_INVALID = 622; + +const int ATLAS_ERROR_VDEC_FORMAT_INVALID = 623; + +const int ATLAS_ERROR_VDEC_INVALID_PARAM = 624; + +const int ATLAS_ERROR_VDEC_SEND_FRAME = 625; + +const int ATLAS_ERROR_VDEC_QUEUE_FULL = 626; + +const int ATLAS_ERROR_SET_RTSP_TRANS = 627; + +const int ATLAS_ERROR_READ_EMPTY = 628; + +const int ATLAS_ERROR_VIDEO_DECODER_STATUS = 629; + +const int ATLAS_ERROR_DECODE_FINISH = 630; + +const int ATLAS_ERROR_H26X_FRAME = 631; + +const int ATLAS_ERROR_VENC_STATUS = 701; + +const int ATLAS_ERROR_VENC_QUEUE_FULL = 702; + +const int ATLAS_ERROR_CREATE_VENC_CHAN_DESC = 703; + +const int ATLAS_ERROR_SET_VENC_CHAN_TID = 704; + +const int ATLAS_ERROR_VENC_SET_EOS = 705; + +const int ATLAS_ERROR_VENC_SET_IF_FRAME = 706; + +const int ATLAS_ERROR_CREATE_VENC_CHAN = 707; + +const int ATLAS_ERROR_VENC_CREATE_FRAME_CONFIG = 708; + +const int ATLAS_ERROR_VENC_SEND_FRAME = 709; + +const int ATLAS_ERROR_SUBSCRIBE_REPORT = 710; + + + + diff --git a/cplusplus/common/atlasutil/include/atlas_model.h b/cplusplus/common/atlasutil/include/atlas_model.h new file mode 100644 index 0000000..b99938f --- /dev/null +++ b/cplusplus/common/atlasutil/include/atlas_model.h @@ -0,0 +1,71 @@ +/** +* Copyright 2020 Huawei Technologies 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 model_process.h +* Description: handle model process +*/ +#pragma once +#include +#include "atlas_utils.h" +#include "acl/acl.h" + +class AtlasModel { +public: + AtlasModel(); + AtlasModel(const std::string& modelPath); + + ~AtlasModel(); + + AtlasError Init(); + AtlasError Init(const std::string& modelPath); + + void DestroyResource(); + AtlasError CreateInput(void *input, uint32_t input1size); + AtlasError CreateInput(void *input1, uint32_t input1size, + void* input2, uint32_t input2size); + AtlasError CreateInput(std::vector& inputData); + AtlasError Execute(std::vector& inferOutputs, + void *data, uint32_t size); + AtlasError Execute(std::vector& inferOutputs); + void DestroyInput(); + +private: + AtlasError LoadModelFromFile(const std::string& modelPath); + AtlasError CreateDesc(); + AtlasError CreateOutput(); + AtlasError AddDatasetBuffer(aclmdlDataset* dataset, + void* buffer, uint32_t bufferSize); + AtlasError GetOutputItem(InferenceOutput& out, + uint32_t idx); + void Unload(); + void DestroyDesc(); + void DestroyOutput(); + +private: + std::string modelPath_; + bool loadFlag_; // model load flag + uint32_t modelId_; + void *modelMemPtr_; + size_t modelMemSize_; + void *modelWeightPtr_; + size_t modelWeightSize_; + aclmdlDesc *modelDesc_; + aclmdlDataset *input_; + aclmdlDataset *output_; + aclrtRunMode runMode_; + size_t outputsNum_; + bool isReleased_; +}; + diff --git a/cplusplus/common/atlasutil/include/atlas_thread.h b/cplusplus/common/atlasutil/include/atlas_thread.h new file mode 100644 index 0000000..3e7cd49 --- /dev/null +++ b/cplusplus/common/atlasutil/include/atlas_thread.h @@ -0,0 +1,49 @@ +#pragma once +#include +#include +#include +#include +#include "thread_safe_queue.h" +#include "acl/acl.h" +#include "atlas_error.h" + +using namespace std; + +#define INVALID_INSTANCE_ID (-1) + +class AtlasThread{ +public: + // 构造函数 + AtlasThread(); + ~AtlasThread() {}; + virtual int Init() { return ATLAS_OK; }; + virtual int Process(int msgId, shared_ptr msgData) = 0; + + int SelfInstanceId() { return instanceId_; } + string& SelfInstanceName() { return instanceName_; } + aclrtContext GetContext() { return context_; } + aclrtRunMode GetRunMode() { return runMode_; } + + AtlasError BaseConfig(int instanceId, const string& threadName, + aclrtContext context, aclrtRunMode runMode); +private: + aclrtContext context_; + aclrtRunMode runMode_; + + int instanceId_; + string instanceName_; + + bool baseConfiged_; + bool isExit_; +}; + +struct AtlasThreadParam { + AtlasThread* threadInst = nullptr; + string threadInstName = ""; + aclrtContext context = nullptr; + aclrtRunMode runMode = ACL_HOST; + + int threadInstId = INVALID_INSTANCE_ID; +}; + + diff --git a/cplusplus/common/atlasutil/include/atlas_thread_mgr.h b/cplusplus/common/atlasutil/include/atlas_thread_mgr.h new file mode 100644 index 0000000..4864f3c --- /dev/null +++ b/cplusplus/common/atlasutil/include/atlas_thread_mgr.h @@ -0,0 +1,48 @@ +#pragma once +#include +#include +#include +#include +#include "atlas_utils.h" +#include "thread_safe_queue.h" +#include "atlas_thread.h" + +enum AtlasThreadStatus { + THREAD_READY = 0, + THREAD_RUNNING = 1, + THREAD_EXITING = 2, + THREAD_EXITED = 3, + THREAD_ERROR = 4, +}; + +class AtlasThreadMgr{ +public: + // 构造函数 + AtlasThreadMgr(AtlasThread* userThreadInstance, + const std::string& threadName); + ~AtlasThreadMgr(); + // 线程函数 + static void ThreadEntry(void* data); + + AtlasThread* GetUserInstance() { return this->userInstance_; } + const std::string& GetThreadName(){ return name_; } + // 将 AtlasMessage 数据发送到队列中 + AtlasError PushMsgToQueue(shared_ptr& pMessage); + // 从队列中将 AtlasMessage 数据取出 + shared_ptr PopMsgFromQueue(){ return this->msgQueue_.Pop(); } + void CreateThread(); + void SetStatus(AtlasThreadStatus status) { status_ = status; } + AtlasThreadStatus GetStatus() { return status_; } + AtlasError WaitThreadInitEnd(); + +public: + std::string name_; + AtlasThread* userInstance_; + + bool isExit_; + AtlasThreadStatus status_; + ThreadSafeQueue> msgQueue_; +}; + + + diff --git a/cplusplus/common/atlasutil/include/atlas_type.h b/cplusplus/common/atlasutil/include/atlas_type.h new file mode 100644 index 0000000..fac4485 --- /dev/null +++ b/cplusplus/common/atlasutil/include/atlas_type.h @@ -0,0 +1,97 @@ +/** +* Copyright 2020 Huawei Technologies 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 utils.h +* Description: handle file operations +*/ +#pragma once + + +#include +#include + +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" + +enum MemoryType { + MEMORY_NORMAL = 0, + MEMORY_HOST, + MEMORY_DEVICE, + MEMORY_DVPP, + MEMORY_INVALID_TYPE +}; + +enum CopyDirection { + TO_DEVICE = 0, + TO_HOST, + INVALID_COPY_DIRECT +}; + +enum CameraId { + CAMERA_ID_0 = 0, + CAMERA_ID_1, + CAMERA_ID_INVALID, +}; + +struct ImageData { + acldvppPixelFormat format; + uint32_t width = 0; + uint32_t height = 0; + uint32_t alignWidth = 0; + uint32_t alignHeight = 0; + uint32_t size = 0; + std::shared_ptr data = nullptr; +}; + +struct FrameData { + bool isFinished = false; + uint32_t frameId = 0; + uint32_t size = 0; + void* data = nullptr; +}; + +struct Resolution { + uint32_t width = 0; + uint32_t height = 0; +}; + +struct Rect { + uint32_t ltX = 0; + uint32_t ltY = 0; + uint32_t rbX = 0; + uint32_t rbY = 0; +}; + +struct BBox { + Rect rect; + uint32_t score = 0; + std::string text; +}; + +struct AtlasMessage { + int dest; + int msgId; + std::shared_ptr data = nullptr; +}; + +struct DataInfo { + void* data; + uint32_t size; +}; + +struct InferenceOutput { + std::shared_ptr data = nullptr; + uint32_t size; +}; \ No newline at end of file diff --git a/cplusplus/common/atlasutil/include/atlas_utils.h b/cplusplus/common/atlasutil/include/atlas_utils.h new file mode 100644 index 0000000..e140138 --- /dev/null +++ b/cplusplus/common/atlasutil/include/atlas_utils.h @@ -0,0 +1,342 @@ +/** +* Copyright 2020 Huawei Technologies 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 utils.h +* Description: handle file operations +*/ +#pragma once + +#include +#include +#include +#include +#include + +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" + +#include "atlas_error.h" +#include "atlas_type.h" + +/** + * @brief calculate RGB 24bits image size + * @param [in]: width: image width + * @param [in]: height: image height + * @return bytes size of image + */ +#define RGBU8_IMAGE_SIZE(width, height) ((width) * (height) * 3) + +/** + * @brief calculate RGB C3F32 image size + * @param [in]: width: image width + * @param [in]: height: image height + * @return bytes size of image + */ +#define RGBF32_IMAGE_SIZE(width, height) ((width) * (height) * 3 * sizeof(float)) + +/** + * @brief calculate YUVSP420 image size + * @param [in]: width: image width + * @param [in]: height: image height + * @return bytes size of image + */ +#define YUV420SP_SIZE(width, height) ((width) * (height) * 3 / 2) + +/** + * @brief calculate YUVSP420 nv12 load to opencv mat height paramter + * @param [in]: height: yuv image height + * @return bytes size of image + */ +#define YUV420SP_CV_MAT_HEIGHT(height) ((height) * 3 / 2) + +/** + * @brief generate shared pointer of dvpp memory + * @param [in]: buf: memory pointer, malloc by acldvppMalloc + * @return shared pointer of input buffer + */ +#define SHARED_PRT_DVPP_BUF(buf) (shared_ptr((uint8_t *)(buf), [](uint8_t* p) { acldvppFree(p); })) + +/** + * @brief generate shared pointer of device memory + * @param [in]: buf: memory pointer, malloc by acldvppMalloc + * @return shared pointer of input buffer + */ +#define SHARED_PRT_DEV_BUF(buf) (shared_ptr((uint8_t *)(buf), [](uint8_t* p) { aclrtFree(p); })) + +/** + * @brief generate shared pointer of memory + * @param [in]: buf memory pointer, malloc by new + * @return shared pointer of input buffer + */ +#define SHARED_PRT_U8_BUF(buf) (shared_ptr((uint8_t *)(buf), [](uint8_t* p) { delete[](p); })) + +/** + * @brief calculate aligned number + * @param [in]: num: the original number that to aligned + * @param [in]: align: the align factor + * @return the number after aligned + */ +#define ALIGN_UP(num, align) (((num) + (align) - 1) & ~((align) - 1)) + +/** + * @brief calculate number align with 2 + * @param [in]: num: the original number that to aligned + * @return the number after aligned + */ +#define ALIGN_UP2(num) ALIGN_UP(num, 2) + +/** + * @brief calculate number align with 16 + * @param [in]: num: the original number that to aligned + * @return the number after aligned + */ +#define ALIGN_UP16(num) ALIGN_UP(num, 16) + +/** + * @brief calculate number align with 128 + * @param [in]: num: the original number that to aligned + * @return the number after aligned + */ +#define ALIGN_UP128(num) ALIGN_UP(num, 128) + +/** + * @brief calculate elements num of array + * @param [in]: array: the array variable + * @return elements num of array + */ +#define SIZEOF_ARRAY(array) (sizeof(array)/sizeof(array[0])) + +/** + * @brief Write acl error level log to host log + * @param [in]: fmt: the input format string + * @return none + */ +#define ATLAS_LOG_ERROR(fmt, ...) \ + do{aclAppLog(ACL_ERROR, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \ + fprintf(stdout, "[ERROR] " fmt "\n", ##__VA_ARGS__);}while(0) + +/** + * @brief Write acl info level log to host log + * @param [in]: fmt: the input format string + * @return none + */ +#define ATLAS_LOG_INFO(fmt, ...) \ + do{aclAppLog(ACL_INFO, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \ + fprintf(stdout, "[INFO] " fmt "\n", ##__VA_ARGS__);}while(0) + +/** + * @brief Write acl debug level log to host log + * @param [in]: fmt: the input format string + * @return none + */ +#define ATLAS_LOG_DEBUG(fmt, ...) \ + do{aclAppLog(ACL_DEBUG, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \ + fprintf(stdout, "[INFO] " fmt "\n", ##__VA_ARGS__);}while(0) + +/** + * @brief Recognize the string is a accessable directory or not + * @param [in]: path: the input string + * @return bool true: is directory; false: not directory + */ +bool IsDirectory(const std::string &path); + +/** + * @brief Copy data to device + * @param [in]: data: The data to copy + * @param [in]: size: The data bytes size + * @param [in]: curRunMode: The run mode, get by aclrtGetRunMode, + * Atlas200DK is ACL_DEVICE, Atlas300 is ACL_HOST + * @param [in]: memType: The dest memory type:MEMORY_NORMAL(in Atlas200DK), + * MEMORY_DEVICE, MEMORY_DVPP + * @return void* The dest memory pointer + */ +void* CopyDataToDevice(const void* data, uint32_t size, + aclrtRunMode curRunMode, MemoryType memType); + +/** + * @brief Copy data to device buffer + * @param [in]: dest: The device buffer + * @param [in]: destSize: The device buffer size + * @param [in]: src: The data to copy + * @param [in]: srcSize: The data bytes size + * @param [in]: curRunMode: The run mode, get by aclrtGetRunMode, + * Atlas200DK is ACL_DEVICE, Atlas300 is ACL_HOST + * @return AtlasError ATLAS_OK: copy success + * others: copy failed + */ +AtlasError CopyDataToDeviceEx(void* dest, uint32_t destSize, + const void* src, uint32_t srcSize, + aclrtRunMode runMode); + +/** + * @brief Copy data to host + * @param [in]: data: The data to be copy + * @param [in]: size: The data bytes size + * @param [in]: curRunMode: The run mode, get by aclrtGetRunMode, + * Atlas200DK is ACL_DEVICE, Atlas300 is ACL_HOST + * @param [in]: memType: The dest memory type:MEMORY_NORMAL, MEMORY_HOST + * @return void* The dest memory pointer + */ +void* CopyDataToHost(const void* data, uint32_t size, + aclrtRunMode curRunMode, MemoryType memType); + +/** + * @brief Copy data to host buffer + * @param [in]: dest: The host buffer + * @param [in]: destSize: The host buffer size + * @param [in]: src: The data to copy + * @param [in]: srcSize: The data bytes size + * @param [in]: curRunMode: The run mode, get by aclrtGetRunMode, + * Atlas200DK is ACL_DEVICE, Atlas300 is ACL_HOST + * @return AtlasError ATLAS_OK: copy success + * others: copy failed + */ +AtlasError CopyDataToHostEx(void* dest, uint32_t destSize, + const void* src, uint32_t srcSize, + aclrtRunMode runMode); + +/** + * @brief Copy data to memory + * @param [in]: data: The data to be copy + * @param [in]: size: The data bytes size + * @param [in]: policy: the kind of sync, + * typedef enum aclrtMemcpyKind { + * ACL_MEMCPY_HOST_TO_HOST, // Host内的内存复制 + * ACL_MEMCPY_HOST_TO_DEVICE, // Host到Device的内存复制 + * ACL_MEMCPY_DEVICE_TO_HOST, // Device到Host的内存复制 + * ACL_MEMCPY_DEVICE_TO_DEVICE, // Device内的内存复制 + * } aclrtMemcpyKind; + * @param [in]: memType: The dest memory type + * @return void* The dest memory pointer + */ +void* CopyData(const void* data, uint32_t size, + aclrtMemcpyKind policy, MemoryType memType); + +/** + * @brief Read jpeg image file. Only support baseline, not support progressive + * @param [out]: image: image data read from file. + * @param [in]: fileName: The data bytes size + * @return AtlasError ATLAS_OK: read success + * others: read failed + */ +AtlasError ReadJpeg(ImageData& image, const std::string& fileName); + +/** + * @brief Get all files from file list string + * @param [in]: pathList: files list string, seperate by ',', + * the element could be file path or directory + * @param [in]: fileVec: The data bytes size + * @return AtlasError ATLAS_OK: read success + * others: read failed + */ +void GetAllFiles(const std::string &pathList, + std::vector &fileVec); + +/** + * @brief Save data to binary file + * @param [in]: filename: binary file name with path + * @param [in]: data: binary data + * @param [in]: size: bytes size of data + * @return AtlasError ATLAS_OK: read success + * others: read failed + */ +void SaveBinFile(const std::string& filename, const void* data, uint32_t size); + +/** + * @brief Read binary file to buffer + * @param [in]: filename: binary file name with path + * @param [in]: data: buffer + * @param [in]: size: buffer size + * @return AtlasError ATLAS_OK: read success + * others: read failed + */ +AtlasError ReadBinFile(const std::string& filename, + void* data, uint32_t& size); + +/** + * @brief Copy image to memory that malloc by new + * @param [out]: destImage: The image after copy + * @param [in]: srcImage: The image to copy + * @param [in]: curRunMode: The run mode, get by aclrtGetRunMode, + * Atlas200DK is ACL_DEVICE, Atlas300 is ACL_HOST + * @return AtlasError ATLAS_OK: read success + * others: read failed + */ +AtlasError CopyImageToLocal(ImageData& destImage, + ImageData& srcImage, aclrtRunMode curRunMode); + +/** + * @brief Copy image to acl device + * @param [out]: destImage: The image after copy + * @param [in]: srcImage: The image to copy + * @param [in]: curRunMode: The run mode, get by aclrtGetRunMode, + * Atlas200DK is ACL_DEVICE, Atlas300 is ACL_HOST + * @param [in]: memType: memory type, dvpp is MEMORY_DVPP, + * device is MEMPRY_DEVICE + * @return AtlasError ATLAS_OK: read success + * others: read failed + */ +AtlasError CopyImageToDevice(ImageData& destImage, ImageData& srcImage, + aclrtRunMode curRunMode, MemoryType memType); + +/** + * @brief Match ip address string as <1-255>.<0-255>.<0-255>.<0-255>: + * @param [in]: addrStr: Ip address string + * @return bool true: The input string match success + * false: is not match + */ +bool IsIpAddrWithPort(const std::string& addrStr); + +/** + * @brief Split ip address string <1-255>.<0-255>.<0-255>.<0-255>: to + * ip and port + * @param [out]: ip: Ip address <1-255>.<0-255>.<0-255>.<0-255> + * @param [out]: port: port string + * @param [in]: addr: Ip address string + * @return None + */ +void ParseIpAddr(std::string& ip, std::string& port, const std::string& addr); + +/** + * @brief Judge input string is mp4 file path + * @param [in]: path: file path + * @return bool true: input string is mp4 file path + * false: is not mp4 file path + */ +bool IsVideoFile(const std::string& path); + +/** + * @brief Judge input string is rtsp addr link rtsp:// + * @param [in]: str: input string + * @return bool true: input string is rtsp address + * false: is not rtsp address + */ +bool IsRtspAddr(const std::string &str); + +/** + * @brief Judge input string is digit string + * @param [in]: str: input string + * @return bool true: input string is digit string + * false: is not rtsp address + */ +bool IsDigitStr(const std::string& str); + +/** + * @brief Test file path is exist or not + * @param [in]: path: file path + * @return bool true: file path is exist + * false: is not exist + */ +bool IsPathExist(const std::string &path); diff --git a/cplusplus/common/atlasutil/include/atlas_videocap_base.h b/cplusplus/common/atlasutil/include/atlas_videocap_base.h new file mode 100644 index 0000000..7f45b25 --- /dev/null +++ b/cplusplus/common/atlasutil/include/atlas_videocap_base.h @@ -0,0 +1,53 @@ +/** +* Copyright 2020 Huawei Technologies 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 utils.h +* Description: handle file operations +*/ +#pragma once + +#include "atlas_error.h" +#include "atlas_type.h" + +#define RTSP_TRANS_UDP ((uint32_t)0) +#define RTSP_TRANS_TCP ((uint32_t)1) + +enum StreamProperty { + FRAME_WIDTH = 1, + FRAME_HEIGHT = 2, + VIDEO_FPS = 3, + OUTPUT_IMAGE_FORMAT = 4, + RTSP_TRANSPORT = 5 +}; + +class AtlasVideoCapBase { +public: + AtlasVideoCapBase(){} + virtual ~AtlasVideoCapBase(){}; + + virtual bool IsOpened() = 0; + + virtual AtlasError Set(StreamProperty key, uint32_t value) { return ATLAS_OK; } + virtual uint32_t Get(StreamProperty key) { return 0; } + + virtual AtlasError Read(ImageData& frame) = 0; + virtual AtlasError Close() = 0; + + virtual AtlasError Open() = 0; + +}; + + + diff --git a/cplusplus/common/atlasutil/include/atlas_videocapture.h b/cplusplus/common/atlasutil/include/atlas_videocapture.h new file mode 100644 index 0000000..57cfb90 --- /dev/null +++ b/cplusplus/common/atlasutil/include/atlas_videocapture.h @@ -0,0 +1,53 @@ +/** +* Copyright 2020 Huawei Technologies 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 utils.h +* Description: handle file operations +*/ +#pragma once + +#include +#include "atlas_utils.h" +#include "atlas_videocap_base.h" + +class AtlasVideoCapture { +public: + AtlasVideoCapture(); + + ~AtlasVideoCapture(); + + AtlasVideoCapture(uint32_t cameraId, uint32_t width = 1280, + uint32_t height = 720, uint32_t fps = 20); + + AtlasVideoCapture(const std::string& videoPath, + aclrtContext context = nullptr); + + bool IsOpened(); + + AtlasError Set(StreamProperty key, uint32_t value); + uint32_t Get(StreamProperty key); + + AtlasError Read(ImageData& frame); + + AtlasError Close(); + +private: + AtlasError Open(); + +private: + AtlasVideoCapBase* cap_; +}; + + diff --git a/cplusplus/common/atlasutil/include/dvpp_process.h b/cplusplus/common/atlasutil/include/dvpp_process.h new file mode 100644 index 0000000..0d0f850 --- /dev/null +++ b/cplusplus/common/atlasutil/include/dvpp_process.h @@ -0,0 +1,52 @@ +/** +* Copyright 2020 Huawei Technologies 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 dvpp_process.h +* Description: handle dvpp process +*/ +#pragma once +#include + +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" +#include "atlas_utils.h" + +/** + * DvppProcess + */ +class DvppProcess { +public: + DvppProcess(); + ~DvppProcess(); + + AtlasError Init(); + AtlasError Resize(ImageData& dest,ImageData& src, + uint32_t width, uint32_t height); + AtlasError JpegD(ImageData& destYuv, ImageData& srcJpeg); + AtlasError JpegE(ImageData& destJpeg, ImageData& srcYuv); + AtlasError Crop(ImageData& dest, ImageData& src, + uint32_t ltHorz, uint32_t ltVert, + uint32_t rbHorz, uint32_t rbVert); + + void DestroyResource(); + +protected: + int isInitOk_; + aclrtStream stream_; + acldvppChannelDesc *dvppChannelDesc_; + + bool isReleased_; +}; + diff --git a/cplusplus/common/atlasutil/include/parse_config.h b/cplusplus/common/atlasutil/include/parse_config.h new file mode 100644 index 0000000..0d2367c --- /dev/null +++ b/cplusplus/common/atlasutil/include/parse_config.h @@ -0,0 +1,9 @@ +#pragma once + +#include +#include + +bool ReadConfig(std::map& config, + const char* configFile); +void PrintConfig(const std::map & m); + diff --git a/cplusplus/common/atlasutil/include/thread_safe_queue.h b/cplusplus/common/atlasutil/include/thread_safe_queue.h new file mode 100644 index 0000000..425c498 --- /dev/null +++ b/cplusplus/common/atlasutil/include/thread_safe_queue.h @@ -0,0 +1,138 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef THREAD_SAFE_QUEUE_H_ +#define THREAD_SAFE_QUEUE_H_ + +#include +#include + +template +class ThreadSafeQueue { +public: + + /** + * @brief ThreadSafeQueue constructor + * @param [in] capacity: the queue capacity + */ + ThreadSafeQueue(uint32_t capacity) { + // check the input value: capacity is valid + if (capacity >= kMinQueueCapacity && capacity <= kMaxQueueCapacity) { + queueCapacity = capacity; + } else { // the input value: capacity is invalid, set the default value + queueCapacity = kDefaultQueueCapacity; + } + } + + /** + * @brief ThreadSafeQueue constructor + */ + ThreadSafeQueue() { + queueCapacity = kDefaultQueueCapacity; + } + + /** + * @brief ThreadSafeQueue destructor + */ + ~ThreadSafeQueue() = default; + + /** + * @brief push data to queue + * @param [in] input_value: the value will push to the queue + * @return true: success to push data; false: fail to push data + */ + bool Push(T input_value) { + std::lock_guard lock(mutex_); + + // check current size is less than capacity + if (queue_.size() < queueCapacity) { + queue_.push(input_value); + return true; + } + + return false; + } + + /** + * @brief pop data from queue + * @return true: success to pop data; false: fail to pop data + */ + T Pop() { + std::lock_guard lock(mutex_); + if (queue_.empty()) { // check the queue is empty + return nullptr; + } + + T tmp_ptr = queue_.front(); + queue_.pop(); + return tmp_ptr; + } + + /** + * @brief check the queue is empty + * @return true: the queue is empty; false: the queue is not empty + */ + bool Empty() { + std::lock_guard lock(mutex_); + return queue_.empty(); + } + + /** + * @brief get the queue size + * @return the queue size + */ + uint32_t Size() { + std::lock_guard lock(mutex_); + return queue_.size(); + } + + void ExtendCapacity(uint32_t newSize) { + queueCapacity = newSize; + kMaxQueueCapacity = newSize >kMaxQueueCapacity ? newSize : kMaxQueueCapacity; + } + +private: + std::queue queue_; // the queue + + uint32_t queueCapacity; // queue capacity + + mutable std::mutex mutex_; // the mutex value + + const uint32_t kMinQueueCapacity = 1; // the minimum queue capacity + + const uint32_t kMaxQueueCapacity = 10000; // the maximum queue capacity + + const uint32_t kDefaultQueueCapacity = 10; // default queue capacity +}; + +#endif /* THREAD_SAFE_QUEUE_H_ */ diff --git a/cplusplus/common/atlasutil/include/venc_process.h b/cplusplus/common/atlasutil/include/venc_process.h new file mode 100644 index 0000000..fa624f3 --- /dev/null +++ b/cplusplus/common/atlasutil/include/venc_process.h @@ -0,0 +1,96 @@ +/** +* @file venc_process.h +* +* Copyright (C) 2020. Huawei Technologies Co., Ltd. All rights reserved. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ +#pragma once +#include +#include +#include + +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" + +#include "atlas_utils.h" +#include "thread_safe_queue.h" + +enum VencStatus { + STATUS_VENC_INIT = 0, + STATUS_VENC_WORK, + STATUS_VENC_FINISH, + STATUS_VENC_EXIT, + STATUS_VENC_ERROR, +}; + +struct VencConfig { + uint32_t maxWidth = 0; + uint32_t maxHeight = 0; + std::string outFile; + acldvppPixelFormat format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + acldvppStreamFormat enType = H264_MAIN_LEVEL; + aclrtContext context = nullptr; + aclrtRunMode runMode = ACL_HOST; +}; + +class DvppVenc { +public: + DvppVenc(VencConfig& vencConfig); + ~DvppVenc(); + + AtlasError Init(); + AtlasError Process(ImageData& image); + void Finish(); + +private: + AtlasError InitResource(); + AtlasError CreateVencChannel(); + AtlasError CreateInputPicDesc(ImageData& image); + AtlasError CreateFrameConfig(); + AtlasError SetFrameConfig(uint8_t eos, uint8_t forceIFrame); + AtlasError SaveVencFile(void* vencData, uint32_t size); + void DestroyResource(); + + static void Callback(acldvppPicDesc *input, + acldvppStreamDesc *output, void *userData); + static void* SubscribleThreadFunc(void *arg); +private: + VencConfig vencInfo_; + + pthread_t threadId_; + aclvencChannelDesc *vencChannelDesc_; + aclvencFrameConfig *vencFrameConfig_; + acldvppPicDesc *inputPicDesc_; + aclrtStream vencStream_; + + FILE *outFp_; + bool isFinished_; +}; + + +class VencProcess { + public: + VencProcess(VencConfig& vencConfig); + ~VencProcess(); + + AtlasError Init(); + AtlasError Process(ImageData& image); + + void SetStatus(VencStatus status) { status_ = status; } + VencStatus GetStatus() { return status_; } + +private: + static void AsyncVencThreadEntry(void* arg); + std::shared_ptr GetEncodeImage(); + +private: + VencConfig vencInfo_; + + VencStatus status_; + DvppVenc* vencProc_; + ThreadSafeQueue> frameImageQueue_; +}; + diff --git a/cplusplus/common/atlasutil/out/arm/libatlasutil.so b/cplusplus/common/atlasutil/out/arm/libatlasutil.so new file mode 100644 index 0000000000000000000000000000000000000000..4a6bf100e75ebde1eb0025ea0b2eb2e851692c64 GIT binary patch literal 481632 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 z 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/acl_device.o b/cplusplus/common/atlasutil/out/arm/obj/src/acl_device.o new file mode 100644 index 0000000000000000000000000000000000000000..5bf1f2b64b1959542aecdcb3bd9078b7e2bc95af GIT binary patch literal 11760 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/atlas_app.o b/cplusplus/common/atlasutil/out/arm/obj/src/atlas_app.o new file mode 100644 index 0000000000000000000000000000000000000000..b7f1dea63638ed4f9889f1cbc4a79e8c09843039 GIT binary patch literal 35768 zcmdUY4|r7NneR7qCLusXlpvwnW&&!FVoV?iRQouS5Cw}!Ay{f{XNF{i)R2VC1VeGx zL9yko?6af!nWH+>)mBn_g+>JXtg#7-G^IjmsY5m8qEE@-+8~u zn{Q?iyx8a7^Ef$Ye&_xFz2E!&IcMD%tONcAdFg zC5u&J@yp&ovS36YS*ZfaXFjizj!L{O8@ zPUtY%O8kcR_k)8I%=PbZO?DZZNuTli?AN{Bd;53wmc80c>I7QWgJf2-MF1seFgI0rt5bJZ2^J8D;vDmeABS5>QZVeR)%;de3o zR@(3JyN*E**^z+Xea^V4`{2v-OM>0xv-J0vqxPQtdPVmKh==hN`mQweXW$!s??Frm zJB{y?FHbBE!ydH3W-mS)lxnNM$Ajx)oJlV}`X0rN?vY*Yhwde=e1~GT#M4bayYc!b zohR=DD*!L~n1HR+j$OzdwA<@Ne&H+gi?Fohu`Pc{YweNr_ET;;8v@;rKu@u9UJc;fiMD`^uNMzgZb3fu zgvs`4f&E2e)#?Dn9QUX#mbZrcD}aZ9Cp^G?s;x-5`3IWC8^E^{aa)fw za0J>5eiJSE6-f?OQ{SNbd(jsHj+*mgO=b6wz7R;xLHxUB1(JT8{m3cs?M*%~7y0xr zx*bhBP#aL}NxsQ1>JOA(#jsJgA@Yj)JLLpnloJuo3GgB9scsDQgK^-eSjLdg5qwNP zAi4zd9s@zoPUJh?)3Q*zOsF5C;_o}cYD_o$wc4A;&Vb>6vknQ~5T{xFu){UK`A zS=3#Z=_UKeq7P0&eHjRCoa9qq z@eVi}pBWsSc^mTAb8fJj{6~%3Rh&n@-gY=LUA6f^>jmv3&^~&(Djz^!D_9Wdj*VA6 zFN6M(D~4niBlkTl^Tn4{Ti>Wa^7xg3WKBT*2aPF3$~o0pq^g66_q(vg?^kVJ$ghNa zXTZ1dS=bVSExp&k5Ado0$xunMJ&e9){H{(8_B`?(%Fn?5o!=eN?SVY9WoMr1DTd5R zkXZp+$Y%17^6p*dnq6V%w!>YO0gNAND%n7Cdq-xsBQRD~Z@*H_oN zfcWLO@sn-Vbrxd{*J5g8_4~nc$|uSbs!7zJsBgaTtBUUZ=r2@@6!+JzI}jt>^CK_S z=P>?YJf^Ys!&nvi)xYX~H7PH!U&kU(?f(hdE<7r*--8%OMydUg-=^Cf9;5GnB{D|s zFQU5ko}kHh^WqzjoVGh&IT!Ho#WW zc?|lBwGNCc@Vjpe#SV4zszB0!Q;jG1n5ki zrn*hn^%b(eI76G?_X*-~?AT!S4)Aqx|G{{Wwa>3d z|GC&WAN&0fk7@6}fFP$EuIbUwR2R_p-6#vTcndfE{Z)y{24{C!7w42)wZd*)* z9NEWSLJT5k8(CLnA4AQfB}qHgc^U(#{?m7=Q#58pblvmldLPr*U<0ik{s=mS{+XPtl1ayleDb{d2=Ztr&x;i1JVk+- zrzVe5)if7ZIf>V4OzwA_T|XVn(YDc?l439cHR@eQ{de*|QlZ*f?)ToH0?6G_s#{^4 z506pFhp$x0uK$(O{h(L%5D(FYN28Wca>t=!J!W_}?nLgjqK~S{s;wV>W*Vacu<1d_ z>&2MeRpV(>M_WLO*rCpxMNNNS=;%F9t?t5H&Tf-zeW5o`RZ~5tH4DvUFwdIWj#%!* zn6e&cnlG%+!&>J^u$$I8$;mYTcjq)7og=F4*WhukNGvYyb^EmsIOWd<M-U6C!E5m$1&%97x#*ldbJPpU|N4* z&4^rA?fu9Tf3BLTCc1MZq64<;80hFe&5!n>Z+JEax^KgHq_9p2!uHupC5!!tlTRh7 z{rgahY5ljJbD%iaoipk+Ao9el0e3pcQ^|N9oeH@|V_$j}~A&C=KkV7*HF%gt@G9EsLGSrvN_j&uP3k^1Jf@}&V6Hw@ z?~&Xzv?sKFlwBwPS-0tJSQq$5s%r9=d?cUA#~0x<`Ac=8SQS3riP+IzRpD{01&EZ{ z#E!;7SH`#}iyU?85v;q5)da0q>ci&R)WAoB<^PFuLgXWM7aynC9lvb&o=y(NU&_0% znA1V8&dU>s6XoSB@DdHh_BizwVAMV)p1YA(=6WJ%p3~ol>MZ5kdiX}`WLj^INBdAs zeIBve30*Z6s_mKYI><%k)>6*3&Kox^_W%12nmfO&_WyK-XO5|hFJP|lF8aR*GWDDR zwsfLz#vtbf?7Yrq$UBcuCH=6w3$_IG z8YZ!LCvt=O1dX9skLfk{3m8Lb9dmA-n;ScSM(v{7Ne=Cq(KY!%b)Bw_P0}7YHzGei z0H53sC_rqA22?kVFOR^UqI~7{KhQex7yG_*&@bkYe5&=d{!ifS&$9lHpuMt#wyQ!my@l=}s?nJwIVFS&dJOjVVqjoGFp>9ULbay@K>+Yku5n-S$ z_Nl!dtd(%S!h^L^CuBY|+0*te#wLts$Sc*}gS{83#c`~6@m-tT^DT@xQ+=Sl*j|oZg3rYJ60YrdQ+@h1VorRZX{S6f zJSOhI@x10IH2>B6mZaB%PZ#zrJ;;$R>{}A%hn-|6e%+rxa+$F<+!que_G ze&;9U`=@U5k;V;Eqo}@4#+Vg`|3TQ`#b+n{B^w^bnA(TBAI6?~(Q|5bC)QGZn4gpF z0qhMYFg{SO%l*`s;N$Q;)5PmklU;v@@6#5Hb@l3aK_|sa)-HuLUV_G(47IBhV-M+; z`?bBOky5v;OI?^FP@l?HmqxksgJJix)tKPGV47~kX|It_HWZ`w(DM_&D$@JLgM%K0 z&*wTkzW#jmtm8YFuX=sH#AWJG-V`7wM{hp|)F`Z^u8$MI`yRK2gmqn<;lCW_(T z#?%6R$hXI%dg;DCsGdOCuzaCBrJPxgSn7E!Y9WoI9<-GQ;{)x-R$`BAve@HIn6?sq zcBrk~T1aCX#;4U@jBV6bloQ3+yP&;kIeySwn4TG)#rV?o&w+kJ)A>{jF463Eh1e+v*kFRwNtFw^IPj{))R!b=RkbhzIo@T9?vTLeHLhz7;^6kc+e2 z9HwUhwErJ)3SNE7TcGEeScmp_`X7EHsS@9#b-+l>Rm~nZ@nfHQ*F-h(@i#y}=)L;y z!{~PjTDyPimi}LP3r=<7JI&FK!EdZbbswxj-v~KZom%2t_3Cl2^LQ_4sDHY2?wsj3 zhwuyBuJ+pE5m)$*%Vzl!dJePW1 z_veA{-KNy3lNfKYZ@Tw==W5uW&~tCvi%`10S^XWcL(b}&LH#hI`>z`_qL+Qyk2xYR z)bs*f)2VJL#F+Y2g`OL@bsaRRV@bTMEOb{(JlYys9*ITgFIYGy6k5^H5~^u!Et?)% z&{*?8sHw5Ou4Zl3^s1^9Tj~P*H;0xqg=!jG8sgE~PbMTKO)1EmL-JNd9*BlwDS7%cHhhxHJEC!I zMD@z%Xry+2ZN=J!kyTNp7Dwx&h^q_7l=^C<4rv8HqYbreuvS+Iws=&CxNAi--AKbV zHN`2?OoC$3NOR3fe*={H>tg=ss;2l_B8fHE+!Udxgd$B%B{fY=%=h)G#f$G={0+Z9 z6C(<`w!k0PUih!8^*6ir*D|~M`uv5r-wpO`bP%Br_day{AB4yLXe<8Q-`MP5yREgb`YJCdtSm(++U0+ zmwlRl$i|eM;r7{t7v{gTYq-2rTeyO4yHcJ>({uo{*q4DJWuhDSJ1Q%`=%2E5Im&R$ zO$+K8BF&BdStT<|N^hLeqQSDiESp_YT7H9zx=c!q@-twe*@Db=o}nV`c&@IInWi{ z;%j%7LE#&Rv`YOR*dC@G5VXN`+K6CNl$s}*uixcc^wg-QM-tz*oQe)-Zu^Max8?@7 z`>M9&-Tg+zo53S@zVpkYhqc=L&o0`M*FIuv?zWumz7B`@D&7c!B)BzqyN@m^w&dX& z++oOGgvlQrrF0ICN$DZ}itWC6?IVI64%93@8a(vIymx+iC#fvsL=%}YZ94`}tdxYbD-0oxAO)jlz$NNC0gSrg34-*ACUUO}3dTPwm zmyx_Da=)K*XZz?a`N3@?w~ngl7_mLC@=2d};h{Gw4!>D(^hofnJ0RxgztDn$DZ(HT z2A}jPKV)Klq>pSlQs~}Ro^LN&pfhm9lZ0GNc}P5d`i6si_0fgp@7+WG-ad5c=H}b1 zn{y@bRNm7gbYA7Q=ZH8h*y@}A=7J&SAm0Deli3}l568ybl=bZ3JOlg=*lPa zc8r*}bxh^<{B4(2e1GHzGbX8f%qIb9Q?)4zx>WG-+KG#n{NAV_G}s3e)-lh z+b-Ll-!b}$QQsd)>?FKlg+ANlz&783#8rki)USdb(JNkNblC`Ij6&TYCI{&7rF zZPq?|>!_-2BP*ZCoxdetH<>s1M)2s7JE^4(AJWE*Ub-cJdtS$g6?CHl%}WgixpVOu zs|8}#XywAzQQJmV5L4Bb{Pxk58C6gEb~tf}ee3O?|KiBeHxHX`s_Vj0w((h<*~U~~ zp#D@r9bzu^s0N4_#;!_XM+e)%{YbZ+&T+I|#a7=ohcZ~`TnV1nn5T)_Jvb)(RQ}VW ziKl(!*1W21Bkp*@SJ9EPJ-2eps0VaNh9Z*x+3=Q8M7C|j_S}w~Cw#=}oi~cef}?c+ z!4)KKh^D%?k8=xiZsVWUNBOliuY#oAy=}xdM;)$!nH-tB4_9o%J8WtiKK;z!iffLK zu6x=?)V;-U&jgh8O>yuC$3aVHdyS@hho)kj^{=&9W1EI?Eo9g|HITpYFZ$Li-xOgt*Enmx}k4)^d%;$S8c zN8u4+hQrazqVyY%!tQd0!%^4~vko`i({UnmQlse*lS^MX1c)m~zjZADT)On184mI{ zM_rSKyY%Te5juDo%068BYpV1I=7hHQJ+tf<64-G6QQGS$U>ivyYy4D(5K@rJynL`higwdPE?Mfx9Eo-E`2&q zRF0xI?S~&OeL7B5j;_R+=&3rSAC4+Z16}#)I1xH{vBExF`gGi-pJ|hGrlsR9{mohE z({Y!6Ru=kn{8~_Y)DTXaH*{>qhj7!gFW0D2KV_WeZ*=6iCv^^IqBjxEXZ#kAiwF3- zsYE|xd>P}WXU@ZTLUNiI=Tge?G2DC;r#4MLghOoVaNHSv>N{Py?Lrkk{lII?X`oA= zjuWAiS~(1{x%6MkScx6=r6EGT>eS<>w0eldQMU|z5myc(l<9C#Au=5fEX{N{?g*N8 z%SpBB@LP^DtzqLd8%RGKMYFN=!%-vCK_HI8#4y9*sLW%fqfC|!XL8hK!vX&0s4-b^ zlikB_JE>KrjbAYwz&E`6uO^A{)MVH~gnn!qwNl|M_-f#p5aS&gPDEl9OYdaJVF3$oz%0w;T>aM!43dm6IPw=jJN({Ez>CyX4l108yeiSxcJavHPX z2U$)(;!THXmlKSaA|7-YJI?|y_72q_)1wBm$iD(zk^HsgOaeZMs~^cX?X`mGJ6SKS z5$V_pJX8FCm<8`;Ia9bx(wdHr-({gc1H4#_nl)f=c2@9 zl5-hwiqBCl1+=cCIl`;Wjg>3t^)J_4nUSc`&%`5y&@xOs*^6Oj{ z{0ij3Sk8fz5?p+aa0&4B7qZ}A0#5PS$P<&@O#d~;XBWDF!J8RB$@nWw|1;p3^uCn^ ze;;_Um?xW=<@Fd^iq%w>IwbRJz%$8zSkq5S(U?ss zW6pYw56w%B9Q?jQ`BTz|F5b+7|0WBru5DGJI~Lqs5nK=o#afn!=7%D~9>-i;t3vnQ zyKuICKoM+enm#@ABc!UuUtYK*J}aaj$d#2%$5Xnxnoum>T-UH-ehodotHD#UP`nwB zSz_~Rs_^)$rV0lh-i2;oy0Ef({@n{hq2ap9%7;Ies#UDL<6M zgPQqksur!OS~5L!Uhc9o@vN(=t}ac+dAX;Tx*O{{Ozu-OJQ=H6R8}UCPZpv@Ys#ia zYU-Qgi(4A*YOIZ(*N(DTX?FbijhLyQ`c*An62Ey(v?kuzJiqK_5r##P=Ey2~{8<*t zlmJWO3ucExb&Yimcmx@`7g=>lAF0lrS+(ZV5Idd3BH<%=5?!<9+^l5~vtTc32s5XlF(75(fF~6)F3RXnpP*NX_N1IWfmc-}8*EU7* zJpTShv_tihY!C5aRn4lVPob$?uj^t>jj^cf^-x_ct6UkadB80l^h|!Kej@q_%c@!x zUBxa8X}GkNTcIXlJXp}ULdD{>jVEi%NFDn-{1;utQ_k)z^@+v&dw?xgQZaVj?CC$cN>;)aa!$Btm2Zg_AN{#M^}iHj=PVYf$F`J$HC%DZAKsvE!3 z5^agncra{O9{xT|70DPHF&5e4%z#lg3mqG8q14wm)}SlLqRsL7ccOFa!DNkmEeMkl zH=ROtC;$-}hZccs$qWoTbDQqQ?+VaMRyD4P>fX|{mJCQG&!2HX*TIwXgtF2Kyo*!W z*l>T{imJLxGi%7yLX~BgWNt7lZhx)`NG5;Ern{3Lw}`sk&Q7DUSu{&@DduB_QPogu z_0Nl$y$o}`T+7p=Wh#v-^|V0b6=F^l!}@B5$tFndxJR&+m0{XFpWmFpJb1Qwa|47I zMuv%b#GRCcA~ma9>Y7nJ1je-rSZ%B^v@+6ATW<*P!WRnZFzU$iM!eP)x_3H9TvuX@ z2F60|;vBP5ux?~qLVU7BhZQIrv+EjT`lUYI2pr@zoC~@h`7h>mLR8H8C|(!Ia?e7H z0<<2AEU#NrhPoB1!HaIOP-+rFB~ROOv7-y|kwKq?Z@5)7%*5)l8Foo0-fZ+GmKkco zD2Z1YLk~pPhHCWNiON8$^!uVM4HzjNus{uA*^F%feaynXNi|>7$QoBf0nOh4YD zKWX8H9||260{?^iE^k&XZdix8={xBEMS5k@8y^C%v*AI|RM-YY*eL z-d@ISzfK7HCxl<81--<_@^cUJSHHQ(Jf#BvzK}Cp;8B4G7$X3K4R>Y?f4qwc6~U=xLqF(33{pn z=6T0a3pf3@Psow5;WD)Muk%#9vbWj{5eLmx+ zzZ?2O#z}9D%c}qSg&dhDy;<;DJZGW9j^|3o?Rd5ddWuhn=El#wEZoE=A>>H<4Hj9FJ*dZzk(LuP(!vg}Bd3aFZGT%-x zZs*%+#_fD7Ai&^xwGxUnlTtfy?}?75GDfeiP%i-X9D42L=5rjN5r~fN?ud zjtY8eck_zV+ZJxxy-&!I^d~Ib(4S=7&Xe~TxAWvQ<0encdnNsre1i`#Zs$+lST`tk zo{VMOj!yyOc6_D?dh$2S^ZscTZu~73awL7Zg&X?WjN9=EFmA_ZF5@OXW<9gOl5g-u zjN9?Kk8wLbwE~y@s7c_<+|cU3tpb<*XcOahKk8uI&gb1i&bNj90|Ng`fgck1!vgQi zB0rzs|FGMAEaP^&`vpC<;{k5>Yc1Tg;}juB(oeH+Lto0c-R|X#+wFcUONFA?#)PsovYlb|Pm$MQNeZsEq?Rv|~yKV;#CKEb#hpN)*$ z@!7<JI?L5f1ZRa6D|CrEwTF^_pU(kO?(C1&}ej&Y2 z2z)H#q*vnC3S7!5XPnwGCgjY`B7dHcBjwi%yjsZV6Y{?+@RNdG+Vh^Ee^k()7W6Vc zX9WF5LEq0f#iv2w1453}tN%wEprii&-vqsn-`AvmE%7|YDb7-UKI0V6zY=ojAJ(VC z?l1QVInuANpnu$D)qhtCT;}0J0&f)b8w4)t+Zng>wu5myZ+8oNY3Ck6FY$eXUdFjs z(91k|Mc|VDB;yn}nLnqq(4P_XGJpC7y|i;c(98TWKNzy}$HxN-#Yfti$GDw8`Hb87 zGgiov`BT8Soj=zIe5q*PYlR%?*Azi7^QTncG9TtLZs)^1Az!xFeS%)<4GVgSuN3q$ zZcTz-%8v_N(swX!=R;=}`ey~b%!lU$y|i<;pqKfuhjBX}dW0Nl=RU^meE2crc0Tk9 zIWiw!VcgD#*90!};gFCc{W>b>Wj^!?T;{_W#_fFQ7r2x^z_?vE3MRVAO1Px=3tYB) zIpd^P#&fQqm-qt4>G?}o^ovD|+j(+d7Wv^U@@s`0nLjH9z4WVI(98U3V%*N3xR4|L zYGvHcpNAN?^CuzX$o$#BxSc=k0+;!-L&%YSbqac!KhFtV<_|x!?1Se zwj(>GJr^sdl;zmZI_-(r1hFf-LqN z$bx6H)9AJ1>CYmkmT~eo&ewF>A@Ej#_X>Qizz+$0nZS?owcU=lLLVJ=oU`SFi8IwD z(-y>U{H3}i@j|+Z!`5r^g!KN6OQQb<_?qIjS>UE!?0P8kO41wO?K)}t2-OEUKM%7m zI}XMK59r66FXBx27JN5x$>V#3w+T9PN%*!b^zDX7+$Z|)3EW(sPtJBjWXahoaA{|U zz>Oay{~m#xb|n0(0{8PZ;olIrsSkvIP2i=1{$7EbOQK(8zTj;7X%6rlfd}}SaDD|q zBc>k_&X2@3zERMR=4(3j2%H~hS zJQiwj^Y6*jTDbXr?G}O8vralaD{#6rznA@iz)hPHeV@R2>y%*Scl1dad(7`>ZxA@i zF@4*-H)ZI}?`2=I=&yIhssd&tdfpP#cg*`pMvnPCYgEva-Y>G89Rep;671YT3*W=e znfH8*eDgchDo!TCNyI{y|B%2*zWIIXV*)4o2-EKtIMMIpBC%KCL~nBXJ%JOw`90`a zffN0DeCWWxxvCFi|7`AvHwc{QO%1IUILSZB^xqIT(Lbf7qQ(k*SbZyrtz8w5ELSD? zk&t^{X|C`Jb)*FEO2<`6Z6qF1CCg(mgR+>bx*F(LV4tc6>z81k zuC9;yQP`)eT>s=P_2aLS6*V=XXlqThDUN?Rb~)a*x3ypN>)qCmj%<16$C!VXpVkQF z_)TPUyrqf#qn~w#BF)W_wE!Baqo8A4^c(rEc+HIt20@&~nLtibiD@*>HhBpJD0?`V9@YKq_xh_{&OW+rh(63nKL; z=lhLeNloLbRnZ2F6ZofZqa}ANTzaGa-7rgvt_w3im+^n>BKS{c;Q!7=@SkRW>3@9&em^iQ z3DWQ~qCxkKr$LVRb#uq>7hOj6&~c zQkTOn*sK&b4Ob-7=HJ8oHoehr1l)`ZqRFMjgE$QTY=P0G&0hvg`)~292VBN^?n#mV z^eEQw8~-UMGwDCc_J5py+Kb7ge;(@(<31gvpLE*#{{$?Pem^xVj*ruS7BrdkKbJv2 zxn%3VAIdZ7U&i_q;E{*nH&_JBne^vTvg3HpJ!$`GZ^iIaEa*6%MgLLOKj4z3{u+J* zypu)$o(%fwUpF=UM*p428}i>ypF_M6^bbZ6pNUo;5$3n^cjISWs*kh(KJaIX-!fjn z%lH*Tq;3BXv*{;iaRe-b4ZnLA{XC0)^O8X?6H@+8#>eoR_?4jJlL}teGd13;EOIYv zQ;2(E_zg_^J=%W*@VS>CD&?{Lr2jg648PGI1pgS|I1M{W{q9#oZ*H3J=6q`w{Re2W zg2U(`{h!Cj@EQCr@RNyN#8Doz{qDD$B#3LnZ{WXXe#hcp>31n;??fIp|3+iK#ox#F zmohWiKNTOtZ|wi~EcUnhUB+_vl=^G<4R9qIkNmgo-{W^Fj2=U8^Iryj-Ts#SW1C!# zdCW-m--wUlH*&wq`tA51@VktL&iyvTZ@#a~!r#aIiwq&3jeY~a&HT3irNu7A$LT); ze*C8bmjBB#_)lY<(Qo8dU>`42{O7U$*~U;l8-4?S3H+J#ce4J?Oi1ycfsf%g`kw(m zVYdGX)^F%pOp4!p|BsL1_Zvb!+w#t_|5o^v(ZA+n_;XOWD1Or|x_-8Q0R2NAMnCb; zF_HOg|NF0V?;Cpe+fe+>_X6-|iht>9m%_xE;y(u;BhTRU?|PCgr7ro<-|O8=${BeW zyUlqa^Gh1KE@OThH+%-KVSYRQvzed%olkif`wjL@+}HjafY0;T|5lDa`Tr$+48QT8 z?6Gx|h|@GN#nDNF1C9VbOYpJz>6wky#6Yl5eTzP+bIk94b7O6;>3jt~nfQC-E>+y} I-;Uq^0bV{2+Z7G&_YYMvAVb1>g{Fa?^fCd#rx2e-AgMfv0(Q1p7Xww zcfQOJ&_3&Vn4EKd^M3E2-}ip+_nk9mhV_*-3o|?(Bb&$k$c&x|YE13c(c^$~7%;QU z*BsePaXtkvYIhl4IedI2@2|rCYCfLI`!8ev6+X_xemY*Xom>0g`?2df=QW#*2@HGi z>buNfAAhUwvcNE5eq(+aGG^zwwLjlJ=nWo%d^fd&eWzU>WTxZw0@`Ju-3w?(SgG;+ zGR*DJCinBT`)NP<_`zaN{}r%%+G}2#?h6b@GRSAsg_t&lV6*pX1E1q>1&!zZA!F(S zCNO{6cJtj{kEt8-X1qi`1UzPLyv%HBN81;!4h)B}CtqKMuOBQf?LW8nHI6g>*2g0w zMCF)xO;&Quur;9L&hxl@p=~bVe)twh$>W~>+l=``MONSwitjWy1W{cdA&!r{o|hhm zZ!^&L#c5{Pi@09NHp4rwFvEEhOx^#x{l{VjO?+%rEurVmZ`G{5&C+0TG|+b-GMfY*z#N&LdU;pvkD{p3%X z@jlk`XS2U2DStowc1Hh4h&u$^r_oohJ`$LpfxdeI{Y+fPfrlrWxvxIq@`pa2Wqf9? z-^3RUf)5XP%L9*p1v&4f@kM#Yvx(mG0Vj?h#e2lF0rz-yQH+G=LB_z2`yP#N(@o=G z$b03i7myEO9Mf3H%XG)Whu<#4cyRN8Y>C}}fj^PSuHDc$c8^0h*%rIx!-v%8&;bp8`_E8|MWl+h|6^i#b~ z*6l%^@XlI}cIC)nsfnaFkYNU>E*?YwQav2<<~nr={XJ_CeMoi9&GX!(JeNKY{-v)Y z*MO(q^xVUyGtMZNrLSWScW!^bmz>kHW?VbIzIVO3&NvZ$q`O<`#29sAqFAU8C|-)) z?T4Q@_2pyC2bi$BKEOQT)Kzdr{o(Y*jc#A~r?`C)Lfs7In1Rp@uFoOV(D+0%FmTw@ zpNl^GA^PrzUeBhTINpQvBT5YG_i4DvaCZlqYaeh+$In+kqRM%r8_zR7+D_QZ?S655l#A0nRy4wv>1 zq9%Qem|wUNK44F^tS=km40GGZn77WY{U6SpMzYi<3K{Vu@)g&I^VLyWZ>00Vz^`Lg zzrXn93yX_lBE5E8z2IBoiz64v@4c{*tXD;$ya)b0>ZkpxIiZ4o6k10oq7aGUHi{vWtkgEPXJaOzC zAU4Y`M=?k@qO32q)*?n^t^Tf9Hi1S2tDcYf%>23X5wfr za*6Uo=4a{i<9Pp(Od7B8w@?cbHJ;Y7A;|kNmkeSq`4IJy>c6{|e|;_XC-x?nkJ@S+Gm*FV8fWf8bnuc;5)-#NVHe8re4sYp|2+_ET*2CgZW? z4a?7L$a2>mA0y8KpX&N(X1$w>TnLRBh){tA%_qf)yG${r}{{9;Azwq zcg^qCN0Oy_M(s|k{(tvNdW@_zW{u0t?8%hAbQ`aMc^mE zYnsHk2B(y_&YZ(*8h8Eda!PIK+KJ}nFxt{J8euY@4kMm(Yk!<{oj_wE1f4&d$UfiX z`uwx?8T~Jmo8872f9plWv28Jq6TauZ^taEK_fLP3D|MmG#baliM823IP)gi=tG{&0iP*;XL(>Z`fC=(C)O5I9X^S( z0IhMn?ltRSr)E%2noaL`&EMytUvsm-W0vVZkYV~C@;K`uXYP$pfQ{*9ljm%3<8+_- zX2x0X#urCM=HBKr--XV)U8prQE)IUl?51@X3R+^0cn|(>n2DV3J^whR@sVzhAf1kl z8{>;8uV|cxIj2e|yK}`yzoTn1H>ZXs1$KMj+p$Szcix{y>W)En$b0omdAL8}H@6)c zn&Q0w&0|x{?mI1CUz`5zCXJgjO1#sA`r&!>~(AA(-ufaVL2Q%lUI2-YYU!fUF! zLpuH7lXU(ablMypn`1Wl(cc;9@9Es%)4*xpDaGexm(Mub)4E&o(#cm|>(Vie3m0?O z$aEb;*Dy5S;QpL*-^%2p_Mo5i`p4k5F5&p#3y+#rt%e zH8N61=Tx7c$9%LC`e+{P#oo`?R8-UDx`uR6LLA$8`doJAUGL?(nl|@=R*@raR}G&#P<(TbLe`A^x%HWtN>lF;QA!QH4pcdhC^4W zbKF-7eN~@(`)RG+mti*1eW<*l(e-4cAijw1v%G`%NPoBE!{|M#UaakacSV5z5M!3c zJ*}xIM`>+RhPEGq6T)abLpE2h>-~@;d-|S^_v^COLmftK=!I@S`a9$swMDwMEwVwj zY&#UwYtTpjlbsOk{fqaiS!9pmfaWj!B02?EP?L=YPT2pmXA! z_U=63-naD(md^jc$#2uO96mdBAL}hzSM}k3>;UH>wUcXidry4CagT2R_a~_~j=6_` zu^{(uNgwH=`+jl{LGp(B>0zh6JC~9ijW@rq^vpEeH^z^H%sWvzuzM=aZ2-k)b&9xE@nn6w}7xkvhsZs)ux4 zPqqHX|5|~2NMD}yF*ttVw$b|mrBmGXF5M3p#`X2NwR@eljTh_h2;%T&nce%4%kMb+ zxc8C%C(gyb%&p;@ljn`sJ{c)K3po$^Di32s#x30|eGh!onDXYi<2TQEo$*HfjhA!X zc-(u1p~K*B8UkWpnXU_!i>zLKy3XW2ntxa6{`)i7CYE zg)r6&h#^;BPg5N4PD4#%-z7eZi)wb~xQUjJ{3C za=+6(5E>6O4rqMPI3W9d;3?hO)U8K*`rkuNzJvRSQWvg(pYC;n=cRi1MC0|Ccfv~> zFfR2y#$McimoY=OX#Gs%ryKQ)&J))G$UXAcsU32USKUV^Sr6w(p5MD^!&g7sb-BL2 zCtpa{i`RWNU6kMC*T{(HvVd=o$Ao;n9<$4XJ|<{^4++=c+vYKQ2m<)@^`2`=Dva6a z@tv69>CQNV-ab9ScV>clG!qht&)LwJ6kJ{cY=@`UdnOZ7&@3CRM~DmE7kS{F)+Ecp zp)*gQe`%iZpcZ-jX47=kn{uqxW}NkH+=jJz5cMIB&%T^F0o;es&QJFOFel1A0Q%h0 zgYk_u{dY4kzWb2-9@vq*k8|EXjJ(fA-qYISL#*ri{vmKiWO_dhB3kp!zE3kYz5u(l zo}t=QdUj-t?IFwy55o_+50QtwrL~yfOgkj&8iVcJ+TH!{e&G50$dWC86b?Q>tsQ>Q z*N>oay&CAJ+@$*wA4j~%@!U7gAb($l?pQ|d8|G~JW@pVd&%Fm>)_I@qy&OE9S-<~d zPy7j*&+vh19bFT^T=yr?d9}Ivu`5GnQ>i!i@6Z)>8QwsD*@MMrsIJ5B0UEbu;AZ;e zW@iRCb80&{Ggr7ZJugD@!xitFFPXY`y?J|kQ3Nl;R_6-Uxw@P z3K~QAnRl1LW(2SG85!?C4E~F899pvFtq#NyShDkvfh7n3xISa*`#V1^-yc|V?2kLY zZ=MGF#LmnsA6s(Sm5=TGx!E*`YcTrEk?#M{czzB3R^|lyqdBhKAna>fK{NGzs&k>` zX47)mGG6mW8Eloo)@^tX{OvD;Ewe7;X>%&@gz=${`OITGr%UQcy(vEpWV~g3M0Ng%mE(gBze6i^kdxytcy6) zYhqd>mKkThf;wmZ#m?Op$BK%AcXh;~ox$bd_Gop@-SdONmCYT&NM~o!oM25$+RSO%NqKucf zMZ>XZMYKKQ0;To!72y~nj+J$+fI=2CuAHlyua_cI<)TIREc%Y$pQ<4)$ftfnN5nKsWo_qOp#)X8-l< zKtj*>4WL!)CClv{kw~vapvwuYxp1BSs z{JDSz}e5K@{@HJioC(2}h{o2>jkfC)nZtZR=c~&bt)MHHfmpdcMA8l)ENsOz6 zpR90D**Sfq_2$EapV$lgdWXvY~Od}u)R9zUYMeewt?T&z3lX<_e z2BO|X-TB1t#zXU$c<3f-T6&xN~0%9kTlVJ=nf!N2Z0OkDc?s!?vF;A zK-sPgM;D_(PkN-DT~LF>I2fb%JXz!rH?E!YC?Fovxfe+u=7||#Tze@SPIBgfSObmS zSVN+CaDjCa&KU{*Mp+d3lPaF#ljeuduET(`{2Q+UGm{jq zN;uJ)nwK$x37#D%=+Eut<+u9tmn_F+UB^u|jm_b<7XQ40xdnxPadU?Q7Ja{{q@b|) zYc4A7a`?dWy+y{?`Bl#~lc(X5*%;i^CLixV$}(}J3)U+rv#qOdTwGlbaziE+v;7oIkR+&@7_uKOAnU+_BV&vj3J+< zdZ>Xh>*x>rRKY&or+gyWiWIWoYK;F>v07QSllJV76Kf_s+Tz>leGtkI9+Hrqm~mIr z*_NefbNd!wm|92!^5+1{Ge=2$epC5Q{21I!qiwd*?f4FV?%3kH{b1E-gT-5X_Z@_j zA;_0-yJu)$I;Hm6NzYwEaXjfO+njaJmdx&nWm_jac&PN?f$HD>=J0;%z{%IuZqDkS zxFvJzgeQHD{J{gIhnBd=y@$#U9(aJ-m2RCt{@~^4#(uJE!|6NWYT*`NMyU#%KG1}?Qhteg}6t@ zjOTl`HO^?7_%y7TYiLXn*M2&~Hi#F*lXxR$%7_}LHS=kGQPZl3DenZ|j8RhYwXH zhDRbUis)NoVM)yU4jo2^Ch~A5B_y^u{TZ!KWt)AscYE(Va68fORH)K!FV(^ zvwJQffm#PB-8`jqYj$bRC8eYveo@X1;$alpa4$8Hb56WcPiX>4#OBtO)7++>8d`m` zSU4@ir!42$rh;#u`NK#m5idTNPPKXQVR@>}YsT85aF9u3#3`RL6i)d@+aq|T!VMG= zE^@N}KI5%UYo4ERoQb|B`R$CydH+1)`L1K`{EPQ)L{5-=obeMZ|704R-u4=NN?~o8 z6d3RuESyfghQ3jlyt(Ga;w0sDzIB*Np1zGZcJrFc$AGT>vG^tMGegPOtCn7aPXMgV zjcY7UVqSwMfUM1xAB&Ti*Wgn&Yjfqt;w0uxtl~x+x$;v-0d?dxUsh-Cp({TYr+2*u zpE_BaD?b*`2X7uFe=E0(G9KXbFY*4L8DGlhGD6NV-oUu@P&w)z>5nrmnbFR;GbiCa zE|2CZ#(P*^GV(a%lK=EQR@!bv%^>}|+*3pKhqhYA2c5Ig5&JCTdoBF`FusrRPTsq` zNt6s?*8oEvRUdemIRajD?WiChxq8Op4>@{9@u{k%*L+o-xreTvvG^YyJ)?MuYUwq8 zb*A-<#pzwI$#aF&U)Szf+?AiHB;7+-{(9#DdizbUx!#7HbFZ0^2G{J4ig+>NQ*B;E zkZSX~tGh98c@x=}{Fc`sDN=0SM3#-dxhl*3KJ_T#9<5J&ujGwUNzn=#Gh3Mg~ajvsqBM(z=j!hcQi__rWNP}0V z!50IkxQ0-lXmhUBu>Wov`A5>=U92a-DY4YiX3T$0BmXMP<5@RnbFSlX^l=*bY?PQ( zJWNl6<8yi^uDx9FJ2JcCO|6>~b?KJrB)8NCv$^Q^9 znYvu}&6mM%D*ubq;MKsL{$f4O^(AyY!1(rDSMdOs{0(XJbg_JhmsoN3=M~0>7?-^I zMH>8V;M3JQ_AKl1qyMI>^{Suy>j~gaKhjfg*y!4ewtohmiih8@{3-eo4Qzgn>pBRh zlAoIfzl-n`)7|}PCr@yt#Wy#MYm=IM@#IhCuwKwLl7;NuY9;^=9&ol+^uUq_C z9`te^X$#(OHJwLK4>%v?$>VM4codz%4aOHMDst6U)2D8g zix$UjSsjfaZ>mekH9Sq&f~;Fy6s#PdlnZzmaU7;@aX;rA-|Kn&!Jc+_%(IUd>i9(| zOW9L(i@%te4vD!qR#OrTHnud_G7|C^rd& zKI#QA^-Z;_4JM|@s#ZD+CDb)m(wzk%^ ztVB1}<2fDl;)+&0P#ar8J!=P5lvILQ-)L240FNV3jULmu2q-O5+yc(R3LDelf=W2) zVHZ$4`N?TFQhNpq?a>v#LR~Mpj^FuJcr1_!7 z=KA2GXnV)1F+3&v0*!c1{edxN$Dck&`<0gsqbWv-p2#C4TN}wHfs_QWSyWt(N2y4* zuB8eOTh-pV`hlW3PF8R)7Zu(WUDeXIrVh(xjKN4}IJi8zvavZB3CAK0jNo~4Ds_Ao zMdfxAxWzS1!cEAB5vmQWff!#Bvue?$z4#`QbluF4f?C4 zqYX*q%m%vp%0*-nHhO7yvES<8jBSeI(QR4y%StQd!Uf-Cs4SX?$p&)`J+h1om-c8| ztojaI%Fuh2tMyk=FpD*}wBgz0#Jaz_7GjI%K(eCso;q5>CQU*YwdP?idCm2?RMBv9 zhI~n5OS|)R7^l{hCzwsfD;zvn-`)~z2shW``zmfi;>#+X?s|t-UKjHf9bO_`WRrVA zo^zQNUf#I62>lX_;L929!NetHC8Baxfft(?)Q;9{pQT;0S99QDdt(a6f~^><_-0A) z!RQ)ZyU1-CzI|@y;r`V^0kOyJPG>8zaJf%(4e;AphIR}1*w$0QxUHvw@vlHn6(7^C ziH~jla=*{kFP~@F`g>WAt$$k@{R52K`Ue@e^~?R=E8u?~%g}BwA75$Vrx>TWs`;39 za$nNcKNE7a**wVS4Yr@fEN|-xF-|<(;i`20u1ll8n{iuzFXOiU(`oS8d{2}7zf;+* zP>V zX|wgnN13*s5Z`yU^~4yr^~4#s^=wmm7P~Gue|Ir%=j|TG?Y!Nmyc`=vq2>-A4J<2G+SjN80zSMtPzJa_)Gg$oZmlpZZVVBsRai*cK`LB?&~_A)NK z^)PSpysFL50n4t)A60gBojjrR=TU<2c2eol_*o@S@lIub1CXQC@)kE2}1?Qt|y$y1*A zdHs}c;nMH3l^!i$XyGDX%($H=C5+p7vVieKp0Ga^mi_?aRgByDQ^&ZSC(D%nJjG{7 z>DPEn$y2=YTvw-sOT6op9xWfYaFKtMahsowjNANlF)sXUWFERL{et%}Zu7I9ahsnV z3YXuoAesghe!JrB0ONL^4>4|!uQN(dSn0{ia!<&g!NV zxQH`ukBe?4PyN`%>)IX*mwtRk>Cy7N7B2GJ7`OXzN{^PGY2hND&$!LoY{qTg ziWwK)WL>*}ahtaQx+ z+~Id4olX47=lU?y!X@5(rHA+t`PmjO@`a4s{Lu5owAuWWFfRTqWq$&ee!(jkw|T2! z+~y~wa6KQz7$<*p9qUy3HQufCtaL+h{%%wFB83kq{62-huJDk;4=`@`;}OQ~emtS% zsb6IMebU0EUrs4KTK=?!i~JeJ?S4GVxZRIFJYP(k^rN5Gos${2`zwcW$#apP%DCN+ zex+ZJ_nAtM#!Hku#XFU+a~4>*#2Zk0w0wnyi+mO1Ha|6t+x*lrF8s)K_)<&1;L8}d zd23+Y=BG)?C*>{Uc3$-`Zs*l@B~LsY;X41ag$ob#96D{%k0L){;Ud3_ahtb2jN7~o zGA_KGVt@8p`UQWJahtazjN7~oDg8Qsjw}5dKdt16AGyvyW8o6-S*1tI%Lh5ao5=h4 z10I{7EXHkqCNnPl3~`?4GA{ZBpUSw+kDqaypM0fX^DtZK*Z2Y@Pw{rLKLHDucq^11 zEnj8fB45L}%}*`kHa~TY3qNw7Xqly7@DSrRKMjoA{In`u&o7TMPX6fe*roJqe7n-q zNCS$uL4`jcAoj-@r_Ya8DEx$y*Z$<-`vkPv{!C?@;?@2XGEVV^-KNgpE`{sstY;Xv z>r5}>cAXhe^3?D0y`5baF8#ho>Cy6o7B2FyGj8X}UdHV_*~hr#$-YcC=p&5V`EZnR z8DAoQoN+r(PAff{=X`u0f;OAC*^Jw~El~2rLxBCn|9RnT;=k}vq4a3^Dhn6+8pdtj zY8khAt7Ba3Hn2a-Ed7Fq7`ORsVBF>{ru65zAv%9Mm41zHRPq$B+~<1S!X;k%UJGr~ zk0Re~;UeF|xXsTqjNAP5GA{fCCc5^vTlximnQ@z+0mf~9_9|SD_oIy4TQJx8vHzxNY}MrANng zM&UZHtQ^-E@u2;g%($(;P|54KDip5u)F`|~#Z}L^9ak&kw%snJr(NmUrf_*SgWeuc zc!!eTr|{JZA5ysH?F8eL&&5jqB;z!WG@iv@OsBY>Q1X)*r?@m;!8qy9Q}R`e+x2jn zlBe-5_r*dMUdy`bl^!kMVBsR)#JD})TN$Ug^yk_!#$~*p$Z`#@v-ArdXPkJ@dg%LG zwAthR86~gB?_aFKtV zahspLjNAOY$+++%_f-#A`UOA2xXsTH<2FAF`1`Yj>pCA$_(L>cd8<|7#exc@8md*MTO+#h;~ozp_>7S)%l>V_fDn zk$;?Vy1v%WS9CLO_e+n`lc)4=Q}V>aMy`|FEnIkbS?SU80~RjwyBN25dy{dSpCgP5 zKfBnUql^>JOO*d77#Ds-{xst@KWCM^=D~NBt5o!e|GA8dKWEsVsg}Ip*D`L$>u21K zH{a4fmGhyHaXa2(#>G#O4=_%4?^XQNDqN5ErD^b1#_c)~W8BX3E~V%D%5IOs?^k%Q z!oR2R?F#=(h3{hAwtG~`>$pxbZu@^ajUM0Ct})^*uIv^vPWe-%@LDCW?RGM5+l@1B z``@MX{9C1eyVCQ7!UvQdjb}}Dg~aj8nelDfwke zejf0>oVOthmvPjj^l15*g^PTgaq?5w+eaC<$I(W{WtDTy7{(TRd&wR#hJ{Kr?;wR301}t3osZe^fe3gZZd=29^pS6tJ zd@f^L`0SPbW!&boo^jz*o0J&uMHzCrPSLg9Ly>AS`ivd3Kx<97b%Gfw_A zDg7l1|0{)8Dg1j1uSugnmPWplaXTN@F>dF><4T_TS3VExvT*6&Zly=d_gJ{dKf}14 z550`r`LK;~$p`tI>}5;8;5!(%^JEv}c0LR${dtP#*Oh*aA5roYZ-B@9Q45!Nhm;;I zf84@F{siMTKPMTt`8mb7@FSmtp0V@`ewJ~YAK$fZ@HRh_6|Tn%f86MNZldc?4s&Ra z3tny;va97;y@TuPvKrQ7kE6Y5@H32)|Ju*|H2##N(IaD%^yvG0-Aa%4zenlO_;$3X zjd;-b%Z%GR)bjH058{I?aZ-9>}-hZcX=|{5r?-efjPH}1Zr7T1KX!&J~)4J#}r6MdM!ZM1N) zJ7D4B|8WbC!#-`-@?PvVFiBMwF3*+4EWClon~ZDGGsJ`Dh$SzdKl<2?$jj%s3oLx^ zMAy$=3vb}{&pr#6-z${w<%xd!oj}@x>@VS~T*&#`s&G;%ze~7A;Zv0Sc7>C?{GQ-{ zQ#i@lT+C48)IO(tBHu60Mk(b}&JEP>2>QzDe znpLsza#MhxpK$jLa?}=W3K!se zUG+|Dum(k>gud;5aY~ZxU-TE{(>n1PG&!CyMJlYZNCAGbA>5SU4mnm-P-2TYG6m=R zb&-Nd%c@n;W~3zkFQaI|?RPKv3+I=OSW~nixS}nL9~>!I+17%-``jD--vj(nUXrc= zpK&=fH{yH)UR*vB`*iJP-J;t+dJ*kq9h1d=kp0ImqJ4y!&^ zA4_4s>mu66Q?#df$hPkXMpGx3KODIm*`h5+7834hV*SIX_{DWsXFven$N478#25 z3J27l{$B>Y`6uB07BSME z)tb#XNM(Nq+dsvE)PI-ZCGEvNT_-s9Sx$C^dG1lY0KAv>0_UKyV_yK?_tId)mPN|3 zk$tK&(q8P-x|8O2D@@bF_C+2d&L-!w$NxK?(*E|pcICwm*{3Ctv=f|uM+5&%hSh() zZ2u-#P2#V#7l78e)ZS~g-^cB9M3DD(`xZ1#)qjKRe<8Oc|7l4k?Zy8Awr~4C#P*B1 zz3imDoZ~;vPU-*D>8^y>5qZ1)=`{YIV*jhSA^A_YT&2C}{RVi0iZSE2knPL$1*=K4 zm-9Qhy`4XuGh7L=Bl2Qj&KIJ6s{AeCi&E`Bl{9HDdcTv#eiz#>5ktI}_5#!Ipro=N zXZupei9ad{(q8P-@0<{Sb3`HU_p<$Ce1A>emiE+!wnxQ(?De*T6JO-zJ^OsU_;0n( zVaLT!@;?tRX)ic^kBWSeJQq8=*uK6-r}xBf+3)7|(oXij=k{_gdub=Sd&fQ fXmmSL;U4!{i#t1hdOKD7R+?C_{mydEZvX!PxefjE literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/atlas_thread.o b/cplusplus/common/atlasutil/out/arm/obj/src/atlas_thread.o new file mode 100644 index 0000000000000000000000000000000000000000..4d3d169b8c50a6e3e3b36a3b577a897646b5d2bb GIT binary patch literal 5360 zcmb_gU2GiH6+XMOc77l~b$<9sgV!iD2~C#W6dI@M!>)}tKS_1TeR}?AjN?7onJNMx0 zyE6|+J<`m%_nYrK=iW2-UeEeRBV&)nV=)qo(eG%zCn!;R`+7U8npxUM_bTod^ta+- z-45+{!hc1#``~xsVq05$b2UzM0o)7DWm;ZyXnBaTod;-XasWO-OMQ>Q|9S^?dTHsM zo}KZ-16f**{eV`TPh+e7m+3_RO*(O9N4Ap%FG=)vf#~|$;vZgq%W>aBik1GP^X}T> z8><}qRz9|R%b{z#k?;2V@zwu2&b8Z4;=!eOwp02rdm@1tzdA^q_nks)X>vGDk6hnH z9d9qaeiqMeI(x2h%wk`*^B=_d2>lpyi?q!6^<6xMrOEI2QfHx$UN3w|CkXu&#J_ql z+j$N?N3plBV2ro&xz*e653Q~({z;9M^KcAYsxDj;9y8bBeq2{kgE(?s#atQVIL{#t z$2aF2=zsskd{OHQJl~Z#Ew_;WrnCE+2Y=-*>hRb(=asv%odU2V>X(dhOuFy^csxda zKZJa1i+_B1h}1k0E*K}gvP>rD*Syx$Ota#Z1^hDp22<&W4+p4(=5@sudv=l%?fYW;?(C-|`gb!3`!?Tl+mja)mz<$( z`yb!>?|*@jyCW&j;MI6F=h1EZCxtVJX9ZkrukbCmed6NQOIvc=_UC@Od1ce^&w5@; zJpN+u>37dS^4{P7`ZpCi_hK*65zv3Z8kmlszSw)IM`;r)P96%yAG#wTMcjFxB;Nrm~y21FF-FGwi5S z#$*!(d_H};%^_Je>(2syH_i-)_{7?10Y3`wuJb|2W3-M3bqQiRv}a>*^n&<%i8q>U z4(+ue)ptVKJbp9Vy41lN2r~zYFmtdHZTlvG`;B#?_8YKqTw&ELMBv{8-e;`mGWu*k z!8KsiKgl5M=eWZ7uWEdTNiel<;rmd6u<_gzffpn2XCv?z7!N7uFC+M`03R^ct^7HC zQ{n3)mDXP(;@pnF=|G#@lVjf*%8j{hYrg1?x*i|UuCGq$RB3LG4wT7#D({aCx^A^m ztyg_?$2T10503&JSs;Y)z0xyoY33Psdfsb7XdvgjYOPB;e2jHZO+B$8U^gwJXdBaJ z(nDUWGTf-2t4@zpCr^*({o}4%YPU0)%(0@^s+N$wS*=fxmhyfkQ=0LbuHW>kervQe zlJ{^M8JSqf9P>)Graw7fKhr2z2#Q*z&I9=J(K2cGjN7ct)x1(=WOjDqbZIsSG+1r4 zT#TrqDmAPpllM2`k1E_Pw;Jw@S1;EpC|{}V;f++5Km{5M5xOgA|1Apzkh zberRw{3kWe<1zV9Yy4i|hjp7>LAUKXXqaN)Z|wzN;F zvgdo0Dz;jb`T|WwovsE2$1Jw(oL2Ff?0U_ncOF24V2AAMJGN=UtlrJ)DNI9I`K(hC;{Oo!v>QA@8*Yw z$$SLbhX%*W3ZVTz^r!n~t>^jkeh|IvA3j@{Vt?`d*vbovG8;Yulw;cZ=QYvhOa34l z5r022r`Oz+=!;&yCxvh8GkBopZ|QGt4HT!ekmt)K5xva+yTDX_%@cP+548mxCL{VCm-^IQ0~{slY;dw-|&_|sa*Z78+se=Pf<|f+q5O`B$gtW&UBgS<==EdV+()?!m?9x2@+r gX|H`ibYm0Wv1hG`+4JYW9bx*U{#U^kOJH^BbD~Wu8UO$Q literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/atlas_thread_mgr.o b/cplusplus/common/atlasutil/out/arm/obj/src/atlas_thread_mgr.o new file mode 100644 index 0000000000000000000000000000000000000000..58f41d5a5a9a7b6f5d6e234907d07557781fe1e7 GIT binary patch literal 28264 zcmb__4|G)3x$mAilMq4#ga8q+Oadxe8WRkPt*vJgfh@tqs)Mx^C=SSmBXTV&3oD zXYa|ElQ|Z|z1Gax=XbvU``dr#1h$n|u5`OxLKm0#M=^G%Q6UzG#_Fc5nqrwKk+jos zel{_j!}ThB=HfF?VOQh&HC11Lt5?;pQP*p6y-w8^<9fZS zFTwR2_>64r>lrab=lQVF1Nj|i-*)w!H(ZAd!%T*Rne4trBwZr@=BL+*cf`kwvxNWIO!0AOvha7i&07bJ zxraif;?`KENVaTubuQRgvfSm0zxnVCk$m_S(Yft_xK(7u-`rLx`nJs#$!$OM^lbZK zM$fjT(DAwG`Q=oRJOy5u+;uk7O!h4l$s}}jWr|l<(WX&t0 z&+Uy@xex>I){^1VRif{}EvO?NrVy`t4RQGF+rFOj;WEU*L>$N-Gx_q@&E%)onaPo@ z|8}t72%PMG)Ya*RUa}?V7Rm0L5L4(pZR8$0Wz0H6crUP^+f4p^baW2IDEItm?=b50 z44)426W31ik+8GynJ~H!f-hi*AyWuHJsX5vy6O+nay&TKlrkv3qdJy~=15JTu@sb?og zMi296-YbNEp2tkSd!6X5f!@=TL~n4R=yY8O?9BIwD_s|iozIPqF58bBi=(X`ooOb+ zruelBJPU*|WEKm*&n0?G!B^lFohJAUkGQAof@kOR;9KAk-xrgFpLhlGKaRW)LXYr_ z`4ob_&xS{Pz2J3&w?OG6-u&TFe-N>7Wsxse4TY8pKk=K3L~rOO(V32?{r@SR9O9Wf z)LkO{WbdFc?~qsAe)0vh)z)*Py}>DFp9}gzQ$*jt10x^9z_!E3Q=kpQ|1h4F!rukL zJtS@res7l9CvD6UePo|6IqEM!`whaTQrH+kyz`4J8{Vt>Va)2g)#>7;}fb z9^qd%$xQAY9qrxs`RHMR*ihRVhza?AAw_ZDRh=sa(r%Z?5Py&^GDh=Z{!C z-FJWwes2@5q4t@=Z@_QTJ80w`3c`2NpMPQ0pC~hvhYLjK0{HnMVx7P^(hY0@_{=%N zpZJ!U{GA(pI8*rNE8oe_{je(!pB(tw4gPd_l7O$of3lS1&zAn4z}VOVf49KjM7EV5 z-PxAE-S9U7*;X#jA8Pkn{syOu-tML8b-3WK2+H#wF*3fB;xs;c||7;EmjJdyb&m1~9YSGhuJkvM4 zK;#a^(XKAUARqaBV2zoit53LI@6Hp4KdJWhoO`fT&Lhc9D|$X_F7FxH`uaie=Za}6 zSEq@-8uTHZSL;}PrRwwT=Z%gdBBVL(467yOTQ5~nLs=# z#}ns9{ge|lhdiuu;-YdK{5r?upN#r-jz4@6IT6CTBnVw`jPDnlnvD$!FECVfa#3{|q$U7M4YSe{VyHLLx+4^#79YSl5-rtMP5aRgD1tLlF)d8$WX>E0GrbwQnHH=}c zvpzuG0KFTZ41BuFT%BRi)7t1KxR&CB`M+~f&Vu1b{i5e@vIO#2bR`xdM}+95wM;(x zi)?qbo=PmheC-m4o1woO>pN;sFY>-$sJuu28`=6Va?K}{58dGD9>tu4`)($2udm=A^m#6!tCj zY_?jzi_<$~tY@SD6K`Uv=si*(($34L+```v8k%Qm>?3>IP0ZE6yx#_&!(5w>HYL6T zm``1DzI6|EgU_0uX3PE?M;p-EMSO}iBK)EK$6?GNeV9L9#{5D4p(Ew~JKBrdlG^bP zh+}?GbUvCf*5=fX)aF(jT6>M(gXaTd<_+|WVn)xXovAL+9;A!LYdQAg>ZP&&+t>?X zzM;Jk&0YN%?`N(vdrl&@2jEM=*F^vn=o6CV}mN!7aF?)7U?VHDD+k>p|>QQ}i>O>HD!Z?VE(7 z02yD=b>GLMQb+tM=e){4GwMGAJ1Ecdkz15kM-VTvErEDB>d<#-d?NXJFVKCBk`KF__5w%L9zx46gZyof-+i6%mrD88*xxriTEg>^ z#vV65e=x4PfpYP=ENe{34`S`D;zBYhFNy90(51`EIA|&F_sq81DW2~f!_X`tW2kM_ zadg4Y!-(TyovE)x!pSX}~`N&7g!>}iwnkOj-?PDfk zN1 z*@v?d$_sOfbNr9s?1A{~d2u9XeEh97;2b$8(L9}ab$s8ZIVYSMuc8=IU)Fuy9>0s3 zb9Da>*;r*~oZ(e@LTa7qj@fD#%r5TCYBo{|Fy>JJT4IfL*k9nvL~R1oXP!KbnKQO?+|Q(poqS9_s&mPC5>Kdc8#J@IkDn z4q(sFjykQyebe+>ToowzUz)pS zWjW7XM=&06-qhTMSn)Lg#p6xr2^Cml=(Cuw64;B@8dx{|sH|tZNA$R;4t?$nakv0& zw!;*i6l0pV3ea}7IA5NLKELPe=wXug&yYtxQCpBdM0*5l!kf>IKQj$~GFoy0wB3+R zGD*%6?3;Bwh;I+tk$6e|$DpMv>G%oiyx+cx`+UTf&dmhu@~Sh!5YBTjH*|&|`#(TK zxt)Mq6LQHmw3m#1H};#lo`5}Zd4@gv5a}bj{{vn(sZ&mhHHwJSRG87t(R= z0`(uOT|dBclJfwrBU}HO=sM^(7|I*DAHrVAg?&f2oU^QTb`X2bk*%+!_L#)yQhd~} zXv{tUJ~#LdfR8Y__XD4RF3t;m_}ynbKb_@12Yv(m&nf;8ol}9IY@!??8D6mfT}gCl z{?jy0z;-WaoNSLnhPlJU{$M;m^&Ra)De1tc3?FR=wG*D>o_wL-qg=0tR2*Ofh8?ow zpHgw4-z?~?faK6#llJQ*qXyRl_^pa!L-L5P8|#1|a4+^S3CN`L0c(%^s&)Pbn$f4O zab5kQ%k!ck23(%E4A%$lCLsn4&wB=bR`A3<*i29v9d*$sw*-@1z2^;=z^Qb93{4)2U+w)q6crOEd zA7*$C;!GUvHFiEgK9YYS*e}~1=L6&$orTbtnjpWBukGk3>CTM@vCoue88{;dsu-9U zf8}{3)=v7IAgW$bc2Jv8-s!Uo%DuRno7=HwqW()XUi7;`)alGc`_qp$)iN}{sd87K zjBNdR>b!;eC&lv|`Ygq-^;+zwV9TSKWy3W%k2pV1BHAO;2E*D=i7vkmcB8Emil zudbf9+30_pg2OMNt;i<S`1s+)*&wivQ)&#+Yl4xjuO2KF6k}_w!ZlS^SI2IS zZHz`jwZ+AO>R2ci3Dj+Fs;^jG9atWyXlQNR6p2<;$Ckxfn(8AJcdlL8y0*2v`ldj+ zEGaQxx^jQ0F6Ni|D;nxzX4 z`mWb&8Gh-CvMo72(&4pqcq46fu%j{RZE21~HJEatu35Tj(|_p#q-JF{g(VX6BABsA zn~uQ}ZzLLRjD8aV5_UiT5`%I}jLEMKy5-k2<@$$l= zlIty0af#`w;`%|A@U(r+H7{p@@B+(I_;R}Xrh1?DJY$qzadk!Z`@aQ+Z;BW2ZS)L9 zUdL$eEYhnjL9q%C5M2oE%ytQCUS_N)Bi$wH&N-#2fSs1psCelPB?kkmhbq3QO;1mK<_aHV zJ(0C{(yFd0yR)CnSg|X|w`X!-UuM};p1^V6N#8rZcT3;@?Qh;5c?K_&JF-%G6RxLopP5ODcg^U! za>Wx<_g=AL_w+r}R_@Dra!T1#+50COce~))yYIaNy(dm87o!s)$SuO>0x3W_gOBoU z?bF%MOqMFLx+bmKomm6s6FOGJvj}mZ@)mvhrkYP@Ju^wtXLe=WKNeTtZqL0Z%65Ci z3XrW+Je97AJa_E&R52a3tiFcT#Q<1eAbymA$tiosV$yYGDMh4W*Ni*&Pkt)9bkDTi z(^oz@Wnaz~G{*_wZ{G2}_ipK~8TTDu_5N?sDpsQ;Tog(QBJoljDU1|m_mS)|KHn7g zrsF40zVn-R->cd+gUB`MJ>#gt7R>|4%f?f=?;Mi_8+>G&k8JaisiG1-Jz_}LWS$|e z!KZVcnIhww-8H#vch;UsE1$@$LqOh6wQK3#jEa4p``@V;sMwpaCVL<9XXSuzpJ#6d z<@|t(`6|dw*S3{=GInRyo;>kA-4$}KUb_ozzB_YI2IW8`8$p{=Ex*^v@0yb*N{LAb z>=MKhDO8ABGF$a8X)pR$HSCl*Q#ys7Iu@LLz_yP^(-9aVCmoDs)Kmw2nggy!wXw%m z8coEB!VojY2vyCZpNL!ZSgqNLML!X@=*jEx#iE~x6P1w~p~iSDdOa$S;TAo;p*g-- z^iH@_oac`hf;+3pC*nkC2zncIe6jRS#EHrf3&s=U&Z3`)TlD!3^b_$(pmd8dT;{0a zHpIdSaxA|l;zVeOYaHk&;uih24)haoi=Jky@x`)dB2H8|+8$4gJBxlI{&hTaF?yZB z6c5662I&l-IfrnqS@$SQzPFAe?2i2V+ zZk&Ky@{8n#$NtceGv0XgGkKda9#nURD0INNmt!ObGA>;);90t2s8+K-GlY{pbP_YM z7=p5WVlf034rz*kLx6O}5Vkd>A~M9pG5mIfpdhtc6k@re{TtxvM%5=A@Pks0&dRYh zWWU76#!pkp&p?O^#Mn5g@zoO7*{s%u;Q3qN`KfHi`|wK63E=7M{F8&6Vl-iaeDmEB zK=Uh=7U1dR&|E%)&0n;3r1CcKeD_#B>lVTpP+B=S2T6;68;PDy?+OPzPZx*J6h2+Wh1R%KW+L^|`E?_3l4Ga8L*aW>>YlO0h)oW1exT@sYQUp) zB$a0z=+8Rf+31St?3@dn?A)okj9eo_ewhRPoens?h@4LTgARBd@B%jf%5^sM{+$E; zzexJAc~l3;!R!h!yO0?%jj z^6iQ#2YHk)u1$&1Bf=Ws>HKPQ!2cU?Z%WEo<#`9Z&jA;U+Qgz-5xAprO{uRk5NK|x z2~-5qo+t$#cwlvLi9E-#PB-q}5G}rC!a-SiYkBd~Kw#y)tIPZqYgPvWA}wRFB}1O1 zmE-L0Vt7i%pSG1(RmX~pnm2}`k=j60ELu^#R9bhpb%IeoQD$|la(N(7*GNY#uO1uhmz8MXCmW!u^N zQ`yq;wd2~k>ModkOF*Vkaq&`qyj&4R`WNGvI2wpWaa`S85iYL|;j6q{thm208d+b6 z6l`k?G)1D#jSV<-j%^9F79lzf4{x?&bg6=Gr2}mo%Euz*Rhu`9&5_OFrY#T!Ly+z` zGHrY~P~W%#C*bmAcI{nZ5xBSE;kt&}Kvkr#=X+$MEJt?V;tPi!+ z#{#vH`baENQC*DRM({I9tF3#~Mlkejlu20~yEPVxZpK+`ERr@m(~kC{rMW&5X%eAu zy|1aMvT=iGj@34{V0;a%Z^F+YvGp{rS*{d+sevjA4=|>|M(Bvfsw1(omS{B65G%8O z4zOe|tBoKM_)X}GrUdkl>ZJ$-47oedgx_ugH8k*sTG}e^th!4+DsNrUw8kHx{$LE8Nid{~v!ioNFi$s1u!tm7$-^*~5;rkUn6IXs(^1Q-l*>HW{ zOnTQaIj<>t!YdeljNxk;{uaaUVfX;Us~A4W@M?yC$Z#&_48yrS7Z}dvd(>K+?C0{m z3b(iKVunYVJxdt=9flV%yp-W33b(iKT84A^eui`T`u7Bq!{yg2dh#pA^u`(9%Z(t?r$E$xn7gur53CFrhPgUYDX@o zi{YGpFO$RR_cNT+zrb*A&vfjUso3N2xWeuB&>u-rA)L$aa*(r^;p6ONIF}=^&!u9w z=OKmL?FllR%c*scvytK4o_dCJImZ~zlfNAAQutip ze0&&ikY9xTEET)_5{294H!*r1hZw_o9BAK7#ojKDFr3SYGn~u$fZ;rzOVqiJUA~{; zTz)OXxtzxt&hYR(>pwC1}4gQuv7Q(-4Rps{*h1>mI%jmzy==}^g z86IRfpJ#VC;9Uy0$A7=V?e_FDIYFlPEeCqNFw*OaBE^%X7EF3wq46ArYx*WdKb_$V znciHR98I6ca8B=4IK@B2O#V8C zn+%UB+}DfEqvzwm8;qXg#~3{y9|joC$A=G?9F7k& zoXhcCVHr(v1DwRlct z*oN!;yujpedi@i=&L2(hQ9te5^EON2_PotixX#-)Wlx^M?Rh(2;aabzU#xI@-WD-A zd_H}M;XKa2a=?!<`Me#^I?yjxKdIW=ah(IcL*Zn9P_~Hm^|%9lFT;7B|BB(cI0wO6mD;?<&2)U*CPtI=jUsTp6eZ8IM<6Gn`E);^(dU;#`Ojn&gC~T zJgVB9E_)Sjm%pFUbNL@BocyX_a&l){H}?F@Q@A}p7c+XwH+?>`#D+I19YstIr!TSL zntr*$?fH3|!pYwnX1}R$ouAY3oXRSje2rHs+@807h1>HJe{>=X(ewBZGMu;98HRKE zyj)9;y}jlu+@23>6>e`AzryY9vXRkKoL^LNsJG!d&P_}Xr;piiP2Z+)d%HZMaC^J# zRJd-J0cFqQ3b)6f{*Zu*9yc`oeudlHWf*^eLWOWs)~v4!4Cnir9QC^|(bqEiT!yb@ zcoD-n{R)MXzkHspR51WEYEU zxNhIYOb(}CV#76kk;3iyP@-^qKH%T*l11mkF=fvRh1>ICmBMvCX!>;ux97t{Ob(C# zUPd3YOpxCRhTqTd=b0SdF1-pTzj%LtiP3ZXHHLFJXPBH)ruQtP=lF7UU`_Gia+(xQ zacE|8x*X^aI?(4_Wie0a7Yyh9!prdWOz$Fv+wCl2^xV#e7;Z8-K?gZajGoI;$9ogb zf7JFxp4;$zC{en|U#|C3~@b=~Q_!YhVTydR)ojQNM$R3_ois?@(WGdV$3CwokW>#7U5_C;fKC7g0Y$3>4i0w6VK~WYve-qD>V#yE&KdcruzAboSg1x6;$=GPx>48g-b$#D{$5oS z)`nssQCQR5Ebv~ILJQ>!h?o8H;CO-KULMmg363Yh>nvaDHJsYi`+|0P`VFN^|4Z$$ zR|mg3nervBuTUJlu~)bujCb1F!jUGteHE&~%QtofUoNI&uQu7`ebuisG5PW(vX&<0 z0=)|x2t}izEdUxRQIVLJ{VtKEPD+E15KKZZ_wAyzLNE7aQRQ^XdGy}m!sRMBDF^U^ zQK-J~i(acN3^#7xjF-|xA^yfcQh3Med%q#y>Q#~=8w2a3A-n-uxFOnz;D1GBDaIvr z6gf_!sqWP9D3;=$){kl!OI@A#E7S1%E`eXK7r6e?OW?0fqo3yCi?v?|SkE2gfAJ;o z??|JcY`R$e9clP!-+ZzB`xU=l&yfAJ{<&EG=M_JXKdpx@mjA^x{IqYoSpHw6;iq+o zo!<)#Q>uOq1~sd^rmpz+KF1Xu4-L*kg=Cr(?@FMn(Fs)-M{@`j=}!UG4ljr%fAwP%TbZDL(Rl zIzF0T`~M?g>Ga2y|0;}1${4=}wxc5BZ_|G;js6*+wd+3wES>&-rQgJJUNpbPeu7Fm z{b$nXr?EiuYyUq5mQKI?4`lGn#D^Enud#Eeq|?9rUW;OtBBc1!`cw03{i~rooqm%N z8%6V5cVqnez5>kY^v9KcJr0q6(rMTKw1fVgO8-Mzk-BPr4exc(Km9(7;-DfV{nVtI zU;F<@rQeo5;sd4s$BJKH$X8xIcd)-{zD1?~&P?-Y{rVpNU{Tumy`=2-;yD$vpZ-c* z^K1L*?>dPj)8;_G`jhe;8?O1mB1;9Hr)$4~`>p4+52r%<7vQ7$wf?`;`iY2@V?>Nn zYh6;`nqLDwTE7O=b^2dfl`N(|ACTtP`j3F0UJwiV*x4AF+y%ysw)+P0= z`8Dvm;wSmM412A+`FPHY=BJobp})&b7yrCP)^km7-Hq9=?`glDF8%{)@<-3r#H;UV@`0epur})?5IWP8jEW~pnF*y-!$D#|c|$W;w=&kM VDlfEmNyq=8ns{!t`EQTk{|Aj-a)kf@ literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/atlas_utils.o b/cplusplus/common/atlasutil/out/arm/obj/src/atlas_utils.o new file mode 100644 index 0000000000000000000000000000000000000000..46443046da69f1936b2ad6ccd83de2b1ecc75a81 GIT binary patch literal 338720 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 z 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 CTWyvA literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/camera.o b/cplusplus/common/atlasutil/out/arm/obj/src/camera.o new file mode 100644 index 0000000000000000000000000000000000000000..692a8db7c2ad29b2e5e8de688deafa038f0b2569 GIT binary patch literal 27384 zcmcg!4|G)3nZJ`aKpG-~gp!IjFMt&gLjs|OE+K;phxdHlY8IqegE&h-@WhM2anV@Eh_MM6c>+rUS+NrRqE)g)Sd?QbZS>Z zT?N0Zn|^)}s@|)X+NqRp&;!3cH!7%8ukE?fH;9<6)UVo=`pMNzFC92x`F{)aeOEWV zaPaOz^&s-S-|9IC_V-@2JTn3XzQM`Bvv;BzEC3lPuWEZ{jCxREJyJcGvQ*n2t&$nm zt*MrFm1^+`UZm_1N|+Bc(#MCe$b^rSGlcr z`jzKT1EABVeDlf{Lqte9-+==JeC0@oMmrr49lAF^pqB#qFY{W~4l-x&-3w#I9t< z-m=VCDYqQkFO5gNC-r#QU*tRHq4>N#CDl@X0^^iBPBA9%>wOmJas2YQ{fjrXdJgtk>ImvZAN!%5nhbg9ihuiLue!J3inaaOYuD!94Rf%z zK(%erbFk!4IgC|X-Tm7wv(-);XbXULGSQade1$QXrY&}8pP%F#{4v;!^^c&&{`oto zvF|*<2ZtPz#6Y>oIhc& zH5zl(DDZD2{4gi%-&`>1Kf%{m;CCK=2O!@S!o2kqdZxbuvDv@b(+aeMR!PBhZ>c(l z>%aie*iN6|KnO+UnO0`wP-@pi~D>2W0H=8Ge9=jH&c z1KK~Os=2K!RgHem1$qAivEi{+t~@*SIx{-|I)ifHH{|;AZ$jQykb^QY7oc2o-5QR( zS3n-pIeG182kX2AqeoDm;2H`6?cKK7GYNA8_T}R+*7if(`=Rc?-O1B%zx4wc@B5*j z!UbwD@EyZX6zxf}0g z*#UFmHep8??D##z!UtG8w9z)SD+sorU7T;xZfP6Z!Fd7oqE6?h`odt}FJL@*2CucD z{rzk|txsqx+KD#u9>(d1pC80HSnyLY2XGue3UY(+tB2oym>Uqo*9tCt?KcZLf=6ME zTnB4PoARoiWhLspT9~iE2Qh?w2+Wf$P~(1K59sCnk`4DSQ{UrU9F{(1eRqM^cPy>X z27Ub>P9Mgt9P$(Tc6SrR2yE1AO`d(u7O;EZThH9gwgWGX*W(8Z+SSfl@P+3(j#r&? z3Vp}6LcBvDcOT4mFT@M^QX^D#dr|H5z)i3=jT$+9@5{V?z<#1YRqwT+uc6=OfXqGc zYkl>zN0HA1Z8cI=<5<-D9moq?pp9{TYZUJ{ob}p+zQI_q#=+QW&x{=$CpdPTapKJN za*&I-Id(j-mi$r7^_Oq_XtG`dS^H;+eZ(+qdlu;5vc~Im565)IMu-R4_d!pSVsGxp=ADAj2mnG(DES8Ir$6sF`UDGX4v;1un&597&6hmbF^pTIAhGE z?0tF0&v>v0pV@G|!M?s^70mcEtUJ#XWsf6!g!2s7k2Q=NTvvD;;959kGWdOB=&^u( z<@Owxf*9Z)K<>@A@ZMbSBb~Ya7Wjx`wG7rag*g~}d>!^g?}2af9y|lK^@Gem8F)M8 z>ep{p$Ij_^0RK(u*jp4EkgZa%QL2H#rC?z`4Mv}UpO0!AoQD01!g{#Re_J4*qMb6I zq8{Xj>O(wt5AS&@KPAUyk(Ufl6wVwHeCR@ z7&K^G98J#O)?`(c|DNt-xW~ULkO((6Et%){uj%Uc2YY&|X8W6>!FB#vv@;UiSU}UI|GU3kx)3gFc4b+Hi^5L=I0j%)`#N|8O!ZRmmLakhy-CKrR5GyNYT;q60vYF zvN{qDf#f(Q5jzr^X?G{Wq)B(e1C2`-ErsC+V*fHdNQe2#hOUk!(!(xeUtWSD$rleN zqMhBzNVF@%o|iv|FkAonXebQBR0x4MrsE{+$R>0`lnG-bL4zfd87)GN8zDv7$!|CV z6UjibJ7I%3J%MP9r|lVv5M<>YmKDN|`~+l$>=!U4oryRr2sxR!5B7 z7-rD@BITaG5_$7rIxfRyOnXY1WAVa;U$CbwTLsH;_pGK!S0Em>@2Z$vQF-T_ZVgs_ zy{e|7vU<9Ma=sZ$4bQ_Z%G>i<&!plqWdl}9_>ib?unS-6NkK0lI1*^Y&R`5cZohTBWw@Fwwfn zv*G@kVbEOu3p7*V{w=gS)5$qw*Mi5qEohZC3hl2WI_(G1)sp@93;Rn+r|043CLQfj z-$!H;#vJw8cm)OH>cvK$xX%Rm2^rt{(?PG;~ zqv{?X`NW9DPkL7a(;I2qIC?&XOryPmKv80 zz?CzEb8#fJ^r>t%i$f1jMn-Y)Tsv``7YO@xz5r~U3yxwfeF}`NOmXB-$N<#BhcGSQ zA#m~=VDsP_@frg^MEF_4w~-v2Q%K)VGA`@SI~7a)vpuYLDww*1Hxm3v;EVcfp+!~9-!KZLvDU^ z@Z9{iL(9qFG`+PnOWi?IGnFGJ7yrJNlfg4H6Z`khi~wpma&qx&T22P%cq5yoX1U18 z#U1)e7y4Y>p`YVIU#(w2nK$7G(S%e`cN`3^JjGJ8^PuRLjCzK|g3Ow)Siq65Sb4K5 z%IDFP&1I!Ww~6y;HF2ITCjO~xfUYcMZt|TQmKyCs&$A(OI}WB#7V9ssFV6s;8MPVu zAGzQ!X*rqom&et=xZneT--PQRi9X3HAR*+_TjYX|bHU31pDfmE)>Gj^KNoPcCq_dh zMD~2ih5jopcnI+Fg3S2m9!uXDk70FL(HI*f(m1Mm6s#^(n_-$6qc_wrbN=|cay z3;vD^{=Y7`2ZnOK{<_fxFLS{w07rjuTwrO}f0cssFZiBr8ePHj1GSo5AfeGk-F^z#SQdtLA!6Rv2g#x$2wzXp7q*blQOZxVgXpubG`0O55c zXB-S9jL$Th^7{D#?%e@+zW9HU=nqpW@X>f!O85m@NckBy<|1di3*L`-p7i+-F7!VI zyj<)9c}4kejc4|C?28TlbDKh-t3`m9i~Sz25MS50ohB`%)<3z(`FBk}IZadWvO7+=Iean|xlk<`rV_|=!YjyM!=s?HiNFoM@QsDB` zkn%5XTDqXN$?s2eukttg#nFrZ{`A4p95{Tauc~fM#>0X2d`wjj$AbPv%a$x`Yh1d- z?+5GKTGJe^hhjqNTzv#kzadx95MpwarfI8Y%d@rmwL^$qSY5w%?N9_&Rqz@(?dXse z;tSs)eV7BHa)KAhwXUu8V@?v#L#@fC8oxghjdVql*kO$yzsk1dAHNPhimjXL%;P+V z$9a2Ut%7l%48YNLuw$KnO?My;6G9+(Jb<&3PI@`Z@+D_G`k1Qw zaz#A6x&qGYdwTqEgq(upWeM4}1(1x7W73f!X2K{j5eaepWg^>+liLhwC;(|ZB<2*gPbn31mM zs}Ra4*U7Sc2`o$aok?I-WJ6WeUC@RvKN9}*!dMS(>+E>lUzm_VABHd6s@Y&+B9h;* zJlO^fZgjz0c{n3Yy6um_1c7PgUl-o!4?-&$)|*H#Z6)u5=hWq5TggxM_+DA!yg!}< z_?HEJgNvMI!c93T!pDOgAGNXCMs3C`>3TcW6Abzt2F~=oLQdu_7knTk=q0|3aP;c| zYGd^jwJ|;`1>R3>w$n$~2dHK{8Gnv&jDwVOlyKDh6>4L3g4$->E)#CX-wXU$a{7^Q zQ%)t}H$zRI5@~*Zjy2`acahI$k*53(7x|rpoAUX2*tCBK(VO!7g`9x4-1+mI3;k(9 zFURdU!cDywT;yCN9Q$34pUZ?}ze{{7J=3DUtAw4Egqwb?5cJZ{5aFhsoi1|VTRvT| ze?vm=E*JUFxyV1_BLA$Avqs40b5GN+5_*qh#;ufaGj7uay$|H~kdB!K&hwqmNqOEe zeYKE}a+tn`aO@X3-{%vKahCJ6&d|&GrHOF#SJF2V&h{|<3c^vZobT-dm;Ih3-0b%h z;bxqV2ssgo8CItSzEKzNjTfX^!i(1pf~$vzK|o=!I01^=X-~cFY(QS-UoU( z@23o$L=Wc+djfMZcKlea5HWL0$)e6 zu{uvU>iwd?-xcyDUP$k6(f;oV`eMS-PKh5S9PN?w=(xZ;g`ATD4+;E~z}E}>w7~TT zv~=&Rz@vixJmKd2eOKTQ3i`{0oAdgLz$JYRy?@3$9~W}w6K=+#nQ+sd6@;65JB6Hp zkiX4^{;;6$7WBsjF4v3GgyVRS^W_ZTX8t)Z=zSo+2l%kOYv4RDE(ke3pkw-r2F~=C z2{-4_6~fJVq~QHJ7M@23$eu#NdA=}SOgP3_t{0_*oAbyP@@0Ic3i%SR5%fN=Yk=&T zZ{X}No`+yzJDI-Dz?r^*a5Fx5euBk}Pcz{hAAZNb!jRASO2WpxbrVc9J&(1 z&GAzza7o`Fa4El&aI{m}lO)`W%?Tp*n1O9MU6Tr}h}ewlD{zVN3ns8`OH;?X+XIeBI* z;bwf`-{k$efwR9oLXM>0Y~W0vBHWD6Hp0#L^b*eT=_Pym z2sh)fi*U~WOy5tq8K36_F7w-Q!p%Hzif}UzoD*^aI>OE$FTKD;y>cHuR^XcjeI?=O z?;QfKCfw|=IzjIPdVVf#FmR54laM3nn+=@l+Xy%NYX#wEf3*|N{dItzCp!o?`>T_1 z?k}cK5^nZakB}qRg?)sZaXTR7%Xl6Y^caWJWan`M=Qx}YawPpp184eEgqv}Dm2fj| zX9(xG@$>ncgqv|2Ae`gI^ydjT<91QVmvOi(Fl&!p-=+N;t>ICVNg3ZpPsZ;XHnr{v6?EeBKqfTt}`D zj`qlWRX7HN;=C7?cn#rbr;O)(!qFayHw$_n$m92PZ3fP9TOs5~`jrOG^zDS3aSjn~ z#<_!Vj&lvYFN+!S8BY>!#y>^48RzYSUdHXPpyx9O2#0!A;144}<($AbF$i_xjm`z? zmHkM=CFl8z(x-mEE$yixnIBb-+d1#`+Qa>sbI#~uC;MfN+p$EC{mV8WR6;n8Pl=Zj zj{Pg+Gm~(PPm0=D`KXP0w@@3aCTgSJM+M$YZImzRR}hZ&NP2!Y!8mLca@whF_7{_Q zfS!G13~R){2{p%s9^W;-O%hTY>A&ql|1Ck!@{s-;0_WyXdcVU&q8>``4nZgNepleq zufGwvq`yz#-0!IOs{*&Fjd;7jrwM$Sz$*oQzrcBZp_~qZ`vm=Jfj0>J>jLNIQ1QWh z+e3uX-|fr{bs@D;&KCqO>FH5Z-<9#vIPhVy^K|*(+nKPI~ExqBt1*Gz6pQO zo-kiPeG9cm08Xh{BR+xCt4)oB1Wu-CgndUjh;x4&5%iox5IQSxEr;y9V&LqTP4`)T zjIJ9Doc(=7;6aj!RjHQa#weica0Zt$4UIPyrvCB~?WT{@)x`u_}>J@F^pq74QvRo^Pn~ ze)zW5;G^%V^cS1i68R2(ZdtJ=81#pGg5g-w54OPtdV+7$Bv;IIl9@q## z6wL+m^hase^R=5JUUP$+AP9xvN4VD~BuoEwf86G3#D|cSu_RAVQRqx}^HXLd@i%e# z?HuxM`cqNrqg)GekqY>Kegd88UWLI~RZ(M-X_|_mKD4a}M%S+ocfnZhiYCJqi#Dl zK#PUfJ>=g8Ki12&oBj@Dh9d39eGc<+?Z%(f+}ZkZ|HOP;yYcfoH>n@jH0I;lji1*) z=|Aqfn2&2W{$8?Q>c{;S^KtFQ{}k~{{X4FMe_tN`xUXZqT)XK%oQEIJWtop_H~!;! z_=9=)ZNPAerDK0+Ipq}9#q_+!ILCvpCqV;k@i9R4K(*88ztyR6{NfVF{JcN=9AK!Q zmOW@W2sHBPKb1#6{wrfs|8~Ig>F*h){;e+h z$F{-^DDC>M(*93?wyA$NV5r{+pE^wXrx8C_Jns4W2sE_)3{ZWR_(KNH`WgNqG<5tJ zpgKnO7ou<|*nik(%+LMzOTh3|hdKUyw5TvWkm$nKT)zZpKK(sy4n6BZ{rJCxFdyT; z0Zhlw2w(&0pXG>2|7Cs#@OdBkErY*@_$iD`p4QL67+}`+8~nXwe{Q1UD4cXs7j2M4hE0~|`&Q>6ba5u*NS@MC_~{}Abi zDyzgu|G#FT8GeTGxm5Q*15`I-vWCKXoU2^^N7#NQpnAn}r_n&yXg|JZG3|fCMSlnB zuOWV}n4hnAy6EpG{k=qp`tO7v^Rr+0AMm69vx$zYe$u~AzC;oH$b;ntwjXL)#(u`R zVtstiygthI8~l~@a+>W#`*AKYKjZI^ex7Hnr3! literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_cropandpaste.o b/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_cropandpaste.o new file mode 100644 index 0000000000000000000000000000000000000000..d236050b21f9b8404e976ad63b3fbabc3b7ae1f5 GIT binary patch literal 20288 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_jpegd.o b/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_jpegd.o new file mode 100644 index 0000000000000000000000000000000000000000..00ba89833485d7e2482f044cf13353e0f24a5b81 GIT binary patch literal 15472 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 MuTaL1@yg|Y0Cb20>Hq)$ literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_jpege.o b/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_jpege.o new file mode 100644 index 0000000000000000000000000000000000000000..aa3b5d46b9785eabdb6f8e6f392230179f2c6d20 GIT binary patch literal 16688 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_mem_mgr.o b/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_mem_mgr.o new file mode 100644 index 0000000000000000000000000000000000000000..6c262efd770d23347de2876ad9a3682d2d686916 GIT binary patch literal 21328 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_process.o b/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_process.o new file mode 100644 index 0000000000000000000000000000000000000000..ce928bacdfc588c057db6915a01c5280aaef0029 GIT binary patch literal 11120 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_resize.o b/cplusplus/common/atlasutil/out/arm/obj/src/dvpp_resize.o new file mode 100644 index 0000000000000000000000000000000000000000..081eede9d6e8284aefe3ca532db4c5dbd5231008 GIT binary patch literal 19472 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 b+I@)Ju|@C?4l|$rMIZLUZ~V3K>-zr<7b31W literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/ffmpeg_decoder.o b/cplusplus/common/atlasutil/out/arm/obj/src/ffmpeg_decoder.o new file mode 100644 index 0000000000000000000000000000000000000000..38c1f5d1c143fd820457df5fb18778d0aab7d423 GIT binary patch literal 21416 zcmb_keRx#WnLjg=LZoT>9qf$(hfYgs?W->D&^JJ2l&P*T( zEhEyFUD-a#8ZcI26QH{!WuLMuSW;^@EwqnM*WI;NkXCDh&|RLbf8bU$W1-piz4v`5 zZ%$^k>YnGx+bNpZC9k+tf6QqnOO%=P!m)S0N;*{Hl_A&keyG-U zaK4R~E5|R&9qPov1!nRh)VTond)`8>@;;QmGR;h0+jja0)R~U;<{Pdv*S7t*FAMab z&IIr~;qTy$3XX|a%AM-?!lmYb%c)B8^US0H_f!-7DRaPsn4vnAO4Mcp--2D{a0T3} zfO`j(Dp6VLrX5N(mye9pgUr-j7O$Cn6pmK6vY1O30Y z?G))6EB|gv?+^Pba}%`~hbs>{`(^?!wgJZeEO4O>@B3VRd4QjW>%(`bWER9Ixlko% z1C|H%vL~BKaH8XVr|NvmmDhjXHLKqM-!Q(r$i@{eGkIu=nal^=33vtI24HAE{B<0> z#Y{rGce>y{`pRwGFx5;V=3OALV!|o}R!dlez@mih6xiPpc5oE?F4!e)_T7}IMZ3`# zw6FILGdbwAtjq7U!;D*MnM^b7sD@?b?D`jlLV`S$ZM`8IOure9v$rmQx`cw)Sg z%~^dPKzz>w_X^;__`e5nUjY6eEOlDBh;5;A61D%jOksRFAc3*nyJ8UQpMl;Pa2=~q zohRV>v8jpLw_GzI{?q!0T(g(R_;-PhQy|Z=KlzxW^E}8T07t&_;OmfUrseNXK<)xu zV_z6@&9N}kIb7Pa4Dw5<<3kh|v>WvtEUkccwe#DXh52pvVeVl(FhqDA&XQBpM*Z+WT%;dpFWQa1{2uFr{}-VS z#(y@*BG>buGm~c^zfl)n+x=Y|U#wU=`x}7oip$ksvfX^5_mt|a1V0YJI0HFn+0`=_ z+C4`dKM!$5E{|)t^e1!7WDnHKZ;ubFTsT@|gX%J`8!r7R-0OvV%fXfkxIYB#TLJxJ zL7r_(V#07K_SGTRj3sjX%AaWWSBx2sRTwJ=_?8cT9h#Y_%}=OKjs^OR`H4QGP4L%& z80MmlVP0S??6$oKv0$zXGd>;HF9p|QvpyZyk0n>$M{_|NEI~inH}(}{@IBzdW|Q`cpSrihyCwQvFyGXFn;ZV_BioVdmNh!_%|VL|FA_Rb07yE zf%`a?_1>eBS6xo%TQmCKf<7U0G70t3E+6D1+Jx=!+$onF->{9k2B*x1e3%9tc0Zdx zPeprSEXTgtyTwc<;Ap_uoyZ-{1@1q8id92i{HK){y_J|h)2w{#*`fyKXQ`s0Y*pU_ zI)P{40{D86WOnSCJ$$H?`T^+cxjIrG06WnK^u;$XQ7gylA67c8oH_yH4UT2(7y2|C zd_@0NKuoT<981ur9?)|hxM2L5ir4d%`sxYi-_Kd^QYD^-@)gRZmZMEQKQIU8D@U^j z?8Lso)PQwG79B7!L25^kbFEj_dQ`G?SHy$Xz?a-n`Eye@;Qo}dR+pxVoGtGgw zTxtO0aek5-z;SD68q|k-`9pSJwBuusdtQ)lJYe32@)$F`=igU;8@B6t;K6p~SUxw) zOu~3D9d+_}xG*2a9pL4hLmsq4>X13YI+)YyyYL)}?O;IP9m>J^uL9=3%DyWL%_Ov& zHSbBCr#_|53y>2FYRmz1^57hd^>^XAQTX(GXgl=j)B-!tFuv*h@fAg9^2h_vBoLP^3ml#K6U;t8 zw9nzs+Ru;eZ>i1&%K13*Z~3#U4~`u>7C2VS02$VM0rcbZJU)kDuJUuo4(QvMt2-JT zE3m%R2A>^mgF$%4md_v8w*8EsfxEo$ocS(rjyN5E@F-P}^D}aIAQr!Ksy~>3;Wa;h z;=1G>rQWHUV19tl$nU}$0sVXr`pJ7x_fha~A=u2%49`x2{s(K9d>H5I)XaZ-cCNjS z+3^MS&Wlb}k9~DVj(P|6_PSL4pwnDoD7B&&c(70QQ#S8Vuuv>oEIy#nBIAe!mxZcpbJAbRmy?j)5iNiGxn{IL<8?LtJ~=>yXn& z{)zP3`E$}*f4RU0)QRgP%%RO-&!cdT^DVYH&f%{*b2<;h9EQ1toH&0^gL*iBqkj17 zz~^D~^}Mw`2oqC2W<5I+|>Q=r|!=c_vfVU|6}U@9P9oZ(2e##0RH0~3eVF0 z2U0S#1xH?rV_)h%KCj#B;2~IVv5ntO-JfOMf6eK#+E>baLz6)pu+K5a*HZWGHaz3Z zwm4qfnFTQ$m5XU|$Yc94t3L$y&N#EEO>A3qJwC1enVoFwsE!9f=5Q(I1N3jm3j@Yj z59Am=7h!wh+JbY9`@H?E^kQoLH8SFuvKj`#_UR`b>Y@YAMoV2FUKRAkSB9gt@mNHu z`yzqX4MBe(Od@MqgK_J+#vApv#8g$l7xo8~S{1P2HLZ=7XoEKv^tog4Xs~tDU3a;^ z}72jFnZi$q{!`{}`KzjpQ)D+n4ONWDzi(*hI7WLiH*w_*YY;yZ8)1n2w2>9{fnsqDhd)P42)|;qQTHFY!(EGFOO0qC-WF{&?powuY6PND z@G}S@hFdoAgVnXQ_tk=9AD_U|yuP(L+`7eR2*#mx0^Sy*F&Kh~F13AFXnAK>J zcoc>PP4CAgAb(eSgCQdxHhf-42JdEfL#)var(qvyNcojn&|=bVV>0^Oqlp1&7ukxG znfTIIn5Z;f%f2AwJ_jHZ->9JNXkFYJjT?4G8g@peOOI53e3U$ePhs!G3=6jU1MS#A zw-;Frld>y~0M@nn$&g0uKSsDQjYX+^x9tBgdE26uR-Ypeu`fa*wFYBN0qQ`^msyT@ z(&R-9x)-#muQ?E3YWSLPfCw2uztsm){-$fN%oRC|c7H`{K`+{x;PAW)#yNv} z3id+`UP=fXAXWdv1cA*OLq}T=d$+GG8V$6@jh28v=w&5MUg&#aY9P_`Q+hrPQOXV+ zXyRKV0R!!bM8hx$*yme<{&s+QUQ||4SaO?+wIPkX))c53WNB6fJ6;FNB@ttots`mbkW8Ysp zRz0!D(e=0^GV!->{`xn9t^Da-j<3940l!KW0%JGvUb1qaS}UWjdm5?cVqTTO ziGf#8Ft4)kq!w|tw>bzRlooPF6(W_7y)V4a8$`gfG<3fXog9Q$(*+z3fo zv3K&mN!3qG>AGRnlM}nIe`>;au6sJ?nQZ5`(m9Aa)0EFc?6TB5BWZ5I78xnlZn|s_ zG*p2+ym?AfTqV|t3NL6?F-K`XZWc>K%2;}G(&muHo|gy+(=Jvu9eo9`%Z5YG1t zz*WSt4`I2^KBz{*F$b~WyG<;%J>%Q!DNBA7H!NwTULc&W`FNgiljIn8LZ5IzK6o_z zGlVBJd^O=c8s1F!poZ@ud`QDj5)R6(V$l8H5pHO>6A}*XG&LOd7%kkR;bnv;2&aQu zMfh$_9@V?lWU^xPV8?$vZp(8k>GI=oTb{E(m%qt+u{?^}XD)S<4q4YO#o0IZwhJPm z7Z3P5UMtMo8Sv*a;4fsr|04tbhYa}t0zOrYS3C}U5mGswolgLc@)2^ZgN`o}&MsSX zDcrjrhN^Tt^8iPlb_$U-pMrc%2KoCl;NA>)I0L>7aMU{l{SS*Z55w_j2Kg5<;J?g( zznKC5AHY#Bwm%kYo`z#F3^?iHb592R{tUPeaO7VNdazh?IvgL*Am5t-KbZmlc?SG! z2K=oI`1={~i7>UKi-Q3;`eo3RVLfAjUzHi;A13)@G-X`EU_j{uJl{Dw4#1^Veg-G$ z^uCkft}Aob#fuAJpK6OY z>URfWkHs4gLv8P-f?zD_EhsMf|ItV4NvnValhrrfL6-d9n+ z*6oh9HMrNf(`>)p>IZEPtSef!awTrfRoOdpMI~c*8>?$;ii*oO;QnJU3=68Q7)bV+QcD&4& zyzLd%BDxON&}n6gnm}XWn8DDN14e=$H`_etEM^rp-g4XB$2LuNprm~f;Z~oYs=j3U>J7`)3iiM^LjtZ z!QMFRXt{k&&F)QYFeISp#~*E0;9vv$w(&r9ZA*)43AFekTgQ;&#+GGO(F(Ua-V_aQ zafia2U~k^qOoqO!U^^=mXthk$`e!lp&(XB1z4sFsXoc$I`&Cp3jzt5Jkk=QeZfOBC zThbZ0Y_zYyHfZ(uj+>@ZaZ#$nLw3QIx4p>?!^gcvrR5tcf^i8e+MC`Kh`SrMx?5qx zG!5rRj${yIKkhzxeWCJ5WNmm8v{7ROUXH{YF$GYIABH`5EMVu%*oOG#x&1U6Z-?{}&s13y0(xz`^(I?gJcKc&tH*CrK zLsq}2itqmBK&n^Oao_p2@s!81>pA6Rg53+EQ2#@jExX zk!RmlWg1>c_*}r3(K#OcbUp|0IvS>|(JQANw_$?aFd(_DP zSHz8n#U!uecW1zBGT{CUczXtXH{l$gV`LM4*oB4T!+5vgk?}vK@w{wTSA!Z4p_cUh@YNI1qp@{|dF z%umjLQ^-raUXvdt4I4Fi#vdXa?U8Zz5U%HWlg6J5^{|9Ae#W;8ei{GW0>_WwxI80p zlR-Eh6L`76j}xx9%T*y?A>`*#=ixl$@z)@n^N{gd3D@I;`@2|}hsRA*<6#`X-@$@B zG7cLBF7q%%xSogYgzNrx37%40mGygA;8g-26nM43FA996z~3fZ*E>Di7Si)Sk8nMo z7Yq4CP}QJ*wN%47&kF^QlrPb6mMqy9w9h zbC_^FK1T(=jKeX(FY!SkzX;;fMD2B2!`WZlr^mwmn&n^8aF&0Wa6LY+60XPR9N`=v zp3jCfe#S2nuE*yx;d*?A1;32LRlzUu$+REN_VB!ztKsbLbiz44ET5<0ERXLou;}qI z2-oAYm~ggdh}x@=a6JwsgtI*?e>dTJe5wR4$Ip#~qdjuIZXz7*k#UO%dHGz|PPjgf zZ6_SIfv>eGt=}qve@Wo=f?xK#jRKebqKR&>4fWfI8Wem{469~A3w_o*ZXgc;8|^(VExt$e2u{I{T>#y zM~)Be0{^ltV*TzBxEvqe7P!o}tAulWj?jFWMIXp;d>GFqoaMP)@&qpP)(|`rUn+2! z&xM5R`B_4^K5v?Yvptu{{wl)td{|95`^EC`Z`-V*w|hkJOZ(%3N8-DLJoY$+|e&=at|D_ zOdy>14;jxT9PO9;?TZC2_uI<^USm^RzjqU^+vykb(%bTUoYgR)43iu zgK*s*elMWoM@b&za0i{^;k3XD1%6K8(yuoN=e*)7Lv+IV!}vuyLA}Kc!f}|+b-%Kx zJ$3sH!u58n5xBJTA;NWj&I`^THi`GQbiEPcLBD8-v8r?vjyxNg1dcs~qn%$7_+i4) zo(BZZ`y$9MdH6j7+9Typ3Z4fA55E^cy$=a|h~&Awc)fa&aBeTgFB6V>B|q=y>-@Z* z&-^B>izd+enE4r>N4U;&E8)zuns^p#JdDeIe(7(O##2K)t2G|RAJXJKB<~?yx0Bx& zuwN{n$RNL4VIim3-i03Hb%)|KU3_LGsJRQXIvc|*s#SA=eYdk%~ z!|xr~9>#gyug7ybt%tbXj}T8D;mpIheD5IJeJ#oB{Q7$Y-gnrj@iQLDz{BfEw)17O zliv%los9p8c<_CVw3FA_Xr~;nxXa>y<%RRzMmWlX_yz&Yqw{Q%=UY72Fn)<{>=N?S zbQW@4!y|Of<3I9P@?;N>&y2SdUPVX7he*jY8t$P%^kog_ew|14n1{a~^$EO=Y{Wxc z;CRa4aehtU^eAD~IwtTjaW05$ZHapuQ~`XTVjr9MEDB$q6J1fq*cTQBzHmzm{G&Zp0RNylP_Sy<`rEDVx`-*zL?5CQY>I}#vQJ-L1B#o{ z(3phLA9pRu}`fNZfiAXLh-y>1CYKlP|4*^M;(6>hnC#6<9xC<61wR|E&MCMy%Jzu_B%S zL)EqhUMHjf7-O!_{#OBp`YHY4%q~ZB?c-Di=&1XT&jM56Pcu^uQhnCPG8CK*WTHL;VX7~mLGfNLCG{&>VzPdY!(&t*{x8BY zquhkz)IiF{d`s+ z!8Ee}PMBuCT1@qM-e(#;9xuX;bnQP({_}G@wm&ur*Jtz4c3n3>Dh~$+C?}}`u9t8f psn^Gx(sLIe_3}deRqA`R&t_kZj}_XKuKsFT{JzN*>8Qv0{{TNd@C5(> literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/parse_config.o b/cplusplus/common/atlasutil/out/arm/obj/src/parse_config.o new file mode 100644 index 0000000000000000000000000000000000000000..552d05f355d88b114f30a2e4f1fcee8bd664f083 GIT binary patch literal 20048 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 P^oKf}$UiCtb!q-TrpxU< literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/venc_process.o b/cplusplus/common/atlasutil/out/arm/obj/src/venc_process.o new file mode 100644 index 0000000000000000000000000000000000000000..2dab69305d2dfca27fc90e967ee67f6c348b7974 GIT binary patch literal 50224 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 z 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/arm/obj/src/video_decode.o b/cplusplus/common/atlasutil/out/arm/obj/src/video_decode.o new file mode 100644 index 0000000000000000000000000000000000000000..9ea308df2c8fbe25765918c3721782cf4691e781 GIT binary patch literal 76624 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/x86/obj/src/acl_device.o b/cplusplus/common/atlasutil/out/x86/obj/src/acl_device.o new file mode 100644 index 0000000000000000000000000000000000000000..a0d943d19137ba7f14dce9ddac3395a534931bd1 GIT binary patch literal 10736 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/x86/obj/src/atlas_app.o b/cplusplus/common/atlasutil/out/x86/obj/src/atlas_app.o new file mode 100644 index 0000000000000000000000000000000000000000..444a534f8c7dc4c9acd545a4bc6bf646f84028c6 GIT binary patch literal 30488 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/x86/obj/src/atlas_model.o b/cplusplus/common/atlasutil/out/x86/obj/src/atlas_model.o new file mode 100644 index 0000000000000000000000000000000000000000..539ca71fee9765068d05fa5dc20c8c492b9997d0 GIT binary patch literal 35672 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⁣#CFr+@K+kylOW>O!T`vHq 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

2rI!ygOy`yBlAFy=q!Q-8Z0 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/x86/obj/src/dvpp_cropandpaste.o b/cplusplus/common/atlasutil/out/x86/obj/src/dvpp_cropandpaste.o new file mode 100644 index 0000000000000000000000000000000000000000..70c12b7ded3ec14c55cf32f8ec166665c913959e GIT binary patch literal 18144 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 XM&=-iN;plO_{VRy+OM`b#?JqLTJ$1~ literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/x86/obj/src/dvpp_jpegd.o b/cplusplus/common/atlasutil/out/x86/obj/src/dvpp_jpegd.o new file mode 100644 index 0000000000000000000000000000000000000000..3f96e3c6d017da110d55c9e473ba748d5a0582f4 GIT binary patch literal 14120 zcmc&*eQ+Dcbw3cKL{k(1yG~0>j&-&^N-GvZP?ANdwap^|@n};NN|2VS51&BbNFXKw z7&ywLU0Z4>WQu{9sN+nV8Mia;BmDaNRBIACu*;L-`xBelL_Chl`Uw|DPRcz1qCF6HvVp-P9Uc)T>aW z_3bt|)1uFRr{lsEl$tn`&@1nQOh~W3*s3q=L~xn-?)R*~$;Y-@8-+}Hab}&q&<_%$ zLhIea)Jz*_4IRD^S-f^xu$`F*Zis>lH}~fb^yeyC7J|VIy~;#5xZxBcDbi8RrvIwCw6ugPvQamw{w-3iz4jiA*u`<7yYBDROCK&R2{!qB;93~0yo<}>U-Zf^ z2P@xqdt!t{c`;ai7l&Hi*P+3~clTh`+SH*}UuYew#%$Z=#ma?XxkJqK3miHMkOtd8 zGYYnT3)ic5F(!5yy*eG5Upz7Y?cn^6PtL!6U8}^J;c5?l*71a%(uQJwt?c=~K_sd%EtKi$x_2BtfJ4gr1FLBY1tEZqTXH#wmm7j>V1nu)dul&1c z*Z0Hvd2wR-Ia6M;*4pwH`|T~U@#I+r^9pB#VEM@BgQ6@g`IM!XH~ZFaf#>h*zLwu_ z@%??%cOinOTiX7pMftN9c(9=*2zikPbA=g8%}ysLP4(Gq+RCV#(`vq`X3Xql#==H6 zcRV?jO$%;CIUE}q**|hrRc~3aO-SxbPEF-gYWjGgpiZ09`Qn^9k<3n+>4#LaSj-pq zY_=`b^xuL2YOeA37tN$)+6D?)uw<4}(nJH_U@mJ#%~U>Z?w_$>?9oQPWNHe1e7s;z z+FV*`E=P*UR|ty?N8SFd3fkeQ%Oy~K$pY`E9T5R5ZAz(_`XoAJdg{lvyg(`rHOm>vXAXJv6*K zN)xwBYKx8R9>kR$O$mIS$3PzYW)TB&_K{8BbMYbJ(dw6xZ9Vyg{hJU0dKj)|tbpze z_(rxco}fiGlzfzaog`T`xF_4ftTh339M=jj$L(Dj*BTA*is z^*|ur^rN;w4Doa18bU&1P<;G95Vt3Nk&7fhvWnZAz-|TA(bZP-rBW3y;73BUv9vp+HgyQ*JEu3O5?v*?kGa5I}362}% z@;%v~Kpjum!Zk$XSLESAfGqur zdl3CfyMq(n5kNos8InEXa|7y+L7aWcx*C6vto^0H@2ufGvVKLp*4Fy4@)qznF@=3Y>kp}^t>bR<@5ei$xrK$ z#NLxQwW<6-;#~yD(kDI++m}UpmB801iw^!ZlK+zqJS6$AIPi~2oYp^euakH$UpUaI zO8rj|qb#>b{#geRmWepu0NN_u zl9B3K;Yf8sq#(0m74vidAC|MFLcU}Q%X~t*yWG+R{OdmkAL7Q|vElyF!TrOAfm8bA zN(eND~1f^{=It>u~B1G>l=bB5Jc8W zLTV?C14n-aFAI|^kze2p26(gl3BQ9M}RsAn^(+bI-yZGImL0+?>qjj8xJ}Wh7EG zEnt6Ew#;0bddG6lW}!7=mS(0ME1^3AfyZsq&LRU#ex{hhtxL{@?4}uNSVnZ<)-#&X z+L73k&6h-qa0l*r{T{f@Z=_3k1D0TV3cM48gB1C!y z@_P?)?q`7E+|SJtclxWcXEvV?2r9&db?;^7ZM5d<&8@o^29GKe3PW z+#_)`!{fP;@qdExZ)G_5Gs1B0XN>9Rehx|8=_ls3kkHSE;37Y>Ob_?-dB%@_GDiHL zW;pi~^H)fypZoczOh5PYOA>eb`8B2oe=8un=b0Yv=Qf$wz&P{uxs&1hnVv@&zK7v` z439JXafbg6!$%lC!thTs9Di>j|G&&|?&ps@@N*!GgyX{B3P{iYA_(NfA7SSXAJ-3< ze*CR~^vK6l%opk+oHCh+9bou&s3YNg9fXVc(H0WUJN{NfIG$xlh;#io7f6WlIN+Qj zA$|xh(t{Wh4$tjZ3B-@WMY)|;s3ReMSkxMCh#!N?jsGdeO8v-xgyB@Zkse(CCnY1- zV~{YE+|Tt4=lmEuBFbZ-UBu7G4po+fQ(nK*fnSpCE(cC+35&SFU$@jql{K`<{h{|S z!b#6D2mcw_{yhhNNw&Yp@ZGYG#j6ZQ8#J!-45u>zp*I3DF1rafm5DU{EZs$AusB|Js0T`<8N5c;nLi+l^j>X@Ks}%8LAb{ zsbm;FEG#9Q#_!7TIQ$_;crukT%-NJ#ungdbFOYCCkKL#s5{8d;-h@x}nigP47Ok0r zgfPKjB#Xu59EngFmY)u{^G#x#5q^L{@Bx)z?&S8A*dzI!KCK$mKh!x9@{1oCQ_4`F(!&h`0Nc&7V|J!zam-(3)1aZ z-(IPo_N51)jr%99e=5D?btzBJB+BEyNpe(r$>Ujx#O>pLOmb9u$HLPOpm8ZjZ7St~D0a?VFY8vfITH5b&;1oB4`=NsJ^g9&c zUy$;zI1JMG3C4FVH~Aj?AOOnRMeR;)$EC81?{;h2Q0ujI6s<#QZpu^4no1L}<*+Kh3xJZuhGGI7<=lrSC z{(nFpCzUs#z5thycPLQhpUBYfc_gM%MV9{nCCd99@^LBej5qmDYTkf~7{5dQx*R{P zzXyO1e@!HL8vj}_?&kk7X@3V9lBMcsk4Sl^|6h>uWQWAaKDGCOyqo{(gEogQ8PR`y zk0g20`zK^y@=pSVn^t9*kSL3^W1A2Oaw&lnOi;2cOJ0G%l7IyQ zFaXk|-PoE^bc4Wj)jBi&;ZCd8eZ+rSCo`E?lZhimRh0f{N13)6PdaJsnKqS1d8mn} zY3;`BId{(?4i;EFJQ?-O?B097dtUe4$L=12&xa#}O&*WNi zf2pt=i>HUn;ZFbY9{`h4DYhHs^QvRG^7+onc2%tuo3TapmX$hI2FmulW4-*-70Cfo zkE>9w7ysfn(GISe!=Xc=!=We6@_K2BEUkh*%~--kuSIEDp4tM9Z+YPsJgw9pFe-|# zvZwhi+%5+PVB{oZRC6JrMiF+V5-XpZnK3F6wZYb^4OYJB zU;GLxfz9&xVF;GJKN^mweD2gBum(@7aFIP3Q^%Mte+f40RrH0*XHG>qL=@NBAeApE zmEW8~4_9J;sh7jFvfiub>)}g=;J>m)6OvRpdFxV2Qtcg@;nifx&&-oWu!;~A92Uh0B zzc>O&s1k1e7H<6z9J9^P0?DH~Hd-qE?O5KbBqHTh+ekUn(Qcf=Ws28GCDWlBWdoM$ zI%sOczzpq{k;R{s)*A~CBBuF|KMcHALJQL^9{=$K)Q$4L+Tp2N83pWBD+4#v+3NY_ zwmu#Q1J}PkUb^=But1^QosHMW2k2*YeQbyIVLvAt`iblA=ymCRzgF)*f5>`qT9%^A z3;*p2mG`yy7f(UYa3!oo%0F9__ll{8Oq*hpt*n~XGlBFkS^Lag=PUuOin9wKV>5P>`&H==q%v<12I-3U1lz)OrX%l{2Q@~+= zB%aCSz%1ICwx)B1dEF`$a)r*#$-9A7sI#5YCm|Zj6~#v8t8uuNfNfstjTh&$Jmjsm z@%uN|#aHNUEMO}ZY)Wmh1o54wfC}v^^LCvAty-~=xHkz=GSzGZ68XG#mATWd7FP(G zv7`E~ocq$r}(Lyd^6^ko@{O~Gm)FgmaL?iv@%x7Dhx+c*VMcnHOIQluo;UF&xRwTy{0*poiP)0bHQz9B$qg9 z=5v{JVm`br9Byb`)4+Vt9GNLubLK?6Xbs<}5|F=7y8n@sxcK&Kg@^k4@7Fu`O+b`q z^qqknfv$VD&!|@LxnNJAtNU&nC8PKqgyeZZ$Kzo1SN) z5#`b9SCMlA`-S}-Bzqr}%~%KBDe#ST|0DH3N_|Zuw&Q5`3iUb16ajoKJt%Pe+Ad$) zOHI3c?MvQWKK;e!kgxNFRUu#3!YxC-zNWLSzAivQJ{>rKbC<7WaLs_v*z1cv<};$c zKCKf}93p*pVF@vMp(*5RU+@n3x|%YrzIH$$R>NyF9lF0jylVHX#51}Q&(8tRZN&2m zJl@o}!SWLN_@Wmg@B;d{uxbR{yVRe$Rrq?l0rwuNT_k?)kP-K4>gAWaRQVa0$0mWRH2^&i0PfMM^FqT`GG5JJ zqk|h>@UszlHTJr;*Q+uvwHUU%n)(o}>+ourjj1QEIyq|b-O7L5**0k9w4c9QTX zsl>voRpTjO!1?r%DDvN43sB3e>2-Jqyl-j^*2CQjuU`)V;^+0i3bzwK=Bgz15PwR7 zP=Ao{6ApYA;cq(dA<}=Z1CJ2@MF;)};k+-ndq3ela^XPdA;MD*e1dRw#u!8gGXkNj^CKcCM#T<{^n-ywdU z=UKoT#i!ze|A`BJ$_2mRf?ssOSFLXB&n6eV*9Gr)!FRjh2LQ)-=4r{PcLRw3q6_~Y zx!|W<@PBZ@-vu1)o`iD|iQm#&U?DY{myIrX58$YWw*bD2ARTt$FS+0q7yS2K@Yh`M zueji6T<{An_(c~SAB}Adj*WGQ+e5FpuLt}Nh!7K>uOkYtp5`oj%tg;%DE{j6v6~eB zi^8kVM}FRY3SLcEC)>vIVZe0>aNRsOdb2*s2DXJ~wVP=#cysLqyUh`E$|~_UZFp=? ztkheY&s%0XJDG!_kH@b0kz4(IzL}Bgy2+91f=EGft5nF%|9@Cc7xTHIr7X({3HCNf zhsfkc81f9};J(rR@!`FrrU^4zBfhgP+j4c`@%=Yz>p47iOWZhzHx${sD-?6O zY&x=H=D}Dg(qo$GTpE%{xVndL;&8@eH_cce(%+@QEr_>mc-xM*ZoKWl+kJT3iMJlS z_2MmPizu0(5(+A*V7F#cSoaPN#=_&~cxYDyvSkqEQXEoPiPTXOQ?MHBj>L2x;+o7v zXSIPx0|jd`02!~jIWun+in%PLr%UtZY?l^KWN>Z<3zh}!B0<-`Ej$*TjRt#&qdyhT zX043M^3^g1ual9_@M;opfKJ&ea?NeT4%>OvXgZ-BA|GQ`i4aUDGHVqb%oV2NrF#5P z%;ML>hDzwyJ1e>L*U;RIL;U6Q~!f- zj6+25|BP^){}F+E={py@Hw%0n;izX+;F|>hodVw?aOr1I;L^`NpQK9E9 zVfV1mBmK+>T&~YA3cO$Fd0F65f&ZDn9})Q11U@G4GXlpPF0aF15RP%~6!`lBmvQr8 z;DL}IVMn8!sze>&h|{1JgmKP|$s zkbY(eclucrdVWjjFAF`=&zA)*=l9zJ-zW6EE%5yU|3KhU&s~sjL&EO8aPfHe2>gJ+ z4-5P;f&ZSs4+{LNgkwB0d(HFv9l{}vprzsZz&@Ur-xYes0cU?c38@|=)Uy>X#@7qH zL*RD^9OsMqy9vkf%K3VLaOZsO5_;|tdL9va@zK;k-yc zvjUgvc2?l{TPGgxa{|X-GBCa%aD3)7UJ>|Vfxj$pd^ceJQ&2}jKjD`?EBOB)2;{^c z6wh(#4;_bUJ);ck=gc}{m>Xq$JJgXdo=4zf9N$%ta9_mXVmyQ(5aLol?r|iE&Uy$|f61t34H?D1*=d>u7w7ySeW?iX1l47McnYpY{F8!_`;k8>aIRiW53bLX z#3=Plu`ra)`tvyl&U%hGaQ5@J9XR{*n!s5nLi~3+w#(x>Bly=+9gDXGjxtdk2+(_Wp?pXD z4Z>L;>wkyvBUCcZf1h~KfuF<$Ec7uy|2;tc6chRpM?Z;OyCU?|tmi;+e!3K&&;sy% zYL_Xl6|77=03T%~Es(^NKwtuX;1rljBur~AVdYCE@WaqfrkY%|IaFbF=N63mO;m=b#=AN8}()rlMa5UkTg zL6ZZ7pB2V4PF#V3t0k=hiQM$Gm4!*o=1NvzXmsB_Dgj2Ctdu!fh{G3sV5*RV$@(?X zdRUN+eznj?`uSYi2yHw+dEIj9CU1~D?@5$T-he#5YavPdcpkG|F5T=OQqtA;JG77I zEz5D~CZB2`kLMA~aj64_TbN!Wpk~uCDqo@JHZ@nyb8c^d3hL@(fXXj#vMVPk0O&v3 z;CS%)e~ory+QK$Eh(u@HlQAdtI_-!H1IDI zKh7Wi`iTAK`I`sK2bVMcE%ehV<_8u<+~%?bXe0Yq$UfUa`+m4sj`2mnaQu!iYdYC) z%xdaE0|CL+5}e*TuyoHcAk9zY0=-ryQYoPIc&G;$B*wWjpW~^gXa#%_?_|l EKiCJWMF0Q* literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/x86/obj/src/dvpp_mem_mgr.o b/cplusplus/common/atlasutil/out/x86/obj/src/dvpp_mem_mgr.o new file mode 100644 index 0000000000000000000000000000000000000000..48ddd3134905875f1d3439a2709e121f494646aa GIT binary patch literal 18176 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 Bi|qga literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/x86/obj/src/dvpp_process.o b/cplusplus/common/atlasutil/out/x86/obj/src/dvpp_process.o new file mode 100644 index 0000000000000000000000000000000000000000..d1941c1c6fc44ba27fb28732f40ef254da11e98f GIT binary patch literal 9904 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 literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/x86/obj/src/ffmpeg_decoder.o b/cplusplus/common/atlasutil/out/x86/obj/src/ffmpeg_decoder.o new file mode 100644 index 0000000000000000000000000000000000000000..0b55c9d9bd4c591a8983d06a4be80aedb7cf94ba GIT binary patch literal 20840 zcmcg!3v?URnI1oqI8KlaO{rVbMu5{MAqY!Wh@A$oY|9zPB60l)X+oID(l{2jB_WL* z2LdG6hUh4!fwtSyvVELxAG_UlVf!L2Z3SeLrfjz$lhab-6Iv*=>4QM_|L^=) z`h6`C!}jbwN1B=Me*feC_rG_p?u>oAKhRcMQliOHqFt@!uOzBzU+Bo6H;L0G?QPnH zg6n|mDyr`7*3+-(W6#&<8CO`(lrLQd6?(e0w!)p&(=VJvT6;RHX8;N7^>%#<*xgO~ z*r6JI@|FfYJ>@>Vb=wqD1;775zpHA=I9_Y0dWPPK)7JXTZ7Ux-3uWT0)uLxM)#;g1 zeeBT+J+tQ+h-K>B*@@Gscb>YYYRMjk<_z7jh?ZDgI>{q z)IxObv8pASJA3N4!l?uORZChm4VwEh_*AX>Gwv;kAagB5 zSZMhUa^2bX%-UMpyG(C`o)K!@NA>it3A8Q#f8zo0lUgksZMWE+J(vN%MMKHMX?b+1 z4wBd=5!r3N>!-IipHc^8KKVBJdVSxU*DemQM@kcx?>;kj6*A zCNQAShH5K>8-YwmQHMVS%)G+^JC-^KO!uulbG6-~^dIu!Pu94ffZ-5GKPT!YvZL4N zW4pn+RUrqHp81gQ3kK67k*lrglT{Prq6LSr1zRBuzHPo6>^uvA&(+`508bzBr4I$t zf5jsgD-bhus3f(|G{J8U7Mcrr;k%g`Q5)4q^T|#jpB@tUlHY> zbnBsC>FFO};_B(&6--$jdvW4y)%f?ZDdZ*uAleR72aN9Wr}fMOICk}nA3mc_VQL~< zweKi^M7kAfkl0kCr`Od9M*7i*u(v0ksM`0mkPe7(zEH%jYT`6vI4mJ*INqs+xoi|8 z=MiwF{BiI|4~@qsV^TW%zwBrf9e(pxjiox zmOE5Lu0?j$0pE4LP2?O5jGp%NpJ7I~2VZ;oN!d=A;`ctk50v4wbMOanGOZ6s-C2?G zI6$gJ)O9;DYTD<6Bv>|83;?`k*rMav)C!z9M{~D}s)@Ezh~(Zw=z&acp8?&~1pRH* zLQdK9*Vtdr`qD?L#+N{k>yxduaGU9=t!_=f1_T_%H6RbU^@zAX3FG5g>w`rH^TFQ$ zT{O&{^*xMPWIKGWwxMaKo-VIFReivg!{jDeZ>^r$O-+UDop>D7`o?}+QZ@bvob9<~ zvsN|n4LECU++Ew6%IX3 zZ#^+J3>`1-KiKHPIrB46KP}huOzKr7-={XbhDs^lp>g&cDJQJrmT(zzxU7UCO!3LN zb?P4M-=duZw}wARPiNOHQ&ZrlptAJ^%ulp}fh>ApDSmxDGD=FUt@1$@fk zQw^VmozzC5;m|T1udSJm>Q<=2!u6U&WjIoZM7={(h)U#}JK?fK{f-c;;(o-3=S zubrwU4r3(bL_HgO4rz~?$mXI``*Y(bImCOkjfqQgvQufJhM0ZVZA6YkS6 zJqUrrWkA>r1i9{;wyHW$##t;Q$O5j@|Es<6Rcnp}YT6sm$Sbm>X??+DBxEG5L?pUn z%^KrcBNU6mRVrjTqp6`GXEbIxM}k9z4AVOps~)VXG9c%{=!BtUN@+K*MX z+*W^A*Tybz;EgK~mV2XvvFJ``U&Mk|n!#abe`E++u+sLRO3p=Z%)1~7#VU}F=r?U(G89meaU_UPGg~q1yiXG#lmLD$Ojs_C%y}vDyFZnKxI+B zupfy=EZe-+Z3PpSv%h~hZtie`ZLn{L2D;bja=CKxka=(pJ~f~8lEQw>8)vM)faY9& z3B9k!w>3+C8}}G<5jr*+Ne-Bla7tW7vy+gH5Zln8X{~gI27=M3IpmClMXnW#?>Piz zbMx_D2Lpvt4HFq#jm|+92-h}Y;zNpu%~4D{%=%C&kual{bJz?=f>L%M2ss&}fUyyg z^Yj0r2)wq%aR6Go;->H;o`}KVu+Mi!!q$KolLKaC$ABeH`{PMC(zv92c=LMf(B*#R zy;^8G)nSidz7D?)Cia3^J^kar^55uVuT<&j#kD)H(lfnq%Xy_lPajKd^HqJlymnuy zz%pW0na;li`O~!KZb#FJe*>>) zMLafJ;^${eylu9`-q{jY&X!m5UErw@ROZ~#C@QipA&rBi+< zX25f$*BFj_tr*UaqkYk-c8@Jj9V=6@{# z9`z)G(PTW9u(VV-u34eD)|cw%0xCR$p1C4F^XdkVC;;08!DBR%F|m?rVZ6;XU~>6n&218O^ZHXq8%*}dm;Aho&N@R#T4ES z_bRPb-2d~HaMlh>1wrV<#a~i{L0l6H`nNR_vf5$^3@8&_*V3}axvaM@6}3{%)vi^p zy36ZR;>vxSyTMiGU2dZ!vWSi)H+N|zqtzuBEu2?zphVMf>u)jDeFu-tj_UoTK1a=+ zWvve9Sou0fU1@)%!wHDbQQhpQ@Ga1m0j-l{HsKL!?nIffvh|L-WTm4f;HdUFD*OvH z!QD;Vp6OgrJp$bIIWBHbe1W)WJc0+Mqm_<|)&-gqE^#*p%MJJiHpfcWIh?yHg?t;> z!nTN+8IIRM+gMw4Y|A!BUD;bocw@R3U^^Bg7YhF7M47uwn;kWiWgxS^+~-(!=bTnY z-PqiXj$;+2k5)SB0P;DUKmjTQq;0`A$I}(E;phVv`Vl9cpPcT8h$#fA^dsC2 zXrB%;|3Wft&VI-=^d4h2A}Y!nfc>i zupPu-BweGVi~1BCxBK)FM?=`r)auY%9i6R?&8?2@8ypSqmq;&oILtllSWw#IXjt!P z3OO1!I-r3vXG(7F42X=H_i?bQT_p3W6)tKKf$~4_DaVt1Y{6lQEi_gNs0!Hg5)w-BQYMG3EffsR(|Y@GKm$i1B8hg8un*mOm^910~vdS`$I?In}Vh z=V*HJO86cHUru;d!LJ}Z@40>E75IE@n__nj;e!f} z>sK7VF$HfUJgMLT!f#jbF2eUI_-4ZIRqz`KzhA+_gyRDPUT!4(O9~z*{ObxnLikYy zN1bJwoZYzv#AlLsgPua{dyC*t7Qvq>g8#h;z5tdKh3sAc_yusskVUMi;o`<3{I3vy zI|+z&HJqO$T+TmYO%3>RxWN^&yB2V?+esl3>ucc0i|}tQg6}PYf1n8dalp~;1Jq=( zMhCn9U4;Kk5&Vxu@Yjmql@+#KC(Q$59S?T90523DqX@pU2tG#ov(W!o#F`(DUo66Z zqzL|W5&UEk{B#j~J}e~*wQETc{IVi=6X4iiS+Ije{QiJrs0ja7;y2OK1%E4GISTm2 zrTO&F+= zcfjo(#Ql}r-jTmB=i1E85{p{qs5P@2XDD#5Qa055k(qkz^l0vGo4wvE?Nsx3wnaKey6cRHAHHVe zkB4sn`bTDpsF~;;>lodB;NRh+=%lrJO{T-f7kG^Hf#=u z;=7=4U;=M63~L|}+i48NcEBqF;#oY*Zkhpa3&1l|BQ!8*;A2eKg-#5aQPH8wJm-OV zEuVCT1MY4BMJ|`3+O!O9YG6*hJ5jOAhrX-9mXwx!|0F0 zOB+@{b_7}p!|lUJn)b+=-Vv`qO`$OKG0GZ4=7>220NjdU9y4Mvy%~{c9PCL8{Rz{= z3+Q!`5`|jxW+pY%nR^!kE(*TLAW69yWO_Rb&Uzq2t%;h}&RAj)8U*uC4i%4$@U<75 zveAJ3Mu3ruCd_`khCU7(;*|xwLLb?S0}@J@Au}>!lCVT6SY$sm6ib>EPQ0a0ciyc` zy`Y2S;7x|Gh<9)pq~W>DOkr4gyvgC!dYuc}=`xHRqoYO~-sOQ6$WX-EWsKB;o$yfS zh-UOgccKejW-?VUeOugb*1A|lHbi1c0~U~`7e^K-1CzMAoQ}5&+z2OQ2E3{f9)fWM zi_f3|bJwVSKY8QRgwQG0z)o5TNPq?p$o&e)xA4`9_8P4-(3&Sr4zO*~Y^z;0=m+>!S`ai??JfB}; z_>GMJD$}!);pMd7h}GQB1q??&Q3lIm!m(etpO+G@=DCaM!Iw8>e6C`8c%JJF4>SJz z89vDHVTKPe{3{F}X1Ls6#rC=wew6rX9F8%Z$KeFi&*Sh%#=nB;pNj#5f(PDSd@h6q z54<1!4DW+F88`bmjLnZR{1(QKGyIU8tv*cgRaEsv^7#?AGn&Cl)e~aN!hJT-M^m7fvf5dPeho>3NkkKX2D2#=nN?*}?E8hDRB`jNvJUbGvsEu8zA&!qvEal8s{@i50B^DDnS^Ens4u7cq`OPf0i1W`m>wRtyBXfb^n94%+|SQ3{XCuzGX6TI=P8Ek3_rne?$1evbGv5>g3jkP841?5vr5C7f$ zpA6p)JgMgqhT}Uh68{auxj%nm`0b2ex)3g)pf4P+WcVJallnX091HTd!$;zuz(7J# z<93G)3w#TlOaA=~-^%a@2uF468IFI+j0N>y4 zKg#&rANd}LY_HUF7x7hp?q+%dO#g=&jxyKN^`{xm?S6sboc{pfs@-oe{^{eElvzyIFEgCm#rG?*NIxaN6agrz-T8#$ z0pF36{VtzXOFd^$7z)0pi3Jbb?xhSz8bQQrWnrow-SyRA7A5)-vxEjZie9~b3c5re1zfL zuAKLz&mVc)ciEpRt?S5)^)aL0rD4^(Tcd-*XC)K0Mrp3aH5UpAg57eBWp<@Vu} z+|dabb~VpkxXk_ClS3*%5K6Uu$bDY~XQ;C&hu9|rxakR{lLXK{c6kMYP-^Uh_HH<$ zeHxC0!m~8RuB@Q6l$T;(9(Ahn+eu!otE7Nap3o89M4h;Y%8QiWF9SxE(tqiPA8&N4q#}%4nDkmkL=^` zC0=Cw@a>U|1M3iaOrwO`(su>UZZq`d4u z^hYrPh^9ULc5%?MG>+d2m+yyFF1S|WfRzBX5-XlbCc%vppfoU1WI5L27t$zk zAP~E<(#%c-*_J~&r`y7IIW616c4^BN4&4T~2}wv{8=zb0Ye^{-8wW^%ra%Di_usi! zx{)x(3qR_o;#b43KZ^4y{Q6X!=kV(@a6S`1YT-3&b^DDD&3;$Q9I5HloQipMfHk`{ zP!$~2vd7XhwCs~=)?wgNM*Z)!%yCt-&kk&E)tt2o?#eX#P)fsihyQE zs`gcsE1CmFo!SDIZMs9t?5+9SHQ{x8)VV`osRW|Yx6 zWIunhR+;#wI#UjPu+b<9b-2#ntqlD@Sru^ zq-GajFrim7`6_(Po-ScuIP-Fu=A7DUk3mYgkTR}0E2<*(FNAYz%e2tA`uVrW70v>! zeq6VoUkUwc4Esf`>=iBagkfJ0(A2hrT5eAD*t_pePHIk5Kywxwp;y$Ao2XxIX^rNr z3E%)fX`%hraxDugp!NdIUQwml9W_>1voFD5wSsIvhM3ISH(k*&yqa@KzzDslj?_&~ zPBIP0&%qT;Ab%BD=((-v3@#Ht>}nA9k>Dysob@p+^LAO-;TD5Q^Ln3&AWo0Hb`?5On}jK4wS zz~aGKpy$?NNM6-!`1v84xb-h-u_v|Ak1;fdw6fR6V(&~&2A|wbVGcUMOSku@FCfj} zIz979jS+fP9a#hK?r06DjEEejj)wuc{?4rnG}0uj)f@}ba~*K`vm~}rk3B8Pd;K^? zf(2p>zYh13Q=7HWK6T_i=%?psq~VYj1cW*=kHRxMse^HiZZ`#VFs#yTBT%D`oKDZ| zt>A>{Xrbt6h7lAUT4oP;(38-!RwYw6oVyb7Yy@gs>)+L4FEbw;RKIWs@n8zqKcT^d zb{3RSyzJ+QZ}{kOVh$8B9O9ZY8r`{!6u*io{xHPqxn)f6^-S*^5T^GssC|)cUje08 zLFXaDp>sR2T~9h+1w_`ly`VFu64PDJY(?O!BR%g;P8#-~81^6(SH{-?5pf|qN6Xy^ z_rn3>FMxvLQPM&@Y#-msMsJ8Tps8>cO$BQ`!o=MKw73B4I&sitb;9)Gb1NT_n!N`>$wyZtxWfFV z*=OYXt9X{h(3n&5wGo<7NA|#Y!(kJ7Vt%2&x;wp8_&;A9cp5cAW00>$569d(+M z@{4iNT&3AmLqE-aguA6f16hlxK)StGbI`eEOn2_BILZd#W$VhJo0^sMh#=COh_aiC zF6bJy#g({16m-G&pqMR43{g! zH6@pVZGYzs?fo(U*Wdi#u?l|GPLZdI$~9j(d_ZDkpN}5N;Ny_gA^p`M#|Lf zMy@k3P)J{x3wRh|<<3nGm@crPH84mvz-L2rCKosAL`MnAO`EtHm(`;F{HA$69OrmFa&l?B}4gh_jJVHM^6!QaGSx%y90n7y`C3drTcU0wcmhHzPLh z5pk|N(;g}cO=}kmR!~rE9-0`YyhF*xbq;xB6B&-gJV5muwOdSIK<&KDNKm7O%A*w~ zxjQc5A3`l~5##+~$FMN0aM?)UE--Nw%iTE0hflE55DrB|QdsdA$VV3s7dgmycZyHW zdMBGf`65s2s%#D1iaJm8Zc3eB>9p0XB$vI8rv?hwRa9KtHG5qEv#TdiXV{MzRJaVg z6EznjUuD=onfR!f-Hie44dEjyY%)3AT5 z)&D{pehcYj+cp&!@XpZIhwKB{(ZTz5go@K!L#vhV7$L~i?OzxUiFHUD2ijPRb!Szb z9(q)>4?@lpY%PBnO!WFkb(gJr>w|R9S@V;g3U^$6Cn8ZfF?+!!u zN!>m~%K*PRvIv8NDVm<8g|IeKv$x^?Vf+wUSY8ls-CP=j(^=+>904TNYl?Xe5{|RDyu}wa`{XMDY_aDWZixG1lZ+ zSI@1`Q^YTe?eXXE+CYJ2ILqsd(4&TZP;-MTU2oJs8l2=2tKO=?!8~f!ofqN8{^^fi zojV@HmF^7qNh=x~#196=$g7+kwf7sOHd`9fi21E=Ot>YRh2hDjDzQ@Ft2HbGMEY?H zh)6Jn48h0K^(2y}&Q}hGJ%)GPd`$x6N5JSmW!HV%d1fIBYJ$*h9 z8nQww^*&1zklv~1%&P-odb)kI@CLgfno7jXl$A{MZCtd-TxrJo`*4?zS^mCsPmjN^ z-|}yY_9QyFhMH zRlZWKe7n5z302u$zVNH6GU3}^_VsGz_8FBp?wwKjlv?({OuD{()}k?0`TeX)5M^f* z@}=2xf!y+u+o;2M^`{i&cWUJyRpqE!37irJHL=c=7EK5%dc`|tE!XXLH2Za|{}6ia zl3sIeY{9DrGS_veaQpK`??yjRytd>KdWV`|gGTB1zlydwW{72;yTo%O|PM-ahI`V7u(wvHb;S6Fj)J@d#{6??iyIEGm%jIWi(e0!# z9k27R4E<@P{l-dl*^4W)&s(RQxS~K>Jd+VfXD)NbzGhr9a^w3qc*7b#D(QKGJP{%4-H_`*_+foI?G^d^{bj?#o z;?M{tVnKz(YuK{`Y)B}{&km?r6Hg0@tGCeW(fHLk6y7Hg3HC3?R{&!@+5UiTKkcr+ z-(@>N*p`vD2WruS7TWY;Jc$7?oDDFb50&qA!&&AxocVg_h-QzY+CHXbA62v8g7JoZ zSgRj%eXid661l_mdll8%L9o$7*I>2q43xnp4DJh#(7^f;J@lAc!P!ayQEcjAT&vV9tv^q&=#~cZX`%lygKyg*l%UfK+A!+HowUr} zS|;4(Nl&J)yMiQSQO4d>tNOz>7R(AWW2Y{O;m%%B!aM zzLc!C>cf@3L0?H>@V*<9_mj?O9duYx?Y|ju6rqRj(_Y213gr()t2(!XPnlM-r%!>> zC7Mr}Q36#IpF(f^Q=3njJq0AUluL3CaEbvBoF4lW_SJ$@7EV5;x^N?1`Pf$|3E-DL zg}z8lZ9av*PEBn-g(aaA9vsG9xrDQ^APN{(Ci#aCKRto|r?YeM!Kcudu&K?LpWP=u z^C^FKB7i%U37YEXISilbw=*~{>qkt_;e2S0%I$nkf0_*9x{l+NFN>Q`Ijb0A_daq` ziRObxOEn)nSE~8kY&PYQPjT1w@`DQ@@;oU%g?$?E8kvw^U+aPQd*I*mz-gnm6#u7z zpMv;5#O1M?fa~9Jyas1#tRCR(higjlNqFG2n_7zgOTbC)QJkq!O`vud_ve-u;!w=| zcRctkM!!=0U-Y0~4tkP1z*7yY9gzD24?d50;7@qq&wAjrhgM3@Yd!F79{87mpC{!L zR=1%40)*OmQa)j|3Hal{OUeD22VMccoG0ZUR+qqM5AafaUI$M8+%+9UXjEUQ#c^MX ze$WH|ng@Q+16LuZ6#vB@c)|n!cMp8r17C}hQ%dd^Jn-*&;E#LYZ+qagP|`}tJ;wtN zc;HsPm=tIm-jD_rOCQ_-8!u1mQeqxRK@_H+j%2=GCh@tcy)EHaHjz z2ItHBG@Vy$TGIy2UNo!J#l^qideA#!#y9<}0;)xEt+Z@f1)u!U(J z44J0Yo$TLi_VjPWJ|5ddYhM9%uD)1Lbqqvfak_3=lT7rkK8bOToSeeJMrfRj5A;BO zq_-Ce^@34nPx~gE5F$-N>;AN5_IH`dXy3-T+0|=-@&=FugW5uQ(aS zS9df~JSweMHYDR+4W_wqaL^oxCsY04oUpc-n;OYB4CkL4`%PVmzRn0)w6J1lPe%KWg^28?o_H#y@?q`rb40gBMj0F1$f zWJpKhMZYKH=N4@brI2u#CfcN!x#!XCpvH}k- zGR=PM&&H#@=#h#itx}mFvKo{N++h zH;6YxJIz=$Ws%-+TVB7D^I?(4plzes5$}n|tYFI0JDQQtl6>>#k1lX5}d{tp%!K`K>Td=DTA73GiXvy zA+`Ptfg%IYha8v9lqExCX^fs>TufS0D3X~+?n?QCN7Ni#G^?} zZLCqKGkz8-C;B4QBh-3OQc5|{UD!xDEy115bK1q``xH5oNw;=H#UrLAt1_HCxp zjd>W#XF|6mm{F9zWPC%kC)yW_Z=jee%)xwa>1Z@pcW{UNxrLT;Lo}62Z0w7mnC9L3 zVJ1Vto)0q$E;UxbQFB9lW1N(Fi{uKY`PS9BRe*XC?d-crNI#=QzowJtlz;&i)bu_rzc36XowH zgnv?^|B-~t_8yXOS^uXwPAA&66Z-tGgwvjvz{ey$e=p(durEQ4^l89P(BI>MKQ7_2 z{#%IwTCrV?*iR^hH%oXO2!ve21HV_o=SlR>d*GkK{sT4ANA}xA9543Ur4lattySV9 z`|WB8m;JCo!ttp+Z`WNMC))WE{-8v^K*C2Qyh*|jNH~3S5`KGL!Y`8W367J!w0kD# zk9*M1!oCVM@|(=3QNl0AGr^~o<7C&l5`MEpPv4IOeMZ9NaoI27A&LGC32%|`;~Xcs zVF_P{{TXV6FTqd9-NkXTYpH~PS)y;1@NawI4@-O^68%plT;_jR!k0<(lM>!0;ajoK zLyh#*@DuvqA>kKD_+t_-kIS49e@e7U60?HngPW&Q7z@D&pMHzYpvtx?$Z1Brg6g#SjOm*eVfiGGzte>?V< zsF6O4@e}+%!9R5nez}AXOE`T&7W5BDc)Nrjknqn)_z?-0<(|qvrF;^!a-KPp zPWGc!t{3DJYQ^I&zJC_u*Sh3W=!Yd-mV1MQ%W>jMHyMJ@KSQd_Iexz{3Qh74yH`g_-`cp35ctYFrCG z9A;mD`4kioJCmClCB)CKNiJWCGK9vC8sYR4ZGc}0{1Cqv<1TRVef24c{zAb7=P?PV zKH_`nA0&Jxzot_&A78;=eCOOM;k=ZwUiV2jFEtE*N5XmPWq2nsMiczScfVc=?6D+u|y z*neLDUdn$p&2EQ5-jDo8p(yMZex?66fov(3f0WA?e<#G*Oo`tHbS@=-2baH|cO?15 zvRM8z9`bjc>UI==U&Pr=k^hv3{4p;78QziP6U$=xU&p{P`-K30UVoZ<(NTmK`=8di z%>E*}QA&1b_qZp8D z@Gv-0LP&tHUw{PGo9q(4oEFX(L`-bLu>o%mSO^e4LaY!Hv*B7G(Y{ypYV=P{w=9!v zeP2&^|NY+oUcGu%)m`1v4b82yii?UIQ;M96oslzxI!=3ZgO+L-F_GyI31zw$MZh4y@q!KbLgif^YNq166*a^S!XCa z?zE|Vl4&aU1qb)jp%coUqjp;LCoCHr3}vr#)Yag7q0Apbd&iZtj6(VbQyauyzPb9$ zW0~Cp9VGW?i6RmD>&PGFR^|m^R~L4&%b{#*xvw)ceWG%!wC_>IdLJ)avb6rn-KCSa z(5dt2exg$<^;@njU*x3z9Lio;F1}=Tr)Rr*GtkMZx;C~W=tgjGXv6UEaOq^nm4+%c z5Fw`EpsJM3lwYNx1TiU*<^9VmN+)k+_o-DfA5rutWoB+)SCrQTWx>I0Q~A{1H~!v~ zneEG5J~7i)CSJ5=+NSQAy~wH0JeQe0ZhJ%Np4nHJI9`@XPU?O2Kxl7cE%Vd9j`x|p zna1O`k6SOTPjHA~+6Q=F`klQ4(`c_^^4$JR<4KYLix!8-3vLCS9O-GHtV*ZsoQcwM zP1(jW6|_*cmYXLyxMYYqRb3aD3Wl;bwCB~2QY_RrT)Opf5)EaOm7%`(O1J*V=!LS^ zwC`zLR20g*VI^4RXQh1)kyvYXV)>(Per^OelS8ePQp-yxH*uYm@X+}t$@(=;@u%#v1Ha{lE1dLPPQC06wbTl!la$rI z!OYLn3n=up+6j|GnODTAYp9imQ%8$%dNZX@B}a5m;}u2uc~aVUKjFC;c=w-~B$nTQ zRC-B#GD9Y_Bp-*a8l^u{7#oNVJ0p_WR2PrLD%T&~qLp8>^pRYvkqj@LT<47R=Ul$q zA=eS?8w_O{YfHDDQ|vg|>7mSC2_+}>+Z?cLlGaho1ALF7cfK8XQ9`T za5g#4LRXNiBwl{r4eZg;CoPlOqmB1SySub+r57!=!_(XjK${!qrN^myzqzPi^$R^g ziEHgm*$HNjdXQOQzF1@ip9$0}7K?&n+;t^6LjzE5-omLP^L%MvF<&=bvd%pmJf8pi zh{;`7k&bRRJ?42O<(u5u^my(XX6Ahac&{EK?@&#yf4lMy{EH#o^)AKQ#Z^1yU;jJL zW;9;7^0A-aGnB!>UE#6%xt(bBc;m_Y81P2M%3Cu!@4(MTNTu?2p6yy@Yz^)Io6G#` zeSdTVanlH?l9;meliVMLwqH}J{OTJl?VCa^Olfd}g?p{(4$UDM7tUM~o9 zedh7>CN+W5l&Pa2<28*RyHgkE_jvI@I@Q4KWZENg3hvLp2jhMy<0Nx&`rtTyxWuq>E^o9t=p(Y zTC&HLZ#myduLxxmWiVdT@Hap%v}DJX)9r9ww#O&Uk)bQ^=Uo{m0k%h^6w&7bX~qxT zVMpeL-KjmEA%1xz9%2G#JGuMZ)kz&-WMCXhjWU07yS*_c(xv&NlSdz?nD?zQ@y7Cb z_a3DG|H_c=ikfaNGX%~JQ2X^nsA6T}oy!Nh3*Q^?%!$6ibXvz)&ETQZt*g29vdIAC z1WnctkV7;}hMF>OC~-Z7|AA0FD~Ak9S+Yqn*je!d%!=in{VVgcfsak)X{263$J)Px z%v7J3=O)jj@{xVhZv6eITuPo>JEPJL)rUXa4FMT~4lniwwPef4Hi6Rgt1F_c-+fWW%Z7 zNeYg+)sa3uVmXwZuO7~hQ;*2$2|S+cjFaM$-P#{AT5$KDojq}T`|!>l61(xk;Zn!h zaC)|_Z2M)yayBWuVchnG!@VCCZ8)m;2H&_(55E8GX)GPerj)g6ZS63=pAtK{{pvZTju4^YMdUYvvEq zq-)B3ncbnjw^FCJW@}jPQhr$Mr-Pj|@(dp+eXQBn`$19Z)-Mp$_hM<^X%w}3^7bUd z!E<40-yXW$LLm#a(6zeY&s(zBme*dI*{{rKk+VpXCq0UqEIja}cRi!Mj|X_^p?+!o zRrFY=@AnR{uS0FQ@h{u#qu7!!nFYSmzIB9$vdu(TR~EWJB~oeMDa57xe;ECr$o}{7 zl%*6he+gyVCxtFhQ@);2hTDBZ0lKcA_w%bLC+d zU3lL7VSl!nb0@Q4qJH-D9G?cxwJGukCcWCTYn{p}bJsr9o9pkP%wL9|9r_iW5APc~ z({!&8wU;l%sW6;6Oy`E&>rg0Fam#n>`3=&R8?~^1Sn@}OvPVz@`Z(K%UsYCV-6j=D zqypG}@$*mXBn!GMX`VN)Z5|o=q(r=sNX1>fGnPyx;+w|c$U*!V z1Ce&b#LeBG*v78ZDM~OW*VNn?*wEFPS{XQvBD6BrwPIz84y9VoCGoCqX_s6Wbu+be z1}+MmwkEB@%7>jChg>}lMUjkY&OjpFEoLeLiC8Mom1Gl~52l?)7c_1=O%(ZfViS?{ z#3|84E18Z)W631s*XVMRU%BY7jC6O$*5m?V@=5BRSAW$2V^9>2bM?#9qwI-A)`~qP z*{CynJ*RzC+#xGbkr|28K?F^pIw;6_WL=$sRGcbQP)VzO4@HrT6^KiVkh#L%iFtHL zisK9IL?dg~EQ>@}yPFw_SAm^T6y53*>rQRziFsIo{4KEKsi>N$K)k1m+B%+C8*v-f zMzb@jqDcoCmu39SON?ck0-R`SbS67_GpsTwp6-e@oLf+}BsOw@QuNUDgfPRfh!Lpyv&+d&jujO)s2DWsfn`R-jKgvW` zs7QX8@z5<$x<{!%$mOo?o-~I@4JV_G7hZxos=6OHw{>s}dWq&mIOiuP@*yaqy?jHF zR3sM=GXU$ciNZM&7q&MRMKM$$p6uG}-J3_VaE~Vip9@Rr`Je}fJS(aYDJeH6; z1vadVb?0>sk>W|nA6!8Z=f*RewDS->DR9rRR`d9JH77N;hO#yevH2}jr3$O_6^JwfD8GV^A3HBoondx!J-p7ga=idORKm)XlfE(Bp<% zD^dSa4-9!zmNUwn>0rMzH-z!kn$2~7)R&_AK2q$Ef*X&HkhxUY1m=nrbZ2(IzMuEjnir5JY0cO4^YwPMFyr=^tgq+me>RlW@_8@PnRMiZ zsR^ap(|9vWb#_79^(|3OMmKAlnrYg*qD?f5?6{7gB~d>Zc8L zy@hVLG|hr;^Y}hbJ!#EXkMJWVI?Tg8UY?ciHeL`NC;YrvGM-LEV=6iAIw-c;jg99A zrY=~P?oOoxGb?H;D$kjoR%gNMgS8cv)zdU8rjL_-(dKzh(Z;f(6DJ!&3Z{-)<7 zxuzBYn*4#z@qS-DeF((Y)JGq*pTRP8Z8cqMplke^em-MVzDzt$gTL&y;(Gt2n@d9e zK<~J)zq0sSiuO6eqU&Ub2f=>V+AU&@(*36?Z*zH~DK@{dL{`+IoMbGnGUSuo4wsxC6Z= z(z`aN*EAtl_oB`1ttv7{e2vvkH1Xlslruu5ineilATeSm*~cr{29pUDaPtI?pNbppfA1c@lCmNUV1v?mLTveHp$lS89`%mnp!A_i%LLU< zAB#?#i_RRdl8y>-HYrvvN@dvIa zH&wFnxl2hXdv6cBTyjbrwE|mksl+*=0ArxU@p<4!df?m(3QLJ|R3S)6iQ_N8Ic!DF zr<{A`%4cL>M|;Mfm2>{)kIR>7V|)vrP&q;GoL|tM@j*E+lRfWB99r|YN(mWe`Kty0 zl@`G+(a-Yc%3EBuPazSAoy{zKOnfAs_z%gafyT8Y4l`jN9HkCuq8^IV~lEU z&+q?=0ay7#S9=wYkGOO(dp;|1jCXQTb|qxjt(4@Vn}4;$F|B0dC*}im_9gPiamk0T zD!ecs?h*L_t3kO>@DN~p_@Ln1Ed1NTuihuXwTDH15e9~?|3Gk)Z${-2!OJZ9M}CzIuKUALPG#=NTer@8BHv@- z9}9l3g%_)QJ<7S);`a&ugoXPBf8OFbPH>-fYw;Pu>nvRN+oPNv7Jj;t_d9>bWTWG= zg(qZgDCByT$iHsM*NS|=lD}B+9t&?0{7wsJ+7jo}7P~$z$<5aJmrH1dcPk~tQx6q~zadals0^RfreUp;tuoaH!hT)C)cNZMBs z?iPnR9{4H`oX0gco(DbfpL*c0d*J^|IQt)vE}))e$^WA%AZ~U~^}wq<@Y#ejf0=X* z_1sJRw|dCm?}6{~z<=q1|BnYgp6aRUE0196nVQ>+aJTx_dEg5?@YNppjUM=2gsc3K zM=(YfBn&vd#xO?W_#^LF9Ii{}P|ykIBGXjL_yYjDl&>zjjB;qa^la~tQk zw9O5NodWg7>gKLhtGe1}t#1#`j6~OTuJ7p?St)D}RtqMJi^RCf=VQ)xPpo-s5pX( zB&c+&l$_xT_rz5$TaETUO2p>I~|U0+(@HGYdpF-+!J5Z72VWaMR{ErzBJs~mF$TpW6kTGup~>{ ztXUn+^TYG&8(N!blnK+<8l)CoxjM`*nZ(!(G`1{~jJ1r#mVSf4whn3Jb7z%cN;f`dt!-XygRa{E43-SzOqmu=#~p!bAWM9S{hz*NnL0>g;!s4*wShA@-OSx zUtU)mrnBirWatQ=;pI4*Ckm^}_tFwbbt;YkOR;Hpi0%0r8knjlTYV#++%d z%?neh3b`zZ<*%TYvw}*a*%8Hgy3p5}h5V^SdxY*68dt`mt93@xc>IZm$V6;Sj7C$J zZZW1C01gWGYW{{o-N88F1>GCEx;w-4+BUs5#_o5dYP;geFb~=)^Ju(M1G0@bDLmYn zjEAYKb*>?0nnxmG`dpj7O?FlgC4ZmN%qL;GX;QC~!>ePP!ji6XvrCVcs_?D!$+Ue; zAG&ifZvYtoEZ}C{o^f6^xra6`7wDaOoKDcO;b{>3Oxh;_ZxNh%CIfzj;Iw?Oeu)Z0Jg)#8{aFkA z7|)F$e;VAWQyK39d?*l*o;|3%DG~m|){zu?P|KA3j{bwC69{@g;&JF*OvJ`38 zt4wgaUMC99bkl%Gzn{_Z$94&VJo;(gvoH_(`8kkh+s4m!!EHbFdlen$vp`2;yUx*t#1oE2!UkLaXz_WsLd+{2y;rSBa7`M9s=l1UW1|E#tiy&VK@~;7oehvYSetro2=x33vquPG@1n2nhJ7weN34${n`gscA z*p63u;I{&PGw|OB_$`2|e@H~ z=g$DnalVo^E@uhOeqx-f1h?aS9`H;j9b>lzcrecM0KX07qrg)Q_$t8B|8;<)|2F|Y z`oA6I`EMPKpLc;g`uVRQ&+lf8{6m1FKLdcHKTiTb`m;}PJD#rq&rGn(?-RJ#d3z$Q z$8+I!=Wq9npHl!wKc@kXel`ehw|k4=wx8|5a~{}@01w793G(NI{AR$>&l>?pKko*9 zjOTrV+kWl<9=_K#@fiRf^z$i@zYyg20gisY066;j7Vx8=?+9-D`4RB&7qG_9@$_DT zOF_E}&h36NZAN|y;OOTxz|qeJ;731O1h@Tc2cFM?-3ahtJd+?_2lAT%M?Y@_9R0i- z_|eb%1h@U%0X+3!cK~?M&!<4X0p#}qj()xXIQscV;732-1^GtcKb+praIxFB3~-!} zP8Xcpy@@u{?iGNepEZE9pX?KtCBTnud@IO50yz5f7~ts7Z-F24VL!-U3jFVbJo-~KfrO}Vy|CY%3;37lnrWBI0KXmZ z)qsB)@IJur0DJ)OuK>PBaL%8(fIkB`#^;xSb9{IXX28+U z8v#c@?*M-E^B%!%KfeJy9bk6=c+k(MKz=^R?*knDd;xIu^DW>j`532ys2 z2YA9@Hv&8u&((m(L4FhPTn+dZz|sF(0B8SAeIF8>=MTpDHNcmF{1D(Ae;MAL4+Xd5Uvvx!QDOclZN`6};C8#5AUN}2 z{7(fQ^z%%>JApq4IQrQD{0We60r?o2cFjfzaQ`o+)z~P_+J6*g#1p;v?Ke?h2_z1l|l<~lP|1?dA?HQ z8OOZ64RFlcKM8KzmF07lZ+wmZ$Eqr39%k$tv>E?-jgbr6{U&V&=QSlR9F7NQGdMr{ zb736$+Z0+@-%9|0kd6(H!0P+Mmw)qFz5;60`Koc{|c7lWIRRJQ( zB#q7BY z&QV|52~%ukSp5$Ss%9cihX3*M8_I8)O7qC-sX zZ^jd}&-01VGkY)nP8a((x#$N7<1UV48J#*Nw)7_5jMNUPAv)nnq8&dVR1g{qR z6*)#QqZ|0R=buCXT-&+)ckfpcVMv>0&XbW`BS#^05^@=YdnSmYoJh&u|_= z0Aq(+1cRc_{8;Sx@qZ9@i(ik#?`l!z_G4XBf77m)8~Y+>b`MX{M;!)`y=|Yr?{Vut z&x-vWqQ~~RE86x~kv>1d+WGH0RVx~KeKw+RaQ-`fH~Sm;A(M)!C)+=cHlt_o^-_N; z{7#wJe~C$;*!Axf{Su4dz(M>sl>Co*-P*6;#s3pX$@c#{V!zT5%Kihf&-bZVNL&@O z-zoYi!^cy~ZA70NJ#+OL(YLDaOcnh=iILQM<2*0-Z=a=Op8srp9@8ur32~eNzx<~1yYYH&e(n16-0P;_6VVzkTME{x F^M8OOas>bY literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/x86/obj/src/venc_process.o b/cplusplus/common/atlasutil/out/x86/obj/src/venc_process.o new file mode 100644 index 0000000000000000000000000000000000000000..6fd9cf6298fbe283f9fda9346a165f48ac0778f8 GIT binary patch literal 44040 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 Tr=u(ve?JG#W2m1@PX7M~2#cyi literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/out/x86/obj/src/video_decode.o b/cplusplus/common/atlasutil/out/x86/obj/src/video_decode.o new file mode 100644 index 0000000000000000000000000000000000000000..e18782bd2ea18935b66e9ca0f7d047f55991e682 GIT binary patch literal 66488 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 literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_feature_mask.cpp.o b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_feature_mask.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..f34be98453331ad8aa9e9614cc0ecd17d3794c42 GIT binary patch literal 371016 zcmeFa4|rWwmHvNjZlHyN{Ar;GNN*`fErq5~Y>_G#TA++oIwg*sp-vN$Kq_e)+JMn! zeM}MDkJNk4gT__~Vj4H~xg=FN{Aa`LD*G zlKeO0PfPy0@n%0>9$@_4CJ!`ukmSL} z-y?a5@o|zlVZ2=*YI1_f!%QA7`Cj8kNKQ2VKFLYOkCdEj{3ywzjZcxRGCo!E7~xpE zK2Gxe#-~fpFn+w`2aKO!a;D@5jekh;MB{nMlZ>A%Im`HL$y1DO0w1X zrzJmQe5J`Y$-goFS;>ox7ffDk@)F5QjjxjYTjQUT{Jinil7DCX3zA8z zKM0o#Ypm@G$t#7cgfCm$S0uk`{A$Us8UMP;ZDp zlK&~ZApF|eUX=VV;Wxs6TiZ*LzZG5x$lE)Z7R&tv0<0Rj2e7eaQlE)kWfaD3rXG(t1_=hA2h@wp~HBKc9{XGqR7{^yeOjh`u5ZTw@Be_{ONk_(Lg zrOCgNJj?h($xj&nYsp2%Yb0xppDkHuyk4@w_&Jj28gGezW9vjNc-8 ztMS`R{)^=8#=mRw4#_U#cbfd3@~BgP+BwscD zJIU9K|BuPnC3}p&Ve)?^w;A7V@=eJd#v{GH@vO*5Rv6Ektd!iv_^u{LNRBkVo5|fJ zM;YJ4x|c% zY%qC_$#YFMnp`aTN#o~9HW^=Ha;fAp>> zR~m0K`8Os%Yw{wK1(O#`USj-G$yLVx*5v0TKW}`s$-guC1(RPid6~(-m;93Pe~`S~ z_!`M8j9)2vmGLi2e#Q7#OGWk=5t20e_qnRwAVhisyUzEJ>pvjMw&0YsQI^#&36^| z%J*_%aHP#uWIqBKm8Q(V>dTr}%lg;kz z=uT|EGAiG*edYcA=3Meeaff8fzcacyl-Y>6w^vESn3qD)WRR+-Y#bxEhv zbj<%)-{+Mc%VQFc6J6Ce#^37`W9C5JtIm4bkBB4-kHs<3ywi0NWut2J6(?dC=OXDJ zt=XEb=)83I!u&1SOsCFYoi)jtigV`nUH4h(oISGenAY86YP%{Y-OChv#vLu+eSGYA z4vHs4UBwgfUHFt6#E>h7@>_79d z%f!D%wS#{r1v;wXNgl77&qfDno%W2cI;m@XTmH&STjrqdY-Uo_I_^w8MMp&~hn%Uo z#`>ApGhO#gur>7hNyK1MF`LonvUo4Ns(7N}Jt5f-3)Jk1!-&0fi2eP04s-s}Pse_D z&8=PIGN+8zMYKy&Bk09#S_hGQ)Ox#oyzdEiwxTe9b9OZMl6^<(uwD1VYq;;HL#>3+q-U#RUD2TpceZ0URN=&@7hn=b-(1h?JvXi{n@>T@B7Iq-`Q_RYYs&p z-(sjWKdF@8i~8obkcq0Pk$CU6ex-f8w|{3G|56=164$|w`zs#ZzA}5m_WPqXubf$V z!|%@8<%a*M+x3Q?6SNMd>v?l*)YCB~>bYlS)OF8AQP-^(6}pPY#__-EqKfF(-AD93 zBcst;6VtU{X^$^TFRoA1)%##)x-FWR@6!9>q<-y_^Idvp?B8CM@6tPD|MqG5F1^D} z`ekovcp{7m^bwld$9ZaZLP|F+R%`nQeI zJkovl(;U)m`^*1yTO{Af>jc#@@=%lGCA%j?U9TM!b^UI1)b;A9s7v|n`c?LTNzZAX z*J&if= zGv@Y{-%a+kGc(euxS^N&1g)s4;`ed~Ip z>gCc*vL9$~9i#egm!9`it#%gGj_>>Fx#BznS3m8KaZPT??jN56e4fRRM_t8_5B&^@ z&k_3#e^2R1?I~kCp7JH0qn;)BI*onC=Jl;zqw_cGIl;N8sJSWbYl@0Zm*RfwndBze ze@^SW|LA43nta9kkJqujI~q#WsNyY`5vYn^Id zeR|JdpGtDoenh^jV}jPtgd`8`lEwRtOBN?othvP2L9s5ghG#xwx2wIRN1s_qpAO0P z`*mHHSu;WXGFzi55l|o3=bm4;A7u9EBb%}Q-b)YZ&~wjqVySyb;wTxXuTMPVv-eLeme=*xJnser)%-84=8sI(`;q^Mq=YiYK&^bD=7u6)^0`2{s zVf$#=2(KfJTdVV1dhBkEqi4C+(tg_ClRcxjHXFw=&bP&~U2UFA&o#cCt#fc3bC0p< z7bonJ$*&((k9j!;L=h5;ZIoG=m{loQDvS+>#n|NHsB3@t0#W%ISBI-}I z5})0E(RXd-RV#a^Yr_03)r$L_8mCXqum<(cxP9fn^{t!Wy;8pQt~;xjoO~nlX z#rDqWb4>4(Iqj42Io0&2Htr|y-k!%hOY6Vrd+C&@YpwQzbw}#?c80J>(6f&9oY8ww@yL8v zt}Qx<=g+Nr{&;LT&vnS3c->1cUe9One9D}+Me{A{IiTlWm)NdEJ`?-C| z@Y%_|(t3BDpzmnTsKIr#N4|@9`bh8cyt^0ARbEvatYK=d{Y2^OI7m0vmmRA2cK^Pkcf5V$I*_kL`Jh@H z71uv80-<-X>D@A9wr9dOYg&k2v?ge1?sXS3v*H5;BWeBN>HO3#UhtnRwX zp4Ft=TW|6;{zhhJq&VNU*2t6Q_Qj0WimyLCzdua-_$c~<_TeONyASp~Ono_1uRUzw-1Ye$ zCjF#NlkZ`tD1Ls9Wb8`5&jtQf$Up8st8;>%5xTRL$umy-6l@kX8QNE97ua`gT#^!t0Dn9Z_`>xgjIa1v4CH&T1qrI1J5Y!3ZQ|OD{MS4fL zSNGy~1lf)EE9L6Ts?$h%rDvRKIQ;$;h3^Mut5401;#~4WtGDD^tbgm)yBqsk*E*e3 z;u`b4mwfZBZk*;gUG;)IC|O6^hvH{c=WeQ->GmB$V=xEK$M>9|9GsvW92T8Fd4!(- z(#MYK@x$?1Q~OH%ZBXxTiqj-?xsJd8od{2U6S!Dsv*L+`uISaz{*3)6N1aFc??-!2 zK4kpF+#&Hkqcg33)jcFPQrC)qM&GZCCnS9m{TYWSZe8SSNL$(qhhr=Dm*=DA`2f!n zoo6%M+EX-sr14AVFyf)P$9Yr?zioNkzB2hnsNYi_?bdH1n-%*lBch(tZz+l;KF8OZ zUpLp4cFns2*CXv(`*nQ1hh6V&*L&NwzBk18$Jq4&c71?dA8gkL+jY*ab9Q~0T^|;8 zQJ4N3(Ds!(v2PI<#bR_p>)5#d=z0xt>T^EXiM3mI)bQ8tmR)5vT zj@GVx>Rr3Vo$zVa(Zl!Y&=Gxo%9~HbgtLV29Xm6AcFOR_KRGqN*2yjCp|k!DiXm$z~k84&k4pZ_{r zl%DtcUO3?M-u&^H^~S^BYwqejUry0;T<@%XVxbrj3w@L1z3}|@!{cvLUEMprHUC7t zhmO~Eq951DRpsZL?C(YW#=-a28>TF4Zdh7( z;WU%SOsQM8ykW|c+LogiFKs%yvAG#LXSOsn=ayWsq9u2BL#|e=sbz6nJR@8! z+#$Ru6b1Ti6V?k43%kzJza1p`l<+R`J0-UY`-!9b8{uH_ha_JY4i$ewG9x)rV2oWP zj}o2}-%WC=z<7H|9w)pkzL(^5;WhESC65=dx3A<0!W-hFjpHADrZ5mk-}_=`AL)KT zcval(za-9_821J7QIgXH<~LHZN_bklQgX8JxOgOagg{L3b-eg}lFa8oabmeez`vU$ zi3N5&4_WbR)V4vO|5d_m0%Kk#kR$r67S;)j11C3(^93QDUt;h1r7!sBKt~PSrEj~hW zitwa3^O__)B97g|#UGGlK8J|kB}pBR6~9IDX@PmJm!uE2!gcf&wNVo<2;_*kKP8Yy zYJ%LY7Q&p8cgDO-K<8n>`{JY541QcAcrBqzy-=?=OHvE0F~+ABh|ztLx=rj zTp;ex2%g_Z#67>{ly>q<|I38+0y^})Nx;Xi2#k#%*9zo}7^6!qr1#{z)W$r2pFMf7 z{BD!&a`_E&6y}r|zgw6kgd81j5A}&7`K30({4!_HZ@8b3U*Bguzk}`74@sYT9WVRD zlK#}cuZ#3vO@1~B_(*>57O1Z)1lBxbdhVzR^6Py(zw~#V$Hd9+%>uP?wZPc;;d=%1 z?i8p6_7KK-N}#66FKe9`ZIomk`ZL$(g&(Ywa{IIIZ!buPeeYP|WpRJ@v5wgL*`LGs zhk5aQ&61Aibask|I$j$mO9#JvZx3@yOnuEVCttJAi~Bi&_2=gY;(^`w3B;7TWPc{s z*kb*9e#2)m`vtLoQegjLpL|Hb?lqFEd17#tz`A4nF9|ma^!b87e(3}E{^)cHPY72C z?VjaUYKiQ!ZVAp zJysq=)-`_kzRf&+-ySH}VeZH&dpLOy+Xu@jb;Wa^`u2LGe!UJ^1K8#KKzyk)o;#0= zlheb*AC~mmeo&k_yhrWi>IH#))q^irudW^uaH3cauO4z95iO zVtkq4{Vx~4QNTxPgPbvsuM2kzuL{%!{xJu1J-^ff^-3%llR9Rfp&vGgDQg*DsMTOJr8GEk_p7%G!eT{qGsU7AzMZli#jo9$@MeVSc`nijk9%^8qS4!#uoMbfaGrk_A&B9PKkrZhrQ0@hTk{q zK4VbFo*(L|s5atAT&@=G6d259r$Kgq-3d`v&zxjL9Q=EOW&cwdcN( zJL2s=GZ(MtaE{~=yX8wHImpRE>{WkXY4NtodW$s zj?OIt<9%JAHhv=%1^lK)uNRmbb&L(qFaA6(u$Da6#20&v184k@6Fb)X?UK%!?^6Q# zAP(e@xqGbG2bdrE@Vvh!&K`&j=FL7y?NIOR=jc**(*@?^c_%0Ax8#&LlhZ1Jc~C#> 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 literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_post_process.cpp.o b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_post_process.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..226500c84fa00ef63fbc4f12a59bba5702bc0750 GIT binary patch literal 260168 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 literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_recognition.cpp.o b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_recognition.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..9f1afe31e08a599a430d0b6c0fc742715265a44b GIT binary patch literal 403128 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 AvH$=8 literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_register.cpp.o b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_register.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..28bf754b4bace2f098d5b0658752d0e2f9748835 GIT binary patch literal 409848 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

5F2Yo2r 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 EKPJzRc>n+a literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/facial_recognition_message.pb.cc.o b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/facial_recognition_message.pb.cc.o new file mode 100644 index 0000000000000000000000000000000000000000..69059e9de4057a46ac92eb7d2f18dd002c5c5997 GIT binary patch literal 331728 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 RBffH%{B#%9PhE8W{{sA(h{pf` literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/flags.make b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/flags.make new file mode 100644 index 0000000..c5638db --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +# compile CXX with /usr/bin/aarch64-linux-gnu-g++ +CXX_FLAGS = -std=c++11 + +CXX_DEFINES = -DENABLE_BOARD_CAMARE -DENABLE_DVPP_INTERFACE + +CXX_INCLUDES = -I/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc -I/home/ascend/ascend_ddk/arm/include/opencv4 -I/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include -I/home/ascend/ascend_ddk/arm/include -I/home/ascend/ascend_ddk/arm/include/ascenddk -I/home/ascend/Ascend -I/home/ascend/Ascend/ascenddk -I/usr/local/include + diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/link.txt b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/link.txt new file mode 100644 index 0000000..4578753 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/aarch64-linux-gnu-g++ CMakeFiles/main.dir/mind_camera.cpp.o CMakeFiles/main.dir/face_register.cpp.o CMakeFiles/main.dir/face_detection.cpp.o CMakeFiles/main.dir/face_feature_mask.cpp.o CMakeFiles/main.dir/face_recognition.cpp.o CMakeFiles/main.dir/facial_recognition_message.pb.cc.o CMakeFiles/main.dir/face_post_process.cpp.o CMakeFiles/main.dir/main.cpp.o -o /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main -L/usr/local/lib -L/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/lib64/stub -L/home/ascend/ascend_ddk/arm/lib -L/home/ascend/Ascend/driver -L/home/ascend/Ascend -L/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/atc/lib64 -lascendcl -lacl_dvpp -lstdc++ -lc_sec -lslog -latlasutil -lavcodec -lavformat -lavdevice -lavutil -lswresample -lavfilter -lswscale -lmedia_mini -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_calib3d -lopencv_flann -lopencv_features2d -lopencv_videoio -lprotobuf -lpresenteragent -lpthread diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/main.cpp.o b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/main.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..36ebfbfc1deb655c995b14a88999c40852bd6238 GIT binary patch literal 228008 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 S1BqXg^P+l)^21k<|Nj8CCFEHE literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/mind_camera.cpp.o b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/mind_camera.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..1b08e2b58358f0c76d743f6db1e2b473d5817901 GIT binary patch literal 314504 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 msgData); + +private: + /** + * @brief: Detect face data in image from MSG_FRAME_DATA and + * MSG_FACE_REG_IMAGE message, and send inference data + * to next(face feature mask) thread + * @param [in]: imageHandle: message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, the thread will exit + */ + AtlasError FrameDataMsgProcess( + std::shared_ptr imageHandle); + + /** + * @brief: check inference results is valid or not + * @param [in]: resultItem: one face item of inference result + * @return: false:invalid, true: valid + */ + bool IsValidResults(float* resultItem); + + /** + * @brief: Correct box coordinate ratio to [0.0, 1.0] + * @param [in]: ratio: coordinate ratio + * @return: ratio in [0.0, 1.0], otherwise + * when ratio less than zero, then return zero + * when ratio more than one, then return one + */ + float CorrectionRatio(float ratio); + + /** + * @brief: Model inference result process, parse face position data + * @param [in/out]: recogInfo: engine transform image + * @param [in]: inferenceOutput: model inference output + * @return: ATLAS_OK: process success + * ATLAS_ERROR: process failed + */ + AtlasError PostProcess( + std::shared_ptr recogInfo, + std::vector& inferenceOutput); + +private: + AtlasModel model_; + DvppProcess dvpp_; +}; + +#endif /* FACE_DETECTION_ENGINE_H_ */ diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_mask.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_mask.h new file mode 100644 index 0000000..e134fe8 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_mask.h @@ -0,0 +1,252 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018-2020, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ +#ifndef FACE_FEATURE_MASK_ENGINE_H_ +#define FACE_FEATURE_MASK_ENGINE_H_ + +#include "face_recognition_params.h" +#include +#include +#include +#include +#include +#include +#include + +#include "opencv2/opencv.hpp" +#include "opencv2/imgproc.hpp" +#include "opencv2/core/types_c.h" + +#include "atlasutil/atlas_model.h" +#include "atlasutil/dvpp_process.h" + +#include "facial_thread_base.h" + +//Define the face feature position +enum FaceFeaturePos { + kLeftEyeX, + kLeftEyeY, + kRightEyeX, + kRightEyeY, + kNoseX, + kNoseY, + kLeftMouthX, + kLeftMouthY, + kRightMouthX, + kRightMouthY +}; + +/** + * @brief: Face feature extract class + */ +class FaceFeatureMask : public FacialThreadBase { +public: + /** + * @brief: constructor + * @param [in]: configFile: App config file + */ + FaceFeatureMask(const std::string& configFile); + + /** + * @brief: destruction function + */ + ~FaceFeatureMask(); + + /** + * @brief: Face feature mask thread init function + * @param [in]: None + * @return: Init result + * ATLAS_OK: Init success + * ATLAS_ERROR: Init failed. The thread will exit + */ + AtlasError Init(); + + /** + * @brief: The message process entry of face feature mask thread received + * @param [in]: msgId: The received message id + * @param [in]: msgData: The received message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, the thread will exit + */ + AtlasError Process(int msgId, std::shared_ptr msgData); + +private: + /** + * @brief: Init the normlized mean and std value + * @param [in]: None + * @return: Whether init success + */ + AtlasError InitNormlizedData(); + + /** + * @brief: Crop all faces area from original image + * @param [out]: faceImgs: all faces area image data + * @param [in]: orgImg: the original image data + * @return: ATLAS_OK: crop success + * ATLAS_ERROR: crop failed + */ + AtlasError Crop(std::vector &faceImgs, ImageData &orgImg); + + /** + * @brief: Resize all cropped image + * @param [out]: resizedImgs: all face image after resize + * @param [in]: faceImgs: all cropped face image + * @return: ATLAS_OK: resize success + * ATLAS_ERROR: resize failed + */ + AtlasError Resize(std::vector &resizedImgs, + std::vector &faceImgs); + + /** + * @brief: Transform the image from resized YUV images by dvpp + * to opencv BGR mat + * @param [out]: bgrImgs BGR images after transform + * @param [in]: resizedImgs resized YUV images by dvpp + * @return: ATLAS_OK: transform success + * ATLAS_ERROR: transform failed + */ + AtlasError Decode(std::vector &bgrImgs, + std::vector &resizedImgs); + + /** + * @brief: Transform the image from (0,255) to little number, + * invoke the opencv's interface to do the normalization, + * sub mean and divide std. + * @param [in/out]: bgrImage The BGR image data + * @return: ATLAS_OK: normalize success + * ATLAS_ERROR: normalize failed + */ + AtlasError Normalize(std::vector &bgrImage); + + /** + * @brief: Copy one batch preprocessed images to + * device buffer for inference later. + * @param [out]: buffer: device buffer for store preprocess images + * @param [in]: bufferSize: device buffer size + * @param [in]: images: preprocessed images data + * @param [in]: batchIdx: current batch index + * @return: > 0: image number of copped + * -1: copy failed + */ + int CopyOneBatchImages(uint8_t* buffer, uint32_t bufferSize, + std::vector& images, int batchIdx); + + /** + * @brief: Copy one image to device buffer with NCWH. + * @param [out]: buffer: device buffer for store preprocess images + * @param [in]: bufferSize: device buffer size + * @param [in]: image: the preprocessed image to copy + * @return: > 0: data size of copped + * -1: copy failed + */ + int CopyImageMatData(uint8_t* buffer, uint32_t bufferSize, cv::Mat& image); + + /** + * @brief: Resize rgb opencv mat image data + * @param [out]: dest: the image data after resize + * @param [in]: src: origin imaga data + * @param [in]: width: resize width + * @param [in]: height: resize height + * @return: None + */ + void BgrResize(cv::Mat& dest, cv::Mat& src, + uint32_t width, uint32_t height); + + /** + * @brief: Inference the preprocessed face images data + * @param [in]: normalizedImgs: the preprocessed image data + * @param [in]: faceImgs: the face images data cropped + * from origin image + * @return: ATLAS_OK: normalize success + * ATLAS_ERROR: normalize failed + */ + AtlasError Inference(std::vector &normalizedImgs, + std::vector &faceImgs); + + /** + * @brief: Parse face feature point coordinate from model + * inference output data + * @param [out]: faceFeature: face feature point coordinate + * @param [in]: facePosition: model inference output data + * @return: None + */ + void ParseFacePosition(FaceFeature *faceFeature, int *facePosition); + + /** + * @brief: Preprocess image for face feature inference, include crop + * faces in image, resize the cropped image, transform to bgr, + * normalinze, and copy to acl device + * @param [out]: processedImgs: preprocessed face images data + * @param [in]: recogInfo: message data from last(face detection) thread + * @return: None + */ + AtlasError PreProcess(std::vector& processedImgs, + std::shared_ptr &recogInfo); + + + /** + * @brief: Process model inference output of one batch face images + * @param [in]: inferenceOutput: model inference output + * @param [in]: startIdx: begin index in the faceImgs + * @param [in]: faceCnt: inference image number + * @param [in]: faceImgs: face images + */ + AtlasError PostProcess(std::vector& inferenceOutput, + int startIdx, int faceCnt, + std::vector& faceImgs); + + /** + * @brief: Process MSG_FACE_DETECT_DATA message + * @param [in]: recogInfo: message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, the thread will exit + */ + AtlasError FaceDetectMsgProcess( + shared_ptr recogInfo); + + +private: + AtlasModel model_; + DvppProcess dvpp_; + int32_t batchSize_; + // Mean value after trained + cv::Mat trainMean_; + // Std value after trained + cv::Mat trainStd_; + uint32_t inputSize_; + uint8_t* inputBuf_; + int *facePositionBuf_; +}; + +#endif diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_train_mean.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_train_mean.h new file mode 100644 index 0000000..943f4d0 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_train_mean.h @@ -0,0 +1,156 @@ +/** +* Copyright 2020 Huawei Technologies 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 FACE_FEATURE_MASK_MEAN_H_ +#define FACE_FEATURE_MASK_MEAN_H_ +const float kTrainMean[4800] = { + 69, 81, 98, 69, 83, 101, 71, 85, 105, 73, 88, 111, 76, 92, 118, 80, 98, 126, 84, 103, 134, 89, 109, 142, 93, 114, 149, 98, 119, 156, 102, 124, 162, 107, 129, 168, 111, + 133, 173, 115, 137, 177, 118, 140, 181, 121, 143, 183, 123, 144, 185, 124, 146, 187, 125, 147, 187, 126, 147, 188, 126, 147, 188, 126, 147, 188, 125, 146, 187, 124, 145, + 186, 122, 144, 185, 120, 142, 183, 117, 139, 180, 114, 136, 176, 110, 132, 172, 106, 128, 167, 101, 123, 161, 97, 118, 154, 92, 113, 147, 87, 107, 139, 83, 101, 131, 78, + 96, 123, 74, 90, 114, 70, 85, 107, 68, 82, 101, 68, 80, 97, 69, 81, 98, 69, 83, 102, 71, 85, 107, 73, 89, 113, 77, 94, 121, 81, 100, 129, 86, 106, 137, 91, 111, 145, 95, + 116, 152, 100, 122, 159, 105, 127, 166, 110, 131, 171, 114, 136, 176, 118, 139, 180, 121, 143, 184, 124, 145, 187, 126, 147, 189, 127, 149, 190, 128, 149, 191, 129, 150, + 191, 129, 150, 191, 128, 149, 191, 128, 149, 191, 126, 148, 190, 125, 146, 188, 123, 144, 186, 120, 142, 183, 116, 138, 180, 112, 135, 175, 108, 131, 170, 104, 126, 165, + 99, 121, 158, 94, 115, 151, 89, 110, 143, 84, 104, 135, 80, 98, 126, 75, 92, 117, 71, 86, 109, 69, 83, 102, 68, 81, 98, 69, 82, 99, 70, 83, 103, 71, 86, 108, 74, 90, 115, + 78, 96, 123, 83, 101, 132, 88, 107, 140, 92, 113, 148, 97, 118, 155, 102, 123, 161, 107, 128, 168, 111, 133, 173, 115, 137, 178, 119, 141, 182, 123, 144, 186, 125, 147, + 189, 128, 149, 191, 129, 151, 192, 130, 151, 193, 131, 152, 194, 131, 152, 194, 130, 152, 194, 130, 151, 193, 128, 150, 192, 127, 148, 190, 124, 146, 188, 122, 143, 185, + 118, 140, 181, 114, 136, 177, 110, 132, 172, 106, 128, 167, 101, 123, 160, 96, 117, 154, 91, 112, 146, 86, 106, 137, 81, 100, 129, 77, 94, 120, 72, 88, 111, 69, 83, 104, + 68, 81, 99, 69, 82, 100, 70, 84, 104, 72, 87, 110, 75, 91, 117, 79, 97, 125, 84, 103, 134, 89, 109, 142, 94, 114, 149, 98, 119, 156, 102, 124, 162, 107, 129, 168, 111, 133, + 173, 115, 137, 178, 119, 141, 182, 123, 144, 186, 126, 147, 189, 128, 149, 191, 130, 151, 193, 131, 152, 194, 132, 153, 195, 132, 153, 195, 131, 153, 195, 131, 152, 194, + 129, 150, 193, 127, 148, 190, 125, 146, 188, 121, 143, 184, 118, 139, 180, 114, 136, 176, 110, 132, 172, 106, 128, 167, 102, 123, 161, 97, 118, 155, 92, 113, 147, 87, 107, + 139, 82, 101, 131, 77, 95, 122, 73, 89, 114, 70, 84, 106, 68, 82, 101, 69, 82, 101, 70, 84, 105, 72, 88, 111, 76, 92, 118, 80, 98, 127, 85, 104, 135, 89, 109, 143, 94, 115, + 150, 98, 119, 156, 102, 123, 161, 106, 128, 166, 110, 131, 171, 114, 135, 175, 117, 138, 179, 121, 142, 183, 124, 145, 187, 127, 148, 190, 129, 150, 193, 131, 152, 195, + 132, 153, 196, 132, 153, 196, 131, 152, 195, 130, 151, 194, 128, 149, 191, 125, 146, 188, 122, 143, 185, 119, 140, 181, 116, 137, 177, 112, 133, 173, 109, 130, 169, 105, + 126, 165, 101, 122, 160, 97, 118, 154, 92, 113, 148, 88, 108, 141, 83, 102, 133, 78, 96, 124, 74, 91, 116, 71, 86, 108, 69, 82, 102, 69, 83, 102, 71, 85, 107, 73, 89, 113, + 76, 93, 120, 81, 99, 128, 85, 105, 136, 90, 110, 143, 94, 114, 149, 97, 118, 154, 101, 121, 158, 104, 125, 163, 107, 128, 166, 110, 130, 170, 113, 133, 173, 116, 137, 178, + 120, 141, 182, 124, 144, 186, 127, 148, 190, 129, 150, 193, 130, 151, 194, 131, 151, 195, 130, 151, 194, 128, 149, 191, 125, 146, 188, 122, 142, 184, 118, 138, 179, 115, + 135, 175, 111, 131, 171, 108, 129, 168, 106, 126, 164, 103, 123, 161, 100, 120, 157, 96, 117, 153, 92, 113, 148, 88, 108, 141, 84, 103, 134, 79, 97, 126, 75, 92, 118, 71, + 87, 110, 69, 83, 104, 70, 84, 103, 72, 86, 108, 74, 90, 115, 77, 95, 122, 82, 100, 129, 86, 105, 136, 89, 109, 142, 92, 112, 147, 95, 115, 151, 98, 118, 154, 100, 120, 157, + 103, 122, 160, 105, 124, 163, 107, 127, 166, 110, 130, 170, 114, 134, 175, 118, 139, 180, 122, 143, 185, 125, 146, 189, 127, 148, 192, 128, 149, 192, 126, 147, 190, 123, + 144, 187, 120, 140, 182, 115, 136, 177, 111, 131, 172, 108, 128, 167, 105, 125, 163, 103, 122, 160, 101, 120, 158, 99, 119, 156, 97, 117, 154, 95, 115, 150, 92, 112, 146, + 88, 108, 141, 84, 103, 135, 80, 98, 127, 76, 93, 120, 73, 88, 112, 70, 84, 105, 71, 84, 105, 72, 87, 110, 75, 91, 117, 78, 96, 123, 82, 100, 130, 85, 104, 136, 88, 107, + 140, 90, 110, 144, 92, 111, 146, 94, 113, 148, 96, 114, 150, 97, 116, 152, 99, 117, 154, 101, 119, 157, 103, 122, 161, 106, 126, 166, 111, 131, 172, 116, 136, 179, 120, + 141, 184, 123, 144, 188, 124, 145, 188, 122, 143, 186, 118, 139, 182, 113, 133, 175, 108, 128, 169, 104, 123, 163, 101, 119, 158, 98, 117, 154, 97, 115, 151, 96, 114, 150, + 95, 113, 149, 94, 113, 148, 92, 112, 147, 90, 110, 144, 87, 107, 140, 84, 103, 135, 81, 99, 129, 78, 95, 122, 74, 90, 115, 71, 85, 107, 71, 85, 107, 74, 89, 112, 77, 93, + 119, 80, 97, 125, 83, 101, 131, 85, 104, 136, 87, 106, 139, 88, 107, 141, 89, 107, 141, 90, 107, 141, 90, 108, 142, 91, 108, 142, 92, 109, 144, 94, 111, 147, 96, 114, 151, + 99, 118, 157, 103, 123, 164, 108, 129, 171, 114, 135, 178, 118, 140, 183, 119, 141, 184, 117, 138, 182, 112, 133, 176, 106, 126, 168, 101, 120, 160, 97, 115, 154, 94, 111, + 148, 91, 108, 144, 91, 107, 142, 90, 107, 141, 89, 107, 141, 89, 107, 141, 89, 107, 142, 88, 107, 141, 86, 106, 139, 84, 103, 135, 82, 100, 130, 79, 97, 124, 76, 92, 117, + 73, 87, 110, 73, 87, 109, 75, 91, 115, 78, 94, 121, 81, 99, 127, 84, 102, 133, 85, 104, 136, 86, 104, 137, 86, 104, 138, 86, 103, 137, 86, 102, 136, 86, 102, 135, 86, 102, + 134, 87, 102, 136, 88, 104, 139, 90, 107, 143, 93, 111, 149, 97, 116, 156, 103, 123, 165, 109, 130, 173, 114, 136, 179, 116, 137, 181, 113, 134, 177, 107, 128, 170, 100, + 120, 162, 95, 114, 153, 91, 109, 147, 88, 105, 141, 86, 102, 136, 85, 100, 133, 85, 100, 132, 85, 101, 133, 85, 102, 135, 85, 103, 137, 85, 104, 138, 86, 105, 138, 85, 104, + 136, 83, 102, 132, 81, 98, 127, 77, 94, 120, 74, 89, 113, 74, 89, 112, 77, 92, 118, 80, 96, 124, 83, 100, 130, 85, 104, 135, 86, 105, 137, 85, 104, 137, 85, 103, 136, 84, + 101, 134, 83, 99, 132, 83, 98, 130, 83, 97, 129, 83, 97, 130, 84, 99, 132, 86, 102, 138, 88, 106, 144, 92, 111, 151, 98, 119, 160, 106, 127, 170, 111, 133, 177, 113, 135, + 179, 110, 132, 175, 104, 125, 167, 96, 116, 158, 91, 109, 149, 87, 104, 141, 84, 100, 135, 82, 97, 130, 81, 95, 127, 81, 95, 126, 81, 96, 128, 83, 99, 132, 84, 101, 135, + 85, 103, 137, 85, 104, 138, 85, 105, 137, 84, 103, 135, 82, 100, 130, 79, 96, 123, 76, 92, 117, 76, 91, 115, 78, 94, 121, 82, 99, 127, 85, 103, 133, 87, 106, 138, 88, 106, + 140, 86, 105, 139, 85, 103, 137, 84, 100, 134, 82, 97, 130, 81, 96, 127, 81, 95, 126, 82, 95, 127, 83, 97, 131, 86, 101, 136, 88, 105, 143, 91, 110, 150, 97, 117, 159, 104, + 126, 169, 110, 132, 176, 113, 135, 179, 110, 131, 175, 103, 124, 167, 96, 115, 157, 90, 108, 148, 86, 103, 141, 84, 99, 134, 83, 96, 130, 81, 94, 126, 80, 94, 125, 80, 95, + 127, 82, 98, 131, 83, 100, 135, 85, 104, 138, 87, 106, 140, 87, 107, 140, 86, 105, 138, 84, 103, 133, 81, 98, 127, 78, 94, 120, 77, 93, 118, 80, 97, 124, 84, 101, 130, 87, + 105, 136, 89, 108, 141, 90, 109, 143, 89, 108, 143, 88, 106, 141, 86, 103, 137, 85, 100, 134, 84, 98, 131, 83, 97, 129, 84, 97, 130, 85, 99, 134, 87, 103, 139, 90, 107, + 145, 93, 111, 152, 98, 119, 161, 105, 126, 170, 111, 133, 177, 114, 136, 180, 111, 133, 177, 105, 126, 169, 98, 118, 160, 92, 111, 152, 89, 106, 145, 87, 102, 138, 86, 100, + 134, 84, 98, 131, 83, 97, 130, 84, 98, 131, 85, 101, 135, 86, 104, 139, 88, 107, 142, 90, 109, 145, 90, 110, 144, 89, 108, 141, 87, 105, 137, 83, 101, 130, 80, 96, 123, 79, + 94, 120, 82, 98, 126, 85, 103, 133, 89, 108, 140, 92, 111, 145, 94, 113, 148, 93, 112, 148, 93, 111, 148, 92, 109, 145, 91, 107, 142, 90, 105, 140, 89, 104, 138, 89, 104, + 138, 90, 105, 141, 92, 108, 145, 94, 111, 151, 96, 115, 157, 102, 122, 165, 108, 129, 173, 113, 135, 180, 116, 137, 183, 113, 135, 180, 108, 129, 174, 102, 122, 166, 97, + 116, 158, 95, 112, 152, 93, 109, 146, 91, 106, 142, 90, 104, 139, 90, 104, 139, 90, 105, 141, 91, 108, 144, 92, 110, 147, 93, 112, 149, 94, 114, 151, 94, 114, 150, 92, 112, + 146, 89, 108, 140, 85, 103, 133, 81, 98, 126, 80, 96, 122, 83, 100, 129, 87, 105, 136, 91, 110, 143, 95, 114, 149, 97, 117, 153, 98, 118, 155, 98, 118, 156, 98, 116, 154, + 98, 115, 153, 97, 113, 151, 97, 112, 150, 97, 113, 150, 97, 113, 151, 98, 115, 154, 100, 118, 159, 102, 121, 164, 106, 126, 170, 111, 132, 178, 116, 138, 184, 118, 140, + 186, 116, 138, 184, 112, 133, 178, 107, 127, 172, 103, 122, 165, 101, 119, 160, 99, 116, 156, 99, 115, 153, 98, 113, 151, 97, 113, 151, 97, 114, 152, 98, 116, 154, 99, 118, + 156, 99, 119, 158, 99, 119, 157, 98, 118, 155, 95, 115, 150, 91, 110, 144, 87, 105, 136, 83, 100, 129, 81, 97, 124, 84, 101, 131, 88, 106, 138, 93, 112, 145, 97, 117, 152, + 100, 120, 158, 103, 123, 161, 104, 124, 164, 105, 124, 164, 106, 124, 164, 106, 123, 164, 106, 123, 163, 106, 123, 163, 105, 123, 163, 105, 123, 165, 105, 124, 167, 107, + 127, 171, 110, 131, 176, 115, 136, 183, 119, 140, 188, 121, 142, 189, 119, 140, 188, 115, 137, 183, 111, 132, 178, 108, 128, 173, 106, 125, 169, 106, 124, 166, 106, 123, + 164, 106, 123, 164, 106, 123, 164, 106, 124, 165, 106, 125, 166, 106, 126, 166, 105, 126, 166, 104, 124, 163, 101, 121, 159, 97, 117, 153, 93, 112, 146, 88, 107, 138, 84, + 101, 131, 82, 98, 126, 85, 102, 132, 89, 107, 139, 94, 113, 147, 99, 118, 155, 103, 123, 161, 106, 127, 167, 109, 129, 171, 111, 131, 173, 112, 132, 174, 113, 132, 174, + 113, 131, 174, 113, 131, 174, 112, 131, 174, 111, 130, 174, 110, 130, 175, 111, 132, 177, 114, 135, 181, 118, 139, 186, 121, 143, 191, 123, 144, 192, 121, 143, 191, 118, + 140, 187, 115, 136, 183, 112, 133, 179, 112, 132, 177, 112, 131, 175, 113, 132, 175, 114, 132, 175, 114, 132, 175, 114, 133, 176, 114, 133, 176, 112, 132, 175, 110, 131, + 173, 107, 128, 169, 103, 123, 162, 98, 118, 155, 94, 113, 148, 89, 107, 140, 85, 102, 132, 83, 99, 126, 86, 102, 132, 89, 107, 139, 94, 113, 148, 99, 119, 156, 104, 124, + 163, 109, 129, 170, 113, 133, 175, 116, 136, 179, 118, 137, 182, 119, 138, 183, 119, 138, 183, 119, 138, 183, 117, 136, 182, 115, 135, 181, 114, 134, 180, 114, 135, 182, + 116, 137, 185, 120, 141, 189, 123, 144, 193, 124, 145, 194, 123, 144, 193, 120, 141, 190, 117, 138, 186, 115, 136, 183, 115, 136, 182, 117, 136, 182, 118, 138, 183, 119, + 139, 184, 120, 139, 184, 120, 140, 184, 119, 139, 184, 117, 137, 182, 114, 134, 178, 110, 130, 172, 104, 125, 165, 99, 119, 157, 94, 113, 148, 89, 107, 140, 85, 103, 133, + 83, 99, 126, 85, 102, 132, 89, 106, 139, 93, 112, 147, 99, 118, 156, 104, 124, 164, 109, 130, 172, 114, 135, 178, 118, 138, 183, 121, 141, 187, 123, 142, 189, 123, 142, + 189, 122, 142, 188, 120, 140, 187, 118, 138, 185, 116, 136, 184, 116, 136, 184, 117, 138, 186, 121, 141, 190, 123, 144, 193, 124, 145, 194, 123, 144, 193, 120, 141, 190, + 118, 138, 187, 116, 137, 185, 116, 137, 184, 118, 138, 186, 121, 141, 188, 123, 143, 189, 124, 144, 190, 124, 144, 190, 122, 142, 189, 119, 140, 185, 115, 136, 180, 110, + 131, 173, 104, 124, 165, 98, 118, 156, 93, 112, 148, 88, 107, 139, 85, 102, 133, 83, 99, 126, 85, 102, 132, 88, 106, 138, 92, 111, 146, 98, 117, 155, 103, 123, 163, 109, + 129, 171, 114, 135, 179, 119, 139, 185, 122, 143, 189, 124, 144, 192, 124, 144, 192, 123, 143, 191, 121, 141, 189, 118, 138, 186, 115, 136, 184, 115, 135, 184, 116, 136, + 186, 119, 139, 188, 122, 141, 191, 123, 142, 192, 121, 141, 191, 119, 139, 188, 116, 136, 186, 115, 135, 184, 115, 135, 184, 117, 138, 186, 121, 141, 189, 124, 144, 192, + 125, 145, 193, 125, 145, 193, 123, 143, 191, 120, 140, 187, 115, 136, 181, 109, 130, 173, 103, 123, 164, 97, 117, 155, 92, 111, 147, 88, 106, 138, 85, 102, 132, 83, 99, + 126, 85, 102, 131, 88, 105, 137, 91, 110, 144, 96, 115, 153, 101, 121, 161, 107, 127, 170, 113, 133, 178, 118, 138, 184, 121, 142, 189, 123, 143, 192, 124, 144, 192, 122, + 142, 191, 120, 140, 188, 116, 136, 185, 113, 133, 182, 112, 132, 181, 113, 132, 182, 116, 135, 184, 118, 137, 186, 118, 137, 187, 117, 136, 186, 115, 134, 184, 113, 132, + 182, 112, 132, 181, 113, 132, 182, 115, 135, 184, 119, 139, 187, 122, 142, 191, 124, 144, 192, 124, 144, 192, 122, 142, 190, 118, 139, 186, 113, 134, 179, 107, 128, 171, + 101, 121, 162, 96, 115, 153, 91, 110, 145, 87, 105, 137, 85, 101, 131, 83, 98, 125, 85, 101, 130, 87, 104, 135, 90, 108, 142, 94, 113, 150, 99, 119, 159, 105, 125, 167, + 110, 130, 175, 115, 135, 182, 119, 139, 187, 121, 141, 190, 121, 142, 191, 120, 140, 189, 117, 137, 186, 114, 133, 182, 111, 130, 179, 109, 128, 177, 109, 128, 177, 110, + 129, 178, 112, 130, 179, 113, 131, 180, 112, 130, 179, 110, 129, 178, 109, 128, 177, 109, 128, 177, 110, 129, 178, 112, 132, 181, 116, 135, 184, 119, 139, 188, 121, 141, + 190, 121, 141, 190, 119, 139, 188, 115, 136, 183, 110, 131, 177, 105, 125, 168, 99, 119, 159, 94, 113, 151, 89, 108, 143, 86, 104, 136, 84, 101, 130, 83, 98, 124, 84, 100, + 128, 86, 103, 134, 89, 107, 140, 93, 112, 148, 97, 117, 156, 102, 122, 164, 107, 127, 172, 112, 132, 179, 115, 136, 184, 118, 138, 187, 118, 138, 188, 117, 137, 187, 115, + 134, 184, 111, 131, 180, 108, 127, 176, 106, 124, 173, 105, 123, 172, 105, 123, 172, 106, 124, 172, 107, 124, 173, 106, 124, 172, 105, 123, 172, 104, 123, 171, 105, 123, + 172, 107, 126, 175, 110, 129, 178, 113, 133, 181, 115, 136, 185, 117, 137, 186, 117, 137, 186, 115, 136, 184, 112, 132, 180, 107, 128, 173, 102, 122, 165, 96, 116, 157, 92, + 111, 148, 88, 106, 140, 85, 103, 134, 84, 100, 128, 83, 98, 123, 84, 100, 127, 86, 102, 132, 88, 106, 138, 92, 110, 146, 96, 115, 153, 100, 120, 161, 104, 124, 168, 108, + 128, 174, 111, 132, 179, 113, 134, 182, 114, 135, 183, 114, 134, 183, 112, 132, 181, 110, 129, 177, 107, 125, 174, 104, 122, 171, 103, 120, 168, 102, 119, 167, 102, 119, + 167, 102, 119, 167, 102, 119, 167, 102, 119, 167, 102, 120, 167, 103, 121, 169, 105, 124, 172, 108, 127, 175, 110, 130, 178, 112, 132, 181, 113, 133, 182, 112, 133, 181, + 111, 132, 180, 108, 129, 175, 104, 124, 169, 99, 119, 162, 94, 114, 153, 90, 110, 146, 87, 105, 139, 84, 102, 132, 83, 99, 127, 83, 98, 122, 84, 99, 125, 85, 102, 130, 87, + 104, 136, 90, 109, 143, 94, 113, 150, 97, 117, 157, 101, 121, 164, 104, 125, 170, 107, 128, 175, 109, 130, 178, 110, 131, 179, 110, 131, 178, 109, 129, 177, 108, 127, 175, + 106, 125, 172, 104, 122, 169, 103, 120, 167, 102, 118, 166, 101, 118, 165, 101, 118, 165, 101, 118, 165, 101, 118, 165, 102, 119, 166, 103, 121, 168, 105, 123, 170, 107, + 126, 173, 108, 128, 175, 109, 129, 177, 109, 129, 177, 108, 129, 177, 107, 128, 175, 104, 126, 171, 101, 122, 165, 96, 117, 158, 92, 112, 151, 89, 108, 143, 86, 104, 136, + 84, 101, 130, 83, 98, 126, 82, 97, 120, 83, 98, 124, 85, 100, 128, 87, 103, 134, 89, 107, 141, 92, 111, 148, 95, 115, 154, 98, 119, 160, 101, 122, 166, 104, 125, 170, 105, + 126, 173, 106, 127, 174, 106, 127, 173, 106, 126, 173, 106, 125, 172, 106, 124, 170, 105, 122, 169, 104, 121, 167, 103, 119, 166, 103, 119, 165, 103, 118, 165, 103, 118, + 165, 103, 119, 165, 103, 120, 166, 104, 121, 167, 104, 123, 169, 105, 124, 170, 106, 125, 171, 105, 126, 172, 105, 126, 172, 104, 126, 172, 103, 125, 170, 101, 123, 167, + 98, 119, 161, 94, 115, 155, 91, 111, 148, 88, 107, 141, 85, 103, 134, 83, 100, 129, 82, 98, 124, 82, 96, 119, 83, 97, 122, 84, 100, 127, 86, 103, 132, 89, 106, 138, 91, + 110, 145, 94, 114, 151, 96, 117, 157, 99, 120, 163, 101, 122, 166, 102, 123, 168, 102, 123, 169, 102, 123, 168, 103, 122, 168, 103, 122, 167, 104, 121, 167, 104, 121, 167, + 104, 120, 166, 104, 119, 166, 104, 119, 166, 104, 119, 166, 104, 119, 165, 103, 119, 165, 103, 119, 165, 103, 119, 165, 103, 120, 166, 103, 121, 166, 102, 121, 166, 102, + 122, 167, 102, 122, 168, 101, 123, 168, 101, 122, 167, 99, 121, 163, 96, 117, 158, 93, 113, 152, 90, 109, 145, 87, 106, 139, 85, 102, 133, 83, 99, 127, 82, 97, 123, 82, 95, + 117, 82, 96, 120, 84, 99, 124, 85, 102, 130, 88, 105, 136, 91, 109, 143, 93, 113, 149, 96, 116, 155, 98, 119, 160, 99, 121, 163, 100, 121, 165, 99, 120, 165, 99, 119, 164, + 99, 118, 163, 99, 117, 162, 100, 117, 163, 101, 117, 163, 102, 117, 164, 103, 117, 164, 103, 117, 165, 103, 117, 165, 103, 117, 164, 102, 117, 164, 101, 116, 163, 100, 115, + 162, 99, 115, 161, 98, 115, 160, 98, 116, 161, 98, 118, 162, 99, 119, 163, 99, 121, 164, 99, 121, 163, 97, 119, 161, 95, 116, 155, 92, 112, 149, 89, 108, 143, 87, 105, 137, + 85, 102, 131, 83, 99, 125, 82, 97, 121, 82, 95, 116, 82, 96, 119, 83, 98, 123, 85, 101, 128, 87, 104, 134, 90, 108, 140, 92, 112, 147, 95, 115, 152, 97, 118, 157, 98, 120, + 161, 98, 120, 162, 98, 119, 162, 97, 116, 160, 95, 114, 158, 95, 112, 157, 96, 112, 157, 97, 112, 158, 99, 113, 160, 101, 114, 162, 102, 114, 163, 102, 115, 163, 102, 114, + 163, 101, 113, 161, 99, 112, 160, 97, 111, 158, 95, 110, 156, 94, 111, 156, 94, 112, 157, 95, 115, 158, 97, 117, 160, 98, 119, 162, 98, 119, 161, 96, 118, 158, 94, 115, + 153, 91, 111, 147, 88, 107, 140, 86, 104, 134, 84, 101, 129, 83, 98, 124, 82, 96, 120, 81, 94, 115, 82, 95, 117, 82, 97, 121, 84, 99, 125, 86, 103, 131, 89, 106, 137, 91, + 110, 144, 94, 114, 150, 96, 117, 155, 98, 119, 159, 98, 119, 161, 97, 118, 160, 95, 115, 159, 94, 112, 156, 92, 109, 154, 92, 107, 154, 94, 108, 155, 96, 109, 157, 99, 110, + 159, 100, 111, 160, 101, 112, 161, 100, 112, 161, 99, 111, 160, 97, 109, 158, 95, 108, 156, 93, 107, 154, 93, 108, 154, 93, 111, 155, 94, 114, 157, 96, 117, 159, 97, 118, + 160, 97, 118, 159, 95, 117, 155, 93, 113, 150, 90, 109, 144, 87, 105, 138, 85, 102, 132, 83, 99, 126, 82, 97, 122, 81, 95, 118, 81, 93, 113, 81, 94, 116, 82, 96, 119, 83, + 98, 123, 85, 101, 128, 87, 104, 134, 90, 108, 141, 93, 112, 147, 95, 116, 152, 97, 118, 157, 98, 119, 160, 97, 118, 160, 96, 116, 159, 94, 113, 157, 93, 109, 155, 92, 107, + 154, 94, 107, 155, 96, 107, 157, 98, 109, 159, 99, 110, 160, 100, 110, 161, 100, 110, 161, 98, 109, 159, 96, 108, 157, 94, 107, 156, 93, 107, 155, 93, 108, 155, 94, 111, + 156, 95, 114, 158, 96, 117, 159, 97, 118, 159, 96, 118, 157, 94, 115, 152, 91, 111, 147, 88, 107, 141, 86, 104, 135, 84, 101, 129, 82, 98, 124, 81, 96, 120, 80, 93, 116, + 80, 92, 112, 80, 93, 114, 81, 95, 117, 82, 96, 121, 83, 99, 125, 86, 102, 131, 88, 106, 137, 91, 110, 143, 93, 113, 149, 96, 117, 154, 98, 119, 158, 98, 119, 160, 97, 117, + 161, 96, 115, 160, 95, 112, 159, 94, 109, 158, 95, 108, 158, 97, 108, 159, 98, 109, 161, 100, 110, 162, 100, 110, 162, 100, 110, 162, 99, 109, 161, 97, 108, 159, 96, 108, + 158, 95, 109, 158, 95, 111, 158, 96, 114, 159, 97, 116, 160, 97, 118, 160, 97, 118, 158, 95, 116, 154, 92, 113, 149, 89, 109, 143, 86, 105, 137, 84, 102, 131, 83, 99, 126, + 82, 97, 122, 80, 94, 117, 79, 92, 114, 80, 92, 111, 80, 92, 112, 81, 93, 115, 81, 95, 118, 82, 97, 123, 84, 100, 128, 86, 104, 133, 89, 107, 139, 92, 111, 145, 94, 115, + 151, 97, 118, 156, 98, 119, 159, 98, 119, 161, 98, 118, 162, 98, 115, 162, 97, 113, 162, 97, 112, 162, 98, 111, 163, 99, 111, 164, 101, 112, 165, 101, 112, 165, 101, 112, + 165, 100, 111, 164, 99, 111, 163, 98, 112, 162, 98, 113, 162, 98, 115, 162, 98, 117, 162, 98, 119, 162, 98, 119, 160, 96, 117, 156, 93, 114, 151, 90, 110, 145, 87, 106, + 139, 85, 103, 133, 83, 100, 128, 82, 97, 123, 80, 95, 119, 79, 93, 115, 79, 92, 112, 80, 91, 110, 80, 91, 111, 80, 92, 113, 80, 93, 116, 81, 95, 120, 83, 98, 124, 84, 101, + 129, 86, 104, 135, 89, 108, 141, 92, 112, 147, 95, 115, 152, 97, 118, 157, 99, 119, 160, 100, 120, 163, 100, 119, 164, 100, 117, 165, 100, 116, 165, 100, 115, 166, 101, + 114, 166, 102, 114, 167, 102, 114, 167, 102, 114, 167, 101, 114, 166, 101, 115, 166, 101, 116, 166, 101, 117, 165, 100, 119, 165, 100, 120, 164, 99, 120, 161, 97, 118, 158, + 95, 115, 153, 91, 111, 147, 88, 107, 141, 85, 104, 135, 83, 100, 130, 82, 98, 125, 80, 95, 121, 79, 93, 117, 79, 92, 114, 79, 91, 111, 80, 91, 109, 80, 91, 110, 79, 91, + 112, 79, 92, 114, 80, 94, 117, 81, 95, 121, 82, 98, 125, 85, 101, 131, 87, 105, 136, 90, 109, 142, 93, 113, 148, 95, 116, 154, 98, 119, 158, 100, 120, 162, 101, 121, 165, + 102, 121, 167, 102, 120, 168, 103, 119, 168, 103, 118, 169, 103, 118, 169, 103, 118, 169, 103, 118, 169, 103, 118, 169, 103, 119, 168, 103, 120, 168, 102, 121, 167, 102, + 121, 166, 100, 121, 163, 98, 119, 159, 96, 116, 155, 93, 113, 149, 89, 109, 143, 86, 104, 136, 83, 101, 131, 82, 98, 126, 80, 96, 122, 80, 94, 118, 79, 92, 115, 78, 91, + 112, 79, 91, 110, 81, 91, 109, 80, 91, 109, 79, 90, 110, 79, 91, 112, 79, 92, 115, 80, 94, 118, 81, 96, 122, 83, 99, 127, 85, 102, 132, 87, 106, 138, 90, 110, 144, 93, 113, + 149, 96, 117, 155, 99, 119, 160, 102, 122, 164, 103, 123, 167, 104, 123, 169, 105, 123, 170, 105, 122, 171, 105, 122, 171, 106, 122, 171, 106, 122, 171, 105, 122, 171, 105, + 122, 170, 105, 123, 169, 104, 123, 168, 102, 122, 165, 100, 120, 161, 97, 117, 156, 94, 114, 151, 90, 110, 144, 87, 106, 138, 84, 101, 132, 82, 98, 127, 80, 96, 123, 79, + 94, 119, 79, 93, 116, 78, 91, 113, 78, 91, 111, 79, 91, 110, 81, 91, 108, 80, 90, 109, 79, 90, 110, 79, 90, 111, 79, 91, 113, 79, 92, 116, 79, 93, 119, 81, 96, 123, 83, 99, + 128, 85, 102, 133, 88, 106, 138, 91, 110, 144, 94, 114, 150, 97, 117, 156, 100, 120, 161, 103, 123, 165, 105, 124, 168, 106, 125, 170, 107, 125, 172, 108, 125, 173, 108, + 125, 173, 108, 125, 173, 108, 125, 172, 107, 125, 171, 106, 125, 169, 104, 123, 166, 101, 121, 162, 98, 118, 157, 95, 115, 152, 91, 111, 146, 88, 106, 139, 84, 102, 133, + 82, 99, 128, 80, 96, 123, 79, 94, 120, 79, 93, 117, 79, 92, 115, 78, 91, 112, 79, 91, 111, 80, 91, 110, 82, 92, 109, 81, 91, 109, 80, 91, 110, 79, 90, 110, 79, 91, 112, 79, + 91, 114, 78, 92, 116, 79, 94, 120, 81, 96, 124, 83, 99, 128, 85, 102, 133, 88, 106, 139, 91, 110, 145, 94, 114, 151, 98, 117, 156, 101, 121, 161, 104, 123, 166, 106, 125, + 169, 108, 126, 171, 109, 127, 172, 109, 127, 173, 109, 127, 172, 108, 126, 171, 107, 125, 169, 105, 124, 167, 102, 121, 163, 99, 118, 158, 96, 115, 152, 92, 111, 147, 89, + 107, 140, 85, 103, 134, 82, 99, 128, 80, 96, 124, 79, 94, 120, 78, 93, 118, 78, 92, 116, 79, 92, 114, 79, 91, 112, 80, 92, 111, 81, 92, 110, 82, 92, 109, 82, 92, 109, 81, + 91, 110, 80, 91, 110, 79, 90, 111, 78, 90, 113, 78, 91, 114, 78, 92, 117, 79, 94, 120, 81, 96, 124, 82, 99, 128, 84, 102, 133, 87, 105, 138, 91, 109, 144, 94, 113, 150, 97, + 116, 155, 100, 119, 160, 103, 122, 164, 105, 123, 166, 106, 124, 168, 107, 125, 169, 106, 124, 168, 105, 124, 167, 104, 122, 164, 101, 120, 161, 98, 117, 156, 95, 114, 151, + 92, 110, 146, 89, 107, 140, 85, 102, 134, 82, 99, 129, 80, 96, 124, 79, 94, 121, 78, 93, 118, 78, 92, 116, 79, 92, 114, 79, 91, 113, 80, 92, 112, 82, 93, 112, 82, 93, 111, + 83, 93, 109, 83, 92, 110, 82, 92, 110, 81, 91, 111, 80, 91, 112, 79, 91, 112, 78, 91, 113, 78, 91, 115, 79, 93, 118, 79, 94, 121, 80, 96, 124, 82, 98, 127, 84, 100, 132, + 86, 104, 137, 89, 107, 142, 93, 111, 147, 95, 114, 152, 98, 116, 156, 100, 118, 159, 101, 119, 161, 102, 119, 162, 101, 119, 161, 100, 118, 159, 98, 116, 157, 96, 114, 153, + 94, 111, 149, 91, 108, 144, 88, 105, 139, 84, 101, 133, 82, 98, 128, 80, 96, 124, 79, 94, 121, 78, 92, 118, 78, 92, 116, 78, 91, 115, 79, 92, 114, 80, 92, 113, 82, 93, 113, + 83, 94, 112, 84, 94, 112 +}; + +#endif diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_train_std.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_train_std.h new file mode 100644 index 0000000..591ec55 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_feature_train_std.h @@ -0,0 +1,133 @@ +/** +* Copyright 2020 Huawei Technologies 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 FACE_FEATURE_MASK_STD_H_ +#define FACE_FEATURE_MASK_STD_H_ + +const float kTrainStd[4800] = {58, 61, 66, 57, 59, 65, 56, 58, 65, 54, 58, 65, 53, 57, 65, 53, 56, 65, 53, 56, 65, 53, 56, 65, 53, 55, 64, 52, 55, 63, 52, 54, 62, 52, 53, 60, 52, 53, 59, 52, 52, 57, +51, 51, 56, 51, 51, 55, 51, 51, 54, 51, 50, 54, 51, 50, 53, 51, 50, 53, 50, 50, 53, 51, 50, 53, 51, 50, 53, 51, 50, 53, 51, 50, 54, 51, 50, 54, 51, 51, 55, 51, 52, 57, 52, +52, 58, 52, 53, 59, 52, 54, 61, 53, 55, 62, 53, 56, 64, 53, 56, 65, 53, 56, 65, 53, 57, 65, 53, 57, 65, 54, 58, 65, 55, 58, 65, 57, 59, 65, 58, 60, 66, 57, 59, 65, 55, 58, +65, 54, 57, 65, 53, 56, 65, 53, 56, 64, 53, 55, 64, 52, 55, 63, 52, 54, 62, 52, 54, 61, 52, 53, 59, 51, 52, 58, 51, 51, 56, 50, 50, 55, 50, 50, 54, 50, 49, 53, 50, 49, 52, +50, 48, 51, 49, 48, 50, 49, 48, 50, 49, 48, 50, 49, 48, 50, 50, 48, 50, 50, 48, 51, 49, 48, 51, 50, 49, 52, 50, 49, 53, 50, 50, 54, 51, 51, 56, 51, 52, 57, 52, 53, 59, 52, +54, 61, 52, 55, 62, 52, 55, 64, 53, 56, 64, 53, 56, 65, 53, 57, 65, 54, 57, 65, 54, 58, 65, 56, 59, 65, 58, 60, 65, 56, 59, 65, 55, 58, 65, 54, 57, 65, 53, 56, 64, 53, 56, +64, 52, 55, 63, 52, 54, 62, 52, 53, 61, 51, 53, 59, 51, 52, 58, 50, 51, 56, 50, 50, 54, 50, 49, 53, 49, 48, 51, 49, 48, 50, 49, 47, 49, 49, 47, 49, 48, 47, 48, 48, 46, 48, +48, 46, 48, 48, 46, 48, 48, 47, 48, 48, 47, 48, 48, 47, 49, 49, 47, 50, 49, 48, 51, 50, 49, 53, 50, 50, 54, 51, 51, 56, 51, 52, 58, 51, 53, 60, 52, 54, 61, 52, 54, 62, 52, +55, 64, 53, 56, 64, 53, 56, 65, 53, 56, 65, 54, 57, 64, 56, 58, 65, 57, 59, 65, 55, 58, 64, 55, 58, 65, 53, 56, 64, 53, 56, 64, 52, 55, 63, 52, 54, 62, 51, 53, 61, 51, 53, +59, 51, 52, 58, 50, 51, 56, 50, 50, 55, 50, 49, 53, 49, 48, 52, 49, 48, 50, 48, 47, 49, 48, 46, 48, 48, 46, 47, 47, 45, 46, 47, 45, 46, 47, 45, 46, 47, 45, 46, 47, 45, 46, +48, 46, 47, 48, 46, 48, 48, 47, 49, 49, 48, 50, 49, 49, 52, 50, 49, 53, 50, 50, 55, 50, 51, 56, 51, 52, 58, 51, 53, 60, 51, 53, 61, 52, 54, 62, 52, 55, 63, 53, 56, 64, 53, +56, 64, 54, 57, 64, 55, 58, 64, 57, 59, 65, 55, 58, 64, 54, 57, 64, 53, 56, 63, 52, 55, 63, 52, 54, 62, 51, 53, 61, 51, 53, 60, 50, 52, 58, 50, 51, 57, 50, 50, 56, 49, 50, +54, 49, 49, 53, 49, 49, 52, 49, 48, 50, 48, 47, 49, 47, 46, 47, 47, 45, 46, 46, 44, 44, 46, 44, 44, 46, 44, 44, 46, 44, 44, 47, 44, 45, 47, 45, 46, 48, 46, 48, 48, 47, 49, +49, 48, 51, 49, 49, 52, 49, 49, 53, 49, 49, 54, 50, 50, 55, 50, 51, 57, 50, 51, 58, 50, 52, 59, 51, 53, 61, 51, 54, 62, 52, 55, 63, 53, 56, 64, 53, 56, 64, 55, 58, 64, 56, +59, 64, 55, 57, 64, 54, 56, 64, 52, 55, 63, 52, 54, 62, 51, 54, 61, 50, 53, 60, 50, 52, 59, 50, 51, 57, 49, 51, 56, 49, 50, 55, 49, 50, 54, 49, 50, 54, 49, 49, 53, 49, 48, +51, 48, 47, 49, 48, 46, 47, 47, 44, 45, 46, 43, 44, 46, 43, 43, 46, 43, 43, 46, 43, 44, 47, 44, 45, 48, 45, 47, 48, 47, 49, 49, 48, 51, 49, 49, 52, 49, 49, 53, 49, 49, 54, +49, 49, 54, 49, 50, 55, 49, 50, 56, 49, 51, 57, 50, 51, 58, 50, 52, 60, 51, 54, 61, 52, 54, 63, 52, 55, 63, 53, 56, 64, 55, 58, 64, 56, 59, 64, 55, 57, 64, 53, 56, 63, 52, +55, 62, 51, 54, 61, 51, 53, 60, 50, 52, 59, 49, 51, 58, 49, 50, 57, 49, 50, 56, 49, 50, 55, 49, 50, 55, 49, 50, 55, 50, 50, 54, 50, 49, 53, 49, 48, 51, 48, 47, 49, 47, 45, +47, 46, 44, 45, 46, 43, 43, 46, 43, 43, 46, 43, 44, 47, 45, 46, 48, 46, 48, 49, 48, 50, 50, 49, 52, 50, 49, 54, 50, 50, 55, 50, 50, 55, 49, 50, 55, 49, 50, 55, 49, 50, 56, +49, 50, 56, 49, 51, 57, 50, 51, 58, 50, 53, 60, 51, 54, 62, 52, 55, 63, 53, 56, 64, 55, 57, 64, 56, 58, 64, 55, 57, 64, 53, 56, 63, 52, 54, 62, 51, 53, 60, 50, 52, 59, 49, +51, 58, 49, 50, 57, 48, 50, 56, 48, 49, 56, 49, 50, 56, 49, 50, 56, 49, 50, 56, 50, 50, 56, 50, 50, 55, 49, 49, 53, 49, 48, 51, 48, 46, 49, 47, 45, 46, 46, 43, 44, 45, 43, +44, 46, 44, 45, 47, 45, 47, 48, 47, 49, 49, 48, 52, 50, 50, 54, 50, 50, 55, 50, 51, 56, 50, 50, 56, 49, 50, 56, 48, 49, 56, 48, 49, 56, 48, 49, 56, 48, 50, 56, 49, 50, 57, +50, 52, 59, 51, 53, 61, 52, 55, 62, 53, 56, 63, 55, 57, 64, 56, 58, 64, 54, 57, 63, 53, 56, 63, 52, 54, 61, 51, 53, 60, 50, 51, 58, 49, 50, 57, 48, 50, 56, 48, 49, 56, 48, +50, 56, 48, 50, 56, 48, 50, 56, 49, 50, 56, 49, 50, 56, 49, 49, 55, 49, 49, 54, 48, 48, 52, 48, 47, 50, 47, 45, 47, 46, 44, 45, 45, 43, 44, 46, 44, 45, 47, 45, 48, 48, 47, +50, 49, 48, 53, 49, 49, 54, 49, 50, 56, 49, 50, 56, 49, 50, 57, 48, 50, 57, 48, 49, 56, 48, 49, 56, 47, 49, 55, 47, 49, 56, 48, 50, 57, 49, 51, 58, 50, 53, 60, 52, 54, 62, +53, 56, 63, 55, 57, 64, 56, 58, 64, 55, 57, 63, 53, 56, 63, 52, 54, 61, 50, 52, 59, 49, 51, 57, 48, 50, 56, 48, 49, 55, 47, 49, 55, 47, 49, 56, 47, 49, 56, 47, 49, 56, 47, +49, 56, 48, 49, 56, 48, 48, 55, 47, 48, 53, 47, 47, 52, 47, 47, 51, 47, 45, 48, 46, 44, 46, 45, 43, 45, 46, 44, 46, 47, 46, 48, 48, 47, 51, 48, 47, 52, 48, 48, 53, 47, 48, +54, 47, 48, 55, 47, 49, 56, 47, 49, 56, 47, 48, 55, 47, 48, 55, 47, 48, 55, 47, 48, 55, 47, 49, 56, 48, 51, 58, 50, 52, 60, 51, 54, 61, 53, 56, 63, 55, 57, 64, 56, 58, 64, +55, 57, 63, 53, 56, 62, 52, 54, 61, 51, 52, 59, 49, 51, 57, 48, 49, 56, 47, 48, 55, 46, 48, 54, 46, 48, 54, 46, 48, 55, 46, 48, 55, 46, 47, 55, 46, 47, 54, 46, 47, 53, 46, +46, 52, 46, 46, 52, 46, 46, 50, 46, 45, 48, 46, 44, 46, 45, 44, 45, 46, 44, 46, 47, 46, 49, 47, 46, 50, 46, 46, 51, 46, 46, 52, 46, 46, 53, 46, 47, 53, 46, 47, 54, 46, 47, +54, 46, 47, 54, 45, 47, 54, 46, 47, 54, 46, 48, 54, 47, 48, 55, 48, 50, 57, 50, 52, 59, 51, 54, 61, 53, 55, 63, 55, 57, 64, 56, 58, 64, 55, 57, 63, 54, 56, 62, 52, 54, 61, +51, 52, 59, 49, 50, 57, 48, 49, 56, 47, 48, 55, 46, 47, 54, 46, 47, 54, 45, 46, 53, 46, 47, 54, 46, 47, 54, 46, 46, 53, 46, 46, 52, 45, 45, 51, 45, 45, 51, 46, 46, 50, 46, +46, 48, 46, 45, 46, 45, 44, 45, 46, 45, 46, 47, 46, 48, 47, 46, 50, 46, 46, 51, 45, 46, 52, 46, 46, 52, 46, 46, 53, 46, 46, 54, 46, 47, 54, 45, 47, 54, 45, 46, 54, 46, 47, +54, 46, 48, 54, 47, 49, 55, 48, 50, 57, 50, 52, 59, 52, 54, 62, 53, 55, 63, 55, 57, 64, 56, 58, 64, 55, 57, 64, 54, 55, 62, 52, 54, 61, 51, 52, 59, 49, 51, 57, 49, 50, 56, +48, 49, 55, 47, 48, 55, 46, 47, 54, 46, 47, 54, 46, 47, 54, 46, 47, 54, 46, 46, 53, 46, 46, 52, 45, 45, 51, 45, 45, 50, 46, 45, 49, 46, 45, 48, 46, 45, 46, 46, 44, 45, 46, +45, 46, 47, 46, 48, 47, 46, 49, 46, 46, 50, 45, 45, 51, 45, 46, 52, 46, 46, 54, 46, 47, 54, 45, 47, 54, 46, 47, 54, 46, 47, 54, 47, 48, 55, 47, 48, 55, 48, 49, 56, 49, 50, +57, 51, 52, 60, 52, 54, 62, 53, 55, 63, 55, 57, 64, 56, 58, 64, 55, 57, 63, 54, 55, 62, 53, 54, 61, 51, 52, 59, 50, 51, 57, 49, 50, 57, 48, 49, 56, 47, 48, 55, 47, 48, 54, +46, 47, 54, 46, 47, 54, 46, 47, 54, 46, 47, 54, 46, 46, 52, 46, 46, 51, 46, 45, 50, 46, 45, 49, 46, 45, 47, 46, 45, 46, 46, 44, 44, 46, 44, 45, 46, 45, 47, 46, 46, 48, 46, +46, 49, 45, 45, 51, 46, 46, 52, 46, 47, 54, 46, 47, 54, 46, 47, 55, 46, 47, 55, 47, 48, 55, 47, 48, 55, 48, 49, 55, 49, 50, 56, 49, 51, 58, 51, 53, 60, 52, 54, 62, 53, 55, +63, 55, 57, 64, 56, 58, 64, 55, 57, 63, 54, 56, 63, 53, 54, 61, 51, 52, 59, 50, 51, 58, 49, 50, 57, 49, 49, 55, 48, 49, 55, 48, 48, 54, 48, 48, 55, 47, 48, 55, 47, 48, 55, +47, 47, 54, 47, 47, 52, 46, 46, 50, 46, 45, 49, 46, 45, 48, 46, 44, 46, 46, 44, 44, 45, 43, 43, 46, 44, 43, 46, 44, 45, 46, 45, 47, 46, 46, 49, 46, 46, 50, 46, 47, 52, 47, +47, 54, 47, 48, 55, 47, 48, 55, 47, 48, 55, 47, 48, 55, 48, 49, 55, 48, 49, 55, 49, 50, 56, 50, 51, 58, 51, 53, 60, 53, 54, 62, 54, 55, 63, 55, 56, 64, 56, 58, 64, 55, 57, +63, 54, 56, 63, 53, 54, 61, 51, 52, 59, 51, 51, 58, 50, 50, 56, 49, 49, 54, 48, 48, 54, 48, 48, 53, 47, 47, 53, 47, 47, 53, 47, 47, 52, 47, 47, 52, 46, 46, 50, 46, 45, 48, +45, 45, 47, 46, 44, 46, 45, 44, 44, 45, 43, 42, 45, 42, 41, 45, 43, 42, 46, 44, 43, 46, 44, 45, 46, 45, 47, 46, 45, 48, 46, 46, 50, 47, 47, 52, 47, 47, 53, 47, 48, 53, 48, +48, 53, 48, 48, 53, 48, 48, 54, 49, 49, 55, 49, 50, 56, 50, 51, 58, 52, 53, 60, 53, 54, 62, 54, 55, 63, 55, 56, 64, 57, 58, 64, 55, 57, 63, 54, 56, 63, 53, 54, 61, 52, 52, +59, 51, 51, 57, 50, 50, 55, 49, 48, 54, 48, 47, 52, 47, 47, 51, 47, 46, 50, 47, 46, 50, 46, 46, 50, 46, 46, 49, 46, 45, 48, 45, 44, 46, 45, 44, 45, 45, 43, 44, 45, 43, 42, +44, 42, 41, 44, 42, 40, 45, 42, 40, 45, 42, 41, 45, 43, 43, 45, 44, 44, 46, 44, 46, 46, 45, 47, 46, 45, 48, 47, 46, 49, 47, 46, 50, 47, 46, 50, 47, 46, 50, 48, 47, 52, 48, +48, 53, 49, 49, 55, 51, 51, 58, 52, 53, 60, 53, 54, 62, 54, 55, 63, 55, 56, 64, 57, 58, 65, 55, 57, 63, 54, 56, 62, 53, 54, 61, 52, 52, 59, 51, 51, 57, 50, 49, 55, 49, 48, +52, 47, 46, 50, 47, 45, 49, 46, 45, 48, 46, 45, 47, 45, 44, 46, 45, 44, 46, 45, 43, 45, 45, 43, 44, 45, 43, 43, 45, 43, 42, 44, 42, 41, 44, 42, 40, 44, 41, 39, 44, 41, 39, +44, 42, 40, 45, 43, 42, 45, 43, 43, 45, 43, 44, 45, 44, 45, 46, 44, 45, 46, 44, 46, 46, 44, 46, 46, 44, 47, 46, 45, 48, 47, 46, 49, 48, 47, 51, 49, 49, 54, 50, 51, 57, 52, +53, 60, 53, 54, 62, 54, 55, 63, 55, 56, 64, 57, 58, 65, 55, 57, 63, 54, 56, 62, 53, 54, 61, 52, 52, 59, 50, 51, 57, 49, 49, 54, 48, 47, 51, 47, 45, 48, 46, 44, 46, 45, 43, +45, 45, 43, 44, 45, 43, 43, 44, 42, 43, 45, 43, 42, 44, 42, 42, 45, 43, 42, 45, 43, 42, 45, 42, 41, 44, 42, 40, 44, 41, 39, 44, 42, 40, 44, 42, 41, 45, 43, 41, 45, 43, 42, +45, 43, 43, 45, 43, 43, 45, 43, 43, 45, 43, 43, 45, 43, 43, 45, 43, 44, 46, 44, 45, 47, 45, 47, 48, 47, 50, 49, 48, 53, 50, 50, 57, 52, 52, 60, 53, 54, 62, 54, 55, 63, 55, +56, 64, 57, 58, 65, 56, 57, 64, 55, 56, 63, 53, 54, 61, 52, 52, 59, 51, 51, 57, 49, 49, 54, 48, 47, 51, 46, 45, 47, 45, 43, 44, 45, 42, 43, 44, 42, 42, 44, 42, 41, 44, 42, +41, 45, 42, 42, 45, 43, 42, 45, 43, 43, 45, 44, 43, 45, 43, 42, 45, 43, 41, 44, 42, 41, 45, 43, 41, 45, 43, 42, 45, 43, 43, 45, 44, 43, 45, 44, 43, 45, 44, 43, 45, 43, 42, +45, 43, 42, 45, 42, 42, 45, 43, 43, 46, 43, 44, 46, 44, 46, 48, 46, 50, 49, 48, 53, 50, 50, 57, 52, 52, 60, 53, 54, 62, 54, 55, 63, 55, 56, 64, 58, 58, 65, 56, 57, 64, 55, +56, 63, 53, 54, 61, 52, 52, 59, 51, 51, 57, 49, 49, 54, 48, 47, 51, 46, 45, 47, 45, 43, 44, 45, 42, 42, 44, 42, 41, 44, 42, 41, 45, 42, 41, 45, 43, 42, 45, 44, 43, 46, 44, +44, 46, 45, 44, 46, 45, 44, 46, 45, 44, 46, 45, 44, 46, 45, 45, 46, 45, 45, 46, 44, 44, 46, 44, 44, 45, 44, 44, 46, 44, 44, 45, 44, 43, 45, 43, 42, 45, 42, 42, 45, 42, 42, +45, 43, 44, 46, 44, 46, 47, 46, 49, 49, 48, 53, 50, 50, 57, 51, 52, 60, 53, 54, 62, 54, 55, 63, 55, 56, 64, 58, 59, 65, 57, 57, 64, 55, 56, 63, 53, 54, 61, 52, 52, 60, 51, +51, 57, 49, 49, 54, 48, 47, 51, 47, 45, 48, 45, 43, 44, 45, 42, 42, 44, 42, 41, 45, 42, 42, 45, 43, 42, 45, 43, 43, 45, 44, 44, 46, 45, 45, 46, 45, 46, 47, 46, 47, 47, 46, +47, 47, 47, 48, 47, 46, 47, 47, 46, 47, 46, 45, 46, 46, 45, 45, 45, 44, 45, 45, 44, 44, 45, 44, 44, 45, 43, 43, 45, 43, 43, 45, 43, 43, 46, 43, 44, 46, 44, 47, 47, 46, 50, +49, 48, 54, 50, 50, 57, 51, 52, 60, 52, 53, 62, 54, 55, 63, 55, 56, 64, 59, 60, 66, 57, 58, 64, 56, 56, 63, 54, 54, 62, 52, 52, 60, 51, 51, 57, 49, 49, 55, 48, 47, 52, 47, +45, 48, 45, 43, 45, 45, 42, 43, 45, 42, 42, 44, 42, 42, 45, 43, 43, 45, 43, 44, 45, 44, 45, 46, 45, 46, 46, 46, 48, 47, 47, 49, 47, 47, 49, 48, 48, 50, 48, 47, 49, 47, 47, +49, 47, 46, 48, 46, 45, 47, 45, 44, 46, 45, 44, 45, 45, 44, 45, 45, 43, 44, 45, 43, 43, 45, 43, 44, 46, 43, 45, 46, 44, 47, 47, 46, 50, 48, 48, 54, 50, 50, 57, 51, 52, 60, +52, 54, 62, 54, 55, 63, 56, 57, 64, 60, 60, 66, 58, 58, 65, 56, 57, 64, 54, 55, 62, 52, 53, 60, 51, 51, 58, 49, 49, 55, 48, 47, 52, 47, 45, 49, 45, 43, 46, 45, 42, 44, 44, +42, 43, 44, 42, 43, 44, 42, 44, 44, 43, 44, 45, 43, 45, 45, 44, 47, 46, 45, 48, 46, 46, 49, 47, 47, 50, 47, 47, 50, 47, 47, 50, 47, 46, 50, 46, 46, 49, 45, 45, 48, 45, 44, +46, 45, 44, 46, 45, 43, 45, 45, 43, 45, 45, 43, 44, 45, 43, 45, 46, 43, 46, 46, 44, 48, 47, 46, 51, 48, 48, 55, 50, 50, 58, 51, 52, 60, 53, 54, 62, 54, 55, 63, 56, 57, 65, +60, 61, 67, 58, 59, 65, 56, 57, 64, 55, 56, 63, 52, 53, 61, 51, 51, 58, 49, 49, 56, 48, 47, 53, 46, 45, 50, 45, 44, 47, 44, 43, 45, 44, 42, 44, 44, 43, 44, 44, 43, 44, 44, +43, 45, 44, 43, 45, 45, 44, 47, 45, 45, 48, 46, 45, 48, 46, 46, 49, 47, 46, 50, 46, 46, 50, 46, 45, 49, 45, 45, 48, 45, 45, 48, 45, 44, 47, 44, 44, 46, 44, 44, 46, 45, 43, +46, 45, 43, 46, 45, 43, 46, 45, 44, 47, 46, 44, 49, 47, 46, 52, 48, 48, 55, 49, 50, 58, 51, 52, 60, 53, 54, 62, 54, 56, 64, 56, 58, 65, 61, 62, 67, 59, 60, 66, 57, 58, 65, +55, 56, 63, 53, 54, 61, 51, 52, 59, 49, 49, 56, 48, 47, 53, 46, 45, 50, 45, 44, 48, 44, 43, 46, 44, 43, 45, 44, 43, 45, 44, 43, 46, 44, 43, 46, 44, 44, 46, 45, 44, 47, 45, +45, 48, 46, 45, 48, 46, 45, 49, 46, 46, 49, 46, 46, 49, 45, 45, 49, 45, 45, 48, 45, 45, 48, 45, 44, 47, 45, 44, 47, 45, 44, 47, 45, 44, 47, 45, 44, 47, 45, 43, 47, 45, 44, +47, 46, 45, 49, 47, 46, 52, 48, 48, 56, 50, 50, 58, 51, 52, 61, 53, 54, 63, 55, 56, 64, 57, 58, 65, 61, 62, 68, 60, 60, 67, 58, 59, 66, 56, 57, 64, 54, 55, 62, 52, 52, 60, +49, 50, 57, 48, 48, 54, 46, 46, 51, 45, 44, 49, 44, 43, 47, 44, 43, 46, 44, 44, 47, 44, 44, 47, 45, 44, 47, 45, 45, 47, 45, 45, 48, 45, 45, 48, 45, 45, 48, 46, 46, 49, 46, +46, 49, 46, 46, 49, 46, 46, 48, 45, 45, 48, 45, 45, 48, 45, 45, 48, 45, 45, 48, 45, 45, 48, 45, 45, 48, 45, 44, 48, 44, 44, 47, 45, 44, 48, 46, 45, 50, 47, 47, 54, 48, 49, +57, 50, 51, 59, 52, 53, 61, 54, 55, 63, 56, 57, 65, 57, 59, 66, 62, 63, 68, 60, 61, 67, 58, 59, 66, 57, 58, 65, 54, 56, 63, 52, 53, 61, 50, 51, 58, 48, 49, 55, 47, 47, 52, +45, 45, 50, 44, 44, 48, 44, 44, 47, 44, 44, 47, 45, 45, 48, 46, 46, 48, 46, 46, 49, 46, 46, 49, 46, 47, 49, 47, 47, 49, 47, 47, 49, 47, 47, 49, 47, 47, 49, 47, 47, 49, 46, +47, 49, 46, 47, 50, 46, 47, 50, 46, 46, 49, 45, 46, 49, 45, 45, 49, 45, 44, 49, 45, 44, 49, 45, 44, 49, 46, 46, 52, 47, 48, 55, 49, 50, 58, 50, 52, 60, 52, 54, 62, 54, 56, +64, 56, 58, 65, 58, 59, 66, 62, 63, 68, 61, 62, 67, 59, 60, 66, 57, 58, 65, 55, 56, 64, 53, 54, 62, 51, 52, 59, 49, 50, 56, 47, 48, 54, 46, 46, 51, 45, 44, 49, 44, 44, 48, +44, 44, 48, 44, 45, 48, 45, 46, 49, 46, 46, 49, 46, 47, 49, 47, 47, 50, 47, 48, 50, 47, 48, 49, 47, 48, 49, 47, 48, 50, 47, 48, 50, 47, 48, 50, 46, 47, 50, 46, 47, 50, 45, +46, 50, 45, 46, 50, 44, 45, 49, 44, 45, 49, 44, 45, 49, 45, 45, 51, 46, 47, 53, 48, 49, 56, 49, 51, 59, 51, 53, 61, 53, 55, 63, 55, 57, 65, 57, 58, 66, 59, 60, 67, 63, 63, +68, 61, 62, 68, 60, 61, 67, 58, 59, 66, 56, 57, 64, 54, 55, 62, 52, 53, 60, 50, 51, 58, 48, 49, 55, 46, 47, 52, 45, 45, 50, 44, 44, 49, 44, 44, 48, 44, 44, 48, 45, 45, 49, +45, 46, 49, 46, 47, 50, 47, 48, 50, 47, 48, 50, 48, 48, 50, 48, 49, 50, 48, 49, 50, 48, 48, 50, 47, 48, 50, 46, 47, 50, 46, 46, 50, 45, 46, 50, 45, 45, 50, 44, 45, 50, 44, +45, 49, 45, 45, 50, 45, 46, 52, 47, 48, 54, 48, 50, 57, 50, 52, 60, 52, 53, 62, 54, 55, 64, 56, 57, 65, 58, 59, 66, 59, 61, 67, 63, 64, 69, 62, 63, 68, 61, 62, 68, 59, 60, +66, 57, 58, 65, 55, 56, 63, 53, 54, 61, 51, 52, 59, 49, 50, 56, 47, 48, 54, 46, 46, 51, 44, 44, 49, 44, 44, 49, 44, 44, 48, 44, 44, 48, 45, 45, 49, 46, 46, 49, 47, 47, 50, +47, 48, 50, 48, 48, 50, 48, 49, 50, 48, 48, 50, 48, 48, 50, 47, 47, 50, 46, 46, 49, 45, 46, 49, 45, 45, 50, 44, 45, 50, 44, 45, 50, 44, 44, 50, 45, 45, 51, 46, 47, 53, 48, +49, 56, 49, 51, 59, 51, 53, 61, 52, 54, 63, 55, 56, 64, 56, 58, 66, 58, 60, 66, 60, 61, 67, 64, 64, 69, 62, 63, 68, 61, 62, 68, 59, 60, 67, 57, 59, 66, 55, 57, 64, 53, 55, +62, 52, 53, 60, 50, 51, 58, 48, 49, 55, 46, 47, 53, 45, 45, 50, 43, 44, 48, 43, 43, 48, 43, 43, 48, 44, 44, 48, 44, 45, 48, 45, 45, 48, 46, 46, 49, 46, 46, 49, 47, 47, 49, +47, 47, 49, 46, 46, 49, 46, 46, 48, 45, 45, 48, 44, 45, 48, 44, 44, 49, 44, 44, 49, 44, 44, 49, 44, 45, 50, 45, 46, 52, 47, 48, 55, 48, 50, 57, 50, 52, 60, 51, 53, 62, 53, +55, 64, 55, 57, 65, 57, 59, 66, 59, 60, 66, 60, 61, 67, 64, 65, 69, 63, 63, 68, 62, 63, 68, 60, 61, 67, 58, 60, 66, 56, 58, 65, 54, 56, 63, 52, 54, 62, 51, 52, 59, 49, 50, +57, 47, 48, 54, 45, 46, 51, 44, 44, 49, 43, 43, 48, 43, 43, 47, 43, 43, 47, 43, 43, 47, 44, 44, 47, 44, 44, 47, 45, 44, 47, 45, 44, 47, 45, 44, 47, 45, 44, 47, 44, 44, 47, +44, 44, 47, 43, 44, 47, 43, 44, 48, 43, 44, 48, 44, 44, 50, 45, 46, 52, 46, 47, 54, 48, 49, 56, 49, 51, 59, 50, 52, 61, 52, 54, 63, 54, 56, 64, 56, 57, 65, 58, 59, 66, 59, +60, 67, 61, 62, 67, 65, 65, 69, 63, 64, 69, 62, 63, 68, 60, 61, 67, 59, 60, 66, 57, 58, 65, 55, 56, 64, 53, 55, 63, 51, 53, 60, 50, 51, 58, 48, 49, 56, 46, 47, 53, 45, 45, +51, 44, 44, 48, 43, 43, 47, 43, 43, 46, 43, 43, 46, 43, 42, 45, 43, 43, 45, 43, 43, 46, 44, 43, 46, 44, 43, 46, 43, 43, 46, 43, 43, 46, 43, 43, 46, 43, 43, 46, 43, 43, 47, +44, 44, 49, 44, 45, 51, 46, 47, 53, 47, 48, 55, 48, 50, 58, 50, 52, 60, 51, 53, 62, 53, 55, 63, 54, 56, 64, 56, 58, 65, 58, 60, 67, 59, 60, 67, 61, 62, 67, 65, 66, 70, 64, +64, 69, 62, 63, 68, 60, 62, 67, 59, 60, 67, 57, 59, 65, 56, 57, 65, 54, 56, 63, 52, 54, 61, 51, 52, 60, 49, 50, 57, 47, 48, 55, 46, 46, 52, 45, 44, 50, 44, 43, 48, 43, 43, +46, 43, 42, 46, 43, 42, 45, 43, 43, 45, 43, 43, 45, 43, 43, 46, 44, 43, 46, 43, 43, 46, 43, 43, 46, 43, 43, 46, 43, 43, 47, 43, 43, 48, 44, 44, 50, 46, 46, 52, 47, 48, 55, +48, 50, 57, 49, 51, 59, 50, 53, 61, 52, 54, 62, 53, 55, 64, 55, 57, 65, 57, 58, 66, 59, 60, 67, 60, 61, 67, 62, 62, 67, 65, 66, 70, 64, 65, 69, 63, 64, 68, 61, 62, 67, 60, +61, 67, 58, 59, 66, 56, 58, 65, 55, 56, 64, 53, 55, 62, 52, 53, 61, 50, 52, 59, 49, 50, 57, 47, 48, 55, 46, 46, 52, 45, 44, 49, 44, 43, 48, 43, 43, 46, 43, 43, 46, 43, 43, +45, 43, 43, 45, 44, 43, 46, 44, 43, 46, 44, 43, 46, 44, 43, 46, 43, 43, 46, 44, 43, 47, 44, 44, 49, 46, 46, 52, 47, 48, 54, 48, 49, 57, 49, 51, 59, 50, 52, 60, 51, 54, 62, +53, 55, 63, 54, 56, 64, 56, 58, 65, 58, 59, 66, 59, 60, 66, 61, 61, 67, 62, 63, 68, 66, 66, 70, 64, 65, 69, 63, 64, 69, 62, 63, 68, 60, 61, 67, 58, 59, 66, 57, 58, 65, 55, +57, 64, 54, 55, 63, 52, 54, 62, 51, 53, 60, 50, 51, 58, 48, 50, 57, 47, 48, 55, 46, 46, 52, 45, 45, 50, 44, 44, 48, 44, 43, 47, 44, 43, 46, 44, 43, 46, 44, 43, 46, 44, 43, +46, 44, 43, 46, 44, 43, 46, 44, 44, 47, 45, 45, 49, 46, 46, 52, 47, 48, 54, 48, 49, 56, 49, 51, 58, 50, 52, 60, 51, 53, 61, 52, 54, 63, 54, 55, 63, 55, 57, 64, 57, 58, 65, +59, 60, 66, 60, 61, 66, 61, 62, 67, 63, 63, 68, 66, 67, 71, 65, 66, 70, 64, 65, 69, 63, 64, 68, 61, 62, 67, 59, 60, 66, 57, 58, 65, 56, 58, 64, 55, 56, 63, 53, 55, 62, 52, +54, 61, 51, 52, 60, 49, 51, 58, 49, 50, 57, 47, 48, 55, 47, 47, 52, 46, 45, 50, 45, 44, 49, 45, 44, 48, 45, 44, 47, 44, 44, 47, 44, 44, 47, 45, 44, 47, 45, 44, 48, 45, 45, +50, 46, 46, 52, 47, 48, 54, 49, 49, 56, 49, 51, 58, 50, 52, 60, 51, 53, 61, 52, 54, 62, 53, 55, 63, 55, 56, 64, 56, 57, 64, 58, 59, 65, 60, 61, 66, 61, 62, 67, 63, 63, 68, +64, 64, 69, 67, 67, 71, 66, 66, 71, 65, 65, 70, 64, 64, 69, 62, 63, 68, 60, 61, 67, 58, 59, 65, 57, 58, 65, 56, 57, 64, 54, 56, 63, 53, 54, 62, 51, 53, 60, 50, 52, 60, 50, +51, 58, 49, 50, 57, 48, 48, 55, 47, 47, 53, 46, 46, 51, 46, 45, 50, 46, 45, 49, 46, 45, 49, 45, 45, 49, 46, 45, 50, 46, 46, 51, 47, 47, 53, 48, 48, 55, 49, 50, 57, 50, 51, +58, 51, 52, 60, 51, 53, 61, 52, 54, 62, 53, 55, 63, 54, 56, 63, 56, 57, 64, 57, 58, 65, 59, 59, 65, 60, 61, 66, 62, 63, 68, 63, 64, 68, 65, 65, 70, 68, 68, 72, 67, 67, 71, +66, 66, 71, 64, 65, 70, 63, 64, 69, 61, 62, 67, 59, 60, 66, 58, 59, 65, 57, 58, 64, 55, 56, 63, 54, 55, 62, 53, 54, 62, 51, 53, 61, 50, 52, 59, 50, 51, 58, 49, 50, 57, 48, +49, 56, 48, 48, 54, 47, 47, 53, 47, 47, 52, 47, 47, 52, 47, 46, 52, 47, 47, 53, 48, 48, 54, 48, 49, 56, 49, 50, 57, 50, 51, 58, 51, 52, 60, 51, 53, 61, 52, 53, 61, 53, 54, +62, 54, 55, 63, 56, 57, 63, 57, 58, 64, 58, 59, 65, 60, 60, 66, 62, 62, 67, 63, 63, 68, 64, 65, 69, 66, 66, 71}; + +#endif diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_post_process.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_post_process.h new file mode 100644 index 0000000..709dfec --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_post_process.h @@ -0,0 +1,135 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018-2020, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef FACE_POST_PROCESS_H_ +#define FACE_POST_PROCESS_H_ + +#include "face_recognition_params.h" + +#include +#include + +#include "atlasutil/atlas_thread.h" +#include "atlasutil/atlas_app.h" +#include "atlasutil/dvpp_process.h" + +#include "facial_recognition_message.pb.h" +#include "ascenddk/presenter/agent/presenter_channel.h" +#include "presenter_channels.h" + + +class FacePostProcess : public AtlasThread { +public: + /** + * @brief: constructor + * @param [in]: configFile: App config file + */ + FacePostProcess(const std::string& configFile); + + /** + * @brief: destruction function + */ + ~FacePostProcess(); + + /** + * @brief: Post process thread init function + * @param [in]: None + * @return: Init result + * ATLAS_OK: Init success + * ATLAS_ERROR: Init failed. The thread will exit + */ + AtlasError Init(); + + /** + * @brief: The message process entry of face detection thread received + * @param [in]: msgId: The received message id + * @param [in]: msgData: The received message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, the thread will exit + */ + AtlasError Process(int msgId, std::shared_ptr msgData); + +private: + /** + * @brief: Send face feature in camera frame to presenter server + * @param [in]: recogInfo:face feature information and origin image + * @return: ATLAS_OK: send success + * ATLAS_ERROR: send failed + */ + AtlasError SendFeature(std::shared_ptr recogInfo); + + /** + * @brief: Send face feature in face register image to presenter server + * @param [in]: recogInfo:face feature information and origin image + * @return: ATLAS_OK: send success + * ATLAS_ERROR: send failed + */ + AtlasError ReplyFeature(std::shared_ptr recogInfo); + + /** + * @brief: Process MSG_FACE_RECOGNIZE_DATA message + * @param [in]: recogInfo: message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, the thread will exit + */ + AtlasError FaceRecognitionMsgProcess( + std::shared_ptr recogInfo); + + /** + * @brief: Fill face feature data to the message that send to + * presenter server + * @param [out]: message instance that send to presenter server + * @param [in]: faceImg: message data + */ + void PrepareFaceBoxData( + ascend::presenter::facial_recognition::FaceFeature* feature, + FaceImage& faceImg); + + /** + * @brief: Send message to presenter server + * @param [in]: recogInfo: message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, the thread will exit + */ + AtlasError SendMessage(google::protobuf::Message& message); + +private: + std::string configFile_; + DvppProcess dvpp_; + }; + + +#endif diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_recognition.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_recognition.h new file mode 100644 index 0000000..8744aee --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_recognition.h @@ -0,0 +1,216 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018-2020, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef FACE_RECOGNITION_ENGINE_H_ +#define FACE_RECOGNITION_ENGINE_H_ + +#include +#include "atlasutil/atlas_model.h" +#include "atlasutil/dvpp_process.h" +#include "face_recognition_params.h" +#include "facial_thread_base.h" + +// aligned face data +struct AlignedFace { +// face index (using for set result) + int32_t faceIndex; +// aligned face + cv::Mat alignedFace; +// flip face according to aligned face + cv::Mat alignedFlipFace; +}; + +/** + * @brief: inference engine class + */ +class FaceRecognition : public FacialThreadBase { +public: + /** + * @brief: constructor + * @param [in]: configFile: App config file + */ + FaceRecognition(const std::string& configFile); + + /** + * @brief: destruction function + */ + ~FaceRecognition(); + + /** + * @brief: Face recognition thread init function + * @param [in]: None + * @return: Init result + * ATLAS_OK: Init success + * ATLAS_ERROR: Init failed. The thread will exit + */ + AtlasError Init(); + + /** + * @brief: The message process entry of face recognition thread received + * @param [in]: msgId: The received message id + * @param [in]: msgData: The received message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, the thread will exit + */ + AtlasError Process(int msgId, shared_ptr msgData); + +private: + /** + * @brief: Create face image affine templete + * @return: None + */ + void CreateFaceAffineDestTemplate(); + + /** + * @brief: Preprocess face images, include resize, flip, affine and align + * @param [out]: alignedImgs: preprocessed image data + * @param [out]: faceImages: face image and feature mask data + */ + void PreProcess(std::vector &alignedImgs, + std::vector &faceImages); + + /** + * @brief Check transformation matrix for openCV wapAffine + * @param [in]: mat: transformation matrix + * @return true: match + * false: not match + */ + bool CheckTransfromMat(cv::Mat &mat); + + /** + * @brief: Affine, aligned and flip face + * @param [out]: alignedImgs: result image data + * @param [in]: faceImg: face data, include cropped face image and feature + * @param [in]: resizedImage: resized face image + * @param [in]: index: current process face index in face image vector + * @return: ATLAS_OK: process success + * ATLAS_ERROR: process failed + */ + AtlasError AlignedAndFlipFace(std::vector &alignedImgs, + FaceImage &faceImg, + ImageData &resizedImage, + int32_t index); + + /** + * @brief: Affine face image + * @param [out]: affinedImg: result image data + * @param [in]: resizedImage: resized face image + * @param [in]: faceImg: face data, include cropped face image and feature + * @return: ATLAS_OK: process success + * ATLAS_ERROR: process failed + */ + AtlasError FaceFeatureMaskAffine(cv::Mat& affinedImg, + ImageData &resizedImage, + FaceImage &faceImg); + + /** + * @brief: Estimate affine face image + * @param [in]: affineMat: affine matrix + * @param [in]: faceImg: face data, include cropped face image and feature + * @return: ATLAS_OK: process success + * ATLAS_ERROR: process failed + */ + AtlasError FaceFeatureMaskEstimateAffine(cv::Mat& affineMat, + FaceImage &faceImg); + + /** + * @brief: Resize face feature mask data + * @param [in]: destPoints: data after resize + * @param [in]: faceImg: face data, include cropped face image and feature + * @return: ATLAS_OK: process success + * ATLAS_ERROR: process failed + */ + AtlasError FaceFeatureMaskResize(std::vector& destPoints, + FaceImage &faceImg); + + /** + * @brief: Copy one batch data to acl device memory + * @param [out]: buffer: acl device memory + * @param [in]: bufferSize: acl device memory soze + * @param [in]: eachImgSize: each aligned image data size + * @param [in]: alignedImgs: aligned image vector + * @param [in]: startIdx: current batch start index in image vector + * @return: ATLAS_OK: process success + * ATLAS_ERROR: process failed + */ + AtlasError CopyOneBatchImage(uint8_t* dataBuffer, + uint32_t bufferSize, + uint32_t eachImgSize, + std::vector &alignedImgs, + int32_t startIdx); + + /** + * @brief: Process mode inference result + * @param [in/out]: faceImgs: face images information + * @param [in]: inferenceOutput: inference output data for each batch + * @param [in]: alignedImgs: aligned face and flip images + * @param [out]: startIdx: current batch start index in faceImgs + * @return: ATLAS_OK: process success + * ATLAS_ERROR: process failed + */ + AtlasError PostProcess(std::vector &faceImgs, + std::vector& inferenceOutput, + std::vector &alignedImgs, + int32_t startIdx); + + /** + * @brief: Inference preprocessed face images + * @param [out]: faceImages: faces information + * @param [in]: alignedImgs: preprocessed face image data + * @return: ATLAS_OK: inference success + * ATLAS_ERROR: inference failed + */ + AtlasError Inference(std::vector &faceImages, + std::vector &alignedImgs); + + /** + * @brief: Process message MSG_FACE_FEATURE_MASK + * @param [in]: recogInfo: message data + * @return: None + */ + void FaceFeatureMaskMsgProcess( + std::shared_ptr recogInfo); + +private: + AtlasModel model_; + DvppProcess dvpp_; + vector faceAffineDest_; + + uint32_t imgSize_; + uint8_t* inputBuf_; + uint32_t inputSize_; + uint8_t* inputPad_; +}; + +#endif /* FACE_RECOGNITION_ENGINE_H_ */ diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_recognition_params.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_recognition_params.h new file mode 100644 index 0000000..2f03c73 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_recognition_params.h @@ -0,0 +1,150 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018-2020, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef FACE_RECOGNITION_PARAMS_H_ +#define FACE_RECOGNITION_PARAMS_H_ + +#include +#include +#include + +#include "face_feature_train_mean.h" +#include "face_feature_train_std.h" +#include "atlasutil/atlas_utils.h" +#include "opencv2/opencv.hpp" + +#include "opencv2/opencv.hpp" +#include "opencv2/imgproc.hpp" +#include "opencv2/core/types_c.h" +#include "opencv2/imgproc/types_c.h" +#include + + +using namespace std; +#define CHECK_MEM_OPERATOR_RESULTS(ret) \ +if (ret != SUCCESS) { \ + ATLAS_LOG_ERROR("memory operation failed, error=%d", ret); \ + return ATLAS_ERROR; \ +} + +#define MSG_READ_FRAME 1 +#define MSG_FRAME_DATA 2 +#define MSG_FACE_DETECT_DATA 3 +#define MSG_FACE_FEATURE_MASK 4 +#define MSG_FACE_RECOGNIZE_DATA 5 +#define MSG_FACE_REGISTER_DAEMON 6 +#define MSG_FACE_REG_IMAGE 7 +#define MSG_FACE_REG_INVALID 8 + +const string kCameraThreadName = "mind_camera"; +const string kDetectThreadName = "face_detect"; +const string kFeatureMaskThreadName = "face_feature_mask"; +const string kRecognitionThreadName = "face_recognition"; +const string kPostProcessThreadName = "face_post_process"; +const string kRegisterThreadName = "face_register"; + +/** + * @brief: frame information + */ +struct FrameInfo { + uint32_t imageSource = 0; // 0:Camera 1:Register + std::string faceId = ""; // registered face id + ImageData image; +}; + +/** + * @brief: face recognition APP error code definition + */ +enum class AppErrorCode { + // Success, no error + kNone = 0, + + // register engine failed + kRegister, + + // detection engine failed + kDetection, + + // feature mask engine failed + kFeatureMask, + + // recognition engine failed + kRecognition +}; + +struct ErrorInfo { + AppErrorCode errCode = AppErrorCode::kNone; + std::string errMsg = ""; +}; + +/** + * @brief: face rectangle + */ +struct FaceRectangle { + cv::Point lt; // left top + cv::Point rb; // right bottom +}; + + +/** + * @brief: face feature + */ +struct FaceFeature { + cv::Point leftEye; // left eye + cv::Point rightEye; // right eye + cv::Point nose; // nose + cv::Point leftMouth; // left mouth + cv::Point rightMouth; // right mouth +}; + +/** + * @brief: face image + */ +struct FaceImage { + ImageData image; // cropped image from original image + FaceRectangle rectangle; // face rectangle + FaceFeature featureMask; // face feature mask + std::vector featureVector; // face feature vector +}; + +/** + * @brief: information for face recognition + */ +struct FaceRecognitionInfo { + ErrorInfo errInfo; + FrameInfo frame; // frame information + ImageData orgImg; // original image + std::vector faceImgs; // cropped image +}; + +#endif /* FACE_RECOGNITION_PARAMS_H_ */ diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_register.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_register.h new file mode 100644 index 0000000..953a70c --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/face_register.h @@ -0,0 +1,133 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018-2020, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef FACE_REGISTER_ENGINE_H_ +#define FACE_REGISTER_ENGINE_H_ +#include +#include +#include +#include +#include +#include +#include + +#include "atlasutil/dvpp_process.h" +#include "face_recognition_params.h" +#include "facial_thread_base.h" +#include "presenter_channels.h" + + +class FaceRegister : public FacialThreadBase { +public: + /** + * @brief: constructor + * @param [in] configFile: App config file + */ + FaceRegister(const std::string& configFile); + + /** + * @brief: destruction function + */ + ~FaceRegister(); + + /** + * @brief: Face register thread init function + * @param [in]: None + * @return: Init result + * ATLAS_OK: Init success + * ATLAS_ERROR: Init failed. The thread will exit + */ + AtlasError Init(); + + /** + * @brief: The message process entry of face register thread received + * @param [in]: msgId: The received message id + * @param [in]: msgData: The received message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, the thread will exit + */ + AtlasError Process(int msgId, std::shared_ptr msgData); + +private: + /** + * @brief: Receive face register request from presenter server + * @param [in]: agentChannel: the connection between persenter + * server and app + * @return: face register request data + */ + ascend::presenter::facial_recognition::FaceInfo* ReceiveFaceRegisterRequest( + ascend::presenter::Channel* agentChannel); + + /** + * @brief: Copy the face register image to acl device, + * and convert to YUV420SP + * @param [out]: recogInfo: data with yuv image + * @param [in]: faceRegReq: face register request + * @return: ATLAS_OK: process success + * ATLAS_ERROR: process failed + */ + AtlasError ProcessFaceImage(std::shared_ptr recogInfo, + ascend::presenter::facial_recognition::FaceInfo* faceRegReq); + + /** + * @brief: Notify face register failed.Send message to post process thread + * first, then post process will send message to presenter server + * @param [in]: recogInfo: notify info + * @param [in]: errMsg: the reason of failed + * @return: ATLAS_OK: process success + * ATLAS_ERROR: process failed + */ + AtlasError SendErrorReply(std::shared_ptr recogInfo, + const std::string& errMsg); + + /** + * @brief: Daemon face register request from presenter server and process it + * @return: ATLAS_OK: process success + * ATLAS_ERROR: process failed + */ + AtlasError FaceRegisterDaemon(); + + /** + * @brief: Create message connection between presenter server and app + * @return: ATLAS_OK: create success + * ATLAS_ERROR: create failed + */ + AtlasError OpenPresenterChannel(); + +private: + DvppProcess dvpp_; + std::string configFile_; +}; + +#endif diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/facial_recognition_message.pb.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/facial_recognition_message.pb.h new file mode 100644 index 0000000..bef2738 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/facial_recognition_message.pb.h @@ -0,0 +1,1834 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: facial_recognition_message.proto + +#ifndef GOOGLE_PROTOBUF_INCLUDED_facial_5frecognition_5fmessage_2eproto +#define GOOGLE_PROTOBUF_INCLUDED_facial_5frecognition_5fmessage_2eproto + +#include +#include + +#include +#if PROTOBUF_VERSION < 3008000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 3008000 < PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // IWYU pragma: export +#include // IWYU pragma: export +#include +#include +// @@protoc_insertion_point(includes) +#include +#define PROTOBUF_INTERNAL_EXPORT_facial_5frecognition_5fmessage_2eproto +PROTOBUF_NAMESPACE_OPEN +namespace internal { +class AnyMetadata; +} // namespace internal +PROTOBUF_NAMESPACE_CLOSE + +// Internal implementation detail -- do not use these members. +struct TableStruct_facial_5frecognition_5fmessage_2eproto { + static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTableField entries[] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::AuxillaryParseTableField aux[] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTable schema[7] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::FieldMetadata field_metadata[]; + static const ::PROTOBUF_NAMESPACE_ID::internal::SerializationTable serialization_table[]; + static const ::PROTOBUF_NAMESPACE_ID::uint32 offsets[]; +}; +extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_facial_5frecognition_5fmessage_2eproto; +namespace ascend { +namespace presenter { +namespace facial_recognition { +class Box; +class BoxDefaultTypeInternal; +extern BoxDefaultTypeInternal _Box_default_instance_; +class CommonResponse; +class CommonResponseDefaultTypeInternal; +extern CommonResponseDefaultTypeInternal _CommonResponse_default_instance_; +class FaceFeature; +class FaceFeatureDefaultTypeInternal; +extern FaceFeatureDefaultTypeInternal _FaceFeature_default_instance_; +class FaceInfo; +class FaceInfoDefaultTypeInternal; +extern FaceInfoDefaultTypeInternal _FaceInfo_default_instance_; +class FaceResult; +class FaceResultDefaultTypeInternal; +extern FaceResultDefaultTypeInternal _FaceResult_default_instance_; +class FrameInfo; +class FrameInfoDefaultTypeInternal; +extern FrameInfoDefaultTypeInternal _FrameInfo_default_instance_; +class RegisterApp; +class RegisterAppDefaultTypeInternal; +extern RegisterAppDefaultTypeInternal _RegisterApp_default_instance_; +} // namespace facial_recognition +} // namespace presenter +} // namespace ascend +PROTOBUF_NAMESPACE_OPEN +template<> ::ascend::presenter::facial_recognition::Box* Arena::CreateMaybeMessage<::ascend::presenter::facial_recognition::Box>(Arena*); +template<> ::ascend::presenter::facial_recognition::CommonResponse* Arena::CreateMaybeMessage<::ascend::presenter::facial_recognition::CommonResponse>(Arena*); +template<> ::ascend::presenter::facial_recognition::FaceFeature* Arena::CreateMaybeMessage<::ascend::presenter::facial_recognition::FaceFeature>(Arena*); +template<> ::ascend::presenter::facial_recognition::FaceInfo* Arena::CreateMaybeMessage<::ascend::presenter::facial_recognition::FaceInfo>(Arena*); +template<> ::ascend::presenter::facial_recognition::FaceResult* Arena::CreateMaybeMessage<::ascend::presenter::facial_recognition::FaceResult>(Arena*); +template<> ::ascend::presenter::facial_recognition::FrameInfo* Arena::CreateMaybeMessage<::ascend::presenter::facial_recognition::FrameInfo>(Arena*); +template<> ::ascend::presenter::facial_recognition::RegisterApp* Arena::CreateMaybeMessage<::ascend::presenter::facial_recognition::RegisterApp>(Arena*); +PROTOBUF_NAMESPACE_CLOSE +namespace ascend { +namespace presenter { +namespace facial_recognition { + +enum ErrorCode : int { + kErrorNone = 0, + kErrorAppRegisterExist = 1, + kErrorAppRegisterType = 2, + kErrorAppRegisterLimit = 3, + kErrorOther = 5, + ErrorCode_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), + ErrorCode_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() +}; +bool ErrorCode_IsValid(int value); +constexpr ErrorCode ErrorCode_MIN = kErrorNone; +constexpr ErrorCode ErrorCode_MAX = kErrorOther; +constexpr int ErrorCode_ARRAYSIZE = ErrorCode_MAX + 1; + +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ErrorCode_descriptor(); +template +inline const std::string& ErrorCode_Name(T enum_t_value) { + static_assert(::std::is_same::value || + ::std::is_integral::value, + "Incorrect type passed to function ErrorCode_Name."); + return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( + ErrorCode_descriptor(), enum_t_value); +} +inline bool ErrorCode_Parse( + const std::string& name, ErrorCode* value) { + return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( + ErrorCode_descriptor(), name, value); +} +// =================================================================== + +class CommonResponse : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.facial_recognition.CommonResponse) */ { + public: + CommonResponse(); + virtual ~CommonResponse(); + + CommonResponse(const CommonResponse& from); + CommonResponse(CommonResponse&& from) noexcept + : CommonResponse() { + *this = ::std::move(from); + } + + inline CommonResponse& operator=(const CommonResponse& from) { + CopyFrom(from); + return *this; + } + inline CommonResponse& operator=(CommonResponse&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const CommonResponse& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const CommonResponse* internal_default_instance() { + return reinterpret_cast( + &_CommonResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = + 0; + + void Swap(CommonResponse* other); + friend void swap(CommonResponse& a, CommonResponse& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline CommonResponse* New() const final { + return CreateMaybeMessage(nullptr); + } + + CommonResponse* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const CommonResponse& from); + void MergeFrom(const CommonResponse& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(CommonResponse* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.facial_recognition.CommonResponse"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_facial_5frecognition_5fmessage_2eproto); + return ::descriptor_table_facial_5frecognition_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // string message = 2; + void clear_message(); + static const int kMessageFieldNumber = 2; + const std::string& message() const; + void set_message(const std::string& value); + void set_message(std::string&& value); + void set_message(const char* value); + void set_message(const char* value, size_t size); + std::string* mutable_message(); + std::string* release_message(); + void set_allocated_message(std::string* message); + + // .ascend.presenter.facial_recognition.ErrorCode ret = 1; + void clear_ret(); + static const int kRetFieldNumber = 1; + ::ascend::presenter::facial_recognition::ErrorCode ret() const; + void set_ret(::ascend::presenter::facial_recognition::ErrorCode value); + + // @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.CommonResponse) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr message_; + int ret_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_facial_5frecognition_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class RegisterApp : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.facial_recognition.RegisterApp) */ { + public: + RegisterApp(); + virtual ~RegisterApp(); + + RegisterApp(const RegisterApp& from); + RegisterApp(RegisterApp&& from) noexcept + : RegisterApp() { + *this = ::std::move(from); + } + + inline RegisterApp& operator=(const RegisterApp& from) { + CopyFrom(from); + return *this; + } + inline RegisterApp& operator=(RegisterApp&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const RegisterApp& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const RegisterApp* internal_default_instance() { + return reinterpret_cast( + &_RegisterApp_default_instance_); + } + static constexpr int kIndexInFileMessages = + 1; + + void Swap(RegisterApp* other); + friend void swap(RegisterApp& a, RegisterApp& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline RegisterApp* New() const final { + return CreateMaybeMessage(nullptr); + } + + RegisterApp* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const RegisterApp& from); + void MergeFrom(const RegisterApp& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(RegisterApp* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.facial_recognition.RegisterApp"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_facial_5frecognition_5fmessage_2eproto); + return ::descriptor_table_facial_5frecognition_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // string id = 1; + void clear_id(); + static const int kIdFieldNumber = 1; + const std::string& id() const; + void set_id(const std::string& value); + void set_id(std::string&& value); + void set_id(const char* value); + void set_id(const char* value, size_t size); + std::string* mutable_id(); + std::string* release_id(); + void set_allocated_id(std::string* id); + + // string type = 2; + void clear_type(); + static const int kTypeFieldNumber = 2; + const std::string& type() const; + void set_type(const std::string& value); + void set_type(std::string&& value); + void set_type(const char* value); + void set_type(const char* value, size_t size); + std::string* mutable_type(); + std::string* release_type(); + void set_allocated_type(std::string* type); + + // @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.RegisterApp) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr id_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr type_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_facial_5frecognition_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class Box : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.facial_recognition.Box) */ { + public: + Box(); + virtual ~Box(); + + Box(const Box& from); + Box(Box&& from) noexcept + : Box() { + *this = ::std::move(from); + } + + inline Box& operator=(const Box& from) { + CopyFrom(from); + return *this; + } + inline Box& operator=(Box&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const Box& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const Box* internal_default_instance() { + return reinterpret_cast( + &_Box_default_instance_); + } + static constexpr int kIndexInFileMessages = + 2; + + void Swap(Box* other); + friend void swap(Box& a, Box& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline Box* New() const final { + return CreateMaybeMessage(nullptr); + } + + Box* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const Box& from); + void MergeFrom(const Box& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(Box* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.facial_recognition.Box"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_facial_5frecognition_5fmessage_2eproto); + return ::descriptor_table_facial_5frecognition_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // uint32 lt_x = 1; + void clear_lt_x(); + static const int kLtXFieldNumber = 1; + ::PROTOBUF_NAMESPACE_ID::uint32 lt_x() const; + void set_lt_x(::PROTOBUF_NAMESPACE_ID::uint32 value); + + // uint32 lt_y = 2; + void clear_lt_y(); + static const int kLtYFieldNumber = 2; + ::PROTOBUF_NAMESPACE_ID::uint32 lt_y() const; + void set_lt_y(::PROTOBUF_NAMESPACE_ID::uint32 value); + + // uint32 rb_x = 3; + void clear_rb_x(); + static const int kRbXFieldNumber = 3; + ::PROTOBUF_NAMESPACE_ID::uint32 rb_x() const; + void set_rb_x(::PROTOBUF_NAMESPACE_ID::uint32 value); + + // uint32 rb_y = 4; + void clear_rb_y(); + static const int kRbYFieldNumber = 4; + ::PROTOBUF_NAMESPACE_ID::uint32 rb_y() const; + void set_rb_y(::PROTOBUF_NAMESPACE_ID::uint32 value); + + // @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.Box) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::uint32 lt_x_; + ::PROTOBUF_NAMESPACE_ID::uint32 lt_y_; + ::PROTOBUF_NAMESPACE_ID::uint32 rb_x_; + ::PROTOBUF_NAMESPACE_ID::uint32 rb_y_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_facial_5frecognition_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class FaceFeature : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.facial_recognition.FaceFeature) */ { + public: + FaceFeature(); + virtual ~FaceFeature(); + + FaceFeature(const FaceFeature& from); + FaceFeature(FaceFeature&& from) noexcept + : FaceFeature() { + *this = ::std::move(from); + } + + inline FaceFeature& operator=(const FaceFeature& from) { + CopyFrom(from); + return *this; + } + inline FaceFeature& operator=(FaceFeature&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const FaceFeature& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const FaceFeature* internal_default_instance() { + return reinterpret_cast( + &_FaceFeature_default_instance_); + } + static constexpr int kIndexInFileMessages = + 3; + + void Swap(FaceFeature* other); + friend void swap(FaceFeature& a, FaceFeature& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline FaceFeature* New() const final { + return CreateMaybeMessage(nullptr); + } + + FaceFeature* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const FaceFeature& from); + void MergeFrom(const FaceFeature& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(FaceFeature* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.facial_recognition.FaceFeature"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_facial_5frecognition_5fmessage_2eproto); + return ::descriptor_table_facial_5frecognition_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated float vector = 2; + int vector_size() const; + void clear_vector(); + static const int kVectorFieldNumber = 2; + float vector(int index) const; + void set_vector(int index, float value); + void add_vector(float value); + const ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >& + vector() const; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >* + mutable_vector(); + + // .ascend.presenter.facial_recognition.Box box = 1; + bool has_box() const; + void clear_box(); + static const int kBoxFieldNumber = 1; + const ::ascend::presenter::facial_recognition::Box& box() const; + ::ascend::presenter::facial_recognition::Box* release_box(); + ::ascend::presenter::facial_recognition::Box* mutable_box(); + void set_allocated_box(::ascend::presenter::facial_recognition::Box* box); + + // @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.FaceFeature) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedField< float > vector_; + mutable std::atomic _vector_cached_byte_size_; + ::ascend::presenter::facial_recognition::Box* box_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_facial_5frecognition_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class FaceInfo : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.facial_recognition.FaceInfo) */ { + public: + FaceInfo(); + virtual ~FaceInfo(); + + FaceInfo(const FaceInfo& from); + FaceInfo(FaceInfo&& from) noexcept + : FaceInfo() { + *this = ::std::move(from); + } + + inline FaceInfo& operator=(const FaceInfo& from) { + CopyFrom(from); + return *this; + } + inline FaceInfo& operator=(FaceInfo&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const FaceInfo& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const FaceInfo* internal_default_instance() { + return reinterpret_cast( + &_FaceInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = + 4; + + void Swap(FaceInfo* other); + friend void swap(FaceInfo& a, FaceInfo& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline FaceInfo* New() const final { + return CreateMaybeMessage(nullptr); + } + + FaceInfo* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const FaceInfo& from); + void MergeFrom(const FaceInfo& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(FaceInfo* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.facial_recognition.FaceInfo"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_facial_5frecognition_5fmessage_2eproto); + return ::descriptor_table_facial_5frecognition_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // string id = 1; + void clear_id(); + static const int kIdFieldNumber = 1; + const std::string& id() const; + void set_id(const std::string& value); + void set_id(std::string&& value); + void set_id(const char* value); + void set_id(const char* value, size_t size); + std::string* mutable_id(); + std::string* release_id(); + void set_allocated_id(std::string* id); + + // bytes image = 2; + void clear_image(); + static const int kImageFieldNumber = 2; + const std::string& image() const; + void set_image(const std::string& value); + void set_image(std::string&& value); + void set_image(const char* value); + void set_image(const void* value, size_t size); + std::string* mutable_image(); + std::string* release_image(); + void set_allocated_image(std::string* image); + + // @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.FaceInfo) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr id_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr image_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_facial_5frecognition_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class FaceResult : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.facial_recognition.FaceResult) */ { + public: + FaceResult(); + virtual ~FaceResult(); + + FaceResult(const FaceResult& from); + FaceResult(FaceResult&& from) noexcept + : FaceResult() { + *this = ::std::move(from); + } + + inline FaceResult& operator=(const FaceResult& from) { + CopyFrom(from); + return *this; + } + inline FaceResult& operator=(FaceResult&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const FaceResult& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const FaceResult* internal_default_instance() { + return reinterpret_cast( + &_FaceResult_default_instance_); + } + static constexpr int kIndexInFileMessages = + 5; + + void Swap(FaceResult* other); + friend void swap(FaceResult& a, FaceResult& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline FaceResult* New() const final { + return CreateMaybeMessage(nullptr); + } + + FaceResult* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const FaceResult& from); + void MergeFrom(const FaceResult& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(FaceResult* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.facial_recognition.FaceResult"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_facial_5frecognition_5fmessage_2eproto); + return ::descriptor_table_facial_5frecognition_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .ascend.presenter.facial_recognition.FaceFeature feature = 3; + int feature_size() const; + void clear_feature(); + static const int kFeatureFieldNumber = 3; + ::ascend::presenter::facial_recognition::FaceFeature* mutable_feature(int index); + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::facial_recognition::FaceFeature >* + mutable_feature(); + const ::ascend::presenter::facial_recognition::FaceFeature& feature(int index) const; + ::ascend::presenter::facial_recognition::FaceFeature* add_feature(); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::facial_recognition::FaceFeature >& + feature() const; + + // string id = 1; + void clear_id(); + static const int kIdFieldNumber = 1; + const std::string& id() const; + void set_id(const std::string& value); + void set_id(std::string&& value); + void set_id(const char* value); + void set_id(const char* value, size_t size); + std::string* mutable_id(); + std::string* release_id(); + void set_allocated_id(std::string* id); + + // .ascend.presenter.facial_recognition.CommonResponse response = 2; + bool has_response() const; + void clear_response(); + static const int kResponseFieldNumber = 2; + const ::ascend::presenter::facial_recognition::CommonResponse& response() const; + ::ascend::presenter::facial_recognition::CommonResponse* release_response(); + ::ascend::presenter::facial_recognition::CommonResponse* mutable_response(); + void set_allocated_response(::ascend::presenter::facial_recognition::CommonResponse* response); + + // @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.FaceResult) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::facial_recognition::FaceFeature > feature_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr id_; + ::ascend::presenter::facial_recognition::CommonResponse* response_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_facial_5frecognition_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class FrameInfo : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.facial_recognition.FrameInfo) */ { + public: + FrameInfo(); + virtual ~FrameInfo(); + + FrameInfo(const FrameInfo& from); + FrameInfo(FrameInfo&& from) noexcept + : FrameInfo() { + *this = ::std::move(from); + } + + inline FrameInfo& operator=(const FrameInfo& from) { + CopyFrom(from); + return *this; + } + inline FrameInfo& operator=(FrameInfo&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const FrameInfo& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const FrameInfo* internal_default_instance() { + return reinterpret_cast( + &_FrameInfo_default_instance_); + } + static constexpr int kIndexInFileMessages = + 6; + + void Swap(FrameInfo* other); + friend void swap(FrameInfo& a, FrameInfo& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline FrameInfo* New() const final { + return CreateMaybeMessage(nullptr); + } + + FrameInfo* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const FrameInfo& from); + void MergeFrom(const FrameInfo& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(FrameInfo* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.facial_recognition.FrameInfo"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_facial_5frecognition_5fmessage_2eproto); + return ::descriptor_table_facial_5frecognition_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .ascend.presenter.facial_recognition.FaceFeature feature = 2; + int feature_size() const; + void clear_feature(); + static const int kFeatureFieldNumber = 2; + ::ascend::presenter::facial_recognition::FaceFeature* mutable_feature(int index); + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::facial_recognition::FaceFeature >* + mutable_feature(); + const ::ascend::presenter::facial_recognition::FaceFeature& feature(int index) const; + ::ascend::presenter::facial_recognition::FaceFeature* add_feature(); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::facial_recognition::FaceFeature >& + feature() const; + + // bytes image = 1; + void clear_image(); + static const int kImageFieldNumber = 1; + const std::string& image() const; + void set_image(const std::string& value); + void set_image(std::string&& value); + void set_image(const char* value); + void set_image(const void* value, size_t size); + std::string* mutable_image(); + std::string* release_image(); + void set_allocated_image(std::string* image); + + // @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.FrameInfo) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::facial_recognition::FaceFeature > feature_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr image_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_facial_5frecognition_5fmessage_2eproto; +}; +// =================================================================== + + +// =================================================================== + +#ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif // __GNUC__ +// CommonResponse + +// .ascend.presenter.facial_recognition.ErrorCode ret = 1; +inline void CommonResponse::clear_ret() { + ret_ = 0; +} +inline ::ascend::presenter::facial_recognition::ErrorCode CommonResponse::ret() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.CommonResponse.ret) + return static_cast< ::ascend::presenter::facial_recognition::ErrorCode >(ret_); +} +inline void CommonResponse::set_ret(::ascend::presenter::facial_recognition::ErrorCode value) { + + ret_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.CommonResponse.ret) +} + +// string message = 2; +inline void CommonResponse::clear_message() { + message_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& CommonResponse::message() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.CommonResponse.message) + return message_.GetNoArena(); +} +inline void CommonResponse::set_message(const std::string& value) { + + message_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.CommonResponse.message) +} +inline void CommonResponse::set_message(std::string&& value) { + + message_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.facial_recognition.CommonResponse.message) +} +inline void CommonResponse::set_message(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + message_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.facial_recognition.CommonResponse.message) +} +inline void CommonResponse::set_message(const char* value, size_t size) { + + message_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.facial_recognition.CommonResponse.message) +} +inline std::string* CommonResponse::mutable_message() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.CommonResponse.message) + return message_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* CommonResponse::release_message() { + // @@protoc_insertion_point(field_release:ascend.presenter.facial_recognition.CommonResponse.message) + + return message_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void CommonResponse::set_allocated_message(std::string* message) { + if (message != nullptr) { + + } else { + + } + message_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), message); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.facial_recognition.CommonResponse.message) +} + +// ------------------------------------------------------------------- + +// RegisterApp + +// string id = 1; +inline void RegisterApp::clear_id() { + id_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& RegisterApp::id() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.RegisterApp.id) + return id_.GetNoArena(); +} +inline void RegisterApp::set_id(const std::string& value) { + + id_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.RegisterApp.id) +} +inline void RegisterApp::set_id(std::string&& value) { + + id_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.facial_recognition.RegisterApp.id) +} +inline void RegisterApp::set_id(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + id_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.facial_recognition.RegisterApp.id) +} +inline void RegisterApp::set_id(const char* value, size_t size) { + + id_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.facial_recognition.RegisterApp.id) +} +inline std::string* RegisterApp::mutable_id() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.RegisterApp.id) + return id_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* RegisterApp::release_id() { + // @@protoc_insertion_point(field_release:ascend.presenter.facial_recognition.RegisterApp.id) + + return id_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void RegisterApp::set_allocated_id(std::string* id) { + if (id != nullptr) { + + } else { + + } + id_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), id); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.facial_recognition.RegisterApp.id) +} + +// string type = 2; +inline void RegisterApp::clear_type() { + type_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& RegisterApp::type() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.RegisterApp.type) + return type_.GetNoArena(); +} +inline void RegisterApp::set_type(const std::string& value) { + + type_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.RegisterApp.type) +} +inline void RegisterApp::set_type(std::string&& value) { + + type_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.facial_recognition.RegisterApp.type) +} +inline void RegisterApp::set_type(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + type_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.facial_recognition.RegisterApp.type) +} +inline void RegisterApp::set_type(const char* value, size_t size) { + + type_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.facial_recognition.RegisterApp.type) +} +inline std::string* RegisterApp::mutable_type() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.RegisterApp.type) + return type_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* RegisterApp::release_type() { + // @@protoc_insertion_point(field_release:ascend.presenter.facial_recognition.RegisterApp.type) + + return type_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void RegisterApp::set_allocated_type(std::string* type) { + if (type != nullptr) { + + } else { + + } + type_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), type); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.facial_recognition.RegisterApp.type) +} + +// ------------------------------------------------------------------- + +// Box + +// uint32 lt_x = 1; +inline void Box::clear_lt_x() { + lt_x_ = 0u; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 Box::lt_x() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.Box.lt_x) + return lt_x_; +} +inline void Box::set_lt_x(::PROTOBUF_NAMESPACE_ID::uint32 value) { + + lt_x_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.Box.lt_x) +} + +// uint32 lt_y = 2; +inline void Box::clear_lt_y() { + lt_y_ = 0u; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 Box::lt_y() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.Box.lt_y) + return lt_y_; +} +inline void Box::set_lt_y(::PROTOBUF_NAMESPACE_ID::uint32 value) { + + lt_y_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.Box.lt_y) +} + +// uint32 rb_x = 3; +inline void Box::clear_rb_x() { + rb_x_ = 0u; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 Box::rb_x() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.Box.rb_x) + return rb_x_; +} +inline void Box::set_rb_x(::PROTOBUF_NAMESPACE_ID::uint32 value) { + + rb_x_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.Box.rb_x) +} + +// uint32 rb_y = 4; +inline void Box::clear_rb_y() { + rb_y_ = 0u; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 Box::rb_y() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.Box.rb_y) + return rb_y_; +} +inline void Box::set_rb_y(::PROTOBUF_NAMESPACE_ID::uint32 value) { + + rb_y_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.Box.rb_y) +} + +// ------------------------------------------------------------------- + +// FaceFeature + +// .ascend.presenter.facial_recognition.Box box = 1; +inline bool FaceFeature::has_box() const { + return this != internal_default_instance() && box_ != nullptr; +} +inline void FaceFeature::clear_box() { + if (GetArenaNoVirtual() == nullptr && box_ != nullptr) { + delete box_; + } + box_ = nullptr; +} +inline const ::ascend::presenter::facial_recognition::Box& FaceFeature::box() const { + const ::ascend::presenter::facial_recognition::Box* p = box_; + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.FaceFeature.box) + return p != nullptr ? *p : *reinterpret_cast( + &::ascend::presenter::facial_recognition::_Box_default_instance_); +} +inline ::ascend::presenter::facial_recognition::Box* FaceFeature::release_box() { + // @@protoc_insertion_point(field_release:ascend.presenter.facial_recognition.FaceFeature.box) + + ::ascend::presenter::facial_recognition::Box* temp = box_; + box_ = nullptr; + return temp; +} +inline ::ascend::presenter::facial_recognition::Box* FaceFeature::mutable_box() { + + if (box_ == nullptr) { + auto* p = CreateMaybeMessage<::ascend::presenter::facial_recognition::Box>(GetArenaNoVirtual()); + box_ = p; + } + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.FaceFeature.box) + return box_; +} +inline void FaceFeature::set_allocated_box(::ascend::presenter::facial_recognition::Box* box) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == nullptr) { + delete box_; + } + if (box) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + box = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, box, submessage_arena); + } + + } else { + + } + box_ = box; + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.facial_recognition.FaceFeature.box) +} + +// repeated float vector = 2; +inline int FaceFeature::vector_size() const { + return vector_.size(); +} +inline void FaceFeature::clear_vector() { + vector_.Clear(); +} +inline float FaceFeature::vector(int index) const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.FaceFeature.vector) + return vector_.Get(index); +} +inline void FaceFeature::set_vector(int index, float value) { + vector_.Set(index, value); + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.FaceFeature.vector) +} +inline void FaceFeature::add_vector(float value) { + vector_.Add(value); + // @@protoc_insertion_point(field_add:ascend.presenter.facial_recognition.FaceFeature.vector) +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >& +FaceFeature::vector() const { + // @@protoc_insertion_point(field_list:ascend.presenter.facial_recognition.FaceFeature.vector) + return vector_; +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< float >* +FaceFeature::mutable_vector() { + // @@protoc_insertion_point(field_mutable_list:ascend.presenter.facial_recognition.FaceFeature.vector) + return &vector_; +} + +// ------------------------------------------------------------------- + +// FaceInfo + +// string id = 1; +inline void FaceInfo::clear_id() { + id_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& FaceInfo::id() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.FaceInfo.id) + return id_.GetNoArena(); +} +inline void FaceInfo::set_id(const std::string& value) { + + id_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.FaceInfo.id) +} +inline void FaceInfo::set_id(std::string&& value) { + + id_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.facial_recognition.FaceInfo.id) +} +inline void FaceInfo::set_id(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + id_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.facial_recognition.FaceInfo.id) +} +inline void FaceInfo::set_id(const char* value, size_t size) { + + id_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.facial_recognition.FaceInfo.id) +} +inline std::string* FaceInfo::mutable_id() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.FaceInfo.id) + return id_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* FaceInfo::release_id() { + // @@protoc_insertion_point(field_release:ascend.presenter.facial_recognition.FaceInfo.id) + + return id_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void FaceInfo::set_allocated_id(std::string* id) { + if (id != nullptr) { + + } else { + + } + id_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), id); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.facial_recognition.FaceInfo.id) +} + +// bytes image = 2; +inline void FaceInfo::clear_image() { + image_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& FaceInfo::image() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.FaceInfo.image) + return image_.GetNoArena(); +} +inline void FaceInfo::set_image(const std::string& value) { + + image_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.FaceInfo.image) +} +inline void FaceInfo::set_image(std::string&& value) { + + image_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.facial_recognition.FaceInfo.image) +} +inline void FaceInfo::set_image(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + image_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.facial_recognition.FaceInfo.image) +} +inline void FaceInfo::set_image(const void* value, size_t size) { + + image_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.facial_recognition.FaceInfo.image) +} +inline std::string* FaceInfo::mutable_image() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.FaceInfo.image) + return image_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* FaceInfo::release_image() { + // @@protoc_insertion_point(field_release:ascend.presenter.facial_recognition.FaceInfo.image) + + return image_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void FaceInfo::set_allocated_image(std::string* image) { + if (image != nullptr) { + + } else { + + } + image_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), image); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.facial_recognition.FaceInfo.image) +} + +// ------------------------------------------------------------------- + +// FaceResult + +// string id = 1; +inline void FaceResult::clear_id() { + id_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& FaceResult::id() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.FaceResult.id) + return id_.GetNoArena(); +} +inline void FaceResult::set_id(const std::string& value) { + + id_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.FaceResult.id) +} +inline void FaceResult::set_id(std::string&& value) { + + id_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.facial_recognition.FaceResult.id) +} +inline void FaceResult::set_id(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + id_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.facial_recognition.FaceResult.id) +} +inline void FaceResult::set_id(const char* value, size_t size) { + + id_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.facial_recognition.FaceResult.id) +} +inline std::string* FaceResult::mutable_id() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.FaceResult.id) + return id_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* FaceResult::release_id() { + // @@protoc_insertion_point(field_release:ascend.presenter.facial_recognition.FaceResult.id) + + return id_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void FaceResult::set_allocated_id(std::string* id) { + if (id != nullptr) { + + } else { + + } + id_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), id); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.facial_recognition.FaceResult.id) +} + +// .ascend.presenter.facial_recognition.CommonResponse response = 2; +inline bool FaceResult::has_response() const { + return this != internal_default_instance() && response_ != nullptr; +} +inline void FaceResult::clear_response() { + if (GetArenaNoVirtual() == nullptr && response_ != nullptr) { + delete response_; + } + response_ = nullptr; +} +inline const ::ascend::presenter::facial_recognition::CommonResponse& FaceResult::response() const { + const ::ascend::presenter::facial_recognition::CommonResponse* p = response_; + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.FaceResult.response) + return p != nullptr ? *p : *reinterpret_cast( + &::ascend::presenter::facial_recognition::_CommonResponse_default_instance_); +} +inline ::ascend::presenter::facial_recognition::CommonResponse* FaceResult::release_response() { + // @@protoc_insertion_point(field_release:ascend.presenter.facial_recognition.FaceResult.response) + + ::ascend::presenter::facial_recognition::CommonResponse* temp = response_; + response_ = nullptr; + return temp; +} +inline ::ascend::presenter::facial_recognition::CommonResponse* FaceResult::mutable_response() { + + if (response_ == nullptr) { + auto* p = CreateMaybeMessage<::ascend::presenter::facial_recognition::CommonResponse>(GetArenaNoVirtual()); + response_ = p; + } + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.FaceResult.response) + return response_; +} +inline void FaceResult::set_allocated_response(::ascend::presenter::facial_recognition::CommonResponse* response) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == nullptr) { + delete response_; + } + if (response) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + response = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, response, submessage_arena); + } + + } else { + + } + response_ = response; + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.facial_recognition.FaceResult.response) +} + +// repeated .ascend.presenter.facial_recognition.FaceFeature feature = 3; +inline int FaceResult::feature_size() const { + return feature_.size(); +} +inline void FaceResult::clear_feature() { + feature_.Clear(); +} +inline ::ascend::presenter::facial_recognition::FaceFeature* FaceResult::mutable_feature(int index) { + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.FaceResult.feature) + return feature_.Mutable(index); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::facial_recognition::FaceFeature >* +FaceResult::mutable_feature() { + // @@protoc_insertion_point(field_mutable_list:ascend.presenter.facial_recognition.FaceResult.feature) + return &feature_; +} +inline const ::ascend::presenter::facial_recognition::FaceFeature& FaceResult::feature(int index) const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.FaceResult.feature) + return feature_.Get(index); +} +inline ::ascend::presenter::facial_recognition::FaceFeature* FaceResult::add_feature() { + // @@protoc_insertion_point(field_add:ascend.presenter.facial_recognition.FaceResult.feature) + return feature_.Add(); +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::facial_recognition::FaceFeature >& +FaceResult::feature() const { + // @@protoc_insertion_point(field_list:ascend.presenter.facial_recognition.FaceResult.feature) + return feature_; +} + +// ------------------------------------------------------------------- + +// FrameInfo + +// bytes image = 1; +inline void FrameInfo::clear_image() { + image_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& FrameInfo::image() const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.FrameInfo.image) + return image_.GetNoArena(); +} +inline void FrameInfo::set_image(const std::string& value) { + + image_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.facial_recognition.FrameInfo.image) +} +inline void FrameInfo::set_image(std::string&& value) { + + image_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.facial_recognition.FrameInfo.image) +} +inline void FrameInfo::set_image(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + image_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.facial_recognition.FrameInfo.image) +} +inline void FrameInfo::set_image(const void* value, size_t size) { + + image_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.facial_recognition.FrameInfo.image) +} +inline std::string* FrameInfo::mutable_image() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.FrameInfo.image) + return image_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* FrameInfo::release_image() { + // @@protoc_insertion_point(field_release:ascend.presenter.facial_recognition.FrameInfo.image) + + return image_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void FrameInfo::set_allocated_image(std::string* image) { + if (image != nullptr) { + + } else { + + } + image_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), image); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.facial_recognition.FrameInfo.image) +} + +// repeated .ascend.presenter.facial_recognition.FaceFeature feature = 2; +inline int FrameInfo::feature_size() const { + return feature_.size(); +} +inline void FrameInfo::clear_feature() { + feature_.Clear(); +} +inline ::ascend::presenter::facial_recognition::FaceFeature* FrameInfo::mutable_feature(int index) { + // @@protoc_insertion_point(field_mutable:ascend.presenter.facial_recognition.FrameInfo.feature) + return feature_.Mutable(index); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::facial_recognition::FaceFeature >* +FrameInfo::mutable_feature() { + // @@protoc_insertion_point(field_mutable_list:ascend.presenter.facial_recognition.FrameInfo.feature) + return &feature_; +} +inline const ::ascend::presenter::facial_recognition::FaceFeature& FrameInfo::feature(int index) const { + // @@protoc_insertion_point(field_get:ascend.presenter.facial_recognition.FrameInfo.feature) + return feature_.Get(index); +} +inline ::ascend::presenter::facial_recognition::FaceFeature* FrameInfo::add_feature() { + // @@protoc_insertion_point(field_add:ascend.presenter.facial_recognition.FrameInfo.feature) + return feature_.Add(); +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::facial_recognition::FaceFeature >& +FrameInfo::feature() const { + // @@protoc_insertion_point(field_list:ascend.presenter.facial_recognition.FrameInfo.feature) + return feature_; +} + +#ifdef __GNUC__ + #pragma GCC diagnostic pop +#endif // __GNUC__ +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace facial_recognition +} // namespace presenter +} // namespace ascend + +PROTOBUF_NAMESPACE_OPEN + +template <> struct is_proto_enum< ::ascend::presenter::facial_recognition::ErrorCode> : ::std::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::ascend::presenter::facial_recognition::ErrorCode>() { + return ::ascend::presenter::facial_recognition::ErrorCode_descriptor(); +} + +PROTOBUF_NAMESPACE_CLOSE + +// @@protoc_insertion_point(global_scope) + +#include +#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_facial_5frecognition_5fmessage_2eproto diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/facial_thread_base.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/facial_thread_base.h new file mode 100644 index 0000000..ebf5a5f --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/facial_thread_base.h @@ -0,0 +1,198 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018-2020, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef FACILA_THREAD_BASE_H +#define FACILA_THREAD_BASE_H + +#include +#include +#include +#include +#include + +#include "atlasutil/atlas_thread.h" +#include "atlasutil/atlas_app.h" +#include "atlasutil/atlas_utils.h" +#include "atlasutil/parse_config.h" +#include "face_recognition_params.h" + + +class FacialThreadBase : public AtlasThread { +public: + /** + * @brief: constructor + * @param [in]: configFile: App config file + */ + FacialThreadBase(const std::string& configFile) : + configFile_(configFile), + modelWidth_(0), + modelHeight_(0), + modelPath_(""), + nextThreadId_(INVALID_INSTANCE_ID) { + GetBaseConfig(); + }; + + /** + * @brief: destruction function + */ + ~FacialThreadBase() {}; + + /** + * @brief: Thread init function, override AtlasThread init method + * @param [in]: None + * @return: Init result + * ATLAS_OK: Init success + * ATLAS_ERROR: Init failed + */ + virtual AtlasError Init() { return ATLAS_OK; } + + /** + * @brief: The message process entry of thread received + * @param [in]: msgId: The received message id + * @param [in]: msgData: The received message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, the thread will exit + */ + virtual AtlasError Process(int msgId, std::shared_ptr msgData) { + return ATLAS_OK; + } + + /** + * @brief: Send message to next thread + * @param [in]: msgId: message id + * @param [in]: data: message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, the thread will exit + */ + AtlasError SendMessageToNext(int msgId, std::shared_ptr data) { + return SendMessage(NextThreadId(), msgId, data); + } + + /** + * @brief: Get model width of current thread configuration.The config + * is in app config file with format .model_width + * @return: 0:No model width config or read config failed + * > 0: model width + */ + uint32_t ModelWidth() { return modelWidth_; } + + /** + * @brief: Get model height of current thread configuration.The config + * is in app config file with format .model_height + * @return: 0:No model height config or read config failed + * > 0: model height + */ + uint32_t ModelHeight() { return modelHeight_; } + + /** + * @brief: Get model path of current thread configuration.The config + * is in app config file with format .model_path + * @return: "":No model path config or read config failed + * other: model path + */ + const std::string& ModelPath() { return modelPath_; } + + /** + * @brief: Get next thread id of current thread.The next thread + * is in app config file with format .next_thread + * @return: -1:No next thread config or read config failed + * >= 1: next thread id + */ + int NextThreadId() { + if ((nextThreadId_ == INVALID_INSTANCE_ID) && + (nextThreadName_.size() > 0)) { + nextThreadId_ = GetAtlasThreadIdByName(nextThreadName_); + ATLAS_LOG_INFO("%s: next thread name %s, id %d", + SelfInstanceName().c_str(), + nextThreadName_.c_str(), nextThreadId_); + } + + return nextThreadId_; + } + + /** + * @brief: Get thread config, include model_width, model_height, + * model_path, next_thread + * @return: ATLAS_OK:No config or get config success + * ATLAS_ERROR: read config file failed + */ + AtlasError GetBaseConfig() { + const std::string& selfName = SelfInstanceName(); + + std::string modelWidthKey = selfName + ".model_width"; + std::string modelHeightKey = selfName + ".model_height"; + std::string modelPahtKey = selfName + ".model_path"; + std::string nextThreadKey = selfName + ".next_thread"; + + std::map config; + if(!ReadConfig(config, configFile_.c_str())) { + ATLAS_LOG_ERROR("Read config %s failed", configFile_.c_str()); + return ATLAS_ERROR; + } + + std::map::const_iterator mIter = config.begin(); + for (; mIter != config.end(); ++mIter) { + if (mIter->first == modelWidthKey) { + modelWidth_ = atoi(mIter->second.c_str()); + ATLAS_LOG_INFO("%s: model width %d", + SelfInstanceName().c_str(), modelWidth_); + } else if (mIter->first == modelHeightKey) { + modelHeight_ = atoi(mIter->second.c_str()); + ATLAS_LOG_INFO("%s: model height %d", + SelfInstanceName().c_str(), modelHeight_); + } else if (mIter->first == modelPahtKey) { + modelPath_.assign(mIter->second.c_str()); + ATLAS_LOG_INFO("%s: model path: %s", + SelfInstanceName().c_str(), modelPath_.c_str()); + } else if (mIter->first == nextThreadKey) { + nextThreadName_.assign(mIter->second.c_str()); + ATLAS_LOG_INFO("%s: next thread name %s", + SelfInstanceName().c_str(), mIter->second.c_str()); + } + } + + return ATLAS_OK; + } + +private: + const std::string& configFile_; + std::string nextThreadName_; + uint32_t modelWidth_; + uint32_t modelHeight_; + std::string modelPath_; + int nextThreadId_; +}; + +#endif /* MindCamera_H */ diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/mind_camera.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/mind_camera.h new file mode 100644 index 0000000..30c874e --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/mind_camera.h @@ -0,0 +1,97 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018-2020, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef MIND_CAMERA_H +#define MIND_CAMERA_H + +#include +#include + +#include "atlasutil/atlas_videocapture.h" +#include "face_recognition_params.h" + +#include "facial_thread_base.h" + +/** + * @brief: Camera class + */ +class MindCamera : public FacialThreadBase { +public: + /** + * @brief: constructor + * @param [in]: configFile: App config file + */ + MindCamera(const std::string& configFile); + + /** + * @brief: destruction function + */ + ~MindCamera(); + + /** + * @brief: Mind camera thread init function + * @param [in]: None + * @return: Init result + * ATLAS_OK: Init success + * ATLAS_ERROR: Init failed, he thread will exit + */ + AtlasError Init(); + + /** + * @brief: The message process entry of mind camera thread received + * @param [in]: msgId: The received message id + * @param [in]: msgData: The received message data + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, he thread will exit + */ + AtlasError Process(int msgId, std::shared_ptr msgData); + +private: + /** + * @brief: Process MSG_READ_FRAME message + * @param [in]: None + * @return: Message process result + * ATLAS_OK: process success + * ATLAS_ERROR: process failed, he thread will exit + */ + AtlasError ReadFrameMsgProcess(); + +private: + //Mind camera self thread id + int selfThreadId_; + //Camera/video decode instance pointer + AtlasVideoCapture* cap_; +}; + +#endif /* MindCamera_H */ diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/presenter_channels.h b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/presenter_channels.h new file mode 100644 index 0000000..fcc8108 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/inc/presenter_channels.h @@ -0,0 +1,186 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018-2020, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef PRESENTER_CHANNELS_H +#define PRESENTER_CHANNELS_H + +#include "facial_recognition_message.pb.h" + +#include +#include +#include +#include +#include + +#include "ascenddk/presenter/agent/presenter_types.h" +#include "ascenddk/presenter/agent/channel.h" +#include "ascenddk/presenter/agent/presenter_channel.h" + +#define COMMENT_CHAR '#' +#define EQUALS_CHAR '=' +#define BLANK_SPACE_CHAR ' ' +#define TABLE_CHAR '\t' + +struct PresenterServerParams { + // ip of presenter server + std::string hostIp; + // port of presenter server + std::uint16_t port; + // name of registered app + std::string appId; + // type of registered app + std::string appType; +}; + +class PresenterChannels { +public: + /** + * @brief: Get global unique PresenterChannels instance + * @return: PresenterChannels instance + */ + static PresenterChannels& GetInstance() { + static PresenterChannels instance; + return instance; + } + + /** + * @brief: Init presenter server connection parameters + * @param [in]: connection parameters + * @return: None + */ + void Init(const PresenterServerParams& param) { + param_ = param; + } + + /** + * @brief: Get face register channel handle, if the channel is + * not exist, create it + * @return: face register channel between app and presenter server + */ + ascend::presenter::Channel* GetChannel() { + if (intfChannel_ != nullptr) { + return intfChannel_.get(); + } + + // create agent channel by hostIp and port + ascend::presenter::ChannelFactory channelFactory; + ascend::presenter::Channel *agentChannel = channelFactory.NewChannel( + param_.hostIp, param_.port); + + //open present channel + ascend::presenter::PresenterErrorCode presentOpenErr = + agentChannel->Open(); + if (presentOpenErr != ascend::presenter::PresenterErrorCode::kNone) { + return nullptr; + } + + // register app to presenter server + ascend::presenter::facial_recognition::RegisterApp appRegister; + appRegister.set_id(param_.appId); + appRegister.set_type(param_.appType); + + // construct responded protobuf Message + std::unique_ptr < google::protobuf::Message > response; + + // send registered request to server + ascend::presenter::PresenterErrorCode presentRegisterErr = agentChannel + ->SendMessage(appRegister, response); + if (presentRegisterErr != ascend::presenter::PresenterErrorCode::kNone) { + return nullptr; + } + + // get responded Message and judge result + ascend::presenter::facial_recognition::CommonResponse* registerResponse = + dynamic_cast(response + .get()); + if (registerResponse == nullptr) { + return nullptr; + } + ascend::presenter::facial_recognition::ErrorCode registerErr = + registerResponse->ret(); + if (registerErr != ascend::presenter::facial_recognition::kErrorNone) { + return nullptr; + } + + intfChannel_.reset(agentChannel); + + return intfChannel_.get(); + } + + /** + * @brief: Get connection channel between presenter server and post process + * thread, ifnot exist, create it + * @return: presenter server channel + */ + ascend::presenter::Channel* GetPresenterChannel() { + // channel already exist, return it + if (presenterChannel_ != nullptr) { + return presenterChannel_.get(); + } + + // channel not exist, open it + ascend::presenter::Channel *ch = nullptr; + ascend::presenter::OpenChannelParam param; + param.host_ip = param_.hostIp; + param.port = param_.port; + param.channel_name = param_.appId; + param.content_type = ascend::presenter::ContentType::kVideo; + + ascend::presenter::PresenterErrorCode error_code = + ascend::presenter::OpenChannel(ch, param); + + // open channel failed + if (error_code != ascend::presenter::PresenterErrorCode::kNone) { + //ERROR_LOG("Open channel failed! %d", + // error_code); + return nullptr; + } + + // open channel successfully, set it to private parameter + presenterChannel_.reset(ch); + return presenterChannel_.get(); + } + +private: + + // intf channel for face register + std::unique_ptr intfChannel_; + + // presenter channel for camera data + std::unique_ptr presenterChannel_; + + // channel params + PresenterServerParams param_; +}; + +#endif diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/model/.keep b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/model/.keep new file mode 100644 index 0000000..e69de29 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main new file mode 100644 index 0000000000000000000000000000000000000000..1e227bc4ed5c0d9aa7329b81b7d148f7c1f6fbe4 GIT binary patch literal 848816 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±Vuk)f_?tXC(cG-_*qY!rC<&g;5M9q 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 F{|^dIdsYAd literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/param.conf b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/param.conf new file mode 100644 index 0000000..b449d49 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/param.conf @@ -0,0 +1,40 @@ +[baseconf] +# A socket server address to communicate with presenter agent +presenter_server_ip=192.168.1.223 + +# The port of presenter agent and server communicate with +presenter_server_port=7008 + +# the ip in presenter server view web url +presenter_view_ip=192.168.1.223 + +# view entry label in presenter server view web +channel_name=face_recognition + +#the data type that send to presenter server from agent, 0:image, 1:video +content_type=1 + +mind_camera.thread_name=mind_camera +mind_camera.next_thread=face_detect + +face_register.thread_name=face_register +face_register.next_thread=face_detect + +face_detect.model_width=304 +face_detect.model_height=300 +face_detect.model_path=../model/face_detection.om +face_detect.thread_name=face_detect +face_detect.next_thread=face_feature_mask + +face_feature_mask.model_width=40 +face_feature_mask.model_height=40 +face_feature_mask.model_path=../model/vanillacnn.om +face_feature_mask.thread_name=face_feature_mask +face_feature_mask.next_thread=face_recognition + +face_recognition.model_width=96 +face_recognition.model_height=112 +face_recognition.model_path=../model/sphereface.om +face_recognition.thread_name=face_recognition +face_recognition.next_thread=face_post_process + diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/README b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/README new file mode 100644 index 0000000..f151a45 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/README @@ -0,0 +1,15 @@ +First, you must ensure "python3.5" is install in your ubuntu environment. + +# Install the dependency package. +# First go to the presenter server directory +1. sudo pip3 install -r requirements + +# Configure your network information. +# Modify presenter_server_ip to the IP address of the private network that can be accessed by the development board. +# Modify web_server_ip to the IP address that your Chrome browser can access. +2. sudo vim facial_recognition/config/config.conf + +# Go to the source code directory and run the python program. +3. python3.5 presenter_server.py --app=facial_recognition + +4. Open your browser(only support Chrome now), and visit the website, for example: http:192.168.1.100:7009 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/__init__.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__init__.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/__init__.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24bf4592bdd7a9d7edd39549ffdbe6e624b4b4d7 GIT binary patch literal 238 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 bbC#6a*VK*Xbq8%F=q*5<{#Da5mKOg5FNbLb literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/channel_handler.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/channel_handler.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..952bb64773a933472b4e598d08fe60b20fa933fe GIT binary patch literal 5357 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 literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/channel_manager.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/channel_manager.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cb165af7ef9208c7f3b82c6010e27d49b3d85e7 GIT binary patch literal 9505 zcmcgyOK;rP6(;AU(dc2>R%|J8Y}$?=<0vD?O;T5IT)U3lIIst4>?Xk!2}|)(5~UF- zUveyKAOi(tpheNtEs6py&_&Tr(M^}#c2%Iif!!47qVT%AtoogE$vZRDNKRcKBlBMJ z@;=Y`&XfMe#6<0)gLDBLsZ6J2XVdXX2zp0wN* zCkVW@weAGYGM?8%(P?|nu)fiJRzvxWHs#WD_S3t387-cH-5J=KiJg@NcK5_=m3W;> za^QxV{Ua|5JJR*KzwsV=a!W6|;zX8XS-D^;^*5VdbJWJE1Q_+v= z0xEN=Pdf9O%aJER_jxy5Uk`)% zl;w8H^2WwiQnj(BAKUgt>^Lf+FwBbCoyl>gk#!>)lxb9em25ky*|q`>?#FHWLC0yQ zZ$@legsyE%!V(jtuNb8^T5S#&FIz2^Om1<}qJPAXYq+8r6a$EZL_9How-WeLPDa!H z-V)tk?T0kt|MM`$uu#1iV=2`vI#P0yM5=g?O zLK;C#QIv^ERKAR>$HPOKCYpQTogAZa<5WygF-gUqEINRg#JHG1eOOG21E{CPlsJg`C2>d` zMtwv~i5aLU)v`hPBiQ+$JlbR6G)`xoFY6!Y4KJ1DXhz(LFlIOf4t_ zYirRxh9TR=DjcJ=syq^#t1!zu%0Q!)_jE4hY#6k+aO@moEf*#;_C&*K!er0dgRA!d zl2nxLPhh|TZ_~D6^NVgfl1H(F{E5gB`W%;%{6ftfuXK+L&Wv;MG};D`I2Um-NlCfV zu~yA(bH|j^biZxBOKpYi!mP1cd|Zr6@Ii_@I554t0uu0X&)+6LE^yk+1~^T8J{&w< zU)wse*ki7e1{-KgipyS{9L!oY#+6+m1z#_*vP;GYg0}Ll_B1`oG{i({aXXuHN%)v1 zB0Xso#?7iZZgx+n`$~nkF>I7eP89t}lai5QB7KM(I{edXCJz6&yj>QBZyJxwjDj*0 zI+3Sj8gX$Oq!Pt1h*Tva73wnHnmYy4_{0#U?-?H%pQ0wG!8r?H=ZTgHYbvVN=8EsG z^!cNymeDlRVhM}2=qs1g$@GE}bTVccUC5pfs*T-!mc+uKSF0x`M>d_QH*DP#zGIVF z#IVlBMkt}!$ZT4nv>y7x3wwQ2*A+@3$R@JVHbe&OTBc)#6Fa?e-I

FO}sN-xfJ z8`(tc5iXpG07MP7g)<#eJbHs?BIpV2CpYVr;{Df1Bis=FDm$KU}5 zkh8?vqlp_L`qQgSZ1d?H*C0Qu+;{MMbc@Xbe+njNV?7SA0VVA zArXAI{q9q#c{x|gCQ~DbTzj0<%aPDb^)Mf?yvUO{qa+h4nPunbjzWcu1t+Ls&}&T; z1a@)2UfhC__yPkIAIeo$-z9U>?7p5C1Om|>GYl|8O9O#}n2}1uaVC5w5k(??O5odj z(=|IiDN{|C{>DKK+k`b^-NB@(6D7#HWTfGUDo2{*!@)_Up+$d7#9?2*I1Vk*ed8;W zg+>n$hGI8HX#+Pzn5V}TN(ql}2rRTg;K>oV$D~Oum~sJLgCW;)ohkA>^632MF?%0A zNCju-9|nzC%&Xa&&Z}_odyGuYIvI7C_4B#I?>Th%xzA!kKKGGkK9qTjVp?`hFCfQWgMlR%!+Qi~&jt zO6=dA$Pp~xe>neN2=|w@*pmSCxkZ^blQVa^`{22?dE4*Yuj~P666L=T3E0VH5BSux=qT7#4h!3Q zPGS*_5CF%Wz61+DaxMjatLwy+E_K}4M@EIZvI7}}y^vRLm>^G>IZPY2P%H!VpUpfr zY2(}GDijx$!uVa`mxTx9Y?}z8Dr)_tM3e)?DfO2csie@jn3#UuRE`~MW73RY)~-+- ziS*^h)xY66qLq9nJ(xXA`n;!o%cfu7ADko|a7}1}6L~ zt<35kwy^et{d-3qL}XLfW9PW5&g`vOFKd>C0R?v{&vKk1od} zS)U!!A7>v^Jfp(F>bAL7ke7K>8rR_6=sn}XlmqI)+B12dCEZl$&4`0Y7_ zK>Pf>N3Q1ye2I8u1s%>(ym_(F{oqBXqm`UCCCIld?-3x-0CUL*bfvY1km0?Aw|Rd}Z{EhYi)_BXqhmx_2m=~ul0%k?IStR5 zf|nYCmmz_7Muh%(hQs!A%nR5UPn$4jw_-CUAi_&ySiZ%uEOM3t5Cbe{@D|}X1Fy0= z(g$nwde`{Scre3euaGJ+`X*KEHZ_7eLAJGiJJ^Gv@Y){KQV*g-VR)o(niQ`D#Adz9 zY?j}`p(Ghj>9{$%?wR`e~=PsD#k^Q;S{RE@p4-iiU0)52ha5uQk0kS3FqXOz~MrK{WDX0td_&OCF2faae6bs9@sd$%)t5kfO zitAL6Cm<=Bknd5!K~k@vxJ6E*xQQ#GtyD)#g%bQg`lB2kCA9HZs1<8t)oS%{b+kHO z9pS$!?nluwj=zcOWOa;ZLKc{u8RZwzwDOxMT2t3=+`s+tP5aLEd-v`8x9{Fm>3RBY l#9l3r9k#usdPV(Tk*gN^@_(@@6|k>jsZ=UVV%f>j{{r3P4!ZyV literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/parameter_validation.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/parameter_validation.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6dd3b6755fcb6059fec2eaa927fac224f1354a4a GIT binary patch literal 1778 zcmcIlU2hvj6rI@*d+j7{nubu?Dq2-4lBFsO1)(ac5G_qAOUOiN)KmtvEISi-cWF}MME^%;Xu*5J zddk{Y#y58&6%A!6mH#YC6A_h3p83OEj8gd$N3d?f9LADYe=!zw3ZS{@i|AjX>px*8 zfHAPtddUs}=Zte!T2n9Vr&v9-g>%MFdFf2}85i!rR`+S;cwD*^dCb1czO_!RQ~Tt8 zS)16%btaCe4VV`2^?{>)HhX&$c4nE~F#W;u|kP1XD!9%U3YtR%g2A zC&i|JM~_#q!9lKuQRz#ia_F4Cl|>{Mn|LuR9) zR8c7_o7S4Ri;>)-P1EEVT~H z7fMDVIEZ2yDjDbfEFp!2F+`)HpiolF4C>KR9Z40$`EZzLL2)js@MtcojpC$Qm`!nh z@gb0FGK_n?iSAfUzQ`TE!Y#~}F1I@VI@$&i27r82N z_hNgzx`W}n*I!ozv%0qP_3mES>F#aqK7068_-N}%r(0cpGq}}#tf;b7jZB>k6CAMiDjWj)Haubsif5xOeu_sd| z?FlitF1TTA6^wB(_UV){ih>#XoY>v%y|!iEcnaN71fz0)kSKu4hC0>z2)qq{c@7`4 zmVK!@NYeQ9&EJ4@0OU6jiRtdC(HqQ>-^1kO`V6@>u?V?ZdkgX1|3+*Z#Jv`T3=vB~ z0v^drQD5my!G?X52uffV5H5iBjCcY17UKUS-IaTg=23Z(aPR5!?6Mt5sYw|VlL zH*qhY<6cL+-KgqeDDpTAr`lYlP2VF!^=PDIZpFN%qDL-VE`6Mo5vccI`j_&#kC0x5 RakytWsCjSATk;xS<6i;Yh!6k( literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/presenter_message_pb2.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/__pycache__/presenter_message_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4f8fe2df0652969b0a795ea162ccea3ecfb0e20 GIT binary patch literal 8058 zcmbsuO;a1mbw&sw1|fv_FszN&7XAQiBtFcpz3cTNglxRAffe#@b~efENZp8m(Tuid zu#K|G#W|(Qw;WQrq*9esCC5|_Ii||_0l815QkBX{hx~zDlJ|O~Ve|#EqbWVT>3;pb zyZd!(b$D3%xs>|mC!Y(#zXads65#9bwf;UJ2t**FF318E4n-nN3nXwPu*;;61b-$} zu91HHl>p^*f#ttXx#48bW2_9ZROrGL$XUJtw?)zoaZdL=JCAl=UGC1MRJ4Oc;m-h8u+m8jU-8Nxiehuj3*Z``7#mY_sOJug-pp;$#-%B-e=+c8vKF{ z@(sXmLf;(ui98Q77swJ>MjhchaCnQXkX6uglH7r3lB_{|KX@e`-XeF_c>~L*&AyQrJ=h}Ww za$MUp=sM`QNAg_q5|{jpeBqP)CHX#={1uV8WY_QL7pGWsY@*{|2ptsnU z`r2ZukZ-uI%UoBL6nwfC3F#@OlP>RYt$x=`eokI+9aiZyT|B%) z?oA8I8l9j?z&AL)M3({o67UbGi+|1Wi*yCri=1Ye<7M7HLsz}Ai!^@tAz8XF&?Lv! z0ZVag3$P`QJppW)W6uCv;g|~8D#sXL6M)?%qkv6wYzDB49GeAfhGTPp#SZV$IA7C- z4nHDGbnx)weUaX$i{vFac^!DwCw~Go59lWz&ALaE^k_ciG@p7jTOLiyqgm%P>mJP$ zk7miENpqUCNAt|1S@vi)IL(Gfqk1$e9!-YRWIP(?(X4tjo1A77X^6Nd%>T58+x~W~ z4`5M596tDq-wb@MAb{@#AQiX&0KgGnG9>2UKfg~Mm}Qz$ts*r@>V?UUQkGh-=+sIT zEBdj8-;_?DQ+-9TH0)3`W1li=6luy(DwOS;tgPbOvQj?QZB3~#vq&vVu@4wkNorp$ zQiai?Su!+RGYzGvmMK$H6-F&;*pyk6J*O;HG|OevIBizSz(g%krBYZ)R!*GoeO)aV zi2C3<8U{){n2q z(~|(yqtrMqEA~l+DleE?0fV7YBGf7}tzw(_Hc;0TI~d*9X%X#&w-M{4TrhQosJ2>A zEfDEMPe-C*)eD{*8uli^f3{hjbVCAfbvL=~a)@`Y9{(GZm%5FPcNv|~rT9*T8kqyt zFsPoR-yT!Tj*m-`qT8Yv5S%ITia0kIUx!u`0%X|S{HXx6MpqV+ofS*gd1l-pd2m?5 zkj9#%SryZ;C@_{NVm+Vp~*Yc7dw) zQ#X4O2}#PBCL@}m+B7~Wi7&atVMI^(xZ%W`Ux-pP2Vql<5+r!qwpsj+6xQiJm~K}1 zfT5K{Hx+&S?@AG-l@4sBVA{4>=KOmb8J8qoEl^#t=}UX64*WPjQpq|Y!F+ML{Z=a z)HUf!Th}wgI<8bqW>bQ*9b9!oN}NUI=3(7Wt%ADxsZd|>=7UZUS0`tnq85)}GB_dY z#IV(u@-XZmnyPD6N?=WOI%YxjR+nX~H8XI1aXKf=d_Nn3-NEVC3_@QzA=nrSlsN-t z1=oAa3F0o{oRd*C+?So+QmTggnbRewvPvK|E$y{_;G@kUvyQ3XH9K0fw4NQU%{WV(b7zRt!|Z@)w=(B5 zL%W3*{0%MWu!DDvg)h77dxz7s)mK00;?DMg$)c}Bs0~8iJamL=|FONlcy~U=Gmy*%3^%_<8l@kfP=j6t#;zj6h-N9U zM^eLrStpNpsA3gOD9Q!%bxr-7V#w6WB*>P*%uIhIh$*X0jUM0VkOt-LhctKsQAFf+Za>-62u>!Bb zA}`b;m}f0Dc=g^}*xg*d*YI$w{S!m+OQ9bBOCj!?GxR>C~hUo;9f;?3+O*jdF0zSx-pEVJOtMujoSf+>xdjvT5bp!?l$tkrn@`J1K6*Sf*gGaRovz&`#mI! zW?>^aZIs9G{R=Gge2o*z&Te))vz6Z7&OXWJayz-q&SqAg%+V5@>L_dBF@o<{&VT7% zcCa`~8dK^FGCSM(>~=o?)ozwu!=8xp_-Xo4_Tf(MX*$ntV$+1Oo6GJ2)n+=M_9U`- z=wo9DrVzY`0RN_9c-z8mAeck2fZ!H_+Xxl`$db>Xk%zd!o;Elk0+&lrw2%2M&1FA- zmfg$C41Vc2`mUO&R#*W2bnzLr;I8LKr>D28PaTwMB|Mw8X_l|eFspWk zP1I&@E3CjKf2^>{W36_UX`4#97+vmgH*mes<#ymV_TA79T>cbq2R`ez-Cv`HO0}%U zlegT4&)hZ6eU8`C&Aqzkx$XOPufFRJ#@wlUtnKpupn|_vDbOg$A!y*reiVBHSMVnY zTm_w1sN?9g#`GU6=(NFdxaXM3^0=GKViUOMWhZJDE3zrPPp}f3#=XF1*csd>*(^JY zdy&ntdEBSi0y~F$iJfN`aGz!u+3(;!!!EIJ;C_Z(X0PBr%WMqDm3aO^Iv|^3JT}E} zMDN!}#;4&Q9CW>AqaHSW&;G0#?%DmJ#F%(trBJZ(Yfw+=M|Zkz;tDPzU}{fs6s94> zQ%mcq$10{xM>~w@3sIOVSmnFHO7=!Ea*CWfV`yuzl1^E>8HBE9C(%noMX1=|ujw_~ zUFO<#&u(^}zLOThJG1L{$LDB%ntz>JXl=Eu$Ft!cck9e?pEW}#K&Kmfaq%G7b@nK> z?RxRN(?E{UbtIY`+0?QY8-d&2iA%#x|CPe0QT2cQ_41y7;4asLhU>BA&wReW9Mlgw zZ8unMblTm3uI0A-)NQ}*1WihCn%<7fU9aITdrrsYJ3c?C)7x9lLAMKaCv<>n={$4Wtvvs>qigwqtZEyEeGF5_nmLkJemj;%hXLZ zx;z#+l{9;X0|O=K5;*uN9zvx>mx@a}CN$_kgWfXmp2KA_^;lOG5to-35zkgQL3k0* z1*T=slgGdiGk&67P(Ia;v?Dz%wx*D)#Bx7VThqsis)RGl>}frHM_W)b%;lqBWm7IE z5l9#k3R&|1IV3ra`+Ak__d8)+*xb11P*xNvZf-aa*B))It=_uz zFgCWE9*a%+t@w=0<2+uyyXAcE(b}W6coNlYw^2{i+l?pDV5-vt5aS66Q;IjY#2Uj& zO4f?3F9C9#3((gv&UJXx3(E$d!U*sZg4o#egD^H|?TS?;gBeOMBDjw$pf_b=R-IFe z^rtWAvwHMKHfoy#BCj%bB{xW<(~s_%G%MgGm1dA$dh{N8YD)oOZ}F~chrS(zerG^N z%HdCCm+XIK3%Z6=ZMcb^k$C8LB%VgSgVM)Eav%h(7A=nN#z={Vjw19U1Wn=+%kUW< zn2M#M9AViV<(_T#^q#h_bMJ7rr?ymDEa$OQj*Q2Ochyirt)=f5cvZzXU^y8rs4e8n z9V^EgY2Hoc50xHj+SmA}EWfGray{cc)Ek<;9BR>@lpZTA*URmY7Pg{)&Q{h#2vU2e z`OIZD#OW@y3af|pEcxWZYxthG(qE|b>NZHiWo1Z=3#p9?SHu&2z}`L#-M)-}=!RYH zjp!NfhAVRVd~UDT+krb&>2`N#q&^!_{W>{eBuZD}V%K(`HQWxhZADIg#U*oMy}DJ_ z)~n*m$0e}}AFkc}#Hl{IcP};|w4d^`s432g>~X&B@9v6~veQJD{8&d=HU(Z{g9e~x zrTwiH_v!)UzSK@hJQ`V>2>r0$cJMf|Roq&BmTBRRsf{lC|6iz*ta`xgZB$;88r<2T;{8ni9=#@mO0BpdG+kEO$ahuE&+v~R5)mXdxaapTY%M-kU!RI6a`0Esu5kM(~yxRz4 zb2GVjy-vNcpWx36{k?YCl1Q5z7{xdzMk>~^Vqz;bh-y>mlS7L*7Oz>?rQwuzY!rnh z37)iqV>B)i-U~ooQ8n~}T2c#I^xE^Vmlki3y+OYrq4z^X44_XJ*fW4GBe)i-EiJZG4O;b6H&pwV%1ExSR0du_?<+|a{^>0R(QI{>^nQ*yCb&3>Qh`+w9%t-_ffL9iX zXCJ{YfwMN~vL)g%FG0)rA7JkJ`xLy3Kw_3Y`Wzfm@?RixFo!@X%t;(V9+n7+s`(YL zNL4h*6{H{8ZkZ%}2QMeEn1e*ijbIT96H?CTsUIeuQXS6l|1*RofP`eFxh8dE?{NRX zt|wA9TQ4sP#nWK6?XyE6|JJw4`Uq^wd1+~V3o{^KAq5i^5gwg^HUb;4mJWp6z!0c6+Ea&E)?&=Bm*G>g}s^yBXM3-*YSL(*ApUD0OAAyELrP z(})ys$N@;MV8;7;nUk+Ab@j)1f{m8C_oy7IT(}A(LZn<<^$fj)HiIts9v3{oO@)B9IslE$263H52fAD;o7qN}HXC`Efx zLFPmEnQ;ONDg+})rDG+8^MEV=vG7&N&z12XDk1n}_^}4l z;f#QQMJP%nK(hg~LTeIcUoQcg)tZ!MUji%=h56`@p93t>gO?14t?2!Pzw+GAgvgX0 z@k*oJ1TTBN*#QN#WG8RLmx%WrhMSOCf?bNr5+2e??fb59dqA>MTBY6~fA(6rS}yVh zjDBp&82$}Qy{$PLf1>N56`&m2X1O)W@zT5qhnKcHx;JT_Yq9< zE64}-TM0 zL4ovZc)-jnKsuqEunvRs2=Wvr=mdWaQc@=rh&?qu`qNDQ5eo|Lfrs1J6Ukyvs#}`8 z0n0GaJcA_OSWkeMRoeX-_=xTAC;LvMQo*blQu<6cw-zCn}$0ADOCnHdAz2;R?+h!AO|^Q-;~Fv{S`Ss^qf5nVO>t zNEnLAsG-V4?0~MtjtMARuoIX9nv~2UB6cFBXQA+VL{f-NBNdgSg=}FfO{%2?>?2_9+v>C07?5mQVTY`Hdw=e0-_Q;n9@Sm-k ztUn_)bva1H=Dur(d(A=e`}zz0vf6v;f)e}<^#Z>h1!y=)`{7@&U+{&#cfDT@q5^xq zp%Wf<+_ZA>!JBeAZp!p6nf%*-F#DqGbr0+@mH#NqLCx4dnd9yO5xn2B-~8aqa(>ce zu8*8=^>ZF&W#DMldEl;tF9AnOW7^+Uu-9lm!R{afB_yPBG~M;~J^!-|DA5(pd4?J> zRf_?+t)yI`9)qwFE!_ky6A~`mEGIJU)ZxXmD@y|YaNMcXB8$!^^Nvqr$3|AR-3<;a zajr?-j&o0`PZ65Lnsr-DR{xWkK4+Ekg;?)wza7tR0NBYGK9mb8K06c_bbK#xI|;Zcwv8_HZg1)=qitkNlyfu$v;75@k}#F7dLIaVUKYx)$R`b z{4|a0lz9@)6pU2nI{tnxrus8_y`21-I z8=E2!#fb!u&q>!HZ8Z&#-{lQgs>%5i4J0a~T#&XnsX$4U3O+xdh&r(ctwpB?-)Nk>h1elx$fF@^n%L0rb`9srQ0&GA?_6p2X;k9gh(sax@R=;xQKF z$!we5#$IAs4BL@3;wM!6I2#1T-tL>9V~Yuc3Hh#%wNuxl`9y2jKROz;EYA)^!+I2E zVl?LuIx;~Q#G=c#qDzkw%N3I;G+U~1P-mrFs1^F~<3E6MjxV3+T-6^KjMxO{#-dK^a>$-ZKg5(XBtWwC^ZRxdZIT;9y^`TDd(bp$`s7%gS$3{8~hB;)Fva^ zPdss`mq?$n9MG_JkqWu~NdqB?nY+`3=}h~6X^!D?13A?(QHIOf3 zmV^0B3x}igxMr+3aNV}v<&?WT z$A5|&e}#hYP#`Apb$Sw$cy8DCciV0youW!I9m3m;FUdpGNKO8gAeA2uxw7+Pqouf7 zNJ=ImF(oI3D_I*&Oj$=-=lu65_#Oo$MQYRcH*Y(4a17VEw^qHqbw_k-+~~yChjMy8 XvQbWmAOka={*g;X=VA@rpr8KV HEARTBEAT_TIMEOUT: + app_id = cls.app_list[i].app_id + cls.channel_manager.unregister_one_channel(app_id) + del cls.app_list[i] + logging.info("unregister app: %s", app_id) + time.sleep(1) + + def set_thread_switch(self): + AppManager.thread_switch = True + + def register_app(self, app_id, socket): + """ + API for registering an app + Args: + app_id: app id, must be globally unique + socket: a socket communicating with the app + """ + with self.app_list_lock: + for i in range(len(self.app_list)): + if self.app_list[i].app_id == app_id: + return False + + app = App(app_id, socket) + self.app_list.append(app) + self.channel_manager.register_one_channel(app_id) + logging.info("register app: %s", app_id) + return True + + def unregister_app_by_fd(self, sock_fileno): + """ + API for unregistering an app + Args: + sock_fileno: sock_fileno is binded to an app. + Through it, find the app and delete it. + """ + with self.app_list_lock: + for i in range(len(self.app_list)): + if self.app_list[i].socket_fd == sock_fileno: + app_id = self.app_list[i].app_id + self.channel_manager.unregister_one_channel(app_id) + del self.app_list[i] + logging.info("unregister app: %s", app_id) + break + + def get_socket_by_app_id(self, app_id): + """ + API for finding an app + Args: + app_id: the id of an app. + """ + with self.app_list_lock: + for i in range(len(self.app_list)): + if self.app_list[i].app_id == app_id: + return self.app_list[i].socket + return None + + def get_app_id_by_socket(self, sock_fd): + """ + API for get app id by socket + Args: + sock_fd: sock_fd is binded to an app. + Through it, find the app and delete it. + """ + with self.app_list_lock: + for i in range(len(self.app_list)): + if self.app_list[i].socket_fd == sock_fd: + return self.app_list[i].app_id + return None + + def is_app_exist(self, app_id): + """ + API for checking if the app exist + Args: + app_id: the id of an app. + """ + with self.app_list_lock: + for i in range(len(self.app_list)): + if self.app_list[i].app_id == app_id: + return True + return False + + def get_app_num(self): + """ + API for getting the number of apps + Args: NA + """ + with self.app_list_lock: + return len(self.app_list) + + def set_heartbeat(self, sock_fileno): + with self.app_list_lock: + for i in range(len(self.app_list)): + if self.app_list[i].socket_fd == sock_fileno: + self.app_list[i].heartbeat = time.time() + + def increase_frame_num(self, app_id, channel_id): + with self.app_list_lock: + for i in range(len(self.app_list)): + if self.app_list[i].app_id == app_id: + if channel_id in self.app_list[i].frame_num_dict: + self.app_list[i].frame_num_dict[channel_id] += 1 + else: + self.app_list[i].frame_num_dict[channel_id] = 1 + + def get_frame_num(self, app_id, channel_id): + with self.app_list_lock: + for i in range(len(self.app_list)): + if self.app_list[i].app_id == app_id: + if channel_id in self.app_list[i].frame_num_dict: + return self.app_list[i].frame_num_dict[channel_id] + else: + return 0 + return 0 + def list_app(self): + """ + API for listing all apps + Args: NA + """ + with self.app_list_lock: + return [self.app_list[i].app_id for i in range(len(self.app_list))] diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/channel_handler.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/channel_handler.py new file mode 100644 index 0000000..d7fa5d4 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/channel_handler.py @@ -0,0 +1,227 @@ +# ======================================================================= +# +# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1 Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2 Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3 Neither the names of the copyright holders nor the names of the +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ======================================================================= +# + +"""presenter channel manager module""" + +import time +import logging +import threading +from threading import get_ident +from common.channel_manager import ChannelManager + +# thread event timeout, The unit is second. +WEB_EVENT_TIMEOUT = 2 +# thread event timeout, The unit is second. +IMAGE_EVENT_TIMEOUT = 10 + +# heart beat timeout, The unit is second. +HEARTBEAT_TIMEOUT = 100 + +class ThreadEvent(): + """An Event-like class that signals all active clients when a new frame is + available. + """ + def __init__(self, timeout=None): + self.events = {} + self.timeout = timeout + + def wait(self): + """Invoked from each client's thread to wait for the next frame.""" + ident = get_ident() + if ident not in self.events: + # this is a new client + # add an entry for it in the self.events dict + # each entry has two elements, a threading.Event() and a timestamp + self.events[ident] = [threading.Event(), time.time()] + return self.events[ident][0].wait(self.timeout) + + def set(self): + """Invoked by the camera thread when a new frame is available.""" + now = time.time() + remove = None + for ident, event in self.events.items(): + if not event[0].isSet(): + # if this client's event is not set, then set it + # also update the last set timestamp to now + event[0].set() + event[1] = now + else: + # if the client's event is already set, it means the client + # did not process a previous frame + # if the event stays set for more than 5 seconds, then assume + # the client is gone and remove it + if now - event[1] > 5: + remove = ident + if remove: + del self.events[remove] + + def clear(self): + """Invoked from each client's thread after a frame was processed.""" + self.events[get_ident()][0].clear() + +class ChannelHandler(): + """A set of channel handlers, process data received from channel""" + def __init__(self, channel_name, media_type): + self.channel_name = channel_name + self.media_type = media_type + self.img_data = None + self._frame = None + self.thread = None + self._frame = None + # last time the channel receive data. + self.heartbeat = time.time() + self.web_event = ThreadEvent(timeout=WEB_EVENT_TIMEOUT) + self.image_event = ThreadEvent(timeout=IMAGE_EVENT_TIMEOUT) + self.lock = threading.Lock() + self.channel_manager = ChannelManager([]) + self.rectangle_list = None + + if media_type == "video": + self.thread_name = "videothread-{}".format(self.channel_name) + self.heartbeat = time.time() + self.close_thread_switch = False + self.fps = 0 + self.image_number = 0 + self.time_list = [] + self._create_thread() + + def close_thread(self): + """close thread if object has created""" + if self.thread is None: + return + + self.set_thread_switch() + self.image_event.set() + logging.info("%s set _close_thread_switch True", self.thread_name) + + def set_heartbeat(self): + """record heartbeat""" + self.heartbeat = time.time() + + def set_thread_switch(self): + """record heartbeat""" + self.close_thread_switch = True + + def save_image(self, data, width, height, rectangle_list): + """save image receive from socket""" + self.width = width + self.height = height + self.rectangle_list = rectangle_list + + # compute fps if type is video + if self.media_type == "video": + while self.img_data: + time.sleep(0.01) + + self.time_list.append(self.heartbeat) + self.image_number += 1 + while self.time_list[0] + 1 < time.time(): + self.time_list.pop(0) + self.image_number -= 1 + if self.image_number == 0: + break + + self.fps = len(self.time_list) + self.img_data = data + self.image_event.set() + else: + self.img_data = data + self.channel_manager.save_channel_image(self.channel_name, + self.img_data, self.rectangle_list) + + self.heartbeat = time.time() + + + def get_media_type(self): + """get media_type, support image or video""" + return self.media_type + + def get_image(self): + """get image_data""" + return self.img_data + + def _create_thread(self): + """Start the background video thread if it isn't running yet.""" + if self.thread is not None and self.thread.isAlive(): + return + + # start background frame thread + self.thread = threading.Thread(target=self._video_thread) + self.thread.start() + + def get_frame(self): + """Return the current video frame.""" + # wait util receive a frame data, and push it to your browser. + ret = self.web_event.wait() + self.web_event.clear() + # True: _web_event return because set() + # False: _web_event return because timeout + if ret: + return (self._frame, self.fps, self.width, self.height, self.rectangle_list) + + return (None, None, None, None, None) + + def frames(self): + """a generator generates image""" + while True: + self.image_event.wait() + self.image_event.clear() + if self.img_data: + yield self.img_data + self.img_data = None + + # if set _close_thread_switch, return immediately + if self.close_thread_switch: + yield None + + # if no frames or heartbeat coming in the last 100 seconds, + # stop the thread and close socket + if time.time() - self.heartbeat > HEARTBEAT_TIMEOUT: + self.set_thread_switch() + self.img_data = None + yield None + + def _video_thread(self): + """background thread to process video""" + logging.info('create %s...', (self.thread_name)) + for frame in self.frames(): + if frame: + # send signal to clients + self._frame = frame + self.web_event.set() + + # exit thread + if self.close_thread_switch: + self.channel_manager.clean_channel_resource_by_name( + self.channel_name) + logging.info('Stop thread:%s.', (self.thread_name)) + break diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/channel_manager.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/channel_manager.py new file mode 100644 index 0000000..04d8578 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/channel_manager.py @@ -0,0 +1,291 @@ +# ======================================================================= +# +# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1 Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2 Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3 Neither the names of the copyright holders nor the names of the +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ======================================================================= +# +"""presenter channel manager module""" + +import logging +import threading + +# max support 10 channels +MAX_CHANNEL_NUM = 10 + +# when a channel have receive data, +# the active status will last 3 seconds +ACTIVE_LAST_TIME = 3 + +class ChannelResource(): + """every channel has a ChannelResource object, contains a ChannelHandler object + and a socket fileno. it corresponding to the ChannelFd one by one + """ + def __init__(self, handler, socket=None): + self.handler = handler + self.socket = socket + +class ChannelFd(): + """every channel has a ChannelFd object, contains a ChannelHandler + object and channel name. It corresponds to the ChannelResource one by one + """ + def __init__(self, channel_name, handler): + self.channel_name = channel_name + self.handler = handler + +class Channel(): + """record user register channels + self.image: if channel type is image, save the image here + """ + def __init__(self, channel_name): + self.channel_name = channel_name + self.image = None + self.rectangle_list = None + +class ChannelManager(): + """manage all the api about channel + __instance: ensure it is a single instance + _channel_resources: a dict + key: channel name + value: a ChannelResource() object. + _channel_fds: a dict + key: socket fileno + value: a ChannelFd() object. + _channel_list: a list, member is a Channel() object.""" + + __instance = None + channel_resources = {} + channel_fds = {} + channel_list = [] + channel_resource_lock = threading.Lock() + channel_fds_lock = threading.Lock() + channel_lock = threading.Lock() + err_code_ok = 0 + err_code_too_many_channel = 1 + err_code_repeat_channel = 2 + + def __init__(self, channel_list=None): + """init func""" + + def __new__(cls, channel_list=None): + """ensure only a single instance created. """ + if cls.__instance is None: + cls.__instance = object.__new__(cls) + # default create 2 channels: image and video + # if channel_list is not None and isinstance(channel_list, list): + # for i in channel_list: + # cls.channel_list.append(Channel(channel_name=i)) + # logging.info("register channel %s", i) + return cls.__instance + + def _register_channel_fd(self, sock_fileno, channel_name): + """Internal func, create a ChannelFd object""" + if self.channel_fds.get(sock_fileno): + del self.channel_fds[sock_fileno] + handler = self.channel_resources[channel_name].handler + self.channel_fds[sock_fileno] = ChannelFd(channel_name, handler) + + + def create_channel_resource(self, channel_name, + channel_fd, + media_type, + handler): + """create a ChannelResource object which contains all the resources + binding a channel. + channel_name: channel name. + channel_fd: socket fileno binding the channel. + media_type: support image or video. + handler: an channel handler process image data. + """ + with self.channel_resource_lock: + log_info = "create channel resource," + log_info += " channel_name:%s, channel_fd:%u, media_type:%s" + logging.info(log_info, channel_name, channel_fd, media_type) + self.channel_resources[channel_name] = \ + ChannelResource(handler=handler, socket=channel_fd) + self._register_channel_fd(channel_fd, channel_name) + + def _clean_channel_resource(self, channel_name): + """Internal func, clean channel resource by channel name""" + if self.channel_resources.get(channel_name): + self.channel_resources[channel_name].handler.close_thread() + self.channel_resources[channel_name].handler.web_event.set() + self.channel_resources[channel_name].handler.image_event.set() + del self.channel_resources[channel_name] + logging.info("clean channel: %s's resource", channel_name) + + def clean_channel_resource_by_fd(self, sock_fileno): + """ + clean channel resource by socket fileno + sock_fileno: socket fileno which binding to an channel + """ + with self.channel_fds_lock: + with self.channel_resource_lock: + if self.channel_fds.get(sock_fileno): + self._clean_channel_resource( + self.channel_fds[sock_fileno].channel_name) + del self.channel_fds[sock_fileno] + + def clean_channel_resource_by_name(self, channel_name): + """clean channel resource by channel_name + channel_name: channel name""" + if self.channel_resources.get(channel_name): + self.clean_channel_resource_by_fd( + self.channel_resources[channel_name].socket) + + def get_channel_handler_by_fd(self, sock_fileno): + """get channel handler by socket fileno""" + with self.channel_fds_lock: + if self.channel_fds.get(sock_fileno): + return self.channel_fds[sock_fileno].handler + return None + + def is_channel_busy(self, channel_name): + """check if channel is busy """ + with self.channel_resource_lock: + if self.channel_resources.get(channel_name): + return True + return False + + def close_all_thread(self): + """if a channel process video type, it will create a thread. + this func can close the thread. + """ + with self.channel_resource_lock: + for channel_name in self.channel_resources: + self.channel_resources[channel_name].handler.close_thread() + + def get_channel_handler_by_name(self, channel_name): + """ + get the channel handlerby channel name + """ + with self.channel_resource_lock: + if self.channel_resources.get(channel_name): + return self.channel_resources[channel_name].handler + return None + + def list_channels(self): + """ + return all the channel name and the status + status is indicating active state or not + """ + with self.channel_lock: + return [{'status': self.is_channel_busy(i.channel_name), + 'name': i.channel_name} for i in self.channel_list] + + def register_one_channel(self, channel_name): + """ + register a channel path, user create a channel via browser + """ + with self.channel_lock: + if len(self.channel_list) >= MAX_CHANNEL_NUM: + logging.info("register channel: %s fail, \ + exceed max number 10.", channel_name) + return self.err_code_too_many_channel + for i in range(len(self.channel_list)): + if self.channel_list[i].channel_name == channel_name: + logging.info("register channel: %s fail, \ + already exist.", channel_name) + return self.err_code_repeat_channel + + self.channel_list.append(Channel(channel_name=channel_name)) + logging.info("register channel: %s", channel_name) + return self.err_code_ok + + def unregister_one_channel(self, channel_name): + """ + unregister a channel path, user delete a channel via browser + """ + with self.channel_lock: + for i in range(len(self.channel_list)): + if self.channel_list[i].channel_name == channel_name: + self.clean_channel_resource_by_name(channel_name) + logging.info("unregister channel: %s", channel_name) + del self.channel_list[i] + break + + def is_channel_exist(self, channel_name): + """ + Check if a channel is exist + True: exist + False: not exist + """ + with self.channel_lock: + for i in range(len(self.channel_list)): + if self.channel_list[i].channel_name == channel_name: + return True + return False + + def save_channel_image(self, channel_name, image_data, rectangle_list): + """ + when a channel bounding to image type, + server will permanent hold an image for it. + this func save a image in memory + """ + with self.channel_lock: + for i in range(len(self.channel_list)): + if self.channel_list[i].channel_name == channel_name: + self.channel_list[i].image = image_data + self.channel_list[i].rectangle_list = rectangle_list + break + + def get_channel_image(self, channel_name): + """ + when a channel bounding to image type, + server will permanent hold an image for it. + this func get the image + """ + with self.channel_lock: + for i in range(len(self.channel_list)): + if self.channel_list[i].channel_name == channel_name: + return self.channel_list[i].image + + # channel not exist + return None + + def get_channel_image_with_rectangle(self, channel_name): + """ + A new method for display server, + return the image and rectangle list + """ + with self.channel_lock: + for i in range(len(self.channel_list)): + if self.channel_list[i].channel_name == channel_name: + return (self.channel_list[i].image, self.channel_list[i].rectangle_list) + return (None, None) + + def clean_channel_image(self, channel_name): + """ + when a channel bounding to image type, + server will permanent hold an image for it. + this func clean the image + """ + with self.channel_lock: + for i in range(len(self.channel_list)): + if self.channel_list[i].channel_name == channel_name: + self.channel_list[i].image = None + break diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/parameter_validation.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/parameter_validation.py new file mode 100644 index 0000000..4402b1b --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/parameter_validation.py @@ -0,0 +1,98 @@ +# ======================================================================= +# +# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1 Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2 Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3 Neither the names of the copyright holders nor the names of the +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ======================================================================= +# +"""Parameter Validation module""" +import logging + +PORT_INTERVAL_BEGIN = 1024 +PORT_INTERVAL_END = 49151 + +def validate_ip(ip_str): + if ip_str == '0.0.0.0': + logging.error("IP Addr \"0.0.0.0\" is illegal") + print("IP Addr \"0.0.0.0\" is illegal") + return False + + sep = ip_str.split('.') + if len(sep) != 4: + return False + for i, x in enumerate(sep): + try: + int_x = int(x) + if int_x < 0 or int_x > 255: + logging.error("Illegal ip: %s", ip_str) + print("Illegal ip: %s"%ip_str) + return False + except ValueError: + logging.error("IP format error:%s", ip_str) + print("IP format error:%s"%ip_str) + return False + return True + +def validate_port(value_str): + try: + value = int(value_str) + if value < PORT_INTERVAL_BEGIN or value > PORT_INTERVAL_END: + logging.error("Illegal port: %d", value) + print("Illegal port: %d"%value) + return False + except ValueError: + logging.error("Port format error:%s", value_str) + print("Port format error:%s"%value_str) + return False + return True + +def validate_integer(value_str, begin, end): + try: + value = int(value_str) + if value < begin or value > end: + return False + except ValueError: + return False + return True + +def Integer_greater(value_str, compared_value): + try: + value = int(value_str) + if value < compared_value: + return False + except ValueError: + return False + return True + +def validate_float(value_str, begin, end): + try: + value = float(value_str) + if value < begin or value > end: + return False + except ValueError: + return False + return True \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/presenter_message_pb2.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/presenter_message_pb2.py new file mode 100644 index 0000000..8e171b5 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/presenter_message_pb2.py @@ -0,0 +1,525 @@ +# ======================================================================= +# +# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1 Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2 Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3 Neither the names of the copyright holders nor the names of the +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ======================================================================= +# + +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: presenter_message.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='presenter_message.proto', + package='ascend.presenter.proto', + syntax='proto3', + serialized_pb=_b('\n\x17presenter_message.proto\x12\x16\x61scend.presenter.proto\"l\n\x12OpenChannelRequest\x12\x14\n\x0c\x63hannel_name\x18\x01 \x01(\t\x12@\n\x0c\x63ontent_type\x18\x02 \x01(\x0e\x32*.ascend.presenter.proto.ChannelContentType\"n\n\x13OpenChannelResponse\x12@\n\nerror_code\x18\x01 \x01(\x0e\x32,.ascend.presenter.proto.OpenChannelErrorCode\x12\x15\n\rerror_message\x18\x02 \x01(\t\"\x12\n\x10HeartbeatMessage\"\"\n\nCoordinate\x12\t\n\x01x\x18\x01 \x01(\r\x12\t\n\x01y\x18\x02 \x01(\r\"\x94\x01\n\x0eRectangle_Attr\x12\x34\n\x08left_top\x18\x01 \x01(\x0b\x32\".ascend.presenter.proto.Coordinate\x12\x38\n\x0cright_bottom\x18\x02 \x01(\x0b\x32\".ascend.presenter.proto.Coordinate\x12\x12\n\nlabel_text\x18\x03 \x01(\t\"\xb7\x01\n\x13PresentImageRequest\x12\x33\n\x06\x66ormat\x18\x01 \x01(\x0e\x32#.ascend.presenter.proto.ImageFormat\x12\r\n\x05width\x18\x02 \x01(\r\x12\x0e\n\x06height\x18\x03 \x01(\r\x12\x0c\n\x04\x64\x61ta\x18\x04 \x01(\x0c\x12>\n\x0erectangle_list\x18\x05 \x03(\x0b\x32&.ascend.presenter.proto.Rectangle_Attr\"o\n\x14PresentImageResponse\x12@\n\nerror_code\x18\x01 \x01(\x0e\x32,.ascend.presenter.proto.PresentDataErrorCode\x12\x15\n\rerror_message\x18\x02 \x01(\t*\xa5\x01\n\x14OpenChannelErrorCode\x12\x19\n\x15kOpenChannelErrorNone\x10\x00\x12\"\n\x1ekOpenChannelErrorNoSuchChannel\x10\x01\x12)\n%kOpenChannelErrorChannelAlreadyOpened\x10\x02\x12#\n\x16kOpenChannelErrorOther\x10\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01*P\n\x12\x43hannelContentType\x12\x1c\n\x18kChannelContentTypeImage\x10\x00\x12\x1c\n\x18kChannelContentTypeVideo\x10\x01*#\n\x0bImageFormat\x12\x14\n\x10kImageFormatJpeg\x10\x00*\xa4\x01\n\x14PresentDataErrorCode\x12\x19\n\x15kPresentDataErrorNone\x10\x00\x12$\n kPresentDataErrorUnsupportedType\x10\x01\x12&\n\"kPresentDataErrorUnsupportedFormat\x10\x02\x12#\n\x16kPresentDataErrorOther\x10\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x62\x06proto3') +) + +_OPENCHANNELERRORCODE = _descriptor.EnumDescriptor( + name='OpenChannelErrorCode', + full_name='ascend.presenter.proto.OpenChannelErrorCode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='kOpenChannelErrorNone', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kOpenChannelErrorNoSuchChannel', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kOpenChannelErrorChannelAlreadyOpened', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kOpenChannelErrorOther', index=3, number=-1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=780, + serialized_end=945, +) +_sym_db.RegisterEnumDescriptor(_OPENCHANNELERRORCODE) + +OpenChannelErrorCode = enum_type_wrapper.EnumTypeWrapper(_OPENCHANNELERRORCODE) +_CHANNELCONTENTTYPE = _descriptor.EnumDescriptor( + name='ChannelContentType', + full_name='ascend.presenter.proto.ChannelContentType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='kChannelContentTypeImage', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kChannelContentTypeVideo', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=947, + serialized_end=1027, +) +_sym_db.RegisterEnumDescriptor(_CHANNELCONTENTTYPE) + +ChannelContentType = enum_type_wrapper.EnumTypeWrapper(_CHANNELCONTENTTYPE) +_IMAGEFORMAT = _descriptor.EnumDescriptor( + name='ImageFormat', + full_name='ascend.presenter.proto.ImageFormat', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='kImageFormatJpeg', index=0, number=0, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1029, + serialized_end=1064, +) +_sym_db.RegisterEnumDescriptor(_IMAGEFORMAT) + +ImageFormat = enum_type_wrapper.EnumTypeWrapper(_IMAGEFORMAT) +_PRESENTDATAERRORCODE = _descriptor.EnumDescriptor( + name='PresentDataErrorCode', + full_name='ascend.presenter.proto.PresentDataErrorCode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='kPresentDataErrorNone', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kPresentDataErrorUnsupportedType', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kPresentDataErrorUnsupportedFormat', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kPresentDataErrorOther', index=3, number=-1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1067, + serialized_end=1231, +) +_sym_db.RegisterEnumDescriptor(_PRESENTDATAERRORCODE) + +PresentDataErrorCode = enum_type_wrapper.EnumTypeWrapper(_PRESENTDATAERRORCODE) +kOpenChannelErrorNone = 0 +kOpenChannelErrorNoSuchChannel = 1 +kOpenChannelErrorChannelAlreadyOpened = 2 +kOpenChannelErrorOther = -1 +kChannelContentTypeImage = 0 +kChannelContentTypeVideo = 1 +kImageFormatJpeg = 0 +kPresentDataErrorNone = 0 +kPresentDataErrorUnsupportedType = 1 +kPresentDataErrorUnsupportedFormat = 2 +kPresentDataErrorOther = -1 + + + +_OPENCHANNELREQUEST = _descriptor.Descriptor( + name='OpenChannelRequest', + full_name='ascend.presenter.proto.OpenChannelRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='channel_name', full_name='ascend.presenter.proto.OpenChannelRequest.channel_name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='content_type', full_name='ascend.presenter.proto.OpenChannelRequest.content_type', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=51, + serialized_end=159, +) + + +_OPENCHANNELRESPONSE = _descriptor.Descriptor( + name='OpenChannelResponse', + full_name='ascend.presenter.proto.OpenChannelResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='error_code', full_name='ascend.presenter.proto.OpenChannelResponse.error_code', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='error_message', full_name='ascend.presenter.proto.OpenChannelResponse.error_message', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=161, + serialized_end=271, +) + + +_HEARTBEATMESSAGE = _descriptor.Descriptor( + name='HeartbeatMessage', + full_name='ascend.presenter.proto.HeartbeatMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=273, + serialized_end=291, +) + + +_COORDINATE = _descriptor.Descriptor( + name='Coordinate', + full_name='ascend.presenter.proto.Coordinate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='x', full_name='ascend.presenter.proto.Coordinate.x', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='y', full_name='ascend.presenter.proto.Coordinate.y', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=293, + serialized_end=327, +) + + +_RECTANGLE_ATTR = _descriptor.Descriptor( + name='Rectangle_Attr', + full_name='ascend.presenter.proto.Rectangle_Attr', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='left_top', full_name='ascend.presenter.proto.Rectangle_Attr.left_top', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='right_bottom', full_name='ascend.presenter.proto.Rectangle_Attr.right_bottom', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='label_text', full_name='ascend.presenter.proto.Rectangle_Attr.label_text', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=330, + serialized_end=478, +) + + +_PRESENTIMAGEREQUEST = _descriptor.Descriptor( + name='PresentImageRequest', + full_name='ascend.presenter.proto.PresentImageRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='format', full_name='ascend.presenter.proto.PresentImageRequest.format', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='width', full_name='ascend.presenter.proto.PresentImageRequest.width', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='height', full_name='ascend.presenter.proto.PresentImageRequest.height', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='data', full_name='ascend.presenter.proto.PresentImageRequest.data', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rectangle_list', full_name='ascend.presenter.proto.PresentImageRequest.rectangle_list', index=4, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=481, + serialized_end=664, +) + + +_PRESENTIMAGERESPONSE = _descriptor.Descriptor( + name='PresentImageResponse', + full_name='ascend.presenter.proto.PresentImageResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='error_code', full_name='ascend.presenter.proto.PresentImageResponse.error_code', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='error_message', full_name='ascend.presenter.proto.PresentImageResponse.error_message', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=666, + serialized_end=777, +) + +_OPENCHANNELREQUEST.fields_by_name['content_type'].enum_type = _CHANNELCONTENTTYPE +_OPENCHANNELRESPONSE.fields_by_name['error_code'].enum_type = _OPENCHANNELERRORCODE +_RECTANGLE_ATTR.fields_by_name['left_top'].message_type = _COORDINATE +_RECTANGLE_ATTR.fields_by_name['right_bottom'].message_type = _COORDINATE +_PRESENTIMAGEREQUEST.fields_by_name['format'].enum_type = _IMAGEFORMAT +_PRESENTIMAGEREQUEST.fields_by_name['rectangle_list'].message_type = _RECTANGLE_ATTR +_PRESENTIMAGERESPONSE.fields_by_name['error_code'].enum_type = _PRESENTDATAERRORCODE +DESCRIPTOR.message_types_by_name['OpenChannelRequest'] = _OPENCHANNELREQUEST +DESCRIPTOR.message_types_by_name['OpenChannelResponse'] = _OPENCHANNELRESPONSE +DESCRIPTOR.message_types_by_name['HeartbeatMessage'] = _HEARTBEATMESSAGE +DESCRIPTOR.message_types_by_name['Coordinate'] = _COORDINATE +DESCRIPTOR.message_types_by_name['Rectangle_Attr'] = _RECTANGLE_ATTR +DESCRIPTOR.message_types_by_name['PresentImageRequest'] = _PRESENTIMAGEREQUEST +DESCRIPTOR.message_types_by_name['PresentImageResponse'] = _PRESENTIMAGERESPONSE +DESCRIPTOR.enum_types_by_name['OpenChannelErrorCode'] = _OPENCHANNELERRORCODE +DESCRIPTOR.enum_types_by_name['ChannelContentType'] = _CHANNELCONTENTTYPE +DESCRIPTOR.enum_types_by_name['ImageFormat'] = _IMAGEFORMAT +DESCRIPTOR.enum_types_by_name['PresentDataErrorCode'] = _PRESENTDATAERRORCODE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +OpenChannelRequest = _reflection.GeneratedProtocolMessageType('OpenChannelRequest', (_message.Message,), dict( + DESCRIPTOR = _OPENCHANNELREQUEST, + __module__ = 'presenter_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.proto.OpenChannelRequest) + )) +_sym_db.RegisterMessage(OpenChannelRequest) + +OpenChannelResponse = _reflection.GeneratedProtocolMessageType('OpenChannelResponse', (_message.Message,), dict( + DESCRIPTOR = _OPENCHANNELRESPONSE, + __module__ = 'presenter_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.proto.OpenChannelResponse) + )) +_sym_db.RegisterMessage(OpenChannelResponse) + +HeartbeatMessage = _reflection.GeneratedProtocolMessageType('HeartbeatMessage', (_message.Message,), dict( + DESCRIPTOR = _HEARTBEATMESSAGE, + __module__ = 'presenter_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.proto.HeartbeatMessage) + )) +_sym_db.RegisterMessage(HeartbeatMessage) + +Coordinate = _reflection.GeneratedProtocolMessageType('Coordinate', (_message.Message,), dict( + DESCRIPTOR = _COORDINATE, + __module__ = 'presenter_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.proto.Coordinate) + )) +_sym_db.RegisterMessage(Coordinate) + +Rectangle_Attr = _reflection.GeneratedProtocolMessageType('Rectangle_Attr', (_message.Message,), dict( + DESCRIPTOR = _RECTANGLE_ATTR, + __module__ = 'presenter_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.proto.Rectangle_Attr) + )) +_sym_db.RegisterMessage(Rectangle_Attr) + +PresentImageRequest = _reflection.GeneratedProtocolMessageType('PresentImageRequest', (_message.Message,), dict( + DESCRIPTOR = _PRESENTIMAGEREQUEST, + __module__ = 'presenter_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.proto.PresentImageRequest) + )) +_sym_db.RegisterMessage(PresentImageRequest) + +PresentImageResponse = _reflection.GeneratedProtocolMessageType('PresentImageResponse', (_message.Message,), dict( + DESCRIPTOR = _PRESENTIMAGERESPONSE, + __module__ = 'presenter_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.proto.PresentImageResponse) + )) +_sym_db.RegisterMessage(PresentImageResponse) + + +# @@protoc_insertion_point(module_scope) diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/presenter_socket_server.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/presenter_socket_server.py new file mode 100644 index 0000000..a28dd67 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/common/presenter_socket_server.py @@ -0,0 +1,463 @@ +# ======================================================================= +# +# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1 Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2 Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3 Neither the names of the copyright holders nor the names of the +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ======================================================================= +# +"""presenter socket server module""" + +import threading +import select +import struct +import logging +import socket +from google.protobuf.message import DecodeError +import common.presenter_message_pb2 as pb2 +from common.channel_manager import ChannelManager +from common.channel_handler import ChannelHandler + +#read nothing from socket.recv() +SOCK_RECV_NULL = b'' + +# epool will return if no event coming in 1 s +EPOLL_TIMEOUT = 1 + +# it specifies the number of unaccepted connections that +# the system will allow before refusing new connections. +SOCKET_WAIT_QUEUE = 2 + +# message head length, include 4 bytes message total length +# and 1 byte message name length +MSG_HEAD_LENGTH = 5 + + +class PresenterSocketServer(): + """a socket server communication with presenter agent. + + """ + def __init__(self, server_address): + """ + Args: + server_address: server listen address, + include an ipv4 address and a port. + """ + + # thread exit switch, if set true, thread must exit immediately. + self.thread_exit_switch = False + # message head length, include 4 bytes message total length + # and 1 byte message name length + self.msg_head_len = 5 + self._create_socket_server(server_address) + + def _create_socket_server(self, server_address): + """ + create a socket server + Args: + server_address: server listen address, + include an ipv4 address and a port. + """ + + # Create a socket server. + self._sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self._sock_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self._sock_server.bind(server_address) + self._sock_server.listen(SOCKET_WAIT_QUEUE) + self._sock_server.setblocking(False) + + # Get server host name and port + host, port = self._sock_server.getsockname()[:2] + + # Start presenter socket server thread. + threading.Thread(target=self._server_listen_thread).start() + + # Display directly on the screen + print('Presenter socket server listen on %s:%s\n' % (host, port)) + + def set_exit_switch(self): + """set switch True to stop presenter socket server thread.""" + self.thread_exit_switch = True + + def _read_socket(self, conn, read_len): + ''' + Read fixed length data + Args: + conn: a socket connection + read_len: read fix byte. + Returns: + ret: True or False + buf: read fix byte buf. + ''' + has_read_len = 0 + read_buf = SOCK_RECV_NULL + total_buf = SOCK_RECV_NULL + while has_read_len != read_len: + try: + read_buf = conn.recv(read_len - has_read_len) + except socket.error: + logging.error("socket %u exception:socket.error", conn.fileno()) + return False, None + if read_buf == SOCK_RECV_NULL: + return False, None + total_buf += read_buf + has_read_len = len(total_buf) + + return True, total_buf + + def _read_msg_head(self, sock_fileno, conns): + ''' + Args: + sock_fileno: a socket fileno + conns: all socket connections which created by server. + Returns: + msg_total_len: total message length. + msg_name_len: message name length. + ''' + ret, msg_head = self._read_socket(conns[sock_fileno], self.msg_head_len) + if not ret: + logging.error("socket %u receive msg head null", sock_fileno) + return None, None + + # in Struct(), 'I' is unsigned int, 'B' is unsigned char + msg_head_data = struct.Struct('IB') + (msg_total_len, msg_name_len) = msg_head_data.unpack(msg_head) + msg_total_len = socket.ntohl(msg_total_len) + + return msg_total_len, msg_name_len + + def _read_msg_name(self, sock_fd, conns, msg_name_len): + ''' + Args: + sock_fd: a socket fileno + conns: all socket connections which created by server. + msg_name_len: message name length. + Returns: + ret: True or False + msg_name: message name. + ''' + ret, msg_name = self._read_socket(conns[sock_fd], msg_name_len) + if not ret: + logging.error("socket %u receive msg name null", sock_fd) + return False, None + try: + msg_name = msg_name.decode("utf-8") + except UnicodeDecodeError: + logging.error("msg name decode to utf-8 error") + return False, None + + return True, msg_name + + def _read_msg_body(self, sock_fd, conns, msg_body_len, msgs): + ''' + Args: + sock_fd: a socket fileno + conns: all socket connections which created by server. + msg_name_len: message name length. + msgs: msg read from a socket + Returns: + ret: True or False + ''' + ret, msg_body = self._read_socket(conns[sock_fd], msg_body_len) + if not ret: + logging.error("socket %u receive msg body null", sock_fd) + return False + msgs[sock_fd] = msg_body + return True + + def _read_sock_and_process_msg(self, sock_fileno, conns, msgs): + ''' + Args: + sock_fileno: a socket fileno, return value of socket.fileno() + conns: all socket connections registered in epoll + msgs: msg read from a socket + Returns: + ret: True or False + ''' + + # Step1: read msg head + msg_total_len, msg_name_len = self._read_msg_head(sock_fileno, conns) + if msg_total_len is None: + logging.error("msg_total_len is None.") + return False + + # Step2: read msg name + ret, msg_name = self._read_msg_name(sock_fileno, conns, msg_name_len) + if not ret: + return ret + + # Step3: read msg body + msg_body_len = msg_total_len - self.msg_head_len - msg_name_len + if msg_body_len < 0: + logging.error("msg_total_len:%u, msg_name_len:%u, msg_body_len:%u", + msg_total_len, msg_name_len, msg_body_len) + return False + ret = self._read_msg_body(sock_fileno, conns, msg_body_len, msgs) + if not ret: + return ret + + # Step4: process msg + ret = self._process_msg(conns[sock_fileno], msg_name, msgs[sock_fileno]) + return ret + + def _process_epollin(self, sock_fileno, epoll, conns, msgs): + ''' + Args: + sock_fileno: a socket fileno, return value of socket.fileno() + epoll: a set of select.epoll. + conns: all socket connections registered in epoll + msgs: msg read from a socket + ''' + msgs[sock_fileno] = b'' + try: + ret = self._read_sock_and_process_msg(sock_fileno, conns, msgs) + if not ret: + self._clean_connect(sock_fileno, epoll, conns, msgs) + except socket.error: + logging.error("receive socket error.") + self._clean_connect(sock_fileno, epoll, conns, msgs) + + def _accept_new_socket(self, epoll, conns): + ''' + Args: + epoll: a set of select.epoll. + conns: all socket connections registered in epoll + ''' + try: + new_conn, address = self._sock_server.accept() + new_conn.setblocking(True) + epoll.register(new_conn.fileno(), select.EPOLLIN | select.EPOLLHUP) + conns[new_conn.fileno()] = new_conn + logging.info("create new connection:client-ip:%s, client-port:%s, fd:%s", + address[0], address[1], new_conn.fileno()) + except socket.error: + logging.error("socket.error exception when sock.accept()") + + def _server_listen_thread(self): + """socket server thread, epoll listening all the socket events""" + epoll = select.epoll() + epoll.register(self._sock_server.fileno(), select.EPOLLIN | select.EPOLLHUP) + try: + conns = {} + msgs = {} + while True: + # thread must exit immediately + if self.thread_exit_switch: + break + + events = epoll.poll(EPOLL_TIMEOUT) + # timeout, but no event come, continue waiting + if not events: + continue + + for sock_fileno, event in events: + # new connection request from presenter agent + if self._sock_server.fileno() == sock_fileno: + self._accept_new_socket(epoll, conns) + + # remote connection closed + # it means presenter agent exit withot close socket. + elif event & select.EPOLLHUP: + logging.info("receive event EPOLLHUP") + self._clean_connect(sock_fileno, epoll, conns, msgs) + # new data coming in a socket connection + elif event & select.EPOLLIN: + self._process_epollin(sock_fileno, epoll, conns, msgs) + # receive event not recognize + else: + logging.error("not recognize event %f", event) + self._clean_connect(sock_fileno, epoll, conns, msgs) + + finally: + logging.info("conns:%s", conns) + logging.info("presenter server listen thread exit.") + epoll.unregister(self._sock_server.fileno()) + epoll.close() + self._sock_server.close() + + + def _process_heartbeat(self, conn): + ''' + set heartbeat + Args: + conn: a socket connection + Returns: + True: set heartbeat ok. + + ''' + sock_fileno = conn.fileno() + handler = self.channel_manager.get_channel_handler_by_fd(sock_fileno) + if handler is not None: + handler.set_heartbeat() + + return True + + def _process_open_channel(self, conn, msg_data): + """ + Deserialization protobuf and process open_channel request + Args: + conn: a socket connection + msg_data: a protobuf struct, include open channel request. + + Returns: + + protobuf structure like this: + ---------------------------------------------- + |channel_name | string | + |---------------------------------------------- + |content_type | ChannelContentType | + |---------------------------------------------- + + enum ChannelContentType { + kChannelContentTypeImage = 0; + kChannelContentTypeVideo = 1; + } + """ + request = pb2.OpenChannelRequest() + response = pb2.OpenChannelResponse() + + try: + request.ParseFromString(msg_data) + except DecodeError: + logging.error("ParseFromString exception: Error parsing message") + channel_name = "unknown channel" + return self._response_open_channel(conn, channel_name, response, + pb2.kOpenChannelErrorOther) + + channel_name = request.channel_name + + # check channel name if exist + if not self.channel_manager.is_channel_exist(channel_name): + logging.error("rrr channel name %s is not exist.", channel_name) + # if channel is not exist, need to create the channel + ret = self.channel_manager.register_one_channel(channel_name) + if ret != ChannelManager.err_code_ok: + logging.error("Create the channel %s failed!, and ret is %d", channel_name, ret) + err_code = pb2.kOpenChannelErrorOther + self._response_open_channel(conn, channel_name, response, err_code) + + # check channel path if busy + if self.channel_manager.is_channel_busy(channel_name): + logging.error("channel path %s is busy.", channel_name) + err_code = pb2.kOpenChannelErrorChannelAlreadyOpened + return self._response_open_channel(conn, channel_name, response, + err_code) + + # if channel type is image, need clean image if exist + self.channel_manager.clean_channel_image(channel_name) + + if request.content_type == pb2.kChannelContentTypeImage: + media_type = "image" + elif request.content_type == pb2.kChannelContentTypeVideo: + media_type = "video" + else: + logging.error("media type %s is not recognized.", + request.content_type) + return self._response_open_channel(conn, channel_name, response, + pb2.kOpenChannelErrorOther) + + handler = ChannelHandler(channel_name, media_type) + self.channel_manager.create_channel_resource( + channel_name, conn.fileno(), media_type, handler) + + return self._response_open_channel(conn, channel_name, response, + pb2.kOpenChannelErrorNone) + + def _response_open_channel(self, conn, channel_name, response, err_code): + """ + Assemble protobuf to response open_channel request + Args: + conn: a socket connection + channel_name: name of a channel. + response: a protobuf response to presenter agent + err_code: part of the response + + Returns: + ret_code:True or False + + Message structure like this: + -------------------------------------------------------------------- + |total message len | int | 4 bytes | + |------------------------------------------------------------------- + |message name len | byte | 1 byte | + |------------------------------------------------------------------- + |message name | string | xx bytes | + |------------------------------------------------------------------- + |message body | protobuf | xx bytes | + -------------------------------------------------------------------- + + protobuf structure like this: + -------------------------------------------------------------------- + |error_code | enum | OpenChannelErrorCode | + |------------------------------------------------------------------- + |error_message | string | xx bytes | + |------------------------------------------------------------------- + + enum OpenChannelErrorCode { + kOpenChannelErrorNone = 0; + kOpenChannelErrorNoSuchChannel = 1; + kOpenChannelErrorChannelAlreadyOpened = 2; + kOpenChannelErrorOther = -1; + } + """ + response.error_code = err_code + ret_code = False + if err_code == pb2.kOpenChannelErrorNoSuchChannel: + response.error_message = "channel {} not exist." \ + .format(channel_name) + elif err_code == pb2.kOpenChannelErrorChannelAlreadyOpened: + response.error_message = "channel {} is busy.".format(channel_name) + elif err_code == pb2.kOpenChannelErrorNone: + response.error_message = "open channel succeed" + ret_code = True + else: + response.error_message = "Unknown err open channel {}." \ + .format(channel_name) + + self.send_message(conn, response, pb2._OPENCHANNELRESPONSE.full_name) + return ret_code + + def send_message(self, conn, protobuf, msg_name): + ''' + API for send message + Args: + conn: a socket connection. + protobuf: message body defined in protobuf. + msg_name: msg name. + Returns: NA + ''' + message_data = protobuf.SerializeToString() + message_len = len(message_data) + + msg_name_size = len(msg_name) + msg_total_size = self.msg_head_len + msg_name_size + message_len + # in Struct(), 'I' is unsigned int, 'B' is unsigned char + s = struct.Struct('IB') + msg_head = (socket.htonl(msg_total_size), msg_name_size) + packed_msg_head = s.pack(*msg_head) + msg_data = packed_msg_head + \ + bytes(msg_name, encoding="utf-8") + message_data + conn.sendall(msg_data) diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/config/config.conf b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/config/config.conf new file mode 100644 index 0000000..008784c --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/config/config.conf @@ -0,0 +1,20 @@ +[baseconf] +# A socket server address to communicate with presenter agent +# Please ensure that the port does not conflict, only support Ipv4 +presenter_server_ip=192.168.1.223 +presenter_server_port=7008 + +# A http server address, you can visit the website by "http//web_server_ip:web_server_port". +# Only support Chrome now. +web_server_ip=192.168.1.223 +web_server_port=7009 + +# Storage path of Face registration information +# Please ensure the storage_dir exist before running the program +storage_dir=./facial + +# Maximum number of supported faces, range is 1-100 +max_face_num=100 + +# Face matching threshold, range is 0 - 1 +face_match_threshold = 0.5 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/config/logging.conf b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/config/logging.conf new file mode 100644 index 0000000..554168c --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/config/logging.conf @@ -0,0 +1,27 @@ +[loggers] +keys=root,facial_recognition + +[handlers] +keys=rotatingFileHandler + +[formatters] +keys=simpleFmt + +[logger_root] +level=DEBUG +handlers=rotatingFileHandler + +[logger_facial_recognition] +level=DEBUG +handlers=rotatingFileHandler +qualname=facial_recognition +propagate=0 + +[handler_rotatingFileHandler] +class=handlers.RotatingFileHandler +level=DEBUG +formatter=simpleFmt +args=("facial_recognition.log", "a", 10*1024*1024, 2) + +[formatter_simpleFmt] +format=%(asctime)s-%(levelname)s-%(filename)s:%(lineno)s %(message)s diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__init__.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/__init__.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/__init__.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe988b3c2030d351b6fe4590dd2344047da795c4 GIT binary patch literal 254 zcmYk1O=?0x5QIm_LIe+zO&WC@f+uj319XOY^>oPm(LK-L6>^i{jof+*SI#Vg7Su=o z6g0hAE*HNG`Z7(|j(^Qsv2E6uhQWNA*V*pRNFP6NJJTUYkX45?&`*|cQX5Nvk}F}- zZVEUetXX|uuumfd$$=6V$e1PC-mN%Jp?WTo9aOm<1a_d&I@krht$Bgf^Qye{oNw literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/config_parser.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/config_parser.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa85a9d9142050b38e4da9638927d1cae63271df GIT binary patch literal 2532 zcma)8&2Jk;6yGn~YkQrfZCYq4Who!UMYR(+z@b7&Mdbn!QV|k+88$m(d)@V}nOQfD zm7H8Ih!g(>H_jaRL*~k<{{km|Z+7E2p-4EIx9`oonRy?-_a-0rdYzv;!ymr7YFU3- z8$TEP=NRf!5N<^lx4Dzqk!`+CAMA`>rhjdhR^J^QUq_yRM+!qpaCiz}VTtFDR~ zyuq6ieBS1r7uL#-+M>g|JTQFMnA6k2BXjpR=IUj?vY|F;A!B3SNEWlO zoQQgQK;|AKc5N1YX*|ME9tgMLsH43U-W~jA^=<7bk&Ps+8S?knv6( zEDon4DZ^BSaj4RKoQW{aRY|TN^gaC=+cbh~sMd6|+NfKM<>H7j-Miota^fbLI!}pg z!a~^r*~3sih~;$b!1nFs?&ckE)Ev0>lYFGi8bAL8Q(9BIbl{a8pjc|jTT2bBH7`gl zlH@~z4YYl%x4FaJm8%ZR4r<4?t+G1}D$Zy*)845K-K`VUAa6kP7ii+tTGMbwb9=fo zy@C_3u59%ObXvsUK=G`R3R0 z^N`RM=8IXVCdDG-;h_lkAMEe#4PKJs@}0-DK8wp_f-(XECk2$wb@v|Z50>}8FBWHW z2{2rWkf%U!S;*t??tAJk4#*dAmK_hi?O)UWvp7pRw4&}A$I`i^Z0O#RIAj&TF{iJs zL4Q6O_13%Qg)H^<#uhVi{a>4CI@(!pOHoB*A$2f|pEFZ#2!L+PB^GomE5>8MRkw~} znG>^XR7?y^jhYxlTkGRSSrM1oDU|l+aXHbARKb1SRq#I^3kIR@$OgIBUdQkfe%ByJ zWg~%~Kv~@fv79Zt`tzI}Ai86FP7^Z~w`F^nX+rXx<*f@?uWP0{ZjE>sC(YUiq)`>%?1LqrbqXV#ZE#ZBD)TyP0k-D|iG*VDY zEhF`6$u|TlYea4n*(LHi$U%Qc2h|zXO%?Wnu_&1=ijuMzwTVL;MaFK@##MIi^! znj3PI<{aoY(Q#A${IXXe3>af5>e7}AygJL9k2W6e!DiI^0Ue&BTjB5yW7Yo?-~+~f zL-wt*SK>EJ?koFolP?F?ZAkiC1F`E_n0BNYYEUP;M{ymCzUo|VYX)|5- YDm%3QuyXsex1piPF&Kgx2O`{m0G)23NdN!< literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/facial_recognition_handler.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/facial_recognition_handler.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73026f14c7f89db04392e67921605606b9bca19d GIT binary patch literal 2812 zcmZ`*Uvtw&5WkaTTUML|3PS_5AkxCr3}d%thB6tZg#ra0nsy*9GoH3rMR#`O$db5| zlVHM=Gs8@u`T_dbm%j8H^tB)2-r7F#75c>PNmddd_T1i|-P_yS-|n8S&d+U3yUY%Qy zNV_p<_k%DBVqc0d9VAg6rHLPI1W6)dA37cj>5o!Aj>Stjh^)4$UbtQG?-%Ts9M(f* z&VF_|P&Z*92-rlx9@4X4kiM~R&+R$f=FT4J)e5V?o(6Ye-r!B{LGQjG4(T<)#yP$8 zm9g>RzKP}0;p`;rXHC5a6Ha#tBRS2jT{5+X_AcGErWSYtZ*5PS5nR>pkCSll?Bt*K z{+aB3vD$XDr(z*8mPaF@YigVcDbdf`Wehhk*0!~yMBLY{(nl-_K-L=x9tA9anhEev zld&)klw#};^8a7mjdUcsfeJ;!yW6SU?5bdt#X@z%EFLRt-B@gi_*14LWWZ5s?*7Zqrm9Qob(1Nw^70GKz2^;k|B|&aykTDhW3qfa$w{=#WmyCXu<><8tfZj_YOza2nj& zwB)sK$&+i3N!~=+DMo|`aR70#3#YR=SZxjGrvy(NE@01Xhz@7+x969?J3@sr$}lTd zd=+d7zc0bNK0uUKLJyK`oUc?<+!~F7fmrcV84aQYvdheU9^}CxF#}y3seHx9p)z`} z0FB37_!wGO48!k>ARo)wEKF0$L2oW9Z4U+T6Sd;6-m2DKQgFFMvf5tMZZsM&v_Ly$ zd}FN38nAT}R~Qp_-5r0V8|2xPtv=jxWRo+abax{%t=(oEa2NVMJ0lx|jc&~t?x z#B!2rTZvrH17Ve-wk=&et!CupX|%3Yk$Gf!=woJl+=aPGW#YQ@n7u$3=n`!K^=RE{ z(K`G+I{DzpXx!Hnq6_e6LBlvU@z{X@;7%}}oUzrPJe@_hzLZ6 zHTk!4?xDyS2q-2;1;znHW++u!Fjk%&n&HZ_anLeE9F&@lQEZUA@}?v}P|0QLZ30*w z5ZOv>ws1(<^J)ety$`ODOGpr-c3n5O#X2i+b+&^j*R?Q)@X+4AZ3pD70%lu^{B?Yr z;Hd)M2cTIk03j`pdbVRZ)Pa7od?cXN)(TI=6)_E=DGp@kCxas(YI1spD4tnRl0_i;L>Q+^lr@{F?I;g7$~54x2BI{ z@)R|`ly6hx+1H&~Hz=re(4!DFVp)(HkS5fnbsG}Jc?U;ya{fr)78)wY9!iuSKw}PR zf{ud}fk$-bK8)-sxkG-u0jWdf$EK{Bbb%6HIKLs6(2YYZz8)57qXS)QbUSsHwQ8uC)_V??B}UpzH|Oo#6>!3h49+t!oR3Goz7(OQJ!X{>GwP6tqK z2in2%tmjJKVHuSl!6oD}lJiK;BDn}eFU}rvcw+%Rsn20(Cv3J1k7zoUkVETF&08;< zu&Z5$c+L3jbv)*ovAD!;3*;4IOf0Nn4!ofrf&!2%(8;AEAvvU^?cp~F-h?sjF;;w$ z!MMfPlW`E2oCae&4H+}fwmb)C$`6s4+hal1^X0cmDB>98s`3k=HHVT|h0Qk)Zc)f~ zAun4s_l$emJ!v@YhP;YWCV1O0(x<|7G)j}s%xC5IgTyeBmylr9-9M}tnS$@$D6aCk Q4-(1);#e-Yre!(SD-^WV3IG5A literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/facial_recognition_message_pb2.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/facial_recognition_message_pb2.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b02408bc56b43d21340cba41a5e57e65f6a106ce GIT binary patch literal 6750 zcmbtYOLH5?5ys+0a0vn+BvGVZhCoszWeE^Tz5S#}z@}r76iCVT#@2d)9zY8LSkx>i zlPFi^pi~a7sFKQ0$R*{tIGQhJChRE*&?Kz0j zzZOE&P$S%oXc2`pVvT5XNQ+5%80BG2m9mQRh!&Uf2+E^cLdtQJlUh;>~9ElC()sv0P*5_()t=p&&h(mYx*hGmj^q z!y#t94NoP9 zXWsecYi4}~UrQd>B#&=EJHX?&r{wW1d?$IF6tm}`%TXoV+hP_vGFsn*A-T>`eUzT>UV>rlhoh(zKKwpfn?;B1+e!^aQ0@DSd;|oRrEajiYoE(kPA9 zbL@;f(iRc3#1>u5f{U4QF}Ee=wu^b-Vy0cp9f`T) zVu~(i#>L!~n7c0KiHo`BV(v-IJs0zhiJ8=3Wu?Mz{HZTqTfTRXhM z9%iaW#WWf^XBDf~GCQW#(woe-jT*~IQ)-WL>3T1OWkn$wfAmlH3f^`Yiys5XM_KzbSlOE`13wg6v zh2>j%oAIi}n+DYu^yW^ZW9mq&f(-S}3(gG4qXX;!{fg1VkmTE(*{s!J+-Ce0+SMluDvH>A2y6;8H|swk+*mUIPN441|x_KG8iffKL+Z!Wq7S%NP_Dk z+Aun1YXJijMW-xa^9rYs?FWfRs7f~79uPgoT02d>v)5+&58P;DB(PBhW>>h`?pRbC z>W>sX;H=tU6&gRRCGEXt*=p!ubd0iLW0xYauSt$|PaOE}lrv~J4f=u19Sxxtm6K#? z=K>D7dZNv=ADh|dYGTD|Hmz2P*=?(3v-AgQh_lXwl2PUoi@BT+Vz~n67GJ?|r<3X+ zP7^^iFr1xLM@p<_+Bi3s+wHWf22GH*htqL2OcCz`KT<=FtX*nsbo5;b8SU5hBt+JD z8J~sF@}Rai5vE#pTOBFlf3J2EW*kfoen4M8$ zWOc1owGL1pRU>8-Ut38mp8e-v6;&l51`%JI1JHsR!!ebimFSVhC0}$7jmok*RCRnq z_d|0di?@7P@x&ziojP3P_`XVSTn}iR<7tn1^86Q=zy3RQcz+%wRQ08-ty?XY3ZyTn z<4zqX!C*cVc5zyyl=P%}?#Q!koEWL#v1(tMO|z2<;Zz%O)HZM_=BY@z|9Z@aMYx4- zilMeqd5ME0qV`^^W9*7iT%B-PGP?}$wG{hwyEjiY%Z10c`3O(qVj?1D3)rrR;yO}h zTnt%lS{`g6r?_~F^F3PE#qr+vXqh`kQMxa@uJ>q#>(RPq{sooHFF8Yb# z!C5V6rRm;1yLn>)p&oYchrX6+`wnZVBEBIw%cJX8wXeEL<*4DgDr?g;O>aL#s|+M4tFuhq6c%aj&qtZ~kk7B?_2B z_8Y|+sz0Oc#D1fu>V;BiqqMTIS`g!d#rTk7lIpbA`^q_W@iS;^ z3yiBvL?nxp={yZlz+*KqkUn_5_ZwDGkT z*Ne+5g<@fO`)R2lhGlJSy|{s)q6et^^vi7=yJBhiaX~&vIGI&1@5${HUm#Yuh}Ajo zcEKJ1M4GvY)@^g+a4@RklKW|4v;RrqvGZMkVk3t76%hur(&2N|X>t(J{xkjw@u6ce z|ALB5Dz>P2Mg?vOy#;L+@vQAk%#WwBX8!@Fc36oiSCshv6^cc|N>E<$&_D_X!%7s} zqRPAfV?jqV7F2^OV*6LvwWBzeV$u%vP4;3+LRwaX_(Oza!;xag=sM_Mrc3?p_j_{9 sFQ?-y`PDt>PwZF3;@7Zn`W-~ov2?5lq5avSDu=FM0%wUDQcwB+e=LfIOaK4? literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/facial_recognition_server.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/facial_recognition_server.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e7b6bfa8793912f7faed4d187ccc0bed1011160 GIT binary patch literal 20089 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 z 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 U)2aAh@N@Ee7XR;;zh}+;ANFXL*Z=?k literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/web.cpython-36.pyc b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/__pycache__/web.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b081b31166c4f842f34e1c153972cfb67c7f647 GIT binary patch literal 11546 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 ABLDyZ literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/config_parser.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/config_parser.py new file mode 100644 index 0000000..372f73b --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/config_parser.py @@ -0,0 +1,109 @@ +# ======================================================================= +# +# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1 Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2 Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3 Neither the names of the copyright holders nor the names of the +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ======================================================================= +# + +"""facial recognition config parser module""" + +import os +import logging +import configparser +import common.parameter_validation as validate + + +class ConfigParser(): + """ parse configuration from the config.conf""" + __instance = None + + def __init__(self): + """init""" + + def __new__(cls): + """ensure class object is a single instance""" + if cls.__instance is None: + cls.__instance = object.__new__(cls) + cls.config_parser() + return cls.__instance + + def config_verify(self): + '''Verify configuration Parameters ''' + if not validate.validate_ip(ConfigParser.web_server_ip) or \ + not validate.validate_ip(ConfigParser.presenter_server_ip) or \ + not validate.validate_port(ConfigParser.web_server_port) or \ + not validate.validate_port(ConfigParser.presenter_server_port): + return False + + if not validate.validate_integer(ConfigParser.max_face_num, 0, 100): + print("Max face num should be 1-100.") + logging.warning("Max face num should be 1-100.") + return False + + threshold = ConfigParser.face_match_threshold + if not validate.validate_float(threshold, 0, 1): + print("Face match threshold should be 0-1.") + logging.warning("Face match threshold should be 0-1.") + return False + + if not os.path.isdir(ConfigParser.storage_dir): + print("You should create directory \"%s\" manually." + %(ConfigParser.storage_dir)) + logging.warning("You should create directory \"%s\" manually.", + ConfigParser.storage_dir) + return False + + return True + + @classmethod + def config_parser(cls): + """parser config from config.conf""" + config_parser = configparser.ConfigParser() + cls.root_path = ConfigParser.get_rootpath() + config_file = os.path.join(cls.root_path, "config/config.conf") + config_parser.read(config_file) + + # Read config parameter + cls.web_server_ip = config_parser.get('baseconf', 'web_server_ip') + cls.presenter_server_ip = \ + config_parser.get('baseconf', 'presenter_server_ip') + cls.web_server_port = config_parser.get('baseconf', 'web_server_port') + cls.presenter_server_port = \ + config_parser.get('baseconf', 'presenter_server_port') + cls.storage_dir = config_parser.get('baseconf', 'storage_dir') + cls.max_face_num = config_parser.get('baseconf', 'max_face_num') + cls.face_match_threshold = \ + config_parser.get('baseconf', 'face_match_threshold') + + @staticmethod + def get_rootpath(): + """get presenter server's root directory.""" + path = __file__ + idx = path.rfind("src") + + return path[0:idx] diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_handler.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_handler.py new file mode 100644 index 0000000..e45e969 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_handler.py @@ -0,0 +1,132 @@ +# ======================================================================= +# +# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1 Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2 Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3 Neither the names of the copyright holders nor the names of the +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ======================================================================= +# +"""facial recognition channel handler module""" + +import time +import logging +from common.channel_handler import ChannelHandler + +HEARTBEAT_TIMEOUT = 100 + +class FacialRecognitionHandler(ChannelHandler): + '''FacialRecognitionHandler''' + def __init__(self, channel_name, media_type): + '''init func''' + self.sleep_time = 0.01 + super(FacialRecognitionHandler, self).__init__(channel_name, media_type) + + def save_frame(self, image, face_list): + """ + Description: save frame info + Input: + image: original image data + face_list: faces info, inlude name, face feature, face coordinate + Returns: NA + """ + while self.img_data: + time.sleep(self.sleep_time) + + # compute fps + self.time_list.append(self.heartbeat) + self.image_number += 1 + while self.time_list[0] + 1 < time.time(): + self.time_list.pop(0) + self.image_number -= 1 + if self.image_number == 0: + break + + self.fps = len(self.time_list) + self.img_data = image + self.face_list = face_list + self.image_event.set() + self.set_heartbeat() + + def get_frame(self): + """ + Description: get frame info + Input:NA + Returns: + { + "image": self.frame_data, + "fps": self.fps, + "face_list": self.face_list + } + """ + # wait util receive a frame data, and push it to your browser. + ret = self.web_event.wait() + self.web_event.clear() + # True: _web_event return because set() + # False: _web_event return because timeout + if ret: + return { + "image": self.frame_data, + "fps": self.fps, + "face_list": self.face_list + } + + return {} + + def frames(self): + """a generator generates image""" + while True: + self.image_event.wait() + self.image_event.clear() + if self.img_data: + yield self.img_data + self.img_data = None + + # if set _close_thread_switch, return immediately + if self.close_thread_switch: + yield None + + # if no frames or heartbeat coming in the last 100 seconds, + # stop the thread and close socket + if time.time() - self.heartbeat > HEARTBEAT_TIMEOUT: + self.set_thread_switch() + self.img_data = None + yield None + + def _video_thread(self): + """background thread to process video""" + logging.info('create %s...', (self.thread_name)) + for frame in self.frames(): + if frame: + # send signal to clients + self.frame_data = frame + self.web_event.set() + + # exit thread + if self.close_thread_switch: + self.channel_manager.clean_channel_resource_by_name( + self.channel_name) + logging.info('Stop thread:%s.', (self.thread_name)) + break diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_message_pb2.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_message_pb2.py new file mode 100644 index 0000000..ec8fb18 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_message_pb2.py @@ -0,0 +1,453 @@ +# ======================================================================= +# +# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1 Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2 Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3 Neither the names of the copyright holders nor the names of the +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ======================================================================= +# + +''' +Generated by the protocol buffer compiler. DO NOT EDIT! +source: facial_recognition_message.proto +''' +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='facial_recognition_message.proto', + package='ascend.presenter.facial_recognition', + syntax='proto3', + serialized_pb=_b('\n facial_recognition_message.proto\x12#ascend.presenter.facial_recognition\"^\n\x0e\x43ommonResponse\x12;\n\x03ret\x18\x01 \x01(\x0e\x32..ascend.presenter.facial_recognition.ErrorCode\x12\x0f\n\x07message\x18\x02 \x01(\t\"\'\n\x0bRegisterApp\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\"=\n\x03\x42ox\x12\x0c\n\x04lt_x\x18\x01 \x01(\r\x12\x0c\n\x04lt_y\x18\x02 \x01(\r\x12\x0c\n\x04rb_x\x18\x03 \x01(\r\x12\x0c\n\x04rb_y\x18\x04 \x01(\r\"T\n\x0b\x46\x61\x63\x65\x46\x65\x61ture\x12\x35\n\x03\x62ox\x18\x01 \x01(\x0b\x32(.ascend.presenter.facial_recognition.Box\x12\x0e\n\x06vector\x18\x02 \x03(\x02\"%\n\x08\x46\x61\x63\x65Info\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05image\x18\x02 \x01(\x0c\"\xa2\x01\n\nFaceResult\x12\n\n\x02id\x18\x01 \x01(\t\x12\x45\n\x08response\x18\x02 \x01(\x0b\x32\x33.ascend.presenter.facial_recognition.CommonResponse\x12\x41\n\x07\x66\x65\x61ture\x18\x03 \x03(\x0b\x32\x30.ascend.presenter.facial_recognition.FaceFeature\"]\n\tFrameInfo\x12\r\n\x05image\x18\x01 \x01(\x0c\x12\x41\n\x07\x66\x65\x61ture\x18\x02 \x03(\x0b\x32\x30.ascend.presenter.facial_recognition.FaceFeature*\x7f\n\tErrorCode\x12\x0e\n\nkErrorNone\x10\x00\x12\x1a\n\x16kErrorAppRegisterExist\x10\x01\x12\x19\n\x15kErrorAppRegisterType\x10\x02\x12\x1a\n\x16kErrorAppRegisterLimit\x10\x03\x12\x0f\n\x0bkErrorOther\x10\x05\x62\x06proto3') +) + +_ERRORCODE = _descriptor.EnumDescriptor( + name='ErrorCode', + full_name='ascend.presenter.facial_recognition.ErrorCode', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='kErrorNone', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kErrorAppRegisterExist', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kErrorAppRegisterType', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kErrorAppRegisterLimit', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='kErrorOther', index=4, number=5, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=658, + serialized_end=785, +) +_sym_db.RegisterEnumDescriptor(_ERRORCODE) + +ErrorCode = enum_type_wrapper.EnumTypeWrapper(_ERRORCODE) +kErrorNone = 0 +kErrorAppRegisterExist = 1 +kErrorAppRegisterType = 2 +kErrorAppRegisterLimit = 3 +kErrorOther = 5 + + + +_COMMONRESPONSE = _descriptor.Descriptor( + name='CommonResponse', + full_name='ascend.presenter.facial_recognition.CommonResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ret', full_name='ascend.presenter.facial_recognition.CommonResponse.ret', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='message', full_name='ascend.presenter.facial_recognition.CommonResponse.message', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=73, + serialized_end=167, +) + + +_REGISTERAPP = _descriptor.Descriptor( + name='RegisterApp', + full_name='ascend.presenter.facial_recognition.RegisterApp', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='ascend.presenter.facial_recognition.RegisterApp.id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='type', full_name='ascend.presenter.facial_recognition.RegisterApp.type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=169, + serialized_end=208, +) + + +_BOX = _descriptor.Descriptor( + name='Box', + full_name='ascend.presenter.facial_recognition.Box', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='lt_x', full_name='ascend.presenter.facial_recognition.Box.lt_x', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='lt_y', full_name='ascend.presenter.facial_recognition.Box.lt_y', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rb_x', full_name='ascend.presenter.facial_recognition.Box.rb_x', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='rb_y', full_name='ascend.presenter.facial_recognition.Box.rb_y', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=210, + serialized_end=271, +) + + +_FACEFEATURE = _descriptor.Descriptor( + name='FaceFeature', + full_name='ascend.presenter.facial_recognition.FaceFeature', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='box', full_name='ascend.presenter.facial_recognition.FaceFeature.box', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='vector', full_name='ascend.presenter.facial_recognition.FaceFeature.vector', index=1, + number=2, type=2, cpp_type=6, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=273, + serialized_end=357, +) + + +_FACEINFO = _descriptor.Descriptor( + name='FaceInfo', + full_name='ascend.presenter.facial_recognition.FaceInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='ascend.presenter.facial_recognition.FaceInfo.id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='image', full_name='ascend.presenter.facial_recognition.FaceInfo.image', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=359, + serialized_end=396, +) + + +_FACERESULT = _descriptor.Descriptor( + name='FaceResult', + full_name='ascend.presenter.facial_recognition.FaceResult', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='ascend.presenter.facial_recognition.FaceResult.id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='response', full_name='ascend.presenter.facial_recognition.FaceResult.response', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='feature', full_name='ascend.presenter.facial_recognition.FaceResult.feature', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=399, + serialized_end=561, +) + + +_FRAMEINFO = _descriptor.Descriptor( + name='FrameInfo', + full_name='ascend.presenter.facial_recognition.FrameInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='image', full_name='ascend.presenter.facial_recognition.FrameInfo.image', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='feature', full_name='ascend.presenter.facial_recognition.FrameInfo.feature', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=563, + serialized_end=656, +) + +_COMMONRESPONSE.fields_by_name['ret'].enum_type = _ERRORCODE +_FACEFEATURE.fields_by_name['box'].message_type = _BOX +_FACERESULT.fields_by_name['response'].message_type = _COMMONRESPONSE +_FACERESULT.fields_by_name['feature'].message_type = _FACEFEATURE +_FRAMEINFO.fields_by_name['feature'].message_type = _FACEFEATURE +DESCRIPTOR.message_types_by_name['CommonResponse'] = _COMMONRESPONSE +DESCRIPTOR.message_types_by_name['RegisterApp'] = _REGISTERAPP +DESCRIPTOR.message_types_by_name['Box'] = _BOX +DESCRIPTOR.message_types_by_name['FaceFeature'] = _FACEFEATURE +DESCRIPTOR.message_types_by_name['FaceInfo'] = _FACEINFO +DESCRIPTOR.message_types_by_name['FaceResult'] = _FACERESULT +DESCRIPTOR.message_types_by_name['FrameInfo'] = _FRAMEINFO +DESCRIPTOR.enum_types_by_name['ErrorCode'] = _ERRORCODE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +CommonResponse = _reflection.GeneratedProtocolMessageType('CommonResponse', (_message.Message,), dict( + DESCRIPTOR = _COMMONRESPONSE, + __module__ = 'facial_recognition_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.CommonResponse) + )) +_sym_db.RegisterMessage(CommonResponse) + +RegisterApp = _reflection.GeneratedProtocolMessageType('RegisterApp', (_message.Message,), dict( + DESCRIPTOR = _REGISTERAPP, + __module__ = 'facial_recognition_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.RegisterApp) + )) +_sym_db.RegisterMessage(RegisterApp) + +Box = _reflection.GeneratedProtocolMessageType('Box', (_message.Message,), dict( + DESCRIPTOR = _BOX, + __module__ = 'facial_recognition_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.Box) + )) +_sym_db.RegisterMessage(Box) + +FaceFeature = _reflection.GeneratedProtocolMessageType('FaceFeature', (_message.Message,), dict( + DESCRIPTOR = _FACEFEATURE, + __module__ = 'facial_recognition_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.FaceFeature) + )) +_sym_db.RegisterMessage(FaceFeature) + +FaceInfo = _reflection.GeneratedProtocolMessageType('FaceInfo', (_message.Message,), dict( + DESCRIPTOR = _FACEINFO, + __module__ = 'facial_recognition_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.FaceInfo) + )) +_sym_db.RegisterMessage(FaceInfo) + +FaceResult = _reflection.GeneratedProtocolMessageType('FaceResult', (_message.Message,), dict( + DESCRIPTOR = _FACERESULT, + __module__ = 'facial_recognition_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.FaceResult) + )) +_sym_db.RegisterMessage(FaceResult) + +FrameInfo = _reflection.GeneratedProtocolMessageType('FrameInfo', (_message.Message,), dict( + DESCRIPTOR = _FRAMEINFO, + __module__ = 'facial_recognition_message_pb2' + # @@protoc_insertion_point(class_scope:ascend.presenter.facial_recognition.FrameInfo) + )) +_sym_db.RegisterMessage(FrameInfo) + + +# @@protoc_insertion_point(module_scope) diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_server.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_server.py new file mode 100644 index 0000000..8060093 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/facial_recognition_server.py @@ -0,0 +1,730 @@ +# ======================================================================= +# +# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1 Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2 Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3 Neither the names of the copyright holders nor the names of the +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ======================================================================= +# +"""presenter facial recognition server module""" + +import os +import json +import threading +import random +import logging +from logging.config import fileConfig +import numpy as np +from json.decoder import JSONDecodeError +from google.protobuf.message import DecodeError +import common.presenter_message_pb2 as presenter_message_pb2 +from common.channel_manager import ChannelManager +from common.presenter_socket_server import PresenterSocketServer +from common.app_manager import AppManager +import facial_recognition.src.facial_recognition_message_pb2 as pb2 +from facial_recognition.src.config_parser import ConfigParser +from facial_recognition.src.facial_recognition_handler import FacialRecognitionHandler + + +# Face Registration timeout is 10 seconds +FACE_REGISTER_TIME_OUT = 10 + +# Presenter Server Type +SERVER_TYPE = "facial_recognition" + +# max app name length +APP_ID_MAX_LENGTH = 20 + +# max support 2 app connect +MAX_APP_NUM = 2 + +# length of face feature vector +FEATURE_VECTOR_LENGTH = 1024 + +# Face Registration Status code +FACE_REGISTER_STATUS_WAITING = 1 +FACE_REGISTER_STATUS_SUCCEED = 2 +FACE_REGISTER_STATUS_FAILED = 3 + +class FacialRecognitionServer(PresenterSocketServer): + '''A server for face recognition''' + def __init__(self, config): + """ + Description: class init func + Input: + config: config information + Returns: NA + """ + server_address = (config.presenter_server_ip, + int(config.presenter_server_port)) + super(FacialRecognitionServer, self).__init__(server_address) + self.storage_dir = config.storage_dir + self.max_face_num = int(config.max_face_num) + self.face_match_threshold = float(config.face_match_threshold) + self.register_dict = {} + self.app_manager = AppManager() + self.channel_manager = ChannelManager() + self.face_register_file = os.path.join(self.storage_dir, + "registered_faces.json") + self._init_face_database() + + def _init_face_database(self): + """ + Description: Init face recognition database, + read information from face_register_file + Input: NA + Returns: NA + """ + if not os.path.isfile(self.face_register_file): + with open(self.face_register_file, "w", encoding="utf-8") as f: + f.write("{}") + + with open(self.face_register_file, "r") as f: + self.face_lock = threading.Lock() + self.registered_faces = json.load(f) + self._filter_registration_data() + + def _filter_registration_data(self): + face_dict = self.registered_faces.copy() + for i in face_dict: + image_path = os.path.join(self.storage_dir, i + ".jpg") + if not os.path.isfile(image_path): + del self.registered_faces[i] + + def get_all_face(self): + """ + Description: get registered face list. + Input: NA + Returns: NA + """ + with self.face_lock: + return [i for i in self.registered_faces] + + def save_face_image(self, name, image): + """ + Description: save face image. + Input: + name face name + image: face image + Returns: True or False + """ + image_file = os.path.join(self.storage_dir, name + ".jpg") + try: + #image = image.decode("utf-8") + with open(image_file, "wb") as f: + f.write(image) + return True + except (OSError, TypeError) as exp: + logging.error(exp) + return False + + def get_app_socket(self, app_id): + """ + Description: get a socket which is bound to the app. + Input: + app_id: id of the app + Returns: socket + """ + return self.app_manager.get_socket_by_app_id(app_id) + + def list_registered_apps(self): + """ + Description: get registered apps list. + Input: NA + Returns: app list + """ + return self.app_manager.list_app() + + def delete_faces(self, name_list): + """ + Description: delete registered faces in name_list + Input: + name_list: a name list + Returns: True or False + """ + with self.face_lock: + for i in name_list: + if self.registered_faces.get(i): + backup = self.registered_faces[i] + del self.registered_faces[i] + try: + with open(self.face_register_file, "w") as f: + json.dump(self.registered_faces, f) + image_file = os.path.join( + self.storage_dir, i + ".jpg") + os.remove(image_file) + except (OSError, JSONDecodeError) as exp: + logging.error(exp) + self.registered_faces[i] = backup + return False + return True + + def _clean_connect(self, sock_fileno, epoll, conns, msgs): + """ + Description: close socket, and clean local variables + Input: + sock_fileno: a socket fileno, return value of socket.fileno() + epoll: a set of select.epoll. + conns: all socket connections registered in epoll + msgs: msg read from a socket + """ + logging.info("clean fd:%s, conns:%s", sock_fileno, conns) + self.app_manager.unregister_app_by_fd(sock_fileno) + epoll.unregister(sock_fileno) + conns[sock_fileno].close() + del conns[sock_fileno] + del msgs[sock_fileno] + + + def _process_msg(self, conn, msg_name, msg_data): + """ + Total entrance to process protobuf msg + Input: + conn: a socket connection + msg_name: name of a msg. + msg_data: msg body, serialized by protobuf + + Returns: + False:somme error occured + True:succeed + + """ + # process open channel request + if msg_name == pb2._REGISTERAPP.full_name: + ret = self._process_register_app(conn, msg_data) + # process image request, receive an image data from presenter agent + elif msg_name == pb2._FACERESULT.full_name: + ret = self._process_face_result(msg_data) + elif msg_name == pb2._FRAMEINFO.full_name: + ret = self._process_frame_info(conn, msg_data) + elif msg_name == presenter_message_pb2._OPENCHANNELREQUEST.full_name: + ret = self._process_open_channel(conn, msg_data) + # process heartbeat request, it used to keepalive a channel path + elif msg_name == presenter_message_pb2._HEARTBEATMESSAGE.full_name: + ret = self._process_heartbeat(conn) + else: + logging.error("Not recognized msg type %s", msg_name) + ret = False + + return ret + + def _process_heartbeat(self, conn): + ''' + set heartbeat + Input: + conn: a socket connection + Returns: + True: set heartbeat ok. + + ''' + sock_fileno = conn.fileno() + if self.app_manager.get_app_id_by_socket(sock_fileno): + self.app_manager.set_heartbeat(sock_fileno) + + handler = self.channel_manager.get_channel_handler_by_fd(sock_fileno) + if handler is not None: + handler.set_heartbeat() + return True + + def _parse_protobuf(self, protobuf, msg_data): + """ + Description: parse protobuf + Input: + protobuf: a struct defined by protobuf + msg_data: msg body, serialized by protobuf + Returns: True or False + """ + try: + protobuf.ParseFromString(msg_data) + return True + except DecodeError as exp: + logging.error(exp) + return False + + def _process_register_app(self, conn, msg_data): + """ + Description: process register_app message + Input: + conn: a socket connection + msg_data: msg body, serialized by protobuf + Returns: True or False + """ + request = pb2.RegisterApp() + response = pb2.CommonResponse() + msg_name = pb2._COMMONRESPONSE.full_name + if not self._parse_protobuf(request, msg_data): + response.ret = pb2.kErrorOther + response.message = "ParseFromString exception" + self.send_message(conn, response, msg_name) + return False + + app_id = request.id + app_type = request.type + + # check app id if exist + if self.app_manager.is_app_exist(app_id): + logging.error("App %s is already exist.", app_id) + response.ret = pb2.kErrorAppRegisterExist + response.message = "App {} is already exist.".format(app_id) + self.send_message(conn, response, msg_name) + elif self.app_manager.get_app_num() >= MAX_APP_NUM: + logging.error("App number reach the upper limit") + response.ret = pb2.kErrorAppRegisterLimit + response.message = "App number reach the upper limit" + self.send_message(conn, response, msg_name) + elif app_type != SERVER_TYPE: + logging.error("App type %s error", app_type) + response.ret = pb2.kErrorAppRegisterType + response.message = "App type {} error".format(app_type) + self.send_message(conn, response, msg_name) + elif len(app_id) > APP_ID_MAX_LENGTH: + logging.error("App id %s is too long", app_id) + response.ret = pb2.kErrorOther + response.message = "App id: {} is too long".format(app_id) + self.send_message(conn, response, msg_name) + else: + self.app_manager.register_app(app_id, conn) + response.ret = pb2.kErrorNone + response.message = "Register app {} succeed".format(app_id) + self.send_message(conn, response, msg_name) + return True + + return False + + def _process_face_result(self, msg_data): + """ + Description: process face_result message + Input: + msg_data: msg body, serialized by protobuf + Returns: True or False + """ + face_result = pb2.FaceResult() + if not self._parse_protobuf(face_result, msg_data): + return False + + face_id = face_result.id + if not self.register_dict.get(face_id): + logging.warning("face id %s is already deleted", face_id) + return True + + ret = face_result.response.ret + if ret != pb2.kErrorNone: + err_msg = face_result.response.message + logging.error("get face feature error message: %s", err_msg) + status = FACE_REGISTER_STATUS_FAILED + message = "Get face feature failed" + self._update_register_dict(face_id, status, message) + return True + + face_num = len(face_result.feature) + if face_num == 0: + status = FACE_REGISTER_STATUS_FAILED + message = "No face recognized" + self._update_register_dict(face_id, status, message) + elif face_num > 1: + status = FACE_REGISTER_STATUS_FAILED + message = "{} faces recognized".format(face_num) + self._update_register_dict(face_id, status, message) + else: + box = face_result.feature[0].box + face_coordinate = [box.lt_x, box.lt_y, box.rb_x, box.rb_x] + feature_vector = [i for i in face_result.feature[0].vector] + if len(feature_vector) != FEATURE_VECTOR_LENGTH: + logging.error("feature_vector length not equal 1024") + status = FACE_REGISTER_STATUS_FAILED + message = "Face feature vector length invalid" + self._update_register_dict(face_id, status, message) + return True + return self._save_face_feature(face_id, face_coordinate, + feature_vector) + + return True + + def _update_register_dict(self, face_id, status, message): + """ + Description: update register_dict + Input: + face_id: id of face + status: status of face register + message: message of status of face register + Returns: True or False + """ + if self.register_dict.get(face_id): + self.register_dict[face_id]["status"] = status + self.register_dict[face_id]["message"] = message + self.register_dict[face_id]["event"].set() + + def _save_face_feature(self, face_id, face_coordinate, feature_vector): + """ + Description: save face_feature + Input: + face_id: id of face + face_coordinate: face coordinates + feature_vector: face feature vector + Returns: True or False + """ + with self.face_lock: + self.registered_faces[face_id] = { + "coordinate": face_coordinate, + "feature": feature_vector + } + try: + with open(self.face_register_file, "w") as f: + json.dump(self.registered_faces, f) + status = FACE_REGISTER_STATUS_SUCCEED + message = "Successful registration" + self._update_register_dict(face_id, status, message) + return True + except (OSError, JSONDecodeError) as exp: + logging.error(exp) + del self.registered_faces[face_id] + status = FACE_REGISTER_STATUS_FAILED + message = "save face feature to json file failed" + self._update_register_dict(face_id, status, message) + return False + + def _process_open_channel(self, conn, msg_data): + """ + Description: process open channel message + Input: + conn: a socket connection + msg_data: msg body, serialized by protobuf + Returns: True or False + """ + request = presenter_message_pb2.OpenChannelRequest() + response = presenter_message_pb2.OpenChannelResponse() + if not self._parse_protobuf(request, msg_data): + channel_name = "unknown channel" + err_code = presenter_message_pb2.kOpenChannelErrorOther + return self._response_open_channel(conn, channel_name, + response, err_code) + channel_name = request.channel_name + + # check channel name if exist + if not self.channel_manager.is_channel_exist(channel_name): + logging.error("channel name %s is not exist.", channel_name) + err_code = presenter_message_pb2.kOpenChannelErrorNoSuchChannel + return self._response_open_channel(conn, channel_name, + response, err_code) + #ret = self.channel_manager.register_one_channel(channel_name) + #if ret != ChannelManager.err_code_ok: + # logging.error("Create the channel %s failed!, and ret is %d", channel_name, ret) + # err_code = pb2.kOpenChannelErrorOther + # self._response_open_channel(conn, channel_name, response, err_code) + + # check channel path if busy + if self.channel_manager.is_channel_busy(channel_name): + logging.error("channel path %s is busy.", channel_name) + err = presenter_message_pb2.kOpenChannelErrorChannelAlreadyOpened + return self._response_open_channel(conn, channel_name, + response, err) + + content_type = presenter_message_pb2.kChannelContentTypeVideo + if request.content_type == content_type: + media_type = "video" + else: + logging.error("media type %s is not recognized.", + request.content_type) + err_code = presenter_message_pb2.kOpenChannelErrorOther + return self._response_open_channel(conn, channel_name, + response, err_code) + + handler = FacialRecognitionHandler(channel_name, media_type) + sock = conn.fileno() + self.channel_manager.create_channel_resource(channel_name, sock, + media_type, handler) + err_code = presenter_message_pb2.kOpenChannelErrorNone + return self._response_open_channel(conn, channel_name, + response, err_code) + + def _process_frame_info(self, conn, msg_data): + """ + Description: process frame info message + Input: + conn: a socket connection + msg_data: msg body, serialized by protobuf + Returns: True or False + """ + request = pb2.FrameInfo() + response = pb2.CommonResponse() + msg_name = pb2._COMMONRESPONSE.full_name + if not self._parse_protobuf(request, msg_data): + return False + + sock_fileno = conn.fileno() + handler = self.channel_manager.get_channel_handler_by_fd(sock_fileno) + if handler is None: + logging.error("get channel handler failed") + response.ret = pb2.kErrorOther + response.message = "channel error." + self.send_message(conn, response, msg_name) + return False + + face_list = self._recognize_face(request.feature) + handler.save_frame(request.image, face_list) + response.ret = pb2.kErrorNone + response.message = "process frame info suceed." + self.send_message(conn, response, msg_name) + return True + + def _recognize_face(self, face_feature): + """ + Description: recognize which face it is. + Input: + face_feature: face feature + Returns: face list + """ + face_list = [] + for i in face_feature: + face_info = {} + box = i.box + coordinate = [box.lt_x, box.lt_y, box.rb_x, box.rb_y] + feature_vector = i.vector + if len(feature_vector) != FEATURE_VECTOR_LENGTH: + logging.error("feature_vector length not equal 1024") + continue + + (name, score) = self._compute_face_feature(feature_vector) + face_info["coordinate"] = coordinate + face_info["name"] = name + face_info["confidence"] = score + face_list.append(face_info) + + return face_list + + def _compute_face_feature(self, feture_vector): + """ + Description: compute score of the feture_vector + Input: + feture_vector: face feature vector + Returns: face name and score + """ + highest_score_face = "Unknown" + highest_score = 0 + with self.face_lock: + for i in self.registered_faces: + feature = self.registered_faces[i]["feature"] + score = self._compute_similar_degree(feature, feture_vector) + if score < self.face_match_threshold: + continue + + if score > highest_score: + highest_score = score + highest_score_face = i + return (highest_score_face, highest_score) + + def _compute_similar_degree(self, feture_vector1, feture_vector2): + """ + Description: compute cosine similarity of two vectors + Input: + feture_vector1: face feature vector + feture_vector2: face feature vector + Returns: score + """ + vector1 = np.array(feture_vector1) + vector2 = np.array(feture_vector2) + square_diff = ((np.linalg.norm(vector1)) * (np.linalg.norm(vector2))) + score = np.dot(vector1, vector2) / square_diff + return score + + + def stop_thread(self): + """ + Description: clean thread when process exit. + Input: NA + Returns: NA + """ + channel_manager = ChannelManager([]) + channel_manager.close_all_thread() + self.set_exit_switch() + self.app_manager.set_thread_switch() + + +class FacialRecognitionManager(): + '''Manager of Face Recognition, a class providing APIs''' + __instance = None + server = None + + def __init__(self, server=None): + '''init func''' + + def __new__(cls, server=None): + """ensure only a single instance created. """ + if cls.__instance is None: + cls.__instance = object.__new__(cls) + cls.server = server + return cls.__instance + + def _choose_random_app(self): + """ + Description: choose a random app online. + Input: NA + Returns: a app name + """ + app_list = self.server.list_registered_apps() + if app_list: + index = random.randint(0, len(app_list) - 1) + return app_list[index] + return None + + def get_app_list(self): + """ + Description: API for getting online app list + Input: NA + Returns: app list + """ + return self.server.list_registered_apps() + + def register_face(self, name, image): + """ + Description: API for registering face + Input: + name: a face name + image: a face picture + Returns: (ret, msg) + """ + + # Input para check + if not isinstance(name, str): + return (False, "Name is not string") + + if not isinstance(image, bytes): + return (False, "Image is not bytes") + + if self._get_face_number() >= self.server.max_face_num: + return (False, "Face number limit") + + app_id = self._choose_random_app() + if app_id is None: + return (False, "No app is online") + + conn = self.server.get_app_socket(app_id) + if conn is None: + return (False, "Internal Error, app lost socket") + + # Prepare sending face register message to agent + request = pb2.FaceInfo() + request.id = name + request.image = image + + register_dict = self.server.register_dict + register_dict[name] = { + "status": FACE_REGISTER_STATUS_WAITING, + "message": "", + "event": threading.Event() + } + + msg_name = pb2._FACEINFO.full_name + self.server.send_message(conn, request, msg_name) + register_dict[name]["event"].wait(FACE_REGISTER_TIME_OUT) + if register_dict[name]["status"] == FACE_REGISTER_STATUS_WAITING: + logging.warning("Register face %s timeout", name) + del register_dict[name] + return (False, "10 sec Timeout") + + if register_dict[name]["status"] == FACE_REGISTER_STATUS_FAILED: + err_msg = register_dict[name]["message"] + logging.error("Register face %s failed, reason:%s", + name, register_dict[name]["message"]) + del register_dict[name] + return (False, err_msg) + + ret = self.server.save_face_image(name, image) + del register_dict[name] + if ret: + logging.info("Register face %s succeed", name) + return (True, "Successful Registration") + + logging.error("Save face %s to database failed", name) + return (False, "Save database error") + + def unregister_face(self, name_list): + """ + Description: API for unregistering faces + Input: + name_list: a name list which will be deleted. + Returns: True or False + """ + if isinstance(name_list, list): + return self.server.delete_faces(name_list) + logging.error("unregister face fail") + return False + + def get_all_face_name(self): + """ + Description: API for geting all registered face names + Input: NA + Returns: a name list + """ + return self.server.get_all_face() + + def _get_face_number(self): + """ + Description: geting total face number + Input: NA + Returns: total face number + """ + return len(self.get_all_face_name()) + + def get_faces(self, name_list): + """ + Description: API for geting specified face info. + Input: a name list. + Returns: a list include face name and image. + """ + if not isinstance(name_list, list): + return [] + + face_list = [] + for i in name_list: + face_info = {} + face_info["name"] = i + try: + image_file = os.path.join(self.server.storage_dir, i + ".jpg") + face_info["image"] = open(image_file, 'rb').read() + except OSError as exp: + logging.error(exp) + continue + face_list.append(face_info) + + return face_list + +def run(): + '''Face Recognition server startup function''' + # read config file + config = ConfigParser() + + # config log + log_file_path = os.path.join(ConfigParser.root_path, "config/logging.conf") + fileConfig(log_file_path) + logging.getLogger('facial_recognition') + + if not config.config_verify(): + return None + + server = FacialRecognitionServer(config) + FacialRecognitionManager(server) + return server diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/web.py b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/web.py new file mode 100644 index 0000000..75838bd --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/src/web.py @@ -0,0 +1,525 @@ +# +# ======================================================================= +# +# Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# 1 Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# 2 Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# 3 Neither the names of the copyright holders nor the names of the +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ======================================================================= +# +""" +web application for presenter server. +""" +import os +import re +import random +import base64 +import threading +import time +import logging +import tornado.ioloop +import tornado.web +import tornado.gen +import tornado.websocket +import common.channel_manager as channel_manager +import facial_recognition.src.config_parser as config_parser +import facial_recognition.src.facial_recognition_server as facial_recognition_server + +# app +G_WEBAPP = None + +# jpeg base64 header +JPEG_BASE64_HEADER = "data:image/jpeg;base64," + +# get request +REQUEST = "req" + +# get appname +APP_NAME = "app_name" + +# get username +USER_NAME = "user_name" + +# get image +IMAGE = "image_data" + +# return code +RET_CODE_SUCCESS = "0" +RET_CODE_FAIL = "1" +RET_CODE_LOADING = "2" + + +class WebApp: + """ + web application + """ + __instance = None + def __init__(self): + """ + init method + """ + self.channel_mgr = channel_manager.ChannelManager() + + self.facial_recognize_manage = facial_recognition_server.FacialRecognitionManager() + + self.request_list = set() + + self.lock = threading.Lock() + + self.videostate = {"ret":0,"msg":{"name":"","req":0}} + + + def __new__(cls, *args, **kwargs): + # if instance is None than create one + if cls.__instance is None: + cls.__instance = object.__new__(cls, *args, **kwargs) + return cls.__instance + + + def get_videostate(self): + '''get video state''' + tmpvideostate = self.videostate + tmplist = self.facial_recognize_manage.get_app_list() + if tmpvideostate["ret"] == 1 and tmpvideostate["msg"]["name"] in tmplist: + return self.videostate + else: + tmpvideostate["ret"] = 0 + self.videostate = tmpvideostate + return tmpvideostate + + + def list_registered_apps(self): + '''get registered apps''' + app_list = self.facial_recognize_manage.get_app_list() + ret = [] + idx = 1 + for item in app_list: + ret.append({"id":idx, "appname":item}) + idx = idx+1 + + return ret + + + def is_channel_exists(self, name): + '''check is app exists''' + return self.channel_mgr.is_channel_exist(name) + + + def register_face(self, user_name, image_data): + ''' register user face''' + ret = {"ret":RET_CODE_FAIL, "msg":""} + + if user_name is None: + logging.info("User name is None, register face failed") + ret["msg"] = "User name can not be empty" + return ret + + #strip user name + user_name = user_name.strip() + + if user_name == "": + logging.info("User name is empty, register face failed") + ret["msg"] = "User name can not be empty" + return ret + + if len(user_name) > 50: + logging.info("Length of User name %s > 50 , register face failed", user_name) + ret["msg"] = "Length of User name should less than 50" + return ret + + if image_data is None: + logging.info("Image data is None, register face failed") + ret["msg"] = "Image data can not be empty" + return ret + + # define pattern support a-z A-Z and / + pattern = re.compile(r"[a-z]|[A-Z]|[0-9]|(\s)") + tmp = pattern.findall(user_name) + + # check reuslt changed or not + if len(tmp) != len(user_name): + logging.info("%s contain invalidate character, add channel failed", user_name) + ret["msg"] = "Channel name only support 0-9, a-z, A-Z /" + return ret + + # check image base64 code + if len(image_data) <= len(JPEG_BASE64_HEADER): + logging.info("Invalid jpeg base64 header identifier") + ret["msg"] = "Just support image in jpg/jpeg format" + return ret + + # jpeg base64 header check + if image_data[0:len(JPEG_BASE64_HEADER)] != JPEG_BASE64_HEADER: + logging.info("Invalid jpeg base64 header identifier") + ret["msg"] = "Just support image in jpg/jpeg format" + return ret + + # remove base64 header "data:image/jpeg;base64,"" + img_data = image_data[len(JPEG_BASE64_HEADER):len(image_data)] + + try: + #convert to binary data + decode_img = base64.b64decode(img_data) + except (ValueError, TypeError) as exp: + logging.error(exp) + return {"ret":RET_CODE_FAIL, "msg":"Image decode error"} + + flag = self.facial_recognize_manage.register_face(user_name, decode_img) + + if flag[0] is True: + logging.info("Register face success") + ret = {"ret":RET_CODE_SUCCESS, "msg":flag[1]} + else: + logging.info("Register face failed") + ret = {"ret":RET_CODE_FAIL, "msg":flag[1]} + + return ret + + def unregister_face(self, name_list): + '''delete regeistered face''' + ret = {"ret":RET_CODE_FAIL, "msg":""} + + if not name_list: + logging.info("Name list is empty,delete name failed") + ret["msg"] = "Name list should not be empty" + return ret + + flag = self.facial_recognize_manage.unregister_face(name_list) + + if flag is False: + ret["ret"] = RET_CODE_FAIL + ret["msg"] = "Delete face failed" + logging.info("Delete face failed") + elif flag is True: + ret["ret"] = RET_CODE_SUCCESS + ret["msg"] = "Delete face success" + logging.info("Delete face success") + + return ret + + + def list_allface(self): + '''list all users face''' + name_list = self.facial_recognize_manage.get_all_face_name() + + if not name_list: + return [] + + name_list = sorted(name_list) + show_face = self.facial_recognize_manage.get_faces(name_list) + for item in show_face: + try: + #convert binary data to base64 + item["image"] = JPEG_BASE64_HEADER + base64.b64encode(item["image"]).decode("utf-8") + except (ValueError, TypeError) as exp: + logging.error(exp) + return [] + + return show_face + + def list_allfacename(self): + '''list all register user name''' + return self.facial_recognize_manage.get_all_face_name() + + + # Input:appname + # Output: + # { + # status: ok/error + # image: image data + # fps: frame per second + # face_list: [{ + # "name":value, + # "confidence":value + # "coordinate":[lt_x, lt_y, rb_x, rb_y] + # }] } + # } + def get_media_data(self, app_name): + '''get media data''' + ret = {"ret":RET_CODE_FAIL, "image":"", "fps":"0", "face_list":""} + + if self.is_channel_exists(app_name) is False: + return ret + + handler = self.channel_mgr.get_channel_handler_by_name(app_name) + + ret["ret"] = RET_CODE_LOADING + + if handler is not None: + frame_info = handler.get_frame() + else: + return ret + + if not frame_info: + return ret + + try: + ret["image"] = base64.b64encode(frame_info["image"]).decode("utf-8") + except (TypeError, ValueError) as exp: + logging.error(exp) + return ret + + ret["ret"] = RET_CODE_SUCCESS + ret["fps"] = frame_info["fps"] + ret["face_list"] = frame_info["face_list"] + + return ret + + def add_requst(self, request): + """ + add request + + @param requst: request item to be stored + + @note: request can not be same with other request. + request is identified by (channel name ,random number) + so this method do not return value. + """ + with self.lock: + self.request_list.add(request) + self.videostate = {"ret":1,"msg":{"name":request[1],"req":request[0]}} + + def has_request(self, request): + """ + whether request exist or not + + @param request: request to be checked. + @return: return True if exists, otherwise return False. + """ + with self.lock: + + for item in self.request_list: + + # check request equal + if item[0] == request[0] and item[1] == request[1]: + return True + + return False + +# pylint: disable=abstract-method +class BaseHandler(tornado.web.RequestHandler): + """ + base handler. + """ + +# pylint: disable=abstract-method +class ApplistHandler(BaseHandler): + """ + handler index request + """ + + @tornado.web.asynchronous + def get(self): + """ + handle home or index request only for get + """ + # self.render("applist.html", listret=G_WEBAPP.list_registered_apps()) + self.render("home.html", listret=(G_WEBAPP.list_registered_apps(), G_WEBAPP.list_allface(), G_WEBAPP.get_videostate())) + +# pylint: disable=abstract-method +class RegisterHandler(BaseHandler): + """ + handler register face + """ + @tornado.web.asynchronous + def post(self): + """ + handle reqeust for register face + """ + user_name = self.get_argument(USER_NAME, '') + name_list = G_WEBAPP.list_allfacename() + + # check user name is duplicate + for item in name_list: + if user_name == item: + self.finish({"ret":RET_CODE_FAIL, "msg":"user name has existed"}) + return None + + image_data = self.get_argument(IMAGE, '') + + self.finish(G_WEBAPP.register_face(user_name, image_data)) + return None + + +# pylint: disable=abstract-method +class DelFaceHandler(BaseHandler): + """ + handler delete request + """ + @tornado.web.asynchronous + def post(self): + """ + handel requst for delete channel + """ + name_list = self.get_arguments(USER_NAME) + + self.finish(G_WEBAPP.unregister_face(name_list)) + + +# pylint: disable=abstract-method +class ViewHandler(BaseHandler): + """ + handler view request + """ + @tornado.web.asynchronous + def get(self): + """ + handler request for view channel + """ + channel_name = self.get_argument(APP_NAME, '') + if G_WEBAPP.is_channel_exists(channel_name): + req_id = str(random.random()) + G_WEBAPP.add_requst((req_id, channel_name)) + self.finish({"ret":RET_CODE_SUCCESS,"msg":req_id}) + else: + self.finish({"ret":RET_CODE_FAIL,"msg":"Channel not exist"}) + +# pylint: disable=abstract-method + +class WebSocket(tornado.websocket.WebSocketHandler): + """ + web socket for web page socket quest + """ + def open(self): + """ + called when client request by ws or wss + """ + + self.req_id = self.get_argument(REQUEST, '', True) + self.channel_name = self.get_argument(APP_NAME, '', True) + + # check request valid or not. + if not G_WEBAPP.has_request((self.req_id, self.channel_name)): + self.close() + + + @staticmethod + def send_message(obj, message, binary=False): + """ + send message to client. + """ + + # check socket exist or not + if not obj.ws_connection or not obj.ws_connection.stream.socket: + return False + + ret = False + try: + obj.write_message(message, binary) + ret = True + except tornado.websocket.WebSocketClosedError: + ret = False + + return ret + + + def on_close(self): + """ + called when closed web socket + """ + + @tornado.web.asynchronous + @tornado.gen.coroutine + def on_message(self, message): + """ + On recv message from client. + """ + if message == "next": + self.run_task() + + + def run_task(self): + """ + send image to client + """ + + # check channel valid + if not G_WEBAPP.is_channel_exists(self.channel_name) or \ + not G_WEBAPP.has_request((self.req_id, self.channel_name)): + self.close() + return + + result = G_WEBAPP.get_media_data(self.channel_name) + + # sleep 100ms if status not ok for frequently query + if result['ret'] != RET_CODE_SUCCESS: + time.sleep(0.1) + + # if channel not exist close websocket. + if result['ret'] == RET_CODE_FAIL: + self.close() + # send message to client + else: + # close websoket when send failed or for image channel. + ret = WebSocket.send_message(self, result) + + +def get_webapp(): + """ + start web applicatioin + """ + # get template file and static file path. + templatepath = os.path.join(config_parser.ConfigParser.get_rootpath(), "ui/templates") + staticfilepath = os.path.join(config_parser.ConfigParser.get_rootpath(), "ui/static") + + # create application object. + app = tornado.web.Application(handlers=[(r"/", ApplistHandler), + (r"/register", RegisterHandler), + (r"/delete", DelFaceHandler), + (r"/view", ViewHandler), + (r"/static/(.*)", + tornado.web.StaticFileHandler, + {"path": staticfilepath}), + (r"/websocket", WebSocket)], + template_path=templatepath) + + # create server + http_server = tornado.httpserver.HTTPServer(app) + + return http_server + + +def start_webapp(): + """ + start webapp + """ + global G_WEBAPP + G_WEBAPP = WebApp() + + http_server = get_webapp() + config = config_parser.ConfigParser() + http_server.listen(config.web_server_port, address=config.web_server_ip) + + print("Please visit http://" + config.web_server_ip + ":" + + str(config.web_server_port) + " for presenter server") + tornado.ioloop.IOLoop.instance().start() + + +def stop_webapp(): + """ + stop web app + """ + tornado.ioloop.IOLoop.instance().stop() diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/123.png b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/123.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c4be5458c98a9c0dee80044d89887222b2c7a3 GIT binary patch literal 51889 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

1ctLC#AfJ}l1M_Tlr5ESmbeck4qu zJf5MZiW0C9PipgXuH)vx4+ywQZ!myk+Pog-{CQ2Bq_whg9klC!#!oW#I?$c|ezoF6 z09!OfcOjBavnvQ0vsiG6f8fMP9)quJK@*v@vIvGT;lCNw7h(=#s^bPmFN=RFiu5cV?;q=|+vQNKrf3Own$IWDI5{H5i3z9l0a_md3>fkZz$pZRvdt5E45 zQ!9`7kQrb#e@qp#@N1&*^SS0tp)SLRg4h9rC8X)ZI0dlDROG3UlXqB(@h3Td;OsT4K@3mD^={o63d8fKrhh(>f?XNb{AP`oLRE2( z>GEvfZPKDcwaP%oE@3$EMl_$R)Y*M1+P~dgCF^WGi)MW5Royh`8V_aDv;9}Ph)T^F z<8_!u8@>s~gu3g;sL-}p_aH>;wy`sgwY4`J-@I`$GX{CAJf{LS{%4jh8ZwFTyhw-S z9>PI3q$YT~epza-^YiW+A*MLLskG0FaF@vY+Dw`42vwK+#poh8UizQ-wOj*e9@3~t ziMo*j0*HGofsO4Iw%xke>4O18h@t22CL><6KEdS2!Rp(yb8CX(LQg;CY72cPfGR8~ z$fL^!7SWC;$%(s7(vv+k4@U^vO!95d)${R?URCh?ZFD;L`>FCz_r#JRQX!nf;Cmzi z%7sijI{N)hm-(**9`?!4v>0JeB91a(pmm<~X2E9vWP7#&UFtv5$2rh7%_VZe-iM)s ztM0#o^7R{FD2PXS3-Krr&UC>d2&-wO7GT{yr(&y}uwq2Z2Y*>=fZV{3B*Hlwj*x&e zH_!swR|dJUbPiP&9GQ{idpN$2VPduB9qUU&tG{cOJl}p$2)}sEI{}8uY{q+#fw`c* zlfJsvv}?(CQfsBE8}lc=F))J9?DhHLvl^v<_xj?A0Fm_=_ZRZ{DNw2y^4-NZo%abG%+Wj>o3mL>Bl~7RqCt*bM?x^2o6$kpCI>Njt0t+0wr2c|T*` zz%!{~nbAV*Lf|yMVG48Cd;LZt4Sq8)BEHZq7H(ePUBZHj zxUtFv^pzBS6j%T8+m&D-KhILe@HURjR!)M@EX4Umr29f>v)XyHxSQ!a2Q`-)$0W$q z)Uqu6W~T-k$dpm~H*TGJ6Ej>1V zBM+GU=O;Av$Bl{W(A`Idio1dQW{V)_s#9bo|RS{$OvQ2d(P^B;H3l|Q02i@!)t zOOxxSlj$stq(AbM>!L#1qBdXYm!*j2-m80H5hvJJ=&KigWy*waXxU_!BrXf^) z-cyfxfxJqPCsdQd&s`j)j2P(V?Y{75Bl?pUjhvfimcy6x@+k>&rB|yJY z2HGi;u_Ev%1&2;;p3p2rX|HBH13`eNyH?<_nMUtoZl9(AsI!O)5>#j)draXu#9~jh z-VXUhccNcF|!w&kSy0a&_WN$oZxWx#Cnrq(QxHcLqfk_^?WrIBZM`kk^lzmCw zjt+S1a6DitOXQ66=k;v5iAx~cWoE(NPGd}X3W^yzfc7dsK~Af3$ye)?gbO!nYr6c& z-_CDaJollFSW^YF!A(SSSjt0#`;hPgDRNAX;Fe_LiCiB%jLJZKa(JzS!>FumELL6J ztYA?tGQ@pe#O@xj^a+1^xV2qxO?@=Q>WsrmDZC~@{T~b=jc{{)XC>DtLrJ`2_#Qzp zB92|7)BS#%sr9>tHNN?DlOYvAZ9Fl+4awNBu7*Gi*R2}j@9OR-e5-Te&EE3mh3&Vp zQQ~3xQEU9t1|t!a(7PR?%b*qIs1sae(ReeQ54$^d$s|BNuWeDeG(pgrp~owkoB{TM z0r!0I6cGxYjS~aVoRFAs8moNvgBCl}rXr*!VKD`@QU}m{^PeG=0o)vb2{=pftIz{t zaclrL4Ib3`f>s-X6_|E!-hb@C$yjBG2rRr>)OwVE(bdZd(rCyLVB)l>6q#K?3-3=I zolb3u(UY4JWsnbZ^up14iE6#4M#0$|%5z5dMQy}mXeJbYbpB5%X!9nY9nu#fgrE<%CBUdBQE~TrAa#LYX$Jx)S z@BWmWw6V8>YWbkQLA8!eiyWC?F58sg!|{>W?awdv83yuWyeD+QiPzG*-O zBh?<5yb$w6qYB%Eo5-+8~1J{2>^at=*Tq0A5{EhexqoH@@${fQeY3~3jA{K!w4gQWb}g+&dbW-~oigFn{b)L0 zNDj|!2TB6(Wu5u$Y}sX=rD|&CkO9igeiIEBjwVPQx0l}YS`eyhFU&(E|P#;3Mw$F@?FE)BIZ-ip<>$jU*3KaoCJPS_pK9v3w z#5hc|6OY!(aTV{T9+4vqE!^#7#2y~-LlVq%QM*KmpNCK$)*kGh%1>!sj^kLh|K-fh zR2$in(TDJY<>EwjT%SBOf0jAgS?l*ZMU{Xg0PEUC|_}Ghclu?mOX7h^JGscm2W$ z&2KT66h|!Ngj=xl3w?LnX+rEDT3rcEePVIr^7n)@DO&WBrhYP_HlwFOzF^+pWGKNC(OD?1rCzurr@8uc=Ka4T5iKxb*;4s$|_1y}Z%oSo%V^nh%hocE`Q zzF7qX=VA?Ww=N11it6kN{JItk9=4q<$Q3UgR_7zJ=28$k4t@0r(Q-Gxi58`7EJ+TO zkdvVdm>s#?eXlR0T6a$el44M;f9H&jjv6j^2Nmf06w&~UMgVHfOfQ~^vBrM0}lN4%R7_Rn3cdqZS%8ZxS#Y6qn~+EKz7h;4LJT0f)J49G)Vk(?VXrK z!9SJOF*5-a6O)&*1p~jKiOqse?3`|w#k-;G0P|A{0Q1D;F$pTmTLb2+nX)QFtB0%O zHSgZlF9a#1qL?Z^WlwawJwPwFd$PYZ~iE}#Y|1sw? zu}gb==Z$9Skf1n9Rr=)WjU8WuN02q{DfPJtzMgb;;qFw`FT#dnqv<;)r=_bQ7khXA z^3!HQAnYKM0P0N=a+_R`h|{NHhPZ}k6|B~wTo$#FyXx|khGOUX2aFf4dZ%y&uEig<(CV?Yw5+ec9cj^d$3MAvfq8;7B7Db?4SwhbAilZX1E*x4(0e@1ES6 zN9|@qxCb6j(kVah>}jg|trw5jP)Rd}w|!eZlX&*h(dT`dG`3~w_ju7yJ3x=-3`Lm|(_UK?PPyN4Y<0U+b9Od_?zh-gYle7UU1` zX~cvw#r+kJyUHW9Jkshzt@~UuWc|Tx!r%2jJ`cQWy9SsguDE7zvn(aWCx?ec{ zIn+O|$o0w6kSCk$C{Z?F#XpTQ_r&(@^UUu4Ay4i~F|>1I9h_ux1X4FWI_A*4OQq$B z64e_R65M_4bg2C{Y#l{Z-iM*;ZkK^#N)vBrLZVKhH{}02l*c6421;=An%aFB&cWb~ zAs}@dgf$i zX#g{XXf3!AGv5)Q>!@L0GLui{4$2@3t07QN!h4hZ4hn0d63vW^IQg1VcfKc&J2Z?h z&;^iGkR7vyiUjgN;f)dz2y7$tR6y9VW&wiJ`9d=d5^<1oHK=G)$~S zK*v z(VKevz5cEvlK81p*QES^h36r8zT^SN3uA$aJ|Q?e$KN*T0*%@Vd_vrvY%*-q913-q zaq#>i3F0(PDM;ijK5YNVLpECaW>L@y|w;z?2XaobXvF2Y_83O&1;^tl$W&BbD!w`JULA+B zee;OvBG}v{bBk0q5`#;dlhW}L#~@^_&x0(*)o_^M**XOq_TdS8yecIg%-_-NCMj#F z7we%2K1vQ*jZ)km-@Y(m@|c=h05RAOgHv7|>ca0V2;3n3n_m5NsC(}1%KUdx)@Kb2 zM`KwTxgVW&45?>8oYfQf?eR--^Iae8M*PN8CTuGAeQvGX6hSFgAxRJ+5oanV-a4P= z?KE&h%74HaE5l!}Ua|r8naXz2o8pi|X$Ge;6o?}Tj2|R-jO=fW*i2@?5y`8aOX-O` zt}5paqsB$~GQNHOCdnILrMfd|Quv@FUvGw9#N<4cOFjARJz_)A zt5LRT`t|-3SM4Z1)@0>=SuTkH>0Zt!kK_c}iYIs0v5gzwO7;{(r#kgd zJd-|m_%At0KH2#t{QcW~BRY(EWz0gs_*lThg+b5E1X2AiQggRGqs3~omx)KZ8I!Re z`Za!QDWdtflZX_4VtG_q9R`iUchy9y%55(kXocGkZP#($>-_SQWL%aPvj7ihNH<=LGk4^zC`r+fWDgFIZe_8`LiyK3ONU$<}aQ5~-qHQ2RjC#agGqK7LwyAv1szIDSA)v zPRD=yZj~M z-grbe8VV6o4ZrUU3yTX1iWQH^U`;*|E2^vq)JGW@cQ+}ZG>n8ELQWtrms-mzwJ1Hr z>nC5vmL#eSN~57Lv2g-6)101Eb-x!4uunChaSlkJMW=(|2G747IW7I?V%iV|I82G! zNWR}4!o9Kj^mux+%l4j#u4y^z>3M>bNSFdqI*Py46Mo6$SRE{uPW ze4!r>1TD6%tD+-9Z~XNd9=haa=LzcwGBUvF?JXJBkFzj#`ULWAtD5N^s zEkxkv8H}=fq@G5PyCwJN(Ez@1WQ#UN&hFFQ*YS!6REv3wG#&LdtFqfxvH^yG%5B_1 zsY|p0WlzB%TgnfHJozQvKl`rZuPvASjq62D@lDR+!+~*iWKy!Uk53RPlo{U8gL0hl zIvHCM(89L4QnhqC{jO=C(F6gusXF1~+vsEDkrk*&V7QY`|k)VDz}Ct5K_)RsBiyfpZ&ZuZ15 zXRxmUymHEu&5ZQ#%8r+ zS`!lXm$Uo98A{XjhLkJV)YBL9UUl-F82>|d3hWO&fhE1*=*NUoA*}?CsmL5xd(Rb* zC!kL4?=Po6O1vo5xYo{fG-nBGEk@x!^U~8267~?{sOC$Q#MFOiI^)pBb+r0%%;FOv z_$(BK!OQv80EQ5imxJ3+%~C>YjLLb6<>1KrZ?Zh#~Xt4;S8qTA4#+`p4D#|C^}v6yG*MMaGl;XrS-D% zd`$1fyJY-5(3kq8MQP&1C5)M}j0;Go%qBg*l`pH6y{cq5+nB@^9#p8>BujzgFvI0B z^o%k{;_^g=+iwS5ogly?Jbj+F&Ws=ty68iSQ=-%*><>{d76*Wqd=6X^f9Qn1lO=ppJix{I2Va5h=FsPQ>9ZR|qFk>eI7uU$L>iQV4(IfUAkN287%pdq2E z%yo$HeGakOoQJnVdp=Xymy5X+1%9){urhP+@FY{rxy>6h&IFV(^z1?}K_Pm+T}h(# zG}>vflRdNWQlICm63h+3!%jA@^PA0ie_GdJ%(HD>da`%S6xV&niz(z8c4ex}LE|JI zH->?soy%9fZ6r@;g4x^7Z|Ad*urk;+A5_j>N`0!#IW{QACF)+9`iBC~GVqW)PO3FG ztGk9w2F*O!C^2)acjx@&Bp*4DY=E0#g%SC6Nu5Xw64=bI-qm|&b$)DL@7L=I#e@Chn$IqZLj5Al>^)&ufN*t|10pjEVi*I)03tzbixONbXm6 z$SquVouvNwAq7xQt>r&OSV_l59+J0jcRp~eq**Xvz^Uu&_@VebNmX5}5Lg?RI3%Ye zKwMYFiMd0z-woO2UnnBtFqIoiNruN8p?U^eln`@l_1B%b z{BU!1)={1Do(#wc0)p+Gew2aFR+{zp_qz}0C-x{RD|$x9{DgcDxCY+0{r%|@T)w=B zsUr$fhfbF$5o@kD!U;LPT;6It#w$;2WEM|-wrlP&7~ziqZhv6(8J1o7V3~W{+KDVy*O6>x#V3+x94rn*`2_q@;m9##4NLv=m zxQo8Euk_*~5-|XM{2mIO!534PWfz|)zWk6M%6Q3Uh3~aQerM^2>PuhH&VpGdWg{~S ztaQ^=%B2i1wL0micUK+VF;z#;d}EZJ~#jRnv}VJB_p;p?XF9SN;pI@?=4)5 znqCwVkBZapd`Uae&f3d5C`3WWuTs*>X3J&!!b|FIvU?Sh$Ey*>nLAgynaoNI?oPA~7dtZ0mW<}Z(f*pJ zMxGY5efJk{tGS&+u@y|0Pou)rPQJts&;f%;U^;!69@te3Q>G+tDVQz(e|nc`K5`T@ zKAd#(T_hSXQKH`nZ@R`7eR6Q^o|$t`w&6}Otc7tBp}M$qo6xoXImO&=DD+8Lf?mgB z@7|8?!d@E}pSP=m7DY7*XBapzDH%Kz(%o=fr>$aw6oq6taoW29g|Ja87AB3`4H!LB zZn!Cs`b3^Y{$>%Su=TK0ih0oRy%myi?62TF`qdX(vZB+*2Ymwr{n6gI&ucEE2<1Dr z0LkD^&G959%HW6>G0SLB%YyB=Ia>pd2vCJy5mJaZQEP#?Glc1D-EmHvfm!}Mm8h9V zNO%X7bSJYX_}~gRITUqhD@U`aY$eJ(Tk$9V1@%toKEaWi@0&;9M@=VA^T4BL_8t+B zL9rGm66R1Uj{Q)Tn=*@sR4O|ps){>KZpqw>tmBh<%+hJn;#N9W zQTJ|QO53GjLaW2~YtZ#p+iACiBke+RZ&x(nRpv#Wf{G~qvg}3Y{^HGBslJnB$w>m- z6Kl5@ANn;Mc z&VA0g@9X+p4oa_xIKM3W5=?bujaZyDno?>cJFp(_ac*S>0Cs6;3V&3(9GyJq1bTp6fGm-f;EQDO#O%K*KdUJw5lkE#j&7tBOkCBN_Fy*NT_^75kb!tl{!;L6ZRSNF+x>+LK4lEs ze!2PG`TTNI)p$dR#**UL91GnpvfKQp(1eWrt6=rpEv#Ud>h^Q0s-JU^0xRo+%RyC* zV>Yk8U=FX#Zn6QIL2E$6HH>GY(MVhht$iYg3xksNY<|`MJ@K8CGl!jXj^ws08uT?u zGv_c45}DPf4@@ZMheemAPPu&J)=0SaSHvF3Pf&p#4Hsk^7R=D3y0@CY+n_{d(JN6o zb;S3r2yOXe^7Y#QPs4wyKo@;1dCKjk$igu!a?>7}1<-P>rx0RC@SJ4?bYuJ3K+Y<= zlMdP`U{#qiS7X0YV9fIA(Eb6aMqm;6k%kEb&j|VvAk4_IM}_f7K0SOhH&ICF`qA@R zM#-;eG;Qd&b_5P|f86lsE49XYk$;>WQB=065;0>uxI`}h9TMqm?ZtNcd#NKr;UE2V z$DPi~?fNA4NyfGlCqICH(AN6$18ct^L!ixom)`;Q1$XCV2|50RMVU`T2PC5O+#4MM zhNxp*#Q2&sMcVVC+lT8|B*c?~t0bm4hN&OIvsmW0pb&%;R_C-P6cPfzCX|ks2d^tL zz{IBz@F3E~V<7 zM#!>R`k?(uw0$iTr*U#&ku5hIVS$EEord&~Hidr~GRxL1xcC8yz#}8D_KnF&d__vz zQex05QOZ!vUpVumfC0|?ny%*LwK~GCOJx`ed!PvD&-XmJ^Z^0X^vp!82>fQ%4AAZ2 zL=wT8GuENdq;6=$dEms!sC&_&ZNbyr#O-bVfkpPr9^64db3zE+XyxD-?%?LGIS2BX z3@VrTYFwi6W*M zcV3h}Lrl=oa6t)SD-o#?I{hIx88I!rpDgZ#jTF+FnD8*v2oi{&qrT;^Ytu*klzN5PbH0M zJg0Uck5mr&pxibC~w+MW8=oP*p7at`K3qCBUc1VgB~mC zLtq;eVx%(?K&)9~qLXh%n^6DAYAxB_Xmu_bJogg>oR@r`Z^gz6du0bqt$_n|uMP?23+$KF^uRX9N*lVb*WLgT;-|4a2aa}C zKjAu}Kp<+(+%OscPr9mhpFJz9n3mIEL}Na0_TUTTlGTOoVl7xc9MJP0jQA7|mj7OIuhZCh62CFhsoHVHm1X#g^&uFOvrv&X z*vk~n_rs8xXC(0t*0*;<3S5!q zdB=$u;k=fCM+~<+>$C5`^HAyoK{y{K$7yD)$dp}b`Bc=gy7j<3*P!_y6x5QWp2a7P*kDf4)v3qt-@A2lG!RP zTN9FEH-56F?RlQdt48v)Yadb{y$?Y}Iw}*CzF9I%h{UbYF;`Za#-aaE2Is*Kkg$X& zQG#a~a~H}rymB_`Q9yLqFKQrJoGUoc^28m80H%RYkW`2NPtBM!0Pj6g(&v=LMd&yW zfY9^+GI-U>qb4=D&@>1zAT(a>6 zWwQ=z+iFA(LSIvwU1b&5%^)5p_SJ*Y9iQi8{RMHLt!shujhASi)Kq3*>+56AD$>py zF&pwGjhP_wr3m^H^N*zd9Y0@-X^>H#A}?b>qDNc4?!Bd=y(#}o zoj`DWs24X7owDJx%=7n`4A+Yye?`<8!8+M4|28aL16$TI+9p$F#>F@HsQ9FB8p6JQ+W zw($Qq-f9#Q&Zz>tN%P&6Y+z*^=u;0umrsCayiZgDB2P3z01pu?hk%tQP$A#QVUI+C zR$~UOrz|iWH(0Hql=awQP+b`3BF*P{LZ#0xkxY#|T3_iq9}p;GNR2I+7{vP%#nhwn zmM!tndS%RIN|H#jm!+pwUi~c?0;GZZI0%X&4k}WV=nrvNpfQ)l@skG?-k{=t#F zYiLofRY?Dji{#C7{yM0GA->0^R2KKNucjveB?HvMRW&kL9j8!r3VL|fdX5D2R3+bv z5O%2(0n8hcFZv7+#~+37@<154MnBNeyC0Vxolp}-HafV-CnJ|uhY8N60W#^ttq*N3 zR~C!(WK~1nw}Ou-As+TeIE6G_daR;N(WUxr0Pp?Txh?tPc)3i0Lg*Pqa-`2OcLp8} z$5B2{c9CtI{l#n6%TA2f<-!To2Ar{El6hay0#HvuazyW-?~ zD&&-WdDHHA9;mqhq2k4qULG2@rg2%15aTL+w1~_kNRE;I@=Y=9*r6`O-?T0yEac6< zC`mee#9Bw#1f#F2g}r!_*~D}{E)A5A7!WggS|AujSO^bm7` z-w&!#NZ5ff;D*Klu!!?T?x7t2vz$kc0@~hpfLKgB&Ovsb_fy})r%{5Z8C?ttJ0xEL zSmJt#@Icr*ppDGS^|qJ*U8o#g6n1uP*c5#l{?*lhr@>>l}8^Qv{U;oUfWbm>CN2*Zclnl8|Pn|`Og%(`E zANiEL!q6B+3lV1SBt{m_`*lz+b~MR-S6tg41p92RJshSS;Ly%e-%F?bNAeTSE2CF- zS4LN4tG?sKf3jzn4cOO9+&#jJXy7*hJJ-7>5^4QjL68nyw8%0L%hKWd^ta&`I-b|(g95ce#RBsq&}L1{e3(za_0O5`O~ zXn^wx8x*2KMpm$NnC#qfNM~DM$c-@{?p1!JODTLZ`uuXY^6Sxs%ki`LGd66lC-<%_ ze{~(3m)6XF{_@HE_y$?`QF{*Y>Z92r5C{HQoKvQuJpUo{%1V00jlN%eoKn8&!=vp1 zE=ndz?pED{$c>aC#po|N3v-c6L^3mk_fGmUW^C6@)5*w#u9tIS?k*tS)3pi{1_3%l~CC5XXo_&L`CNdrKSME{y;De1Z_PKMs|0| z{(~8ZT|Lcv>;AvU9YEtN2UfK0HbO|hM8T2s1$f2uh+I9y&uOYu2tC{>MhRgjV+rHP z<^m2wEB2}mj4*=)UUoTj%CQ|G%mYGqo6CT|__!GFtW3~JNGpDLv;Wh^kM76BpD*V+ zSAB(74!tfHXA*@Oi&<4vB@MjUS(iPG>+-w*e%V|6c9ZfE3f_}B_}=IEETNe(;Tb?egRggD;*+A2>RZq#H# zq!4(@C4G|v!*UHC0eMgK&Qn%8tnl8CFVmS3vjg#9wDmYIFb557HmS{b8VlRzm;$Os zzMVQY(i)WyC;+4=0qIfHk^-L#nB~AO{i63#J6e3zj5xXiEw7`F5Lv!?mBp)dtFA8i z7Ijy}rxr>lxgCqs{0Uu`wS5bJQ?7E#lB@D??YNj={Y)%pt)-Y1TO6E)*Zj8qh*QYp z;_jXjA)ZG+{AL}hGD!}5M?xHb;~kbBVsoN)n9MtRO%PBJgBw(`TU$83(?^eZP{@1h z-!Sk7c3Y_C);F4){V~!uL1v424q)my`sDqYgmlJD8{$a8owTLkQO`luSS-PWwV1w5 zwga_`JO|c|weSu8vnh8p(gm0=!`|hitTPF(zO3F6H>Js$U;~we|1lC(CwP&EMxAc} zbf?_@K$0xU8Pro^Mk)WF$Qpu}*5<{$XrLH~)l`{+L%HhkYL z&B>L^1Zz6baL5EU;@E%uNNZ(lFv}R=W~q2Y3pt-$L?bseOW`nv8gJ{R7l3GPP)ZbG zeq}d|Y@g*v!eopna3P$Bxo90AUB@5}sNShnoHlmiWcppreU6L`YMHyz+N#DZpjca~+q+V5DRn=66lM5BrAn zVqOWw<2t{1#OfNfIR+}yib{H!Qj~177WG-@{EPfMi?qyqRN)(77y6fdz;<5z6$hqG z)t@L5e|okJ+=jwxp8{kcQ{ZDRlp~g!^5XCFNdEK9EwSr!!op}~APQ5qln#ujC509z z@bdZR+>AG7Y+m?>im*-lT|m$LW!3EZmmv7rpV`p}Y<3x$Wr4!J0L>xUh7jlsJE3!9Btr?M4- zuV3O9gx~Wn?a+H+oGSmV(7fBuJk`BCy?``bq=sB5y$XQu2y*y;OVK|V162XUu5Udj2Js7rF9Q-~1N_m&yR5J`UWv_mfCY88$3THU_2KiTni zXGWe@xjZCip2^yY&mzl<_cpD7K)U zr|%2L>s-qv+}z|%2u7VqZ&1KVKhD*FDCFw{9LyNdTpCRBLj)9Xbx9cbfPv>E&dd<` zCK;^oyzNR0$jyMT#Q3B*-@O6ZbXbCxOZBiL!k?-!zNY zz3Pa2hcQJkj0V%gl*;!M{Rw=4|1sdR1_SJ(4|qL`drYag;7np2`zi+_T%p=oUH#<} zD!)I-hk#OXKOhowr_1a(paYB+$tbb(SOYw)(2-fON9+u5FLr@S>;FZHmKIW^j* zMiV1X1yTk^km8OSn$1{1>GAY@$Sk`VIZ#EE;hZUL=mROq_wLd4GdC*ndqxAqYi zw6=6UdJ}^_6k0MnMYdk+7q&+`KOAOE`Sl`O=@H#_h=!z?e-XBmy~3$w&mR5A6ky0+ zCSj&r>?#EXKJ=M!KvYWN1lSDk^qCq)B_K)cBVNfTEajr8c+kLah`1On4Ml1i8%9l1^w-FUF4L>8*2BFx;|5R3wsS^5r8 zK1}a3W?uq#8{HmMY*8&E?9n%7B;wXv@VU30P%)MYcmpuu(iAbdWwsYL_q<7$rjS|&+$PrHO%a+ia{CI(nG9j20EZk%0O zL$*dE(@saYC+q0%+9hcJO`aNOY8_mvJXYKX3B4GZ2fTGROEnG_4!1X&SOz!rst zNfU=BTuSa6NGF8@^woqtC`4mrC-sz!4ja+Fh=+}Z0YGYbfXxn~FyzEVfLyY00T6um zJ4K8z0uaVZi&r1$B?uZA(aGW4C%^Q=f#fdbqT6>?Q>hLUq41^h=D$A&bDD1-$9xg- zxBEcYwjXn|IiPqnB4vN%S)@vN^|UXx`uM}0Ok~)|yHr2C$b+i3R75}i=4OY###*#3 zaewtSNyqzA)40Puc>uc?SPMY{OjovF6~TYnM@7|Q0iO7Ef9Mwomg+FlgDqvNk~&%T z1Jc;{=k(~b02o$jx*jcxXk-#d*CB*S+%m$X2Qq$?)0G^m0${W%U3)=~ukSH$U@Ijk z5SB3z_iYl%T0}B939_+VGZL+`2ds{wa3bC)I+2LHes@Kn z6kJq1P%zQ&OHMLC%{Yu{g3o8F=^1z+U@2R99;5}O0PLh0CZpG!~ml-usg#)1rM?zRfYQGi` z>W0I|R2lrgGPwxcn8na3XgXn9MDy25#jpXnaVh}dT5c(h&tgJ6kZW9eSQTv+^EmD&(K@gwG%@D2Yzfmh=TY8e>z4lS*H7{-IJ{O* zl$%!8c`k26R5-3{T2_KjP#4O1N==~GatT+=9sfDrH2@sv%v%_AxQoX8;3`eGY_0b< z2*cJ7heguBUkgm54{pow+4obQV=FxPYX8TFJEW8qK7UrHmI~7tT8p6)UXLt zbY$J?Jo#xkbhef8T4u5}%b<6PZLkZJDpsraYStTcnDkQD*rPReMFH^;&h#srzAQg& z5~NT`1Y_K60#ex?&b|PU%&3G1sx(Wlp$eNegb11oW6@jzgmGB#dyQZbjxJTGI)0Db zm=8bh=Q<|tXFYDTzdl!=n68^h?L^szF=>U#9UM_Ag*R!KF zd~ZeaJ7&L#uI0;mFwIQ2Vu)6eW>j+GroHm8;^fLVDJ%X~_ks|&3I5CVMl7%GIfXzQ zi@FeFL~Wh&8Z1hR05~+q3F3fWb+r3pwUEa6wY+YVk8g4DAl ziYb3^2dUUFgB0mR$XKIWEB%r?4K9PZ%01BKXF<914M(T0h%8brzJKsd{lTb>cD7x#vU^X>sHDKIUG z>>yg`h-t0g@)OSLQ;(tICu!I;c7QYb`z_Mw(zeXT#z9YKM#7=KQoK zyo+J)jl<5Lx6YkisnLFK)?Ju${Zx9)!W$Y8i|;TlMJC0VPpqUOJoKpAtc;1Q9hB!O z^Z(73-DW^K(i(cEHhC+S&y%)X9LKSJ2f)hXu-M}kB5mR(Mx8ITJkZ7gtMl}^X%N7-UP5ahw8ZVT_Xv+~QX??(4{P)lwh zq*F4u$N;@$BPv{hzpoo69YaX@&i-#Pj==^i;f^|lis29~HEF^RKNFScm5p7o1f-p2Q>Ck0XpJBLQ|N^{j>e_M~_ zTi+ztw>%@tB%%`mH)@&t*w3Zn1Z}^=4YeK5Olnrnp5XQkCX{^tX;B6-5~_43RAz9y zDpl-17<28XJ`{?}euCJb0W#1;)&F$S%-i(&*hQUSF)ME&3R8%#qd_eb*w_v8FWLE>pvWqEC(xA%bjC+WZ@qe*pN3xew*9WMwOsLEnq=wA54H<~ z@_G8_xgoi=t!jH#I$Ytey;Q?)c5E&?ZB-^5w$3S3|6oxHuPsY@g7I7X{&2YZ#J{1o zuE(7X)>-_{{K~3*Sb^=B^yDBt)gB+`N}Z{Gplj?F@h|k^;YR$Y;IF1xU>L76YfTaW zY81nvhoE%;Tg5F%BOSQS$VG4fdld`yXWuj!(wayW(YPm&IcQz7fbzgk5_W9pAASJB zA)#VXL`q)hpw02Q%;U&duhCw32u60o8!n=94B~8fv@8Bk3LBak1RJqQVcZM>>!}Vo z5;FR#^E3Mzw_?G~#nxX-pICnQ`DcNrAmjD-f9ml4(@orKrE>r_b#w;N3ZNq?^X^l! z$~m3t`!)b_x9}kiAGL6oj3u1c>zfdJ^-Um>0m&W~qHg!Mo{IKsqu$G0Q^aEE6^bz2 zgZW3SLi%mTa0r`_aMzH$U3l+;?@Cy+skyet*gkvxYUVpuWRa3ce^s6cahy z6w^}51k;HtphXkGI-*s7EugJ6dB#AT%k18QdiN)^OojJ&D9#yGPNUv^PLk!3V+vM%8CYzP zZ*GdasdTE<)$$buuO%BAKDwa0Y3_*WoF(}6#a2bxJ}SqGz4%(`!l zBNyy{sP*z@5vv|PmI`=XY9C7o2u+z}OM#4gB1T`mPj5_Fm?1FfPnj%AQb9NoxRC_t z6b;0j6*F#x7Vm@JZrV8gl!Dm**a{tKJT(qSZz$J1yf);yk_y1Es`)$=$Ug=P{nehu za(MnX41v%Lxrl)>$$)JOQi=qX_po>sO;cWd`RCL=D(4e!T)VfM(tb;NC_9aR@W}NS zO~f)kZJ%V2N~8bb3DYd@4)Txtc@onj)vu9t}Y<;NOt z7N$D!->#-Ud(`*L$@PypZeDaMhpYjo370?}vr>w*ov`vRx=Debw|rZuNb1rjdz)P# zg;rjPsmq+W7qQ3-Fe>F-hXmQ!Hgq9}M$xDy#EX#j4*vJ5Fu*eEupuhA4g^nUH*BZx zE(xM3V0WX~f{(_ON^U!F=~LZe0t~F}076v$1KJ>!y0tkIfsXHkJ>Jh`UAoDSKGu}2 zo$ITwFEmuHfAw{%rNfcav%lCv+}I zUjF`jGjsW`Pm$0(V*x38AG&CMU(LK6=4VBG2eEf}p@Uk#mij)#5li5xSN)=XQ_sSC z-lqTXce5$~;<7ts0xx{Ag|j=HBxElif1m{ytG`8ccUj~vdbUSO_(g4>%2Stc()N_t zG!g%kuqMAhHYT1EKWUwq54E+C9>qSpM6lRHkN0UbOO8BeQ=CYcwDEjpwVe(^+L*=U zJlmNQ4@!de(5^`cxOhEwdwS}oM@TRN-Vu9X*m*$U|M-VMFJt!7ZJ)1^SmcL^a?w|4 zg0wRo<1ywcipASsEs-?PPOb9B)9B63=8Wx8 zi_rQ}W^~+ItyEI~fz%O4fOcu)o@>OgQqN=4FI6Yf3p~^b71=(P@0gmbJ_Y->RmqN3 z^-bO#8E+DRJ;@#xT$ZbaiT|a5w5f8IN}x3nb|M5#)U8Qr=$hpo#3lu~BWs5@MX&}w zOe;^kfGnikD7kB(%?@qd=G#Q46y~mC9CmA7vo>c|MIJ#*GR3_f3NXx4iPfUPbEqdn zq1S7b=X>b|(q70<;dhO5vb!Zu(UHx;26p5K5BRmCGqP)JG$GOk+g-?L*>%+^>-a6T zg?xM149DKcjmmlKzDIcEurLkdf%Y^vq6WY7$>*SiZ3b7v0-pv} zjo21n*6qP3RG=Gyj|78!Z#S{ zO}BOJi<**kGW$dGH_MBi_L}FX_k+)FPLbLa1HWJ=1v35yviF;w13`s4(&w3-;p)Kn ziOI|AG0tn3jB4zoZ0;wuc*s#(MP7uU<1*&hn^|-qIbWKi>724?hmS%)9caoMi;fJp zG&4V7d2nUA^UDrK3?wRshp$V-lCytPg}_f5K@rzQSC;5PyWZ`$K_Hv-{{23K!RqiV z)iaA8vTw(jgvO1Gkh_JD%RigxUOg9(%k5@JV32PU@7z3pPP|ge;nx1eczyt^Y1u4+Y&j2O{;(xXz`iVZ$FN3xBQ92!B3J~uWZz`j9d0!#p|%v3Fx3)E1Y?0qY@=P4OXY_nL7f%=_C_b| zzc8l&66D3{W(aNAwk56S2GixA$l$fNjz{aC1@bd=_a6-sxSFo-D!SE@vUTF^6w^hm z`QQ_kpK@`2cxUYQMGeX()-|_>68cUrF#Z%xj6G;OU>G~A+h}<|N?lXh`u8?fqY5$!Ursw$E3#rQsxRpzsr76M*n`(1Tv0 zpa!}u41n3um!w7Yf=PK^0IaV_Q+r;(Gll>Mh z4r74tDAh24$$@*05tffT$Y{Irw41wsSP8&!FZrajQV_sq&NJ1h{(T*}HN=OWWBKA^ z2ATiS!XEhqva>$ao*HC}$6wz&e`w#?>tIs-S@Vpdv$`Kf2TBlZ?fUE#9~d(vzf@}Y z&6L<4`tVU+S-j50x9!Qu>6Zs@w?F#B-?tfAFyu_fm32AI;Wn_RG_GBv{{&6EDh>ZP z^wzaVr{Noih{zq4?K5lrpR(nypVs}W{critV-4X+SWkIOm+7Z!zQSz&qK2DjZ>zw} zRL?19bRmKW*MOI{-{-zJKFzl@;hoi(EqN0?ns~W#g6#j+z`(&5a=Y*c$VL0~#qY+M zH?rnwQ5i>rjS(=xiZ75cAVE9=!8m}^hPeof6*@)ygQ}vDvYDN>MI`UEl|cL(q9qZO z1(7Dn=rzVkKoXacP1IF2e7u(YdNg#bI&0HcQ<9WHsnW2ycl2k$j_~zgQ~su*6X-iM zvy_&3)#)F+d6|a4{!RaVPcmQm`L{S0Ccr}0bL-?w)H(MvJGjm}Yp*{#$5^KR#IMq!;2M?iOkrrm!543a~?hyBR(R{-R`nY^m-@6t2rfWi(Kl`!p9`j zt+y2jB0Uz(*qIz~NsKz$0DYAyHiVNL51Qv%*VFZecQ|@F2i)1hMTGcZTC0yi4#^a5 z%-icwSsz&!2kg0K{FG8(8@o;#G+aHlpW<}W!_+3fe=qOML!PVqAzGftniv0G3qhnx zU(;+5sXL*IFgM;t944O@7?1z1+5N7%an^fT_4kWg#Ppf_ZdbiayXbfRZ~waFqvyLr z`f8tSoHN$%emlN6vuG`@-ue~_U0XUPPlR6?Jtj87a_-$|HZy8i{SAUf#Abi&3!Om7 z1-?Ui?ekHb&-VmnvJ$NOPsuz6Daf?zd`@-(vO5=^#RiBUuLJY%cr2E$darg0)xE$N z25boI3Rwr~_=xPsh2xW<+C5Ro!b5ACk>-{bi}m|gaw(G2SB}L6hg*aE;h8xCyU6y! zM|Z`NmxrsIcAGL(@TJxB-(Z+;TBsuyYNQ?Ag<=({V&c2W?KB7q320-6J`g-A)cSI+^Xr$s3~ zrs_I}0`@7Kk`o)+$_(uU{lHS9-+Fx$R|I@NYHji2bmvp0C76 zuJra6%9zLrKvhb({1R%9|LQ!+yY|W8t2$6bD-MjehR|Wan*PPc7+Gllp5q@fluiuc z@@3ECqvFv%j*TJ6;hYJ(r5zX=p~ZDqX<57X62#7Px-0`>@exzrrT}o^8VCJhR03FhiJ4I68;rD*`OV|WCT$wRFH#{!} zOMatwuRN6jgnmXB;ENtsgYNOGFd#y;Q-L7@HpJ0}5_Zp(MtbfCL6fi?UI~3ZcN)Qh zS&WH2YONoW{PDjpn;W7UI(*awMH~oZNP*G*Tz}B*dPTsjZ+oaBLw!kWAzX*0$v=w+ zuHbK=ey|thxoA;_Y`pkX>@`_;DeS6Q$p#0Wo`!R=92x%Ddoh*uE|tKU!)p@etT`$C zZURK3(DdkU?|VbGrh6b7XqfKMHt(J(gAn$k`}HQEy#|6a?-_NbEY|TcFEU_MaC84j zVu(%k>3tRy-VD2YadFj#4W~hU0BHUxiM%ZP#CEXz9a>l&BML<={i;KBTJN_Opz~*Z zg^%IA@MS^?p6qkc-s!S|Aj@~I*0?&}ne?kqV18zxox0XA*hy&MQymiKnp$4)NZeyLy`q#%LP!9irG!uRo@ z!)^aS7*^V4C;2AO+G8+SYj@7#Hmx?<9>i!>c>z zm93}Qd3xywvJy37*buB*{|^RucaaeWWjWR|^@CR`mnM9^i#qCOi>cgmL%d+dmO3W& z7byv5@#|^fOqrFv4Cz}B-(q>#x}!)B7seo&~%lmq2Hgm zKbs+=IX|3&O_A$2I0Z=)WG15?MVH8D>E%dxLdD#|zbka<59*-GHk$KG-uU#~-4OTddhT6W$@YZZ6iHyRV}D%_jo_CyGTA0gtEj8wcQ@ zLLJ~F=|00HkkkSpY!wC5O;uKgiCX? z4*}uqg-uil)AN3&kAQm)Hsl(tfdqnV)K2B>Ts;aKme>^)qLG;+Qnp zU|Q$NuCs0PE~F43yqjVrsdnGP(A=U;JZBZajAUeo+mP`(3?YSp3%m2|04R)(|Gx0O z(~WP^bSMl!>97NRf-JhzK*)0Ls){@c{fH`?u9(MY?$2tI>8b`tJqfT_*5({!`)fp@ za9&SL1QE>KR7#e9`R+z%YzyV_7$xZ4B=Wxk6S_@|+3!OwH6@bAb093|^}_&Z8)(8d>HPIL?Y6-sk>h?*!*`2gu@8MwL-FInWk^Vfy^%)IN1chk4G(DEWru#fP#b4hS0{_d{2&;+@zgF3j5b_mk_~==Yw};Y(pyLaMc~$)Zb3RC(3J5p zEZrY}XvWwmfQ5cdGsPL(R=NIE1m0o66)O&ug3v$u{*V1sBU>Yyh(DSzJ)gNho(EJ| zIEo1GgCXMF78))fE%P*63-OcYzrvRM3kM@g4-fMI#6%4gz3BF7fK^bEkmrp9>1K*| zuwrPGS{23Rzz5{G4PIF6z2b<+Cugip7X>{*_(uAOkkdOCB$$5A3*U+h3QeiM$L0hf zJRFPKXz_Gjej<~TT<%M{ZOEvAzQjQe>0MYz!4<+Ert$8`DbdWCjuXKQb?Q$y&T;;$ z$xk$Zl#G&mZxKCT2N(!q+ZRoGWxm=Mr%0X-fG&AezW?7xfSnG2Az)+X+Klp^A!xX0Xaq$+irfFBLrnOCA+{l#AF+=z zuOF`UY4`EZ^t^>EUwvQ&I!Pw{w^G&z4Umyym=*7nvWH|ScqD`*E~q;qLSH4Fa@#H! zwL}a2%Gdr*(1@v;7A*9$5df-uOIa#b=Q?$VC*=8H3=isnlQ#pl%@oSbg#1gC)nEzlR*oN61qN_M_YS z&?sZUF!%UqBo`!?W1pU1shz=r_>1n-cI+mfz&QA~T_FseRh>%!-cVT)_B_61P)+ z2K{q((2$pl>k#pNm1ftrGpQW0y)+nn2mX*Oc(uCy;NWmMeq(#N09b|a;kK(Ail2-tE^iJcige_`V3(9!OlLrPpVCt&-C z9xGt;z4GDxNBOZ-#!Z2gc`tL@;O<|u>%smz87dAc_Ps7X(^C|%?WEYJHwYfN@9uTx zeuFpzt-ha27JZbMC4V&If$@Pd-F5d_`RJ}QDMzmeVE^iD0u)>g6EXclIG>^2qVSm@Qg|!@pH1HT?z2JE-M;7L7+>Gov*fHFY~D})z97BaMD<61ubG?SeRy6! zaAZMhQvV%GgVvmw|2lv+bv@Y3ejwk-3*MMHsIYwYuu9BTd zD9?A+@^bDM{TlW8%Ph5h75i1)b!0O)T}5u2Ns zuj+yokKKipI!jMlpPGu#Yo+J!ttSO`bQ~+l2k~F5z@UZ^EbkVsf%uo|HY1I*`{lZO zzD%2YGcGHoAE&Fp`im0!dbClqepJ?%+|jQ&&Y$sZ*9+?k~J*#e698yUSxv^U~j{#VVEB+#DwwwB6U zx9y6qdz=%Fn!F1Rt?`$Ff8<{wRbezR=WS}J+w;DCXVcik4jLW=%Og>qkAmHU$o2-q zNc{2<%!4JYh?UCZ?R8dYpObUy{-%1b%fL-y|{4x>X!#d57|;+{Jk{D3lCgySFv4JSbu|?V$S->#H1r3OUeRQLf(2V-8w)4qxa;b zhhSPUdAW=C9AsO2TjM#$987**)>rLs$6zxRNHVG>wdMD|w&gm_ecAdi*%>GQ^1^h< z%%*JOgixB)P^zSf63J*z$+@eaK+do})T=x9`YHdTfMxM_p~wbr)n?Z28qL%2Uq4+z9mFbOnH0QQ6mPUmo^lz%yWq4h_tK_YYaRQa!9 zJE<&%8OA^5ERTy-yjDw!KNXkbLcH+uA46&jZaRU(@v_p;nDx6na5)%qUW*@JZ4*3Q@bX4sqJ~!d>`G(fCrVP!wo^fQkow3Orj+iWGaTi9_dZ4-%#rEVCtS%$ za}S#==}W{=Fb(x(Ic5P$Ibt6C?K0{K?!r0e0wbVaucWapXpDS}+Dla+7FaFXBNR$g z`Mntuily)E`d;%#b!2DA0#nvF@W~Secjq(|T;I%zeS2zFD$Y;_V-T>WUJcv*oJus9 z75bsF-s^$vz*N_l>(=QAPwR&-zbJ(KS(|$B+gx>*4L5k@$>8rb?yjKxSw}BpbE>i) zH%}m5R`^5XV$cM(4Q-~^K$gxY!SaATj-}~gDo?9_(gbe{<3Dw(OyJ1`OyK{ju5Z{n`md^E})%=g)-7(`Pilq4hg>LNd}!SGc&w94A(r`UxY|(C>lp)8c8{~C83Xli*R|#xK_@0HxJz?@>#y8s z%Dc;b>4U+xNw`#I7iXI&8r{v_h0DXR>KBMDld$zY`O|Y;iz1S4YLi&|lU{;@KA4es z_i)4todtnlvWFv<1sj&oZ*kY^44r-55{DV|_z6XA_qt>)1)BHfgL4FHrq63mC$7QdBR{xV!JuHq|N*wp3DS_hh5>ThHps@Hc6 zGg&@U<>TjhdT4JXp_-MT-C?}Yy+odD-gz)C5^(m}Fn1WM$LysDrAuYfHD5G2hNn2z z%pl%$#&R(vy0yDWVyRCcL(s>Ij#)}HDU{vXw%@ppX!I_0Ffo zn3H+%-~p!ezjgjNb9Z2Y@+=M||L6UKeY;A{*^lwBUc9Y$^J6ZCkL(fcv%*$%6yc^4 z4`Kx7i?LS$?#ky87v)iDxaV1Mv90)#0ae+ZdG}yl`&ayg)s=6nA=h8tkzJ&{x`lEDECZ8KA&VNKKp#2QYoLqcHCd82dGaq}!&oy@XH{7`fWeUa^2lxMgQPBu}XVfp`B_KjDsO^$9iN?H}CgFSZ6K$Dkh7I(p`5bX{AeP1F$l3I% zdHnpvGX6E~f&+0|9LI)!N5FBu^>Bi4Q#Uoma1&K#D5GlIF|XBtF)G99e*=&Ib`@Xv zMivJ$^cK=@Q?)L#GcF*IzQoF9S?L_(m8(3bLPmwAC(?#~cAd9Z}=ku~&xrA$;Y@a0?lypG=JB1J0SK?mE89?b*L2E&JGi-)U3nRdEH zdo7vG256f?!}c4t-44ft1}~aCaqvgzag$4}UWmM8Ei;DGIfmF{^j0n)lp4o9nMv$V zkKutwFXQoFm+-rnfs2cE&p-^{s2Im>7C~sRo4;^8rAE`R1^VM1Q+zvX}X2|wrgS17%V3}A)U}%jf z(RL{c2HJ6pFtl>uZbH!Djem$dB9{~(?U%gMVnL4u&0VxPhKJbUzTGXA;T1ZxM>lcJLmB?7KI*OuH=_dKoVCasacG z*c5}hAUHG#-zo-o69k3{5zUq5%>x&=H2CTrpMlg2J~A?i&pdJw4}Sf1+dlo&=_Q7Nyh64{@!@kTc_Ar*wrVBMfWWBo}w4;&l&ioRL ztME}|eC!ZUobgg3YtXsw`z0V9bg<2k?R6)n(Ur^^bnc1MMrEtCSvTNqZQp^R+wHs^ zF5kQfLXaW2-irvwXG{q8e{}($IzF)+*epSUY&sT7UoD?^6B(yvNw~|0suhUIX nm{8N)fuaC+U%YSMx(xge1{igg#Njae00000NkvXXu0mjfsnG#X literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/384_304.jpg b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/384_304.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff08e4218ed4efe1eee16ce46440e2b17984a22d GIT binary patch literal 28353 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 literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/384_304_02.jpg b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/384_304_02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d10ebec6d89f7573b4e827461dcdb4b3750c12d2 GIT binary patch literal 23728 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

{*O9?It^nDc#-G*G^F$BCH2(l1pT3Kt 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 Dmd~V@ literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/bootstrap/css/bootstrap.min.css b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/bootstrap/css/bootstrap.min.css new file mode 100644 index 0000000..c547283 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/bootstrap/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10px;margin-bottom:10px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-primary:hover{color:#3071a9}.text-warning{color:#8a6d3b}.text-warning:hover{color:#66512c}.text-danger{color:#a94442}.text-danger:hover{color:#843534}.text-success{color:#3c763d}.text-success:hover{color:#2b542c}.text-info{color:#31708f}.text-info:hover{color:#245269}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#dff0d8}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#d0e9c6}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#f2dede}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#ebcccc}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#faf2cc}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:7px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#fff}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/bootstrap/js/bootstrap.min.js b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/bootstrap/js/bootstrap.min.js new file mode 100644 index 0000000..1a6258e --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('

'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.common.js b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.common.js new file mode 100644 index 0000000..f0659fd --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.common.js @@ -0,0 +1,3757 @@ +/*! + * Cropper v4.0.0 + * https://github.com/fengyuanchen/cropper + * + * Copyright (c) 2014-2018 Chen Fengyuan + * Released under the MIT license + * + * Date: 2018-04-01T06:27:27.267Z + */ + +'use strict'; + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var $ = _interopDefault(require('jquery')); + +var IN_BROWSER = typeof window !== 'undefined'; +var WINDOW = IN_BROWSER ? window : {}; +var NAMESPACE = 'cropper'; + +// Actions +var ACTION_ALL = 'all'; +var ACTION_CROP = 'crop'; +var ACTION_MOVE = 'move'; +var ACTION_ZOOM = 'zoom'; +var ACTION_EAST = 'e'; +var ACTION_WEST = 'w'; +var ACTION_SOUTH = 's'; +var ACTION_NORTH = 'n'; +var ACTION_NORTH_EAST = 'ne'; +var ACTION_NORTH_WEST = 'nw'; +var ACTION_SOUTH_EAST = 'se'; +var ACTION_SOUTH_WEST = 'sw'; + +// Classes +var CLASS_CROP = NAMESPACE + '-crop'; +var CLASS_DISABLED = NAMESPACE + '-disabled'; +var CLASS_HIDDEN = NAMESPACE + '-hidden'; +var CLASS_HIDE = NAMESPACE + '-hide'; +var CLASS_INVISIBLE = NAMESPACE + '-invisible'; +var CLASS_MODAL = NAMESPACE + '-modal'; +var CLASS_MOVE = NAMESPACE + '-move'; + +// Data keys +var DATA_ACTION = 'action'; +var DATA_PREVIEW = 'preview'; + +// Drag modes +var DRAG_MODE_CROP = 'crop'; +var DRAG_MODE_MOVE = 'move'; +var DRAG_MODE_NONE = 'none'; + +// Events +var EVENT_CROP = 'crop'; +var EVENT_CROP_END = 'cropend'; +var EVENT_CROP_MOVE = 'cropmove'; +var EVENT_CROP_START = 'cropstart'; +var EVENT_DBLCLICK = 'dblclick'; +var EVENT_LOAD = 'load'; +var EVENT_POINTER_DOWN = WINDOW.PointerEvent ? 'pointerdown' : 'touchstart mousedown'; +var EVENT_POINTER_MOVE = WINDOW.PointerEvent ? 'pointermove' : 'touchmove mousemove'; +var EVENT_POINTER_UP = WINDOW.PointerEvent ? 'pointerup pointercancel' : 'touchend touchcancel mouseup'; +var EVENT_READY = 'ready'; +var EVENT_RESIZE = 'resize'; +var EVENT_WHEEL = 'wheel mousewheel DOMMouseScroll'; +var EVENT_ZOOM = 'zoom'; + +// RegExps +var REGEXP_ACTIONS = /^(?:e|w|s|n|se|sw|ne|nw|all|crop|move|zoom)$/; +var REGEXP_DATA_URL = /^data:/; +var REGEXP_DATA_URL_JPEG = /^data:image\/jpeg;base64,/; +var REGEXP_TAG_NAME = /^(?:img|canvas)$/i; + +var DEFAULTS = { + // Define the view mode of the cropper + viewMode: 0, // 0, 1, 2, 3 + + // Define the dragging mode of the cropper + dragMode: DRAG_MODE_CROP, // 'crop', 'move' or 'none' + + // Define the aspect ratio of the crop box + aspectRatio: NaN, + + // An object with the previous cropping result data + data: null, + + // A selector for adding extra containers to preview + preview: '', + + // Re-render the cropper when resize the window + responsive: true, + + // Restore the cropped area after resize the window + restore: true, + + // Check if the current image is a cross-origin image + checkCrossOrigin: true, + + // Check the current image's Exif Orientation information + checkOrientation: true, + + // Show the black modal + modal: true, + + // Show the dashed lines for guiding + guides: true, + + // Show the center indicator for guiding + center: true, + + // Show the white modal to highlight the crop box + highlight: true, + + // Show the grid background + background: true, + + // Enable to crop the image automatically when initialize + autoCrop: true, + + // Define the percentage of automatic cropping area when initializes + autoCropArea: 0.8, + + // Enable to move the image + movable: true, + + // Enable to rotate the image + rotatable: true, + + // Enable to scale the image + scalable: true, + + // Enable to zoom the image + zoomable: true, + + // Enable to zoom the image by dragging touch + zoomOnTouch: true, + + // Enable to zoom the image by wheeling mouse + zoomOnWheel: true, + + // Define zoom ratio when zoom the image by wheeling mouse + wheelZoomRatio: 0.1, + + // Enable to move the crop box + cropBoxMovable: true, + + // Enable to resize the crop box + cropBoxResizable: true, + + // Toggle drag mode between "crop" and "move" when click twice on the cropper + toggleDragModeOnDblclick: true, + + // Size limitation + minCanvasWidth: 0, + minCanvasHeight: 0, + minCropBoxWidth: 0, + minCropBoxHeight: 0, + minContainerWidth: 200, + minContainerHeight: 100, + + // Shortcuts of events + ready: null, + cropstart: null, + cropmove: null, + cropend: null, + crop: null, + zoom: null +}; + +var TEMPLATE = '
' + '
' + '
' + '
' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
'; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + +var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } +}; + +/** + * Check if the given value is not a number. + */ +var isNaN = Number.isNaN || WINDOW.isNaN; + +/** + * Check if the given value is a number. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a number, else `false`. + */ +function isNumber(value) { + return typeof value === 'number' && !isNaN(value); +} + +/** + * Check if the given value is undefined. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is undefined, else `false`. + */ +function isUndefined(value) { + return typeof value === 'undefined'; +} + +/** + * Check if the given value is an object. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is an object, else `false`. + */ +function isObject(value) { + return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value !== null; +} + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * Check if the given value is a plain object. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a plain object, else `false`. + */ + +function isPlainObject(value) { + if (!isObject(value)) { + return false; + } + + try { + var _constructor = value.constructor; + var prototype = _constructor.prototype; + + + return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf'); + } catch (e) { + return false; + } +} + +/** + * Check if the given value is a function. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a function, else `false`. + */ +function isFunction(value) { + return typeof value === 'function'; +} + +/** + * Iterate the given data. + * @param {*} data - The data to iterate. + * @param {Function} callback - The process function for each element. + * @returns {*} The original data. + */ +function forEach(data, callback) { + if (data && isFunction(callback)) { + if (Array.isArray(data) || isNumber(data.length) /* array-like */) { + var length = data.length; + + var i = void 0; + + for (i = 0; i < length; i += 1) { + if (callback.call(data, data[i], i, data) === false) { + break; + } + } + } else if (isObject(data)) { + Object.keys(data).forEach(function (key) { + callback.call(data, data[key], key, data); + }); + } + } + + return data; +} + +/** + * Extend the given object. + * @param {*} obj - The object to be extended. + * @param {*} args - The rest objects which will be merged to the first object. + * @returns {Object} The extended object. + */ +var assign = Object.assign || function assign(obj) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (isObject(obj) && args.length > 0) { + args.forEach(function (arg) { + if (isObject(arg)) { + Object.keys(arg).forEach(function (key) { + obj[key] = arg[key]; + }); + } + }); + } + + return obj; +}; + +var REGEXP_DECIMALS = /\.\d*(?:0|9){12}\d*$/i; + +/** + * Normalize decimal number. + * Check out {@link http://0.30000000000000004.com/} + * @param {number} value - The value to normalize. + * @param {number} [times=100000000000] - The times for normalizing. + * @returns {number} Returns the normalized number. + */ +function normalizeDecimalNumber(value) { + var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000; + + return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value; +} + +var REGEXP_SUFFIX = /^(?:width|height|left|top|marginLeft|marginTop)$/; + +/** + * Apply styles to the given element. + * @param {Element} element - The target element. + * @param {Object} styles - The styles for applying. + */ +function setStyle(element, styles) { + var style = element.style; + + + forEach(styles, function (value, property) { + if (REGEXP_SUFFIX.test(property) && isNumber(value)) { + value += 'px'; + } + + style[property] = value; + }); +} + +/** + * Check if the given element has a special class. + * @param {Element} element - The element to check. + * @param {string} value - The class to search. + * @returns {boolean} Returns `true` if the special class was found. + */ +function hasClass(element, value) { + return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1; +} + +/** + * Add classes to the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be added. + */ +function addClass(element, value) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + addClass(elem, value); + }); + return; + } + + if (element.classList) { + element.classList.add(value); + return; + } + + var className = element.className.trim(); + + if (!className) { + element.className = value; + } else if (className.indexOf(value) < 0) { + element.className = className + ' ' + value; + } +} + +/** + * Remove classes from the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be removed. + */ +function removeClass(element, value) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + removeClass(elem, value); + }); + return; + } + + if (element.classList) { + element.classList.remove(value); + return; + } + + if (element.className.indexOf(value) >= 0) { + element.className = element.className.replace(value, ''); + } +} + +/** + * Add or remove classes from the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be toggled. + * @param {boolean} added - Add only. + */ +function toggleClass(element, value, added) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + toggleClass(elem, value, added); + }); + return; + } + + // IE10-11 doesn't support the second parameter of `classList.toggle` + if (added) { + addClass(element, value); + } else { + removeClass(element, value); + } +} + +var REGEXP_HYPHENATE = /([a-z\d])([A-Z])/g; + +/** + * Transform the given string from camelCase to kebab-case + * @param {string} value - The value to transform. + * @returns {string} The transformed value. + */ +function hyphenate(value) { + return value.replace(REGEXP_HYPHENATE, '$1-$2').toLowerCase(); +} + +/** + * Get data from the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to get. + * @returns {string} The data value. + */ +function getData(element, name) { + if (isObject(element[name])) { + return element[name]; + } else if (element.dataset) { + return element.dataset[name]; + } + + return element.getAttribute('data-' + hyphenate(name)); +} + +/** + * Set data to the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to set. + * @param {string} data - The data value. + */ +function setData(element, name, data) { + if (isObject(data)) { + element[name] = data; + } else if (element.dataset) { + element.dataset[name] = data; + } else { + element.setAttribute('data-' + hyphenate(name), data); + } +} + +/** + * Remove data from the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to remove. + */ +function removeData(element, name) { + if (isObject(element[name])) { + try { + delete element[name]; + } catch (e) { + element[name] = undefined; + } + } else if (element.dataset) { + // #128 Safari not allows to delete dataset property + try { + delete element.dataset[name]; + } catch (e) { + element.dataset[name] = undefined; + } + } else { + element.removeAttribute('data-' + hyphenate(name)); + } +} + +var REGEXP_SPACES = /\s\s*/; +var onceSupported = function () { + var supported = false; + + if (IN_BROWSER) { + var once = false; + var listener = function listener() {}; + var options = Object.defineProperty({}, 'once', { + get: function get$$1() { + supported = true; + return once; + }, + + + /** + * This setter can fix a `TypeError` in strict mode + * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only} + * @param {boolean} value - The value to set + */ + set: function set$$1(value) { + once = value; + } + }); + + WINDOW.addEventListener('test', listener, options); + WINDOW.removeEventListener('test', listener, options); + } + + return supported; +}(); + +/** + * Remove event listener from the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Function} listener - The event listener. + * @param {Object} options - The event options. + */ +function removeListener(element, type, listener) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + var handler = listener; + + type.trim().split(REGEXP_SPACES).forEach(function (event) { + if (!onceSupported) { + var listeners = element.listeners; + + + if (listeners && listeners[event] && listeners[event][listener]) { + handler = listeners[event][listener]; + delete listeners[event][listener]; + + if (Object.keys(listeners[event]).length === 0) { + delete listeners[event]; + } + + if (Object.keys(listeners).length === 0) { + delete element.listeners; + } + } + } + + element.removeEventListener(event, handler, options); + }); +} + +/** + * Add event listener to the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Function} listener - The event listener. + * @param {Object} options - The event options. + */ +function addListener(element, type, listener) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + var _handler = listener; + + type.trim().split(REGEXP_SPACES).forEach(function (event) { + if (options.once && !onceSupported) { + var _element$listeners = element.listeners, + listeners = _element$listeners === undefined ? {} : _element$listeners; + + + _handler = function handler() { + for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + delete listeners[event][listener]; + element.removeEventListener(event, _handler, options); + listener.apply(element, args); + }; + + if (!listeners[event]) { + listeners[event] = {}; + } + + if (listeners[event][listener]) { + element.removeEventListener(event, listeners[event][listener], options); + } + + listeners[event][listener] = _handler; + element.listeners = listeners; + } + + element.addEventListener(event, _handler, options); + }); +} + +/** + * Dispatch event on the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Object} data - The additional event data. + * @returns {boolean} Indicate if the event is default prevented or not. + */ +function dispatchEvent(element, type, data) { + var event = void 0; + + // Event and CustomEvent on IE9-11 are global objects, not constructors + if (isFunction(Event) && isFunction(CustomEvent)) { + event = new CustomEvent(type, { + detail: data, + bubbles: true, + cancelable: true + }); + } else { + event = document.createEvent('CustomEvent'); + event.initCustomEvent(type, true, true, data); + } + + return element.dispatchEvent(event); +} + +/** + * Get the offset base on the document. + * @param {Element} element - The target element. + * @returns {Object} The offset data. + */ +function getOffset(element) { + var box = element.getBoundingClientRect(); + + return { + left: box.left + (window.pageXOffset - document.documentElement.clientLeft), + top: box.top + (window.pageYOffset - document.documentElement.clientTop) + }; +} + +var location = WINDOW.location; + +var REGEXP_ORIGINS = /^(https?:)\/\/([^:/?#]+):?(\d*)/i; + +/** + * Check if the given URL is a cross origin URL. + * @param {string} url - The target URL. + * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`. + */ +function isCrossOriginURL(url) { + var parts = url.match(REGEXP_ORIGINS); + + return parts && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port); +} + +/** + * Add timestamp to the given URL. + * @param {string} url - The target URL. + * @returns {string} The result URL. + */ +function addTimestamp(url) { + var timestamp = 'timestamp=' + new Date().getTime(); + + return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp; +} + +/** + * Get transforms base on the given object. + * @param {Object} obj - The target object. + * @returns {string} A string contains transform values. + */ +function getTransforms(_ref) { + var rotate = _ref.rotate, + scaleX = _ref.scaleX, + scaleY = _ref.scaleY, + translateX = _ref.translateX, + translateY = _ref.translateY; + + var values = []; + + if (isNumber(translateX) && translateX !== 0) { + values.push('translateX(' + translateX + 'px)'); + } + + if (isNumber(translateY) && translateY !== 0) { + values.push('translateY(' + translateY + 'px)'); + } + + // Rotate should come first before scale to match orientation transform + if (isNumber(rotate) && rotate !== 0) { + values.push('rotate(' + rotate + 'deg)'); + } + + if (isNumber(scaleX) && scaleX !== 1) { + values.push('scaleX(' + scaleX + ')'); + } + + if (isNumber(scaleY) && scaleY !== 1) { + values.push('scaleY(' + scaleY + ')'); + } + + var transform = values.length ? values.join(' ') : 'none'; + + return { + WebkitTransform: transform, + msTransform: transform, + transform: transform + }; +} + +/** + * Get the max ratio of a group of pointers. + * @param {string} pointers - The target pointers. + * @returns {number} The result ratio. + */ +function getMaxZoomRatio(pointers) { + var pointers2 = assign({}, pointers); + var ratios = []; + + forEach(pointers, function (pointer, pointerId) { + delete pointers2[pointerId]; + + forEach(pointers2, function (pointer2) { + var x1 = Math.abs(pointer.startX - pointer2.startX); + var y1 = Math.abs(pointer.startY - pointer2.startY); + var x2 = Math.abs(pointer.endX - pointer2.endX); + var y2 = Math.abs(pointer.endY - pointer2.endY); + var z1 = Math.sqrt(x1 * x1 + y1 * y1); + var z2 = Math.sqrt(x2 * x2 + y2 * y2); + var ratio = (z2 - z1) / z1; + + ratios.push(ratio); + }); + }); + + ratios.sort(function (a, b) { + return Math.abs(a) < Math.abs(b); + }); + + return ratios[0]; +} + +/** + * Get a pointer from an event object. + * @param {Object} event - The target event object. + * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not. + * @returns {Object} The result pointer contains start and/or end point coordinates. + */ +function getPointer(_ref2, endOnly) { + var pageX = _ref2.pageX, + pageY = _ref2.pageY; + + var end = { + endX: pageX, + endY: pageY + }; + + return endOnly ? end : assign({ + startX: pageX, + startY: pageY + }, end); +} + +/** + * Get the center point coordinate of a group of pointers. + * @param {Object} pointers - The target pointers. + * @returns {Object} The center point coordinate. + */ +function getPointersCenter(pointers) { + var pageX = 0; + var pageY = 0; + var count = 0; + + forEach(pointers, function (_ref3) { + var startX = _ref3.startX, + startY = _ref3.startY; + + pageX += startX; + pageY += startY; + count += 1; + }); + + pageX /= count; + pageY /= count; + + return { + pageX: pageX, + pageY: pageY + }; +} + +/** + * Check if the given value is a finite number. + */ +var isFinite = Number.isFinite || WINDOW.isFinite; + +/** + * Get the max sizes in a rectangle under the given aspect ratio. + * @param {Object} data - The original sizes. + * @param {string} [type='contain'] - The adjust type. + * @returns {Object} The result sizes. + */ +function getAdjustedSizes(_ref4) // or 'cover' +{ + var aspectRatio = _ref4.aspectRatio, + height = _ref4.height, + width = _ref4.width; + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain'; + + var isValidNumber = function isValidNumber(value) { + return isFinite(value) && value > 0; + }; + + if (isValidNumber(width) && isValidNumber(height)) { + var adjustedWidth = height * aspectRatio; + + if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) { + height = width / aspectRatio; + } else { + width = height * aspectRatio; + } + } else if (isValidNumber(width)) { + height = width / aspectRatio; + } else if (isValidNumber(height)) { + width = height * aspectRatio; + } + + return { + width: width, + height: height + }; +} + +/** + * Get the new sizes of a rectangle after rotated. + * @param {Object} data - The original sizes. + * @returns {Object} The result sizes. + */ +function getRotatedSizes(_ref5) { + var width = _ref5.width, + height = _ref5.height, + degree = _ref5.degree; + + degree = Math.abs(degree) % 180; + + if (degree === 90) { + return { + width: height, + height: width + }; + } + + var arc = degree % 90 * Math.PI / 180; + var sinArc = Math.sin(arc); + var cosArc = Math.cos(arc); + var newWidth = width * cosArc + height * sinArc; + var newHeight = width * sinArc + height * cosArc; + + return degree > 90 ? { + width: newHeight, + height: newWidth + } : { + width: newWidth, + height: newHeight + }; +} + +/** + * Get a canvas which drew the given image. + * @param {HTMLImageElement} image - The image for drawing. + * @param {Object} imageData - The image data. + * @param {Object} canvasData - The canvas data. + * @param {Object} options - The options. + * @returns {HTMLCanvasElement} The result canvas. + */ +function getSourceCanvas(image, _ref6, _ref7, _ref8) { + var imageAspectRatio = _ref6.aspectRatio, + imageNaturalWidth = _ref6.naturalWidth, + imageNaturalHeight = _ref6.naturalHeight, + _ref6$rotate = _ref6.rotate, + rotate = _ref6$rotate === undefined ? 0 : _ref6$rotate, + _ref6$scaleX = _ref6.scaleX, + scaleX = _ref6$scaleX === undefined ? 1 : _ref6$scaleX, + _ref6$scaleY = _ref6.scaleY, + scaleY = _ref6$scaleY === undefined ? 1 : _ref6$scaleY; + var aspectRatio = _ref7.aspectRatio, + naturalWidth = _ref7.naturalWidth, + naturalHeight = _ref7.naturalHeight; + var _ref8$fillColor = _ref8.fillColor, + fillColor = _ref8$fillColor === undefined ? 'transparent' : _ref8$fillColor, + _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled, + imageSmoothingEnabled = _ref8$imageSmoothingE === undefined ? true : _ref8$imageSmoothingE, + _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality, + imageSmoothingQuality = _ref8$imageSmoothingQ === undefined ? 'low' : _ref8$imageSmoothingQ, + _ref8$maxWidth = _ref8.maxWidth, + maxWidth = _ref8$maxWidth === undefined ? Infinity : _ref8$maxWidth, + _ref8$maxHeight = _ref8.maxHeight, + maxHeight = _ref8$maxHeight === undefined ? Infinity : _ref8$maxHeight, + _ref8$minWidth = _ref8.minWidth, + minWidth = _ref8$minWidth === undefined ? 0 : _ref8$minWidth, + _ref8$minHeight = _ref8.minHeight, + minHeight = _ref8$minHeight === undefined ? 0 : _ref8$minHeight; + + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + var maxSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: maxWidth, + height: maxHeight + }); + var minSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: minWidth, + height: minHeight + }, 'cover'); + var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth)); + var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight)); + + // Note: should always use image's natural sizes for drawing as + // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90 + var destMaxSizes = getAdjustedSizes({ + aspectRatio: imageAspectRatio, + width: maxWidth, + height: maxHeight + }); + var destMinSizes = getAdjustedSizes({ + aspectRatio: imageAspectRatio, + width: minWidth, + height: minHeight + }, 'cover'); + var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth)); + var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight)); + var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight]; + + canvas.width = normalizeDecimalNumber(width); + canvas.height = normalizeDecimalNumber(height); + context.fillStyle = fillColor; + context.fillRect(0, 0, width, height); + context.save(); + context.translate(width / 2, height / 2); + context.rotate(rotate * Math.PI / 180); + context.scale(scaleX, scaleY); + context.imageSmoothingEnabled = imageSmoothingEnabled; + context.imageSmoothingQuality = imageSmoothingQuality; + context.drawImage.apply(context, [image].concat(toConsumableArray(params.map(function (param) { + return Math.floor(normalizeDecimalNumber(param)); + })))); + context.restore(); + return canvas; +} + +var fromCharCode = String.fromCharCode; + +/** + * Get string from char code in data view. + * @param {DataView} dataView - The data view for read. + * @param {number} start - The start index. + * @param {number} length - The read length. + * @returns {string} The read result. + */ + +function getStringFromCharCode(dataView, start, length) { + var str = ''; + var i = void 0; + + length += start; + + for (i = start; i < length; i += 1) { + str += fromCharCode(dataView.getUint8(i)); + } + + return str; +} + +var REGEXP_DATA_URL_HEAD = /^data:.*,/; + +/** + * Transform Data URL to array buffer. + * @param {string} dataURL - The Data URL to transform. + * @returns {ArrayBuffer} The result array buffer. + */ +function dataURLToArrayBuffer(dataURL) { + var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, ''); + var binary = atob(base64); + var arrayBuffer = new ArrayBuffer(binary.length); + var uint8 = new Uint8Array(arrayBuffer); + + forEach(uint8, function (value, i) { + uint8[i] = binary.charCodeAt(i); + }); + + return arrayBuffer; +} + +/** + * Transform array buffer to Data URL. + * @param {ArrayBuffer} arrayBuffer - The array buffer to transform. + * @param {string} mimeType - The mime type of the Data URL. + * @returns {string} The result Data URL. + */ +function arrayBufferToDataURL(arrayBuffer, mimeType) { + var uint8 = new Uint8Array(arrayBuffer); + var data = ''; + + // TypedArray.prototype.forEach is not supported in some browsers. + forEach(uint8, function (value) { + data += fromCharCode(value); + }); + + return 'data:' + mimeType + ';base64,' + btoa(data); +} + +/** + * Get orientation value from given array buffer. + * @param {ArrayBuffer} arrayBuffer - The array buffer to read. + * @returns {number} The read orientation value. + */ +function getOrientation(arrayBuffer) { + var dataView = new DataView(arrayBuffer); + var orientation = void 0; + var littleEndian = void 0; + var app1Start = void 0; + var ifdStart = void 0; + + // Only handle JPEG image (start by 0xFFD8) + if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) { + var length = dataView.byteLength; + var offset = 2; + + while (offset < length) { + if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) { + app1Start = offset; + break; + } + + offset += 1; + } + } + + if (app1Start) { + var exifIDCode = app1Start + 4; + var tiffOffset = app1Start + 10; + + if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') { + var endianness = dataView.getUint16(tiffOffset); + + littleEndian = endianness === 0x4949; + + if (littleEndian || endianness === 0x4D4D /* bigEndian */) { + if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) { + var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian); + + if (firstIFDOffset >= 0x00000008) { + ifdStart = tiffOffset + firstIFDOffset; + } + } + } + } + } + + if (ifdStart) { + var _length = dataView.getUint16(ifdStart, littleEndian); + var _offset = void 0; + var i = void 0; + + for (i = 0; i < _length; i += 1) { + _offset = ifdStart + i * 12 + 2; + + if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) { + // 8 is the offset of the current tag's value + _offset += 8; + + // Get the original orientation value + orientation = dataView.getUint16(_offset, littleEndian); + + // Override the orientation with its default value + dataView.setUint16(_offset, 1, littleEndian); + break; + } + } + } + + return orientation; +} + +/** + * Parse Exif Orientation value. + * @param {number} orientation - The orientation to parse. + * @returns {Object} The parsed result. + */ +function parseOrientation(orientation) { + var rotate = 0; + var scaleX = 1; + var scaleY = 1; + + switch (orientation) { + // Flip horizontal + case 2: + scaleX = -1; + break; + + // Rotate left 180° + case 3: + rotate = -180; + break; + + // Flip vertical + case 4: + scaleY = -1; + break; + + // Flip vertical and rotate right 90° + case 5: + rotate = 90; + scaleY = -1; + break; + + // Rotate right 90° + case 6: + rotate = 90; + break; + + // Flip horizontal and rotate right 90° + case 7: + rotate = 90; + scaleX = -1; + break; + + // Rotate left 90° + case 8: + rotate = -90; + break; + + default: + } + + return { + rotate: rotate, + scaleX: scaleX, + scaleY: scaleY + }; +} + +var render = { + render: function render() { + this.initContainer(); + this.initCanvas(); + this.initCropBox(); + this.renderCanvas(); + + if (this.cropped) { + this.renderCropBox(); + } + }, + initContainer: function initContainer() { + var element = this.element, + options = this.options, + container = this.container, + cropper = this.cropper; + + + addClass(cropper, CLASS_HIDDEN); + removeClass(element, CLASS_HIDDEN); + + var containerData = { + width: Math.max(container.offsetWidth, Number(options.minContainerWidth) || 200), + height: Math.max(container.offsetHeight, Number(options.minContainerHeight) || 100) + }; + + this.containerData = containerData; + + setStyle(cropper, { + width: containerData.width, + height: containerData.height + }); + + addClass(element, CLASS_HIDDEN); + removeClass(cropper, CLASS_HIDDEN); + }, + + + // Canvas (image wrapper) + initCanvas: function initCanvas() { + var containerData = this.containerData, + imageData = this.imageData; + var viewMode = this.options.viewMode; + + var rotated = Math.abs(imageData.rotate) % 180 === 90; + var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth; + var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight; + var aspectRatio = naturalWidth / naturalHeight; + var canvasWidth = containerData.width; + var canvasHeight = containerData.height; + + if (containerData.height * aspectRatio > containerData.width) { + if (viewMode === 3) { + canvasWidth = containerData.height * aspectRatio; + } else { + canvasHeight = containerData.width / aspectRatio; + } + } else if (viewMode === 3) { + canvasHeight = containerData.width / aspectRatio; + } else { + canvasWidth = containerData.height * aspectRatio; + } + + var canvasData = { + aspectRatio: aspectRatio, + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + width: canvasWidth, + height: canvasHeight + }; + + canvasData.left = (containerData.width - canvasWidth) / 2; + canvasData.top = (containerData.height - canvasHeight) / 2; + canvasData.oldLeft = canvasData.left; + canvasData.oldTop = canvasData.top; + + this.canvasData = canvasData; + this.limited = viewMode === 1 || viewMode === 2; + this.limitCanvas(true, true); + this.initialImageData = assign({}, imageData); + this.initialCanvasData = assign({}, canvasData); + }, + limitCanvas: function limitCanvas(sizeLimited, positionLimited) { + var options = this.options, + containerData = this.containerData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + var viewMode = options.viewMode; + var aspectRatio = canvasData.aspectRatio; + + var cropped = this.cropped && cropBoxData; + + if (sizeLimited) { + var minCanvasWidth = Number(options.minCanvasWidth) || 0; + var minCanvasHeight = Number(options.minCanvasHeight) || 0; + + if (viewMode > 1) { + minCanvasWidth = Math.max(minCanvasWidth, containerData.width); + minCanvasHeight = Math.max(minCanvasHeight, containerData.height); + + if (viewMode === 3) { + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } else { + minCanvasHeight = minCanvasWidth / aspectRatio; + } + } + } else if (viewMode > 0) { + if (minCanvasWidth) { + minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0); + } else if (minCanvasHeight) { + minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0); + } else if (cropped) { + minCanvasWidth = cropBoxData.width; + minCanvasHeight = cropBoxData.height; + + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } else { + minCanvasHeight = minCanvasWidth / aspectRatio; + } + } + } + + var _getAdjustedSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: minCanvasWidth, + height: minCanvasHeight + }); + + minCanvasWidth = _getAdjustedSizes.width; + minCanvasHeight = _getAdjustedSizes.height; + + + canvasData.minWidth = minCanvasWidth; + canvasData.minHeight = minCanvasHeight; + canvasData.maxWidth = Infinity; + canvasData.maxHeight = Infinity; + } + + if (positionLimited) { + if (viewMode) { + var newCanvasLeft = containerData.width - canvasData.width; + var newCanvasTop = containerData.height - canvasData.height; + + canvasData.minLeft = Math.min(0, newCanvasLeft); + canvasData.minTop = Math.min(0, newCanvasTop); + canvasData.maxLeft = Math.max(0, newCanvasLeft); + canvasData.maxTop = Math.max(0, newCanvasTop); + + if (cropped && this.limited) { + canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width)); + canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height)); + canvasData.maxLeft = cropBoxData.left; + canvasData.maxTop = cropBoxData.top; + + if (viewMode === 2) { + if (canvasData.width >= containerData.width) { + canvasData.minLeft = Math.min(0, newCanvasLeft); + canvasData.maxLeft = Math.max(0, newCanvasLeft); + } + + if (canvasData.height >= containerData.height) { + canvasData.minTop = Math.min(0, newCanvasTop); + canvasData.maxTop = Math.max(0, newCanvasTop); + } + } + } + } else { + canvasData.minLeft = -canvasData.width; + canvasData.minTop = -canvasData.height; + canvasData.maxLeft = containerData.width; + canvasData.maxTop = containerData.height; + } + } + }, + renderCanvas: function renderCanvas(changed, transformed) { + var canvasData = this.canvasData, + imageData = this.imageData; + + + if (transformed) { + var _getRotatedSizes = getRotatedSizes({ + width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1), + height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1), + degree: imageData.rotate || 0 + }), + naturalWidth = _getRotatedSizes.width, + naturalHeight = _getRotatedSizes.height; + + var width = canvasData.width * (naturalWidth / canvasData.naturalWidth); + var height = canvasData.height * (naturalHeight / canvasData.naturalHeight); + + canvasData.left -= (width - canvasData.width) / 2; + canvasData.top -= (height - canvasData.height) / 2; + canvasData.width = width; + canvasData.height = height; + canvasData.aspectRatio = naturalWidth / naturalHeight; + canvasData.naturalWidth = naturalWidth; + canvasData.naturalHeight = naturalHeight; + this.limitCanvas(true, false); + } + + if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) { + canvasData.left = canvasData.oldLeft; + } + + if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) { + canvasData.top = canvasData.oldTop; + } + + canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth); + canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight); + + this.limitCanvas(false, true); + + canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft); + canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop); + canvasData.oldLeft = canvasData.left; + canvasData.oldTop = canvasData.top; + + setStyle(this.canvas, assign({ + width: canvasData.width, + height: canvasData.height + }, getTransforms({ + translateX: canvasData.left, + translateY: canvasData.top + }))); + + this.renderImage(changed); + + if (this.cropped && this.limited) { + this.limitCropBox(true, true); + } + }, + renderImage: function renderImage(changed) { + var canvasData = this.canvasData, + imageData = this.imageData; + + var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth); + var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight); + + assign(imageData, { + width: width, + height: height, + left: (canvasData.width - width) / 2, + top: (canvasData.height - height) / 2 + }); + setStyle(this.image, assign({ + width: imageData.width, + height: imageData.height + }, getTransforms(assign({ + translateX: imageData.left, + translateY: imageData.top + }, imageData)))); + + if (changed) { + this.output(); + } + }, + initCropBox: function initCropBox() { + var options = this.options, + canvasData = this.canvasData; + var aspectRatio = options.aspectRatio; + + var autoCropArea = Number(options.autoCropArea) || 0.8; + var cropBoxData = { + width: canvasData.width, + height: canvasData.height + }; + + if (aspectRatio) { + if (canvasData.height * aspectRatio > canvasData.width) { + cropBoxData.height = cropBoxData.width / aspectRatio; + } else { + cropBoxData.width = cropBoxData.height * aspectRatio; + } + } + + this.cropBoxData = cropBoxData; + this.limitCropBox(true, true); + + // Initialize auto crop area + cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth); + cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); + + // The width/height of auto crop area must large than "minWidth/Height" + cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea); + cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea); + cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2; + cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2; + cropBoxData.oldLeft = cropBoxData.left; + cropBoxData.oldTop = cropBoxData.top; + + this.initialCropBoxData = assign({}, cropBoxData); + }, + limitCropBox: function limitCropBox(sizeLimited, positionLimited) { + var options = this.options, + containerData = this.containerData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData, + limited = this.limited; + var aspectRatio = options.aspectRatio; + + + if (sizeLimited) { + var minCropBoxWidth = Number(options.minCropBoxWidth) || 0; + var minCropBoxHeight = Number(options.minCropBoxHeight) || 0; + var maxCropBoxWidth = Math.min(containerData.width, limited ? canvasData.width : containerData.width); + var maxCropBoxHeight = Math.min(containerData.height, limited ? canvasData.height : containerData.height); + + // The min/maxCropBoxWidth/Height must be less than container's width/height + minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width); + minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height); + + if (aspectRatio) { + if (minCropBoxWidth && minCropBoxHeight) { + if (minCropBoxHeight * aspectRatio > minCropBoxWidth) { + minCropBoxHeight = minCropBoxWidth / aspectRatio; + } else { + minCropBoxWidth = minCropBoxHeight * aspectRatio; + } + } else if (minCropBoxWidth) { + minCropBoxHeight = minCropBoxWidth / aspectRatio; + } else if (minCropBoxHeight) { + minCropBoxWidth = minCropBoxHeight * aspectRatio; + } + + if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) { + maxCropBoxHeight = maxCropBoxWidth / aspectRatio; + } else { + maxCropBoxWidth = maxCropBoxHeight * aspectRatio; + } + } + + // The minWidth/Height must be less than maxWidth/Height + cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth); + cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight); + cropBoxData.maxWidth = maxCropBoxWidth; + cropBoxData.maxHeight = maxCropBoxHeight; + } + + if (positionLimited) { + if (limited) { + cropBoxData.minLeft = Math.max(0, canvasData.left); + cropBoxData.minTop = Math.max(0, canvasData.top); + cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width; + cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height; + } else { + cropBoxData.minLeft = 0; + cropBoxData.minTop = 0; + cropBoxData.maxLeft = containerData.width - cropBoxData.width; + cropBoxData.maxTop = containerData.height - cropBoxData.height; + } + } + }, + renderCropBox: function renderCropBox() { + var options = this.options, + containerData = this.containerData, + cropBoxData = this.cropBoxData; + + + if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) { + cropBoxData.left = cropBoxData.oldLeft; + } + + if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) { + cropBoxData.top = cropBoxData.oldTop; + } + + cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth); + cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); + + this.limitCropBox(false, true); + + cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft); + cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop); + cropBoxData.oldLeft = cropBoxData.left; + cropBoxData.oldTop = cropBoxData.top; + + if (options.movable && options.cropBoxMovable) { + // Turn to move the canvas when the crop box is equal to the container + setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL); + } + + setStyle(this.cropBox, assign({ + width: cropBoxData.width, + height: cropBoxData.height + }, getTransforms({ + translateX: cropBoxData.left, + translateY: cropBoxData.top + }))); + + if (this.cropped && this.limited) { + this.limitCanvas(true, true); + } + + if (!this.disabled) { + this.output(); + } + }, + output: function output() { + this.preview(); + dispatchEvent(this.element, EVENT_CROP, this.getData()); + } +}; + +var preview = { + initPreview: function initPreview() { + var crossOrigin = this.crossOrigin; + var preview = this.options.preview; + + var url = crossOrigin ? this.crossOriginUrl : this.url; + var image = document.createElement('img'); + + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + + image.src = url; + this.viewBox.appendChild(image); + this.viewBoxImage = image; + + if (!preview) { + return; + } + + var previews = preview; + + if (typeof preview === 'string') { + previews = this.element.ownerDocument.querySelectorAll(preview); + } else if (preview.querySelector) { + previews = [preview]; + } + + this.previews = previews; + + forEach(previews, function (el) { + var img = document.createElement('img'); + + // Save the original size for recover + setData(el, DATA_PREVIEW, { + width: el.offsetWidth, + height: el.offsetHeight, + html: el.innerHTML + }); + + if (crossOrigin) { + img.crossOrigin = crossOrigin; + } + + img.src = url; + + /** + * Override img element styles + * Add `display:block` to avoid margin top issue + * Add `height:auto` to override `height` attribute on IE8 + * (Occur only when margin-top <= -height) + */ + img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;"'; + + el.innerHTML = ''; + el.appendChild(img); + }); + }, + resetPreview: function resetPreview() { + forEach(this.previews, function (element) { + var data = getData(element, DATA_PREVIEW); + + setStyle(element, { + width: data.width, + height: data.height + }); + + element.innerHTML = data.html; + removeData(element, DATA_PREVIEW); + }); + }, + preview: function preview() { + var imageData = this.imageData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + var cropBoxWidth = cropBoxData.width, + cropBoxHeight = cropBoxData.height; + var width = imageData.width, + height = imageData.height; + + var left = cropBoxData.left - canvasData.left - imageData.left; + var top = cropBoxData.top - canvasData.top - imageData.top; + + if (!this.cropped || this.disabled) { + return; + } + + setStyle(this.viewBoxImage, assign({ + width: width, + height: height + }, getTransforms(assign({ + translateX: -left, + translateY: -top + }, imageData)))); + + forEach(this.previews, function (element) { + var data = getData(element, DATA_PREVIEW); + var originalWidth = data.width; + var originalHeight = data.height; + var newWidth = originalWidth; + var newHeight = originalHeight; + var ratio = 1; + + if (cropBoxWidth) { + ratio = originalWidth / cropBoxWidth; + newHeight = cropBoxHeight * ratio; + } + + if (cropBoxHeight && newHeight > originalHeight) { + ratio = originalHeight / cropBoxHeight; + newWidth = cropBoxWidth * ratio; + newHeight = originalHeight; + } + + setStyle(element, { + width: newWidth, + height: newHeight + }); + + setStyle(element.getElementsByTagName('img')[0], assign({ + width: width * ratio, + height: height * ratio + }, getTransforms(assign({ + translateX: -left * ratio, + translateY: -top * ratio + }, imageData)))); + }); + } +}; + +var events = { + bind: function bind() { + var element = this.element, + options = this.options, + cropper = this.cropper; + + + if (isFunction(options.cropstart)) { + addListener(element, EVENT_CROP_START, options.cropstart); + } + + if (isFunction(options.cropmove)) { + addListener(element, EVENT_CROP_MOVE, options.cropmove); + } + + if (isFunction(options.cropend)) { + addListener(element, EVENT_CROP_END, options.cropend); + } + + if (isFunction(options.crop)) { + addListener(element, EVENT_CROP, options.crop); + } + + if (isFunction(options.zoom)) { + addListener(element, EVENT_ZOOM, options.zoom); + } + + addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this)); + + if (options.zoomable && options.zoomOnWheel) { + addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this)); + } + + if (options.toggleDragModeOnDblclick) { + addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this)); + } + + addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this)); + addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this)); + + if (options.responsive) { + addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this)); + } + }, + unbind: function unbind() { + var element = this.element, + options = this.options, + cropper = this.cropper; + + + if (isFunction(options.cropstart)) { + removeListener(element, EVENT_CROP_START, options.cropstart); + } + + if (isFunction(options.cropmove)) { + removeListener(element, EVENT_CROP_MOVE, options.cropmove); + } + + if (isFunction(options.cropend)) { + removeListener(element, EVENT_CROP_END, options.cropend); + } + + if (isFunction(options.crop)) { + removeListener(element, EVENT_CROP, options.crop); + } + + if (isFunction(options.zoom)) { + removeListener(element, EVENT_ZOOM, options.zoom); + } + + removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart); + + if (options.zoomable && options.zoomOnWheel) { + removeListener(cropper, EVENT_WHEEL, this.onWheel); + } + + if (options.toggleDragModeOnDblclick) { + removeListener(cropper, EVENT_DBLCLICK, this.onDblclick); + } + + removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove); + removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd); + + if (options.responsive) { + removeListener(window, EVENT_RESIZE, this.onResize); + } + } +}; + +var handlers = { + resize: function resize() { + var options = this.options, + container = this.container, + containerData = this.containerData; + + var minContainerWidth = Number(options.minContainerWidth) || 200; + var minContainerHeight = Number(options.minContainerHeight) || 100; + + if (this.disabled || containerData.width <= minContainerWidth || containerData.height <= minContainerHeight) { + return; + } + + var ratio = container.offsetWidth / containerData.width; + + // Resize when width changed or height changed + if (ratio !== 1 || container.offsetHeight !== containerData.height) { + var canvasData = void 0; + var cropBoxData = void 0; + + if (options.restore) { + canvasData = this.getCanvasData(); + cropBoxData = this.getCropBoxData(); + } + + this.render(); + + if (options.restore) { + this.setCanvasData(forEach(canvasData, function (n, i) { + canvasData[i] = n * ratio; + })); + this.setCropBoxData(forEach(cropBoxData, function (n, i) { + cropBoxData[i] = n * ratio; + })); + } + } + }, + dblclick: function dblclick() { + if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) { + return; + } + + this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP); + }, + wheel: function wheel(e) { + var _this = this; + + var ratio = Number(this.options.wheelZoomRatio) || 0.1; + var delta = 1; + + if (this.disabled) { + return; + } + + e.preventDefault(); + + // Limit wheel speed to prevent zoom too fast (#21) + if (this.wheeling) { + return; + } + + this.wheeling = true; + + setTimeout(function () { + _this.wheeling = false; + }, 50); + + if (e.deltaY) { + delta = e.deltaY > 0 ? 1 : -1; + } else if (e.wheelDelta) { + delta = -e.wheelDelta / 120; + } else if (e.detail) { + delta = e.detail > 0 ? 1 : -1; + } + + this.zoom(-delta * ratio, e); + }, + cropStart: function cropStart(e) { + if (this.disabled) { + return; + } + + var options = this.options, + pointers = this.pointers; + + var action = void 0; + + if (e.changedTouches) { + // Handle touch event + forEach(e.changedTouches, function (touch) { + pointers[touch.identifier] = getPointer(touch); + }); + } else { + // Handle mouse event and pointer event + pointers[e.pointerId || 0] = getPointer(e); + } + + if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) { + action = ACTION_ZOOM; + } else { + action = getData(e.target, DATA_ACTION); + } + + if (!REGEXP_ACTIONS.test(action)) { + return; + } + + if (dispatchEvent(this.element, EVENT_CROP_START, { + originalEvent: e, + action: action + }) === false) { + return; + } + + e.preventDefault(); + + this.action = action; + this.cropping = false; + + if (action === ACTION_CROP) { + this.cropping = true; + addClass(this.dragBox, CLASS_MODAL); + } + }, + cropMove: function cropMove(e) { + var action = this.action; + + + if (this.disabled || !action) { + return; + } + + var pointers = this.pointers; + + + e.preventDefault(); + + if (dispatchEvent(this.element, EVENT_CROP_MOVE, { + originalEvent: e, + action: action + }) === false) { + return; + } + + if (e.changedTouches) { + forEach(e.changedTouches, function (touch) { + assign(pointers[touch.identifier], getPointer(touch, true)); + }); + } else { + assign(pointers[e.pointerId || 0], getPointer(e, true)); + } + + this.change(e); + }, + cropEnd: function cropEnd(e) { + if (this.disabled) { + return; + } + + var action = this.action, + pointers = this.pointers; + + + if (e.changedTouches) { + forEach(e.changedTouches, function (touch) { + delete pointers[touch.identifier]; + }); + } else { + delete pointers[e.pointerId || 0]; + } + + if (!action) { + return; + } + + e.preventDefault(); + + if (!Object.keys(pointers).length) { + this.action = ''; + } + + if (this.cropping) { + this.cropping = false; + toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal); + } + + dispatchEvent(this.element, EVENT_CROP_END, { + originalEvent: e, + action: action + }); + } +}; + +var change = { + change: function change(e) { + var options = this.options, + canvasData = this.canvasData, + containerData = this.containerData, + cropBoxData = this.cropBoxData, + pointers = this.pointers; + var action = this.action; + var aspectRatio = options.aspectRatio; + var left = cropBoxData.left, + top = cropBoxData.top, + width = cropBoxData.width, + height = cropBoxData.height; + + var right = left + width; + var bottom = top + height; + var minLeft = 0; + var minTop = 0; + var maxWidth = containerData.width; + var maxHeight = containerData.height; + var renderable = true; + var offset = void 0; + + // Locking aspect ratio in "free mode" by holding shift key + if (!aspectRatio && e.shiftKey) { + aspectRatio = width && height ? width / height : 1; + } + + if (this.limited) { + minLeft = cropBoxData.minLeft; + minTop = cropBoxData.minTop; + + maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width); + maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height); + } + + var pointer = pointers[Object.keys(pointers)[0]]; + var range = { + x: pointer.endX - pointer.startX, + y: pointer.endY - pointer.startY + }; + var check = function check(side) { + switch (side) { + case ACTION_EAST: + if (right + range.x > maxWidth) { + range.x = maxWidth - right; + } + + break; + + case ACTION_WEST: + if (left + range.x < minLeft) { + range.x = minLeft - left; + } + + break; + + case ACTION_NORTH: + if (top + range.y < minTop) { + range.y = minTop - top; + } + + break; + + case ACTION_SOUTH: + if (bottom + range.y > maxHeight) { + range.y = maxHeight - bottom; + } + + break; + + default: + } + }; + + switch (action) { + // Move crop box + case ACTION_ALL: + left += range.x; + top += range.y; + break; + + // Resize crop box + case ACTION_EAST: + if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + renderable = false; + break; + } + + check(ACTION_EAST); + width += range.x; + + if (aspectRatio) { + height = width / aspectRatio; + top -= range.x / aspectRatio / 2; + } + + if (width < 0) { + action = ACTION_WEST; + width = 0; + } + + break; + + case ACTION_NORTH: + if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + + if (aspectRatio) { + width = height * aspectRatio; + left += range.y * aspectRatio / 2; + } + + if (height < 0) { + action = ACTION_SOUTH; + height = 0; + } + + break; + + case ACTION_WEST: + if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + renderable = false; + break; + } + + check(ACTION_WEST); + width -= range.x; + left += range.x; + + if (aspectRatio) { + height = width / aspectRatio; + top += range.x / aspectRatio / 2; + } + + if (width < 0) { + action = ACTION_EAST; + width = 0; + } + + break; + + case ACTION_SOUTH: + if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) { + renderable = false; + break; + } + + check(ACTION_SOUTH); + height += range.y; + + if (aspectRatio) { + width = height * aspectRatio; + left -= range.y * aspectRatio / 2; + } + + if (height < 0) { + action = ACTION_NORTH; + height = 0; + } + + break; + + case ACTION_NORTH_EAST: + if (aspectRatio) { + if (range.y <= 0 && (top <= minTop || right >= maxWidth)) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + width = height * aspectRatio; + } else { + check(ACTION_NORTH); + check(ACTION_EAST); + + if (range.x >= 0) { + if (right < maxWidth) { + width += range.x; + } else if (range.y <= 0 && top <= minTop) { + renderable = false; + } + } else { + width += range.x; + } + + if (range.y <= 0) { + if (top > minTop) { + height -= range.y; + top += range.y; + } + } else { + height -= range.y; + top += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_SOUTH_WEST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_NORTH_WEST; + width = 0; + } else if (height < 0) { + action = ACTION_SOUTH_EAST; + height = 0; + } + + break; + + case ACTION_NORTH_WEST: + if (aspectRatio) { + if (range.y <= 0 && (top <= minTop || left <= minLeft)) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + width = height * aspectRatio; + left += range.y * aspectRatio; + } else { + check(ACTION_NORTH); + check(ACTION_WEST); + + if (range.x <= 0) { + if (left > minLeft) { + width -= range.x; + left += range.x; + } else if (range.y <= 0 && top <= minTop) { + renderable = false; + } + } else { + width -= range.x; + left += range.x; + } + + if (range.y <= 0) { + if (top > minTop) { + height -= range.y; + top += range.y; + } + } else { + height -= range.y; + top += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_SOUTH_EAST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_NORTH_EAST; + width = 0; + } else if (height < 0) { + action = ACTION_SOUTH_WEST; + height = 0; + } + + break; + + case ACTION_SOUTH_WEST: + if (aspectRatio) { + if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) { + renderable = false; + break; + } + + check(ACTION_WEST); + width -= range.x; + left += range.x; + height = width / aspectRatio; + } else { + check(ACTION_SOUTH); + check(ACTION_WEST); + + if (range.x <= 0) { + if (left > minLeft) { + width -= range.x; + left += range.x; + } else if (range.y >= 0 && bottom >= maxHeight) { + renderable = false; + } + } else { + width -= range.x; + left += range.x; + } + + if (range.y >= 0) { + if (bottom < maxHeight) { + height += range.y; + } + } else { + height += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_NORTH_EAST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_SOUTH_EAST; + width = 0; + } else if (height < 0) { + action = ACTION_NORTH_WEST; + height = 0; + } + + break; + + case ACTION_SOUTH_EAST: + if (aspectRatio) { + if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) { + renderable = false; + break; + } + + check(ACTION_EAST); + width += range.x; + height = width / aspectRatio; + } else { + check(ACTION_SOUTH); + check(ACTION_EAST); + + if (range.x >= 0) { + if (right < maxWidth) { + width += range.x; + } else if (range.y >= 0 && bottom >= maxHeight) { + renderable = false; + } + } else { + width += range.x; + } + + if (range.y >= 0) { + if (bottom < maxHeight) { + height += range.y; + } + } else { + height += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_NORTH_WEST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_SOUTH_WEST; + width = 0; + } else if (height < 0) { + action = ACTION_NORTH_EAST; + height = 0; + } + + break; + + // Move canvas + case ACTION_MOVE: + this.move(range.x, range.y); + renderable = false; + break; + + // Zoom canvas + case ACTION_ZOOM: + this.zoom(getMaxZoomRatio(pointers), e); + renderable = false; + break; + + // Create crop box + case ACTION_CROP: + if (!range.x || !range.y) { + renderable = false; + break; + } + + offset = getOffset(this.cropper); + left = pointer.startX - offset.left; + top = pointer.startY - offset.top; + width = cropBoxData.minWidth; + height = cropBoxData.minHeight; + + if (range.x > 0) { + action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST; + } else if (range.x < 0) { + left -= width; + action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST; + } + + if (range.y < 0) { + top -= height; + } + + // Show the crop box if is hidden + if (!this.cropped) { + removeClass(this.cropBox, CLASS_HIDDEN); + this.cropped = true; + + if (this.limited) { + this.limitCropBox(true, true); + } + } + + break; + + default: + } + + if (renderable) { + cropBoxData.width = width; + cropBoxData.height = height; + cropBoxData.left = left; + cropBoxData.top = top; + this.action = action; + this.renderCropBox(); + } + + // Override + forEach(pointers, function (p) { + p.startX = p.endX; + p.startY = p.endY; + }); + } +}; + +var methods = { + // Show the crop box manually + crop: function crop() { + if (this.ready && !this.cropped && !this.disabled) { + this.cropped = true; + this.limitCropBox(true, true); + + if (this.options.modal) { + addClass(this.dragBox, CLASS_MODAL); + } + + removeClass(this.cropBox, CLASS_HIDDEN); + this.setCropBoxData(this.initialCropBoxData); + } + + return this; + }, + + + // Reset the image and crop box to their initial states + reset: function reset() { + if (this.ready && !this.disabled) { + this.imageData = assign({}, this.initialImageData); + this.canvasData = assign({}, this.initialCanvasData); + this.cropBoxData = assign({}, this.initialCropBoxData); + this.renderCanvas(); + + if (this.cropped) { + this.renderCropBox(); + } + } + + return this; + }, + + + // Clear the crop box + clear: function clear() { + if (this.cropped && !this.disabled) { + assign(this.cropBoxData, { + left: 0, + top: 0, + width: 0, + height: 0 + }); + + this.cropped = false; + this.renderCropBox(); + this.limitCanvas(true, true); + + // Render canvas after crop box rendered + this.renderCanvas(); + removeClass(this.dragBox, CLASS_MODAL); + addClass(this.cropBox, CLASS_HIDDEN); + } + + return this; + }, + + + /** + * Replace the image's src and rebuild the cropper + * @param {string} url - The new URL. + * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one. + * @returns {Cropper} this + */ + replace: function replace(url) { + var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!this.disabled && url) { + if (this.isImg) { + this.element.src = url; + } + + if (hasSameSize) { + this.url = url; + this.image.src = url; + + if (this.ready) { + this.viewBoxImage.src = url; + + forEach(this.previews, function (element) { + element.getElementsByTagName('img')[0].src = url; + }); + } + } else { + if (this.isImg) { + this.replaced = true; + } + + this.options.data = null; + this.uncreate(); + this.load(url); + } + } + + return this; + }, + + + // Enable (unfreeze) the cropper + enable: function enable() { + if (this.ready && this.disabled) { + this.disabled = false; + removeClass(this.cropper, CLASS_DISABLED); + } + + return this; + }, + + + // Disable (freeze) the cropper + disable: function disable() { + if (this.ready && !this.disabled) { + this.disabled = true; + addClass(this.cropper, CLASS_DISABLED); + } + + return this; + }, + + + /** + * Destroy the cropper and remove the instance from the image + * @returns {Cropper} this + */ + destroy: function destroy() { + var element = this.element; + + + if (!getData(element, NAMESPACE)) { + return this; + } + + if (this.isImg && this.replaced) { + element.src = this.originalUrl; + } + + this.uncreate(); + removeData(element, NAMESPACE); + + return this; + }, + + + /** + * Move the canvas with relative offsets + * @param {number} offsetX - The relative offset distance on the x-axis. + * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis. + * @returns {Cropper} this + */ + move: function move(offsetX) { + var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX; + var _canvasData = this.canvasData, + left = _canvasData.left, + top = _canvasData.top; + + + return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY)); + }, + + + /** + * Move the canvas to an absolute point + * @param {number} x - The x-axis coordinate. + * @param {number} [y=x] - The y-axis coordinate. + * @returns {Cropper} this + */ + moveTo: function moveTo(x) { + var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x; + var canvasData = this.canvasData; + + var changed = false; + + x = Number(x); + y = Number(y); + + if (this.ready && !this.disabled && this.options.movable) { + if (isNumber(x)) { + canvasData.left = x; + changed = true; + } + + if (isNumber(y)) { + canvasData.top = y; + changed = true; + } + + if (changed) { + this.renderCanvas(true); + } + } + + return this; + }, + + + /** + * Zoom the canvas with a relative ratio + * @param {number} ratio - The target ratio. + * @param {Event} _originalEvent - The original event if any. + * @returns {Cropper} this + */ + zoom: function zoom(ratio, _originalEvent) { + var canvasData = this.canvasData; + + + ratio = Number(ratio); + + if (ratio < 0) { + ratio = 1 / (1 - ratio); + } else { + ratio = 1 + ratio; + } + + return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent); + }, + + + /** + * Zoom the canvas to an absolute ratio + * @param {number} ratio - The target ratio. + * @param {Object} pivot - The zoom pivot point coordinate. + * @param {Event} _originalEvent - The original event if any. + * @returns {Cropper} this + */ + zoomTo: function zoomTo(ratio, pivot, _originalEvent) { + var options = this.options, + canvasData = this.canvasData; + var width = canvasData.width, + height = canvasData.height, + naturalWidth = canvasData.naturalWidth, + naturalHeight = canvasData.naturalHeight; + + + ratio = Number(ratio); + + if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) { + var newWidth = naturalWidth * ratio; + var newHeight = naturalHeight * ratio; + + if (dispatchEvent(this.element, EVENT_ZOOM, { + originalEvent: _originalEvent, + oldRatio: width / naturalWidth, + ratio: newWidth / naturalWidth + }) === false) { + return this; + } + + if (_originalEvent) { + var pointers = this.pointers; + + var offset = getOffset(this.cropper); + var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : { + pageX: _originalEvent.pageX, + pageY: _originalEvent.pageY + }; + + // Zoom from the triggering point of the event + canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width); + canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height); + } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) { + canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width); + canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height); + } else { + // Zoom from the center of the canvas + canvasData.left -= (newWidth - width) / 2; + canvasData.top -= (newHeight - height) / 2; + } + + canvasData.width = newWidth; + canvasData.height = newHeight; + this.renderCanvas(true); + } + + return this; + }, + + + /** + * Rotate the canvas with a relative degree + * @param {number} degree - The rotate degree. + * @returns {Cropper} this + */ + rotate: function rotate(degree) { + return this.rotateTo((this.imageData.rotate || 0) + Number(degree)); + }, + + + /** + * Rotate the canvas to an absolute degree + * @param {number} degree - The rotate degree. + * @returns {Cropper} this + */ + rotateTo: function rotateTo(degree) { + degree = Number(degree); + + if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) { + this.imageData.rotate = degree % 360; + this.renderCanvas(true, true); + } + + return this; + }, + + + /** + * Scale the image on the x-axis. + * @param {number} scaleX - The scale ratio on the x-axis. + * @returns {Cropper} this + */ + scaleX: function scaleX(_scaleX) { + var scaleY = this.imageData.scaleY; + + + return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1); + }, + + + /** + * Scale the image on the y-axis. + * @param {number} scaleY - The scale ratio on the y-axis. + * @returns {Cropper} this + */ + scaleY: function scaleY(_scaleY) { + var scaleX = this.imageData.scaleX; + + + return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY); + }, + + + /** + * Scale the image + * @param {number} scaleX - The scale ratio on the x-axis. + * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis. + * @returns {Cropper} this + */ + scale: function scale(scaleX) { + var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX; + var imageData = this.imageData; + + var transformed = false; + + scaleX = Number(scaleX); + scaleY = Number(scaleY); + + if (this.ready && !this.disabled && this.options.scalable) { + if (isNumber(scaleX)) { + imageData.scaleX = scaleX; + transformed = true; + } + + if (isNumber(scaleY)) { + imageData.scaleY = scaleY; + transformed = true; + } + + if (transformed) { + this.renderCanvas(true, true); + } + } + + return this; + }, + + + /** + * Get the cropped area position and size data (base on the original image) + * @param {boolean} [rounded=false] - Indicate if round the data values or not. + * @returns {Object} The result cropped data. + */ + getData: function getData$$1() { + var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var options = this.options, + imageData = this.imageData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + + var data = void 0; + + if (this.ready && this.cropped) { + data = { + x: cropBoxData.left - canvasData.left, + y: cropBoxData.top - canvasData.top, + width: cropBoxData.width, + height: cropBoxData.height + }; + + var ratio = imageData.width / imageData.naturalWidth; + + forEach(data, function (n, i) { + n /= ratio; + data[i] = rounded ? Math.round(n) : n; + }); + } else { + data = { + x: 0, + y: 0, + width: 0, + height: 0 + }; + } + + if (options.rotatable) { + data.rotate = imageData.rotate || 0; + } + + if (options.scalable) { + data.scaleX = imageData.scaleX || 1; + data.scaleY = imageData.scaleY || 1; + } + + return data; + }, + + + /** + * Set the cropped area position and size with new data + * @param {Object} data - The new data. + * @returns {Cropper} this + */ + setData: function setData$$1(data) { + var options = this.options, + imageData = this.imageData, + canvasData = this.canvasData; + + var cropBoxData = {}; + + if (this.ready && !this.disabled && isPlainObject(data)) { + var transformed = false; + + if (options.rotatable) { + if (isNumber(data.rotate) && data.rotate !== imageData.rotate) { + imageData.rotate = data.rotate; + transformed = true; + } + } + + if (options.scalable) { + if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) { + imageData.scaleX = data.scaleX; + transformed = true; + } + + if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) { + imageData.scaleY = data.scaleY; + transformed = true; + } + } + + if (transformed) { + this.renderCanvas(true, true); + } + + var ratio = imageData.width / imageData.naturalWidth; + + if (isNumber(data.x)) { + cropBoxData.left = data.x * ratio + canvasData.left; + } + + if (isNumber(data.y)) { + cropBoxData.top = data.y * ratio + canvasData.top; + } + + if (isNumber(data.width)) { + cropBoxData.width = data.width * ratio; + } + + if (isNumber(data.height)) { + cropBoxData.height = data.height * ratio; + } + + this.setCropBoxData(cropBoxData); + } + + return this; + }, + + + /** + * Get the container size data. + * @returns {Object} The result container data. + */ + getContainerData: function getContainerData() { + return this.ready ? assign({}, this.containerData) : {}; + }, + + + /** + * Get the image position and size data. + * @returns {Object} The result image data. + */ + getImageData: function getImageData() { + return this.sized ? assign({}, this.imageData) : {}; + }, + + + /** + * Get the canvas position and size data. + * @returns {Object} The result canvas data. + */ + getCanvasData: function getCanvasData() { + var canvasData = this.canvasData; + + var data = {}; + + if (this.ready) { + forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) { + data[n] = canvasData[n]; + }); + } + + return data; + }, + + + /** + * Set the canvas position and size with new data. + * @param {Object} data - The new canvas data. + * @returns {Cropper} this + */ + setCanvasData: function setCanvasData(data) { + var canvasData = this.canvasData; + var aspectRatio = canvasData.aspectRatio; + + + if (this.ready && !this.disabled && isPlainObject(data)) { + if (isNumber(data.left)) { + canvasData.left = data.left; + } + + if (isNumber(data.top)) { + canvasData.top = data.top; + } + + if (isNumber(data.width)) { + canvasData.width = data.width; + canvasData.height = data.width / aspectRatio; + } else if (isNumber(data.height)) { + canvasData.height = data.height; + canvasData.width = data.height * aspectRatio; + } + + this.renderCanvas(true); + } + + return this; + }, + + + /** + * Get the crop box position and size data. + * @returns {Object} The result crop box data. + */ + getCropBoxData: function getCropBoxData() { + var cropBoxData = this.cropBoxData; + + var data = void 0; + + if (this.ready && this.cropped) { + data = { + left: cropBoxData.left, + top: cropBoxData.top, + width: cropBoxData.width, + height: cropBoxData.height + }; + } + + return data || {}; + }, + + + /** + * Set the crop box position and size with new data. + * @param {Object} data - The new crop box data. + * @returns {Cropper} this + */ + setCropBoxData: function setCropBoxData(data) { + var cropBoxData = this.cropBoxData; + var aspectRatio = this.options.aspectRatio; + + var widthChanged = void 0; + var heightChanged = void 0; + + if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) { + if (isNumber(data.left)) { + cropBoxData.left = data.left; + } + + if (isNumber(data.top)) { + cropBoxData.top = data.top; + } + + if (isNumber(data.width) && data.width !== cropBoxData.width) { + widthChanged = true; + cropBoxData.width = data.width; + } + + if (isNumber(data.height) && data.height !== cropBoxData.height) { + heightChanged = true; + cropBoxData.height = data.height; + } + + if (aspectRatio) { + if (widthChanged) { + cropBoxData.height = cropBoxData.width / aspectRatio; + } else if (heightChanged) { + cropBoxData.width = cropBoxData.height * aspectRatio; + } + } + + this.renderCropBox(); + } + + return this; + }, + + + /** + * Get a canvas drawn the cropped image. + * @param {Object} [options={}] - The config options. + * @returns {HTMLCanvasElement} - The result canvas. + */ + getCroppedCanvas: function getCroppedCanvas() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (!this.ready || !window.HTMLCanvasElement) { + return null; + } + + var canvasData = this.canvasData; + + var source = getSourceCanvas(this.image, this.imageData, canvasData, options); + + // Returns the source canvas if it is not cropped. + if (!this.cropped) { + return source; + } + + var _getData = this.getData(), + initialX = _getData.x, + initialY = _getData.y, + initialWidth = _getData.width, + initialHeight = _getData.height; + + var ratio = source.width / Math.floor(canvasData.naturalWidth); + + if (ratio !== 1) { + initialX *= ratio; + initialY *= ratio; + initialWidth *= ratio; + initialHeight *= ratio; + } + + var aspectRatio = initialWidth / initialHeight; + var maxSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.maxWidth || Infinity, + height: options.maxHeight || Infinity + }); + var minSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.minWidth || 0, + height: options.minHeight || 0 + }, 'cover'); + + var _getAdjustedSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.width || (ratio !== 1 ? source.width : initialWidth), + height: options.height || (ratio !== 1 ? source.height : initialHeight) + }), + width = _getAdjustedSizes.width, + height = _getAdjustedSizes.height; + + width = Math.min(maxSizes.width, Math.max(minSizes.width, width)); + height = Math.min(maxSizes.height, Math.max(minSizes.height, height)); + + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + + canvas.width = normalizeDecimalNumber(width); + canvas.height = normalizeDecimalNumber(height); + + context.fillStyle = options.fillColor || 'transparent'; + context.fillRect(0, 0, width, height); + + var _options$imageSmoothi = options.imageSmoothingEnabled, + imageSmoothingEnabled = _options$imageSmoothi === undefined ? true : _options$imageSmoothi, + imageSmoothingQuality = options.imageSmoothingQuality; + + + context.imageSmoothingEnabled = imageSmoothingEnabled; + + if (imageSmoothingQuality) { + context.imageSmoothingQuality = imageSmoothingQuality; + } + + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage + var sourceWidth = source.width; + var sourceHeight = source.height; + + // Source canvas parameters + var srcX = initialX; + var srcY = initialY; + var srcWidth = void 0; + var srcHeight = void 0; + + // Destination canvas parameters + var dstX = void 0; + var dstY = void 0; + var dstWidth = void 0; + var dstHeight = void 0; + + if (srcX <= -initialWidth || srcX > sourceWidth) { + srcX = 0; + srcWidth = 0; + dstX = 0; + dstWidth = 0; + } else if (srcX <= 0) { + dstX = -srcX; + srcX = 0; + srcWidth = Math.min(sourceWidth, initialWidth + srcX); + dstWidth = srcWidth; + } else if (srcX <= sourceWidth) { + dstX = 0; + srcWidth = Math.min(initialWidth, sourceWidth - srcX); + dstWidth = srcWidth; + } + + if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) { + srcY = 0; + srcHeight = 0; + dstY = 0; + dstHeight = 0; + } else if (srcY <= 0) { + dstY = -srcY; + srcY = 0; + srcHeight = Math.min(sourceHeight, initialHeight + srcY); + dstHeight = srcHeight; + } else if (srcY <= sourceHeight) { + dstY = 0; + srcHeight = Math.min(initialHeight, sourceHeight - srcY); + dstHeight = srcHeight; + } + + var params = [srcX, srcY, srcWidth, srcHeight]; + + // Avoid "IndexSizeError" + if (dstWidth > 0 && dstHeight > 0) { + var scale = width / initialWidth; + + params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale); + } + + // All the numerical parameters should be integer for `drawImage` + // https://github.com/fengyuanchen/cropper/issues/476 + context.drawImage.apply(context, [source].concat(toConsumableArray(params.map(function (param) { + return Math.floor(normalizeDecimalNumber(param)); + })))); + + return canvas; + }, + + + /** + * Change the aspect ratio of the crop box. + * @param {number} aspectRatio - The new aspect ratio. + * @returns {Cropper} this + */ + setAspectRatio: function setAspectRatio(aspectRatio) { + var options = this.options; + + + if (!this.disabled && !isUndefined(aspectRatio)) { + // 0 -> NaN + options.aspectRatio = Math.max(0, aspectRatio) || NaN; + + if (this.ready) { + this.initCropBox(); + + if (this.cropped) { + this.renderCropBox(); + } + } + } + + return this; + }, + + + /** + * Change the drag mode. + * @param {string} mode - The new drag mode. + * @returns {Cropper} this + */ + setDragMode: function setDragMode(mode) { + var options = this.options, + dragBox = this.dragBox, + face = this.face; + + + if (this.ready && !this.disabled) { + var croppable = mode === DRAG_MODE_CROP; + var movable = options.movable && mode === DRAG_MODE_MOVE; + + mode = croppable || movable ? mode : DRAG_MODE_NONE; + + options.dragMode = mode; + setData(dragBox, DATA_ACTION, mode); + toggleClass(dragBox, CLASS_CROP, croppable); + toggleClass(dragBox, CLASS_MOVE, movable); + + if (!options.cropBoxMovable) { + // Sync drag mode to crop box when it is not movable + setData(face, DATA_ACTION, mode); + toggleClass(face, CLASS_CROP, croppable); + toggleClass(face, CLASS_MOVE, movable); + } + } + + return this; + } +}; + +var AnotherCropper = WINDOW.Cropper; + +var Cropper = function () { + /** + * Create a new Cropper. + * @param {Element} element - The target element for cropping. + * @param {Object} [options={}] - The configuration options. + */ + function Cropper(element) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + classCallCheck(this, Cropper); + + if (!element || !REGEXP_TAG_NAME.test(element.tagName)) { + throw new Error('The first argument is required and must be an or element.'); + } + + this.element = element; + this.options = assign({}, DEFAULTS, isPlainObject(options) && options); + this.cropped = false; + this.disabled = false; + this.pointers = {}; + this.ready = false; + this.reloading = false; + this.replaced = false; + this.sized = false; + this.sizing = false; + this.init(); + } + + createClass(Cropper, [{ + key: 'init', + value: function init() { + var element = this.element; + + var tagName = element.tagName.toLowerCase(); + var url = void 0; + + if (getData(element, NAMESPACE)) { + return; + } + + setData(element, NAMESPACE, this); + + if (tagName === 'img') { + this.isImg = true; + + // e.g.: "img/picture.jpg" + url = element.getAttribute('src') || ''; + this.originalUrl = url; + + // Stop when it's a blank image + if (!url) { + return; + } + + // e.g.: "http://example.com/img/picture.jpg" + url = element.src; + } else if (tagName === 'canvas' && window.HTMLCanvasElement) { + url = element.toDataURL(); + } + + this.load(url); + } + }, { + key: 'load', + value: function load(url) { + var _this = this; + + if (!url) { + return; + } + + this.url = url; + this.imageData = {}; + + var element = this.element, + options = this.options; + + + if (!options.checkOrientation || !window.ArrayBuffer) { + this.clone(); + return; + } + + // XMLHttpRequest disallows to open a Data URL in some browsers like IE11 and Safari + if (REGEXP_DATA_URL.test(url)) { + if (REGEXP_DATA_URL_JPEG.test(url)) { + this.read(dataURLToArrayBuffer(url)); + } else { + this.clone(); + } + + return; + } + + var xhr = new XMLHttpRequest(); + + this.reloading = true; + this.xhr = xhr; + + var done = function done() { + _this.reloading = false; + _this.xhr = null; + }; + + xhr.ontimeout = done; + xhr.onabort = done; + xhr.onerror = function () { + done(); + _this.clone(); + }; + + xhr.onload = function () { + done(); + _this.read(xhr.response); + }; + + // Bust cache when there is a "crossOrigin" property + if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) { + url = addTimestamp(url); + } + + xhr.open('get', url); + xhr.responseType = 'arraybuffer'; + xhr.withCredentials = element.crossOrigin === 'use-credentials'; + xhr.send(); + } + }, { + key: 'read', + value: function read(arrayBuffer) { + var options = this.options, + imageData = this.imageData; + + var orientation = getOrientation(arrayBuffer); + var rotate = 0; + var scaleX = 1; + var scaleY = 1; + + if (orientation > 1) { + this.url = arrayBufferToDataURL(arrayBuffer, 'image/jpeg'); + + var _parseOrientation = parseOrientation(orientation); + + rotate = _parseOrientation.rotate; + scaleX = _parseOrientation.scaleX; + scaleY = _parseOrientation.scaleY; + } + + if (options.rotatable) { + imageData.rotate = rotate; + } + + if (options.scalable) { + imageData.scaleX = scaleX; + imageData.scaleY = scaleY; + } + + this.clone(); + } + }, { + key: 'clone', + value: function clone() { + var element = this.element, + url = this.url; + + var crossOrigin = void 0; + var crossOriginUrl = void 0; + + if (this.options.checkCrossOrigin && isCrossOriginURL(url)) { + crossOrigin = element.crossOrigin; + + + if (crossOrigin) { + crossOriginUrl = url; + } else { + crossOrigin = 'anonymous'; + + // Bust cache when there is not a "crossOrigin" property + crossOriginUrl = addTimestamp(url); + } + } + + this.crossOrigin = crossOrigin; + this.crossOriginUrl = crossOriginUrl; + + var image = document.createElement('img'); + + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + + image.src = crossOriginUrl || url; + + var start = this.start.bind(this); + var stop = this.stop.bind(this); + + this.image = image; + this.onStart = start; + this.onStop = stop; + + if (this.isImg) { + if (element.complete) { + // start asynchronously to keep `this.cropper` is accessible in `ready` event handler. + this.timeout = setTimeout(start, 0); + } else { + addListener(element, EVENT_LOAD, start, { + once: true + }); + } + } else { + image.onload = start; + image.onerror = stop; + addClass(image, CLASS_HIDE); + element.parentNode.insertBefore(image, element.nextSibling); + } + } + }, { + key: 'start', + value: function start(event) { + var _this2 = this; + + var image = this.isImg ? this.element : this.image; + + if (event) { + image.onload = null; + image.onerror = null; + } + + this.sizing = true; + + var IS_SAFARI = WINDOW.navigator && /(Macintosh|iPhone|iPod|iPad).*AppleWebKit/i.test(WINDOW.navigator.userAgent); + var done = function done(naturalWidth, naturalHeight) { + assign(_this2.imageData, { + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + aspectRatio: naturalWidth / naturalHeight + }); + _this2.sizing = false; + _this2.sized = true; + _this2.build(); + }; + + // Modern browsers (except Safari) + if (image.naturalWidth && !IS_SAFARI) { + done(image.naturalWidth, image.naturalHeight); + return; + } + + var sizingImage = document.createElement('img'); + var body = document.body || document.documentElement; + + this.sizingImage = sizingImage; + + sizingImage.onload = function () { + done(sizingImage.width, sizingImage.height); + + if (!IS_SAFARI) { + body.removeChild(sizingImage); + } + }; + + sizingImage.src = image.src; + + // iOS Safari will convert the image automatically + // with its orientation once append it into DOM (#279) + if (!IS_SAFARI) { + sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;'; + body.appendChild(sizingImage); + } + } + }, { + key: 'stop', + value: function stop() { + var image = this.image; + + + image.onload = null; + image.onerror = null; + image.parentNode.removeChild(image); + this.image = null; + } + }, { + key: 'build', + value: function build() { + if (!this.sized || this.ready) { + return; + } + + var element = this.element, + options = this.options, + image = this.image; + + // Create cropper elements + + var container = element.parentNode; + var template = document.createElement('div'); + + template.innerHTML = TEMPLATE; + + var cropper = template.querySelector('.' + NAMESPACE + '-container'); + var canvas = cropper.querySelector('.' + NAMESPACE + '-canvas'); + var dragBox = cropper.querySelector('.' + NAMESPACE + '-drag-box'); + var cropBox = cropper.querySelector('.' + NAMESPACE + '-crop-box'); + var face = cropBox.querySelector('.' + NAMESPACE + '-face'); + + this.container = container; + this.cropper = cropper; + this.canvas = canvas; + this.dragBox = dragBox; + this.cropBox = cropBox; + this.viewBox = cropper.querySelector('.' + NAMESPACE + '-view-box'); + this.face = face; + + canvas.appendChild(image); + + // Hide the original image + addClass(element, CLASS_HIDDEN); + + // Inserts the cropper after to the current image + container.insertBefore(cropper, element.nextSibling); + + // Show the image if is hidden + if (!this.isImg) { + removeClass(image, CLASS_HIDE); + } + + this.initPreview(); + this.bind(); + + options.aspectRatio = Math.max(0, options.aspectRatio) || NaN; + options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0; + + addClass(cropBox, CLASS_HIDDEN); + + if (!options.guides) { + addClass(cropBox.getElementsByClassName(NAMESPACE + '-dashed'), CLASS_HIDDEN); + } + + if (!options.center) { + addClass(cropBox.getElementsByClassName(NAMESPACE + '-center'), CLASS_HIDDEN); + } + + if (options.background) { + addClass(cropper, NAMESPACE + '-bg'); + } + + if (!options.highlight) { + addClass(face, CLASS_INVISIBLE); + } + + if (options.cropBoxMovable) { + addClass(face, CLASS_MOVE); + setData(face, DATA_ACTION, ACTION_ALL); + } + + if (!options.cropBoxResizable) { + addClass(cropBox.getElementsByClassName(NAMESPACE + '-line'), CLASS_HIDDEN); + addClass(cropBox.getElementsByClassName(NAMESPACE + '-point'), CLASS_HIDDEN); + } + + this.render(); + this.ready = true; + this.setDragMode(options.dragMode); + + if (options.autoCrop) { + this.crop(); + } + + this.setData(options.data); + + if (isFunction(options.ready)) { + addListener(element, EVENT_READY, options.ready, { + once: true + }); + } + + dispatchEvent(element, EVENT_READY); + } + }, { + key: 'unbuild', + value: function unbuild() { + if (!this.ready) { + return; + } + + this.ready = false; + this.unbind(); + this.resetPreview(); + this.cropper.parentNode.removeChild(this.cropper); + removeClass(this.element, CLASS_HIDDEN); + } + }, { + key: 'uncreate', + value: function uncreate() { + var element = this.element; + + + if (this.ready) { + this.unbuild(); + this.ready = false; + this.cropped = false; + } else if (this.sizing) { + this.sizingImage.onload = null; + this.sizing = false; + this.sized = false; + } else if (this.reloading) { + this.xhr.abort(); + } else if (this.isImg) { + if (element.complete) { + clearTimeout(this.timeout); + } else { + removeListener(element, EVENT_LOAD, this.onStart); + } + } else if (this.image) { + this.stop(); + } + } + + /** + * Get the no conflict cropper class. + * @returns {Cropper} The cropper class. + */ + + }], [{ + key: 'noConflict', + value: function noConflict() { + window.Cropper = AnotherCropper; + return Cropper; + } + + /** + * Change the default options. + * @param {Object} options - The new default options. + */ + + }, { + key: 'setDefaults', + value: function setDefaults(options) { + assign(DEFAULTS, isPlainObject(options) && options); + } + }]); + return Cropper; +}(); + +assign(Cropper.prototype, render, preview, events, handlers, change, methods); + +if ($.fn) { + var AnotherCropper$1 = $.fn.cropper; + var NAMESPACE$1 = 'cropper'; + + $.fn.cropper = function jQueryCropper(option) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var result = void 0; + + this.each(function (i, element) { + var $element = $(element); + var isDestroy = option === 'destroy'; + var cropper = $element.data(NAMESPACE$1); + + if (!cropper) { + if (isDestroy) { + return; + } + + var options = $.extend({}, $element.data(), $.isPlainObject(option) && option); + + cropper = new Cropper(element, options); + $element.data(NAMESPACE$1, cropper); + } + + if (typeof option === 'string') { + var fn = cropper[option]; + + if ($.isFunction(fn)) { + result = fn.apply(cropper, args); + + if (result === cropper) { + result = undefined; + } + + if (isDestroy) { + $element.removeData(NAMESPACE$1); + } + } + } + }); + + return result !== undefined ? result : this; + }; + + $.fn.cropper.Constructor = Cropper; + $.fn.cropper.setDefaults = Cropper.setDefaults; + $.fn.cropper.noConflict = function noConflict() { + $.fn.cropper = AnotherCropper$1; + return this; + }; +} diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.css b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.css new file mode 100644 index 0000000..b5b8b41 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.css @@ -0,0 +1,305 @@ +/*! + * Cropper v4.0.0 + * https://github.com/fengyuanchen/cropper + * + * Copyright (c) 2014-2018 Chen Fengyuan + * Released under the MIT license + * + * Date: 2018-04-01T06:26:32.417Z + */ + +.cropper-container { + direction: ltr; + font-size: 0; + line-height: 0; + position: relative; + -ms-touch-action: none; + touch-action: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.cropper-container img {/*Avoid margin top issue (Occur only when margin-top <= -height) + */ + display: block; + height: 100%; + image-orientation: 0deg; + max-height: none !important; + max-width: none !important; + min-height: 0 !important; + min-width: 0 !important; + width: 100%; +} + +.cropper-wrap-box, +.cropper-canvas, +.cropper-drag-box, +.cropper-crop-box, +.cropper-modal { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.cropper-wrap-box, +.cropper-canvas { + overflow: hidden; +} + +.cropper-drag-box { + background-color: #fff; + opacity: 0; +} + +.cropper-modal { + background-color: #000; + opacity: .5; +} + +.cropper-view-box { + display: block; + height: 100%; + outline-color: rgba(51, 153, 255, 0.75); + outline: 1px solid #39f; + overflow: hidden; + width: 100%; +} + +.cropper-dashed { + border: 0 dashed #eee; + display: block; + opacity: .5; + position: absolute; +} + +.cropper-dashed.dashed-h { + border-bottom-width: 1px; + border-top-width: 1px; + height: 33.33333%; + left: 0; + top: 33.33333%; + width: 100%; +} + +.cropper-dashed.dashed-v { + border-left-width: 1px; + border-right-width: 1px; + height: 100%; + left: 33.33333%; + top: 0; + width: 33.33333%; +} + +.cropper-center { + display: block; + height: 0; + left: 50%; + opacity: .75; + position: absolute; + top: 50%; + width: 0; +} + +.cropper-center:before, +.cropper-center:after { + background-color: #eee; + content: ' '; + display: block; + position: absolute; +} + +.cropper-center:before { + height: 1px; + left: -3px; + top: 0; + width: 7px; +} + +.cropper-center:after { + height: 7px; + left: 0; + top: -3px; + width: 1px; +} + +.cropper-face, +.cropper-line, +.cropper-point { + display: block; + height: 100%; + opacity: .1; + position: absolute; + width: 100%; +} + +.cropper-face { + background-color: #fff; + left: 0; + top: 0; +} + +.cropper-line { + background-color: #39f; +} + +.cropper-line.line-e { + cursor: ew-resize; + right: -3px; + top: 0; + width: 5px; +} + +.cropper-line.line-n { + cursor: ns-resize; + height: 5px; + left: 0; + top: -3px; +} + +.cropper-line.line-w { + cursor: ew-resize; + left: -3px; + top: 0; + width: 5px; +} + +.cropper-line.line-s { + bottom: -3px; + cursor: ns-resize; + height: 5px; + left: 0; +} + +.cropper-point { + background-color: #39f; + height: 5px; + opacity: .75; + width: 5px; +} + +.cropper-point.point-e { + cursor: ew-resize; + margin-top: -3px; + right: -3px; + top: 50%; +} + +.cropper-point.point-n { + cursor: ns-resize; + left: 50%; + margin-left: -3px; + top: -3px; +} + +.cropper-point.point-w { + cursor: ew-resize; + left: -3px; + margin-top: -3px; + top: 50%; +} + +.cropper-point.point-s { + bottom: -3px; + cursor: s-resize; + left: 50%; + margin-left: -3px; +} + +.cropper-point.point-ne { + cursor: nesw-resize; + right: -3px; + top: -3px; +} + +.cropper-point.point-nw { + cursor: nwse-resize; + left: -3px; + top: -3px; +} + +.cropper-point.point-sw { + bottom: -3px; + cursor: nesw-resize; + left: -3px; +} + +.cropper-point.point-se { + bottom: -3px; + cursor: nwse-resize; + height: 20px; + opacity: 1; + right: -3px; + width: 20px; +} + +@media (min-width: 768px) { + .cropper-point.point-se { + height: 15px; + width: 15px; + } +} + +@media (min-width: 992px) { + .cropper-point.point-se { + height: 10px; + width: 10px; + } +} + +@media (min-width: 1200px) { + .cropper-point.point-se { + height: 5px; + opacity: .75; + width: 5px; + } +} + +.cropper-point.point-se:before { + background-color: #39f; + bottom: -50%; + content: ' '; + display: block; + height: 200%; + opacity: 0; + position: absolute; + right: -50%; + width: 200%; +} + +.cropper-invisible { + opacity: 0; +} + +.cropper-bg { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC'); +} + +.cropper-hide { + display: block; + height: 0; + position: absolute; + width: 0; +} + +.cropper-hidden { + display: none !important; +} + +.cropper-move { + cursor: move; +} + +.cropper-crop { + cursor: crosshair; +} + +.cropper-disabled .cropper-drag-box, +.cropper-disabled .cropper-face, +.cropper-disabled .cropper-line, +.cropper-disabled .cropper-point { + cursor: not-allowed; +} diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.esm.js b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.esm.js new file mode 100644 index 0000000..758c2df --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.esm.js @@ -0,0 +1,3753 @@ +/*! + * Cropper v4.0.0 + * https://github.com/fengyuanchen/cropper + * + * Copyright (c) 2014-2018 Chen Fengyuan + * Released under the MIT license + * + * Date: 2018-04-01T06:27:27.267Z + */ + +import $ from 'jquery'; + +var IN_BROWSER = typeof window !== 'undefined'; +var WINDOW = IN_BROWSER ? window : {}; +var NAMESPACE = 'cropper'; + +// Actions +var ACTION_ALL = 'all'; +var ACTION_CROP = 'crop'; +var ACTION_MOVE = 'move'; +var ACTION_ZOOM = 'zoom'; +var ACTION_EAST = 'e'; +var ACTION_WEST = 'w'; +var ACTION_SOUTH = 's'; +var ACTION_NORTH = 'n'; +var ACTION_NORTH_EAST = 'ne'; +var ACTION_NORTH_WEST = 'nw'; +var ACTION_SOUTH_EAST = 'se'; +var ACTION_SOUTH_WEST = 'sw'; + +// Classes +var CLASS_CROP = NAMESPACE + '-crop'; +var CLASS_DISABLED = NAMESPACE + '-disabled'; +var CLASS_HIDDEN = NAMESPACE + '-hidden'; +var CLASS_HIDE = NAMESPACE + '-hide'; +var CLASS_INVISIBLE = NAMESPACE + '-invisible'; +var CLASS_MODAL = NAMESPACE + '-modal'; +var CLASS_MOVE = NAMESPACE + '-move'; + +// Data keys +var DATA_ACTION = 'action'; +var DATA_PREVIEW = 'preview'; + +// Drag modes +var DRAG_MODE_CROP = 'crop'; +var DRAG_MODE_MOVE = 'move'; +var DRAG_MODE_NONE = 'none'; + +// Events +var EVENT_CROP = 'crop'; +var EVENT_CROP_END = 'cropend'; +var EVENT_CROP_MOVE = 'cropmove'; +var EVENT_CROP_START = 'cropstart'; +var EVENT_DBLCLICK = 'dblclick'; +var EVENT_LOAD = 'load'; +var EVENT_POINTER_DOWN = WINDOW.PointerEvent ? 'pointerdown' : 'touchstart mousedown'; +var EVENT_POINTER_MOVE = WINDOW.PointerEvent ? 'pointermove' : 'touchmove mousemove'; +var EVENT_POINTER_UP = WINDOW.PointerEvent ? 'pointerup pointercancel' : 'touchend touchcancel mouseup'; +var EVENT_READY = 'ready'; +var EVENT_RESIZE = 'resize'; +var EVENT_WHEEL = 'wheel mousewheel DOMMouseScroll'; +var EVENT_ZOOM = 'zoom'; + +// RegExps +var REGEXP_ACTIONS = /^(?:e|w|s|n|se|sw|ne|nw|all|crop|move|zoom)$/; +var REGEXP_DATA_URL = /^data:/; +var REGEXP_DATA_URL_JPEG = /^data:image\/jpeg;base64,/; +var REGEXP_TAG_NAME = /^(?:img|canvas)$/i; + +var DEFAULTS = { + // Define the view mode of the cropper + viewMode: 0, // 0, 1, 2, 3 + + // Define the dragging mode of the cropper + dragMode: DRAG_MODE_CROP, // 'crop', 'move' or 'none' + + // Define the aspect ratio of the crop box + aspectRatio: NaN, + + // An object with the previous cropping result data + data: null, + + // A selector for adding extra containers to preview + preview: '', + + // Re-render the cropper when resize the window + responsive: true, + + // Restore the cropped area after resize the window + restore: true, + + // Check if the current image is a cross-origin image + checkCrossOrigin: true, + + // Check the current image's Exif Orientation information + checkOrientation: true, + + // Show the black modal + modal: true, + + // Show the dashed lines for guiding + guides: true, + + // Show the center indicator for guiding + center: true, + + // Show the white modal to highlight the crop box + highlight: true, + + // Show the grid background + background: true, + + // Enable to crop the image automatically when initialize + autoCrop: true, + + // Define the percentage of automatic cropping area when initializes + autoCropArea: 0.8, + + // Enable to move the image + movable: true, + + // Enable to rotate the image + rotatable: true, + + // Enable to scale the image + scalable: true, + + // Enable to zoom the image + zoomable: true, + + // Enable to zoom the image by dragging touch + zoomOnTouch: true, + + // Enable to zoom the image by wheeling mouse + zoomOnWheel: true, + + // Define zoom ratio when zoom the image by wheeling mouse + wheelZoomRatio: 0.1, + + // Enable to move the crop box + cropBoxMovable: true, + + // Enable to resize the crop box + cropBoxResizable: true, + + // Toggle drag mode between "crop" and "move" when click twice on the cropper + toggleDragModeOnDblclick: true, + + // Size limitation + minCanvasWidth: 0, + minCanvasHeight: 0, + minCropBoxWidth: 0, + minCropBoxHeight: 0, + minContainerWidth: 200, + minContainerHeight: 100, + + // Shortcuts of events + ready: null, + cropstart: null, + cropmove: null, + cropend: null, + crop: null, + zoom: null +}; + +var TEMPLATE = '
' + '
' + '
' + '
' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
'; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + +var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } +}; + +/** + * Check if the given value is not a number. + */ +var isNaN = Number.isNaN || WINDOW.isNaN; + +/** + * Check if the given value is a number. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a number, else `false`. + */ +function isNumber(value) { + return typeof value === 'number' && !isNaN(value); +} + +/** + * Check if the given value is undefined. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is undefined, else `false`. + */ +function isUndefined(value) { + return typeof value === 'undefined'; +} + +/** + * Check if the given value is an object. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is an object, else `false`. + */ +function isObject(value) { + return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value !== null; +} + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * Check if the given value is a plain object. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a plain object, else `false`. + */ + +function isPlainObject(value) { + if (!isObject(value)) { + return false; + } + + try { + var _constructor = value.constructor; + var prototype = _constructor.prototype; + + + return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf'); + } catch (e) { + return false; + } +} + +/** + * Check if the given value is a function. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a function, else `false`. + */ +function isFunction(value) { + return typeof value === 'function'; +} + +/** + * Iterate the given data. + * @param {*} data - The data to iterate. + * @param {Function} callback - The process function for each element. + * @returns {*} The original data. + */ +function forEach(data, callback) { + if (data && isFunction(callback)) { + if (Array.isArray(data) || isNumber(data.length) /* array-like */) { + var length = data.length; + + var i = void 0; + + for (i = 0; i < length; i += 1) { + if (callback.call(data, data[i], i, data) === false) { + break; + } + } + } else if (isObject(data)) { + Object.keys(data).forEach(function (key) { + callback.call(data, data[key], key, data); + }); + } + } + + return data; +} + +/** + * Extend the given object. + * @param {*} obj - The object to be extended. + * @param {*} args - The rest objects which will be merged to the first object. + * @returns {Object} The extended object. + */ +var assign = Object.assign || function assign(obj) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (isObject(obj) && args.length > 0) { + args.forEach(function (arg) { + if (isObject(arg)) { + Object.keys(arg).forEach(function (key) { + obj[key] = arg[key]; + }); + } + }); + } + + return obj; +}; + +var REGEXP_DECIMALS = /\.\d*(?:0|9){12}\d*$/i; + +/** + * Normalize decimal number. + * Check out {@link http://0.30000000000000004.com/} + * @param {number} value - The value to normalize. + * @param {number} [times=100000000000] - The times for normalizing. + * @returns {number} Returns the normalized number. + */ +function normalizeDecimalNumber(value) { + var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000; + + return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value; +} + +var REGEXP_SUFFIX = /^(?:width|height|left|top|marginLeft|marginTop)$/; + +/** + * Apply styles to the given element. + * @param {Element} element - The target element. + * @param {Object} styles - The styles for applying. + */ +function setStyle(element, styles) { + var style = element.style; + + + forEach(styles, function (value, property) { + if (REGEXP_SUFFIX.test(property) && isNumber(value)) { + value += 'px'; + } + + style[property] = value; + }); +} + +/** + * Check if the given element has a special class. + * @param {Element} element - The element to check. + * @param {string} value - The class to search. + * @returns {boolean} Returns `true` if the special class was found. + */ +function hasClass(element, value) { + return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1; +} + +/** + * Add classes to the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be added. + */ +function addClass(element, value) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + addClass(elem, value); + }); + return; + } + + if (element.classList) { + element.classList.add(value); + return; + } + + var className = element.className.trim(); + + if (!className) { + element.className = value; + } else if (className.indexOf(value) < 0) { + element.className = className + ' ' + value; + } +} + +/** + * Remove classes from the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be removed. + */ +function removeClass(element, value) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + removeClass(elem, value); + }); + return; + } + + if (element.classList) { + element.classList.remove(value); + return; + } + + if (element.className.indexOf(value) >= 0) { + element.className = element.className.replace(value, ''); + } +} + +/** + * Add or remove classes from the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be toggled. + * @param {boolean} added - Add only. + */ +function toggleClass(element, value, added) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + toggleClass(elem, value, added); + }); + return; + } + + // IE10-11 doesn't support the second parameter of `classList.toggle` + if (added) { + addClass(element, value); + } else { + removeClass(element, value); + } +} + +var REGEXP_HYPHENATE = /([a-z\d])([A-Z])/g; + +/** + * Transform the given string from camelCase to kebab-case + * @param {string} value - The value to transform. + * @returns {string} The transformed value. + */ +function hyphenate(value) { + return value.replace(REGEXP_HYPHENATE, '$1-$2').toLowerCase(); +} + +/** + * Get data from the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to get. + * @returns {string} The data value. + */ +function getData(element, name) { + if (isObject(element[name])) { + return element[name]; + } else if (element.dataset) { + return element.dataset[name]; + } + + return element.getAttribute('data-' + hyphenate(name)); +} + +/** + * Set data to the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to set. + * @param {string} data - The data value. + */ +function setData(element, name, data) { + if (isObject(data)) { + element[name] = data; + } else if (element.dataset) { + element.dataset[name] = data; + } else { + element.setAttribute('data-' + hyphenate(name), data); + } +} + +/** + * Remove data from the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to remove. + */ +function removeData(element, name) { + if (isObject(element[name])) { + try { + delete element[name]; + } catch (e) { + element[name] = undefined; + } + } else if (element.dataset) { + // #128 Safari not allows to delete dataset property + try { + delete element.dataset[name]; + } catch (e) { + element.dataset[name] = undefined; + } + } else { + element.removeAttribute('data-' + hyphenate(name)); + } +} + +var REGEXP_SPACES = /\s\s*/; +var onceSupported = function () { + var supported = false; + + if (IN_BROWSER) { + var once = false; + var listener = function listener() {}; + var options = Object.defineProperty({}, 'once', { + get: function get$$1() { + supported = true; + return once; + }, + + + /** + * This setter can fix a `TypeError` in strict mode + * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only} + * @param {boolean} value - The value to set + */ + set: function set$$1(value) { + once = value; + } + }); + + WINDOW.addEventListener('test', listener, options); + WINDOW.removeEventListener('test', listener, options); + } + + return supported; +}(); + +/** + * Remove event listener from the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Function} listener - The event listener. + * @param {Object} options - The event options. + */ +function removeListener(element, type, listener) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + var handler = listener; + + type.trim().split(REGEXP_SPACES).forEach(function (event) { + if (!onceSupported) { + var listeners = element.listeners; + + + if (listeners && listeners[event] && listeners[event][listener]) { + handler = listeners[event][listener]; + delete listeners[event][listener]; + + if (Object.keys(listeners[event]).length === 0) { + delete listeners[event]; + } + + if (Object.keys(listeners).length === 0) { + delete element.listeners; + } + } + } + + element.removeEventListener(event, handler, options); + }); +} + +/** + * Add event listener to the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Function} listener - The event listener. + * @param {Object} options - The event options. + */ +function addListener(element, type, listener) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + var _handler = listener; + + type.trim().split(REGEXP_SPACES).forEach(function (event) { + if (options.once && !onceSupported) { + var _element$listeners = element.listeners, + listeners = _element$listeners === undefined ? {} : _element$listeners; + + + _handler = function handler() { + for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + delete listeners[event][listener]; + element.removeEventListener(event, _handler, options); + listener.apply(element, args); + }; + + if (!listeners[event]) { + listeners[event] = {}; + } + + if (listeners[event][listener]) { + element.removeEventListener(event, listeners[event][listener], options); + } + + listeners[event][listener] = _handler; + element.listeners = listeners; + } + + element.addEventListener(event, _handler, options); + }); +} + +/** + * Dispatch event on the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Object} data - The additional event data. + * @returns {boolean} Indicate if the event is default prevented or not. + */ +function dispatchEvent(element, type, data) { + var event = void 0; + + // Event and CustomEvent on IE9-11 are global objects, not constructors + if (isFunction(Event) && isFunction(CustomEvent)) { + event = new CustomEvent(type, { + detail: data, + bubbles: true, + cancelable: true + }); + } else { + event = document.createEvent('CustomEvent'); + event.initCustomEvent(type, true, true, data); + } + + return element.dispatchEvent(event); +} + +/** + * Get the offset base on the document. + * @param {Element} element - The target element. + * @returns {Object} The offset data. + */ +function getOffset(element) { + var box = element.getBoundingClientRect(); + + return { + left: box.left + (window.pageXOffset - document.documentElement.clientLeft), + top: box.top + (window.pageYOffset - document.documentElement.clientTop) + }; +} + +var location = WINDOW.location; + +var REGEXP_ORIGINS = /^(https?:)\/\/([^:/?#]+):?(\d*)/i; + +/** + * Check if the given URL is a cross origin URL. + * @param {string} url - The target URL. + * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`. + */ +function isCrossOriginURL(url) { + var parts = url.match(REGEXP_ORIGINS); + + return parts && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port); +} + +/** + * Add timestamp to the given URL. + * @param {string} url - The target URL. + * @returns {string} The result URL. + */ +function addTimestamp(url) { + var timestamp = 'timestamp=' + new Date().getTime(); + + return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp; +} + +/** + * Get transforms base on the given object. + * @param {Object} obj - The target object. + * @returns {string} A string contains transform values. + */ +function getTransforms(_ref) { + var rotate = _ref.rotate, + scaleX = _ref.scaleX, + scaleY = _ref.scaleY, + translateX = _ref.translateX, + translateY = _ref.translateY; + + var values = []; + + if (isNumber(translateX) && translateX !== 0) { + values.push('translateX(' + translateX + 'px)'); + } + + if (isNumber(translateY) && translateY !== 0) { + values.push('translateY(' + translateY + 'px)'); + } + + // Rotate should come first before scale to match orientation transform + if (isNumber(rotate) && rotate !== 0) { + values.push('rotate(' + rotate + 'deg)'); + } + + if (isNumber(scaleX) && scaleX !== 1) { + values.push('scaleX(' + scaleX + ')'); + } + + if (isNumber(scaleY) && scaleY !== 1) { + values.push('scaleY(' + scaleY + ')'); + } + + var transform = values.length ? values.join(' ') : 'none'; + + return { + WebkitTransform: transform, + msTransform: transform, + transform: transform + }; +} + +/** + * Get the max ratio of a group of pointers. + * @param {string} pointers - The target pointers. + * @returns {number} The result ratio. + */ +function getMaxZoomRatio(pointers) { + var pointers2 = assign({}, pointers); + var ratios = []; + + forEach(pointers, function (pointer, pointerId) { + delete pointers2[pointerId]; + + forEach(pointers2, function (pointer2) { + var x1 = Math.abs(pointer.startX - pointer2.startX); + var y1 = Math.abs(pointer.startY - pointer2.startY); + var x2 = Math.abs(pointer.endX - pointer2.endX); + var y2 = Math.abs(pointer.endY - pointer2.endY); + var z1 = Math.sqrt(x1 * x1 + y1 * y1); + var z2 = Math.sqrt(x2 * x2 + y2 * y2); + var ratio = (z2 - z1) / z1; + + ratios.push(ratio); + }); + }); + + ratios.sort(function (a, b) { + return Math.abs(a) < Math.abs(b); + }); + + return ratios[0]; +} + +/** + * Get a pointer from an event object. + * @param {Object} event - The target event object. + * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not. + * @returns {Object} The result pointer contains start and/or end point coordinates. + */ +function getPointer(_ref2, endOnly) { + var pageX = _ref2.pageX, + pageY = _ref2.pageY; + + var end = { + endX: pageX, + endY: pageY + }; + + return endOnly ? end : assign({ + startX: pageX, + startY: pageY + }, end); +} + +/** + * Get the center point coordinate of a group of pointers. + * @param {Object} pointers - The target pointers. + * @returns {Object} The center point coordinate. + */ +function getPointersCenter(pointers) { + var pageX = 0; + var pageY = 0; + var count = 0; + + forEach(pointers, function (_ref3) { + var startX = _ref3.startX, + startY = _ref3.startY; + + pageX += startX; + pageY += startY; + count += 1; + }); + + pageX /= count; + pageY /= count; + + return { + pageX: pageX, + pageY: pageY + }; +} + +/** + * Check if the given value is a finite number. + */ +var isFinite = Number.isFinite || WINDOW.isFinite; + +/** + * Get the max sizes in a rectangle under the given aspect ratio. + * @param {Object} data - The original sizes. + * @param {string} [type='contain'] - The adjust type. + * @returns {Object} The result sizes. + */ +function getAdjustedSizes(_ref4) // or 'cover' +{ + var aspectRatio = _ref4.aspectRatio, + height = _ref4.height, + width = _ref4.width; + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain'; + + var isValidNumber = function isValidNumber(value) { + return isFinite(value) && value > 0; + }; + + if (isValidNumber(width) && isValidNumber(height)) { + var adjustedWidth = height * aspectRatio; + + if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) { + height = width / aspectRatio; + } else { + width = height * aspectRatio; + } + } else if (isValidNumber(width)) { + height = width / aspectRatio; + } else if (isValidNumber(height)) { + width = height * aspectRatio; + } + + return { + width: width, + height: height + }; +} + +/** + * Get the new sizes of a rectangle after rotated. + * @param {Object} data - The original sizes. + * @returns {Object} The result sizes. + */ +function getRotatedSizes(_ref5) { + var width = _ref5.width, + height = _ref5.height, + degree = _ref5.degree; + + degree = Math.abs(degree) % 180; + + if (degree === 90) { + return { + width: height, + height: width + }; + } + + var arc = degree % 90 * Math.PI / 180; + var sinArc = Math.sin(arc); + var cosArc = Math.cos(arc); + var newWidth = width * cosArc + height * sinArc; + var newHeight = width * sinArc + height * cosArc; + + return degree > 90 ? { + width: newHeight, + height: newWidth + } : { + width: newWidth, + height: newHeight + }; +} + +/** + * Get a canvas which drew the given image. + * @param {HTMLImageElement} image - The image for drawing. + * @param {Object} imageData - The image data. + * @param {Object} canvasData - The canvas data. + * @param {Object} options - The options. + * @returns {HTMLCanvasElement} The result canvas. + */ +function getSourceCanvas(image, _ref6, _ref7, _ref8) { + var imageAspectRatio = _ref6.aspectRatio, + imageNaturalWidth = _ref6.naturalWidth, + imageNaturalHeight = _ref6.naturalHeight, + _ref6$rotate = _ref6.rotate, + rotate = _ref6$rotate === undefined ? 0 : _ref6$rotate, + _ref6$scaleX = _ref6.scaleX, + scaleX = _ref6$scaleX === undefined ? 1 : _ref6$scaleX, + _ref6$scaleY = _ref6.scaleY, + scaleY = _ref6$scaleY === undefined ? 1 : _ref6$scaleY; + var aspectRatio = _ref7.aspectRatio, + naturalWidth = _ref7.naturalWidth, + naturalHeight = _ref7.naturalHeight; + var _ref8$fillColor = _ref8.fillColor, + fillColor = _ref8$fillColor === undefined ? 'transparent' : _ref8$fillColor, + _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled, + imageSmoothingEnabled = _ref8$imageSmoothingE === undefined ? true : _ref8$imageSmoothingE, + _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality, + imageSmoothingQuality = _ref8$imageSmoothingQ === undefined ? 'low' : _ref8$imageSmoothingQ, + _ref8$maxWidth = _ref8.maxWidth, + maxWidth = _ref8$maxWidth === undefined ? Infinity : _ref8$maxWidth, + _ref8$maxHeight = _ref8.maxHeight, + maxHeight = _ref8$maxHeight === undefined ? Infinity : _ref8$maxHeight, + _ref8$minWidth = _ref8.minWidth, + minWidth = _ref8$minWidth === undefined ? 0 : _ref8$minWidth, + _ref8$minHeight = _ref8.minHeight, + minHeight = _ref8$minHeight === undefined ? 0 : _ref8$minHeight; + + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + var maxSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: maxWidth, + height: maxHeight + }); + var minSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: minWidth, + height: minHeight + }, 'cover'); + var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth)); + var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight)); + + // Note: should always use image's natural sizes for drawing as + // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90 + var destMaxSizes = getAdjustedSizes({ + aspectRatio: imageAspectRatio, + width: maxWidth, + height: maxHeight + }); + var destMinSizes = getAdjustedSizes({ + aspectRatio: imageAspectRatio, + width: minWidth, + height: minHeight + }, 'cover'); + var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth)); + var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight)); + var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight]; + + canvas.width = normalizeDecimalNumber(width); + canvas.height = normalizeDecimalNumber(height); + context.fillStyle = fillColor; + context.fillRect(0, 0, width, height); + context.save(); + context.translate(width / 2, height / 2); + context.rotate(rotate * Math.PI / 180); + context.scale(scaleX, scaleY); + context.imageSmoothingEnabled = imageSmoothingEnabled; + context.imageSmoothingQuality = imageSmoothingQuality; + context.drawImage.apply(context, [image].concat(toConsumableArray(params.map(function (param) { + return Math.floor(normalizeDecimalNumber(param)); + })))); + context.restore(); + return canvas; +} + +var fromCharCode = String.fromCharCode; + +/** + * Get string from char code in data view. + * @param {DataView} dataView - The data view for read. + * @param {number} start - The start index. + * @param {number} length - The read length. + * @returns {string} The read result. + */ + +function getStringFromCharCode(dataView, start, length) { + var str = ''; + var i = void 0; + + length += start; + + for (i = start; i < length; i += 1) { + str += fromCharCode(dataView.getUint8(i)); + } + + return str; +} + +var REGEXP_DATA_URL_HEAD = /^data:.*,/; + +/** + * Transform Data URL to array buffer. + * @param {string} dataURL - The Data URL to transform. + * @returns {ArrayBuffer} The result array buffer. + */ +function dataURLToArrayBuffer(dataURL) { + var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, ''); + var binary = atob(base64); + var arrayBuffer = new ArrayBuffer(binary.length); + var uint8 = new Uint8Array(arrayBuffer); + + forEach(uint8, function (value, i) { + uint8[i] = binary.charCodeAt(i); + }); + + return arrayBuffer; +} + +/** + * Transform array buffer to Data URL. + * @param {ArrayBuffer} arrayBuffer - The array buffer to transform. + * @param {string} mimeType - The mime type of the Data URL. + * @returns {string} The result Data URL. + */ +function arrayBufferToDataURL(arrayBuffer, mimeType) { + var uint8 = new Uint8Array(arrayBuffer); + var data = ''; + + // TypedArray.prototype.forEach is not supported in some browsers. + forEach(uint8, function (value) { + data += fromCharCode(value); + }); + + return 'data:' + mimeType + ';base64,' + btoa(data); +} + +/** + * Get orientation value from given array buffer. + * @param {ArrayBuffer} arrayBuffer - The array buffer to read. + * @returns {number} The read orientation value. + */ +function getOrientation(arrayBuffer) { + var dataView = new DataView(arrayBuffer); + var orientation = void 0; + var littleEndian = void 0; + var app1Start = void 0; + var ifdStart = void 0; + + // Only handle JPEG image (start by 0xFFD8) + if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) { + var length = dataView.byteLength; + var offset = 2; + + while (offset < length) { + if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) { + app1Start = offset; + break; + } + + offset += 1; + } + } + + if (app1Start) { + var exifIDCode = app1Start + 4; + var tiffOffset = app1Start + 10; + + if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') { + var endianness = dataView.getUint16(tiffOffset); + + littleEndian = endianness === 0x4949; + + if (littleEndian || endianness === 0x4D4D /* bigEndian */) { + if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) { + var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian); + + if (firstIFDOffset >= 0x00000008) { + ifdStart = tiffOffset + firstIFDOffset; + } + } + } + } + } + + if (ifdStart) { + var _length = dataView.getUint16(ifdStart, littleEndian); + var _offset = void 0; + var i = void 0; + + for (i = 0; i < _length; i += 1) { + _offset = ifdStart + i * 12 + 2; + + if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) { + // 8 is the offset of the current tag's value + _offset += 8; + + // Get the original orientation value + orientation = dataView.getUint16(_offset, littleEndian); + + // Override the orientation with its default value + dataView.setUint16(_offset, 1, littleEndian); + break; + } + } + } + + return orientation; +} + +/** + * Parse Exif Orientation value. + * @param {number} orientation - The orientation to parse. + * @returns {Object} The parsed result. + */ +function parseOrientation(orientation) { + var rotate = 0; + var scaleX = 1; + var scaleY = 1; + + switch (orientation) { + // Flip horizontal + case 2: + scaleX = -1; + break; + + // Rotate left 180° + case 3: + rotate = -180; + break; + + // Flip vertical + case 4: + scaleY = -1; + break; + + // Flip vertical and rotate right 90° + case 5: + rotate = 90; + scaleY = -1; + break; + + // Rotate right 90° + case 6: + rotate = 90; + break; + + // Flip horizontal and rotate right 90° + case 7: + rotate = 90; + scaleX = -1; + break; + + // Rotate left 90° + case 8: + rotate = -90; + break; + + default: + } + + return { + rotate: rotate, + scaleX: scaleX, + scaleY: scaleY + }; +} + +var render = { + render: function render() { + this.initContainer(); + this.initCanvas(); + this.initCropBox(); + this.renderCanvas(); + + if (this.cropped) { + this.renderCropBox(); + } + }, + initContainer: function initContainer() { + var element = this.element, + options = this.options, + container = this.container, + cropper = this.cropper; + + + addClass(cropper, CLASS_HIDDEN); + removeClass(element, CLASS_HIDDEN); + + var containerData = { + width: Math.max(container.offsetWidth, Number(options.minContainerWidth) || 200), + height: Math.max(container.offsetHeight, Number(options.minContainerHeight) || 100) + }; + + this.containerData = containerData; + + setStyle(cropper, { + width: containerData.width, + height: containerData.height + }); + + addClass(element, CLASS_HIDDEN); + removeClass(cropper, CLASS_HIDDEN); + }, + + + // Canvas (image wrapper) + initCanvas: function initCanvas() { + var containerData = this.containerData, + imageData = this.imageData; + var viewMode = this.options.viewMode; + + var rotated = Math.abs(imageData.rotate) % 180 === 90; + var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth; + var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight; + var aspectRatio = naturalWidth / naturalHeight; + var canvasWidth = containerData.width; + var canvasHeight = containerData.height; + + if (containerData.height * aspectRatio > containerData.width) { + if (viewMode === 3) { + canvasWidth = containerData.height * aspectRatio; + } else { + canvasHeight = containerData.width / aspectRatio; + } + } else if (viewMode === 3) { + canvasHeight = containerData.width / aspectRatio; + } else { + canvasWidth = containerData.height * aspectRatio; + } + + var canvasData = { + aspectRatio: aspectRatio, + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + width: canvasWidth, + height: canvasHeight + }; + + canvasData.left = (containerData.width - canvasWidth) / 2; + canvasData.top = (containerData.height - canvasHeight) / 2; + canvasData.oldLeft = canvasData.left; + canvasData.oldTop = canvasData.top; + + this.canvasData = canvasData; + this.limited = viewMode === 1 || viewMode === 2; + this.limitCanvas(true, true); + this.initialImageData = assign({}, imageData); + this.initialCanvasData = assign({}, canvasData); + }, + limitCanvas: function limitCanvas(sizeLimited, positionLimited) { + var options = this.options, + containerData = this.containerData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + var viewMode = options.viewMode; + var aspectRatio = canvasData.aspectRatio; + + var cropped = this.cropped && cropBoxData; + + if (sizeLimited) { + var minCanvasWidth = Number(options.minCanvasWidth) || 0; + var minCanvasHeight = Number(options.minCanvasHeight) || 0; + + if (viewMode > 1) { + minCanvasWidth = Math.max(minCanvasWidth, containerData.width); + minCanvasHeight = Math.max(minCanvasHeight, containerData.height); + + if (viewMode === 3) { + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } else { + minCanvasHeight = minCanvasWidth / aspectRatio; + } + } + } else if (viewMode > 0) { + if (minCanvasWidth) { + minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0); + } else if (minCanvasHeight) { + minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0); + } else if (cropped) { + minCanvasWidth = cropBoxData.width; + minCanvasHeight = cropBoxData.height; + + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } else { + minCanvasHeight = minCanvasWidth / aspectRatio; + } + } + } + + var _getAdjustedSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: minCanvasWidth, + height: minCanvasHeight + }); + + minCanvasWidth = _getAdjustedSizes.width; + minCanvasHeight = _getAdjustedSizes.height; + + + canvasData.minWidth = minCanvasWidth; + canvasData.minHeight = minCanvasHeight; + canvasData.maxWidth = Infinity; + canvasData.maxHeight = Infinity; + } + + if (positionLimited) { + if (viewMode) { + var newCanvasLeft = containerData.width - canvasData.width; + var newCanvasTop = containerData.height - canvasData.height; + + canvasData.minLeft = Math.min(0, newCanvasLeft); + canvasData.minTop = Math.min(0, newCanvasTop); + canvasData.maxLeft = Math.max(0, newCanvasLeft); + canvasData.maxTop = Math.max(0, newCanvasTop); + + if (cropped && this.limited) { + canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width)); + canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height)); + canvasData.maxLeft = cropBoxData.left; + canvasData.maxTop = cropBoxData.top; + + if (viewMode === 2) { + if (canvasData.width >= containerData.width) { + canvasData.minLeft = Math.min(0, newCanvasLeft); + canvasData.maxLeft = Math.max(0, newCanvasLeft); + } + + if (canvasData.height >= containerData.height) { + canvasData.minTop = Math.min(0, newCanvasTop); + canvasData.maxTop = Math.max(0, newCanvasTop); + } + } + } + } else { + canvasData.minLeft = -canvasData.width; + canvasData.minTop = -canvasData.height; + canvasData.maxLeft = containerData.width; + canvasData.maxTop = containerData.height; + } + } + }, + renderCanvas: function renderCanvas(changed, transformed) { + var canvasData = this.canvasData, + imageData = this.imageData; + + + if (transformed) { + var _getRotatedSizes = getRotatedSizes({ + width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1), + height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1), + degree: imageData.rotate || 0 + }), + naturalWidth = _getRotatedSizes.width, + naturalHeight = _getRotatedSizes.height; + + var width = canvasData.width * (naturalWidth / canvasData.naturalWidth); + var height = canvasData.height * (naturalHeight / canvasData.naturalHeight); + + canvasData.left -= (width - canvasData.width) / 2; + canvasData.top -= (height - canvasData.height) / 2; + canvasData.width = width; + canvasData.height = height; + canvasData.aspectRatio = naturalWidth / naturalHeight; + canvasData.naturalWidth = naturalWidth; + canvasData.naturalHeight = naturalHeight; + this.limitCanvas(true, false); + } + + if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) { + canvasData.left = canvasData.oldLeft; + } + + if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) { + canvasData.top = canvasData.oldTop; + } + + canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth); + canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight); + + this.limitCanvas(false, true); + + canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft); + canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop); + canvasData.oldLeft = canvasData.left; + canvasData.oldTop = canvasData.top; + + setStyle(this.canvas, assign({ + width: canvasData.width, + height: canvasData.height + }, getTransforms({ + translateX: canvasData.left, + translateY: canvasData.top + }))); + + this.renderImage(changed); + + if (this.cropped && this.limited) { + this.limitCropBox(true, true); + } + }, + renderImage: function renderImage(changed) { + var canvasData = this.canvasData, + imageData = this.imageData; + + var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth); + var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight); + + assign(imageData, { + width: width, + height: height, + left: (canvasData.width - width) / 2, + top: (canvasData.height - height) / 2 + }); + setStyle(this.image, assign({ + width: imageData.width, + height: imageData.height + }, getTransforms(assign({ + translateX: imageData.left, + translateY: imageData.top + }, imageData)))); + + if (changed) { + this.output(); + } + }, + initCropBox: function initCropBox() { + var options = this.options, + canvasData = this.canvasData; + var aspectRatio = options.aspectRatio; + + var autoCropArea = Number(options.autoCropArea) || 0.8; + var cropBoxData = { + width: canvasData.width, + height: canvasData.height + }; + + if (aspectRatio) { + if (canvasData.height * aspectRatio > canvasData.width) { + cropBoxData.height = cropBoxData.width / aspectRatio; + } else { + cropBoxData.width = cropBoxData.height * aspectRatio; + } + } + + this.cropBoxData = cropBoxData; + this.limitCropBox(true, true); + + // Initialize auto crop area + cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth); + cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); + + // The width/height of auto crop area must large than "minWidth/Height" + cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea); + cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea); + cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2; + cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2; + cropBoxData.oldLeft = cropBoxData.left; + cropBoxData.oldTop = cropBoxData.top; + + this.initialCropBoxData = assign({}, cropBoxData); + }, + limitCropBox: function limitCropBox(sizeLimited, positionLimited) { + var options = this.options, + containerData = this.containerData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData, + limited = this.limited; + var aspectRatio = options.aspectRatio; + + + if (sizeLimited) { + var minCropBoxWidth = Number(options.minCropBoxWidth) || 0; + var minCropBoxHeight = Number(options.minCropBoxHeight) || 0; + var maxCropBoxWidth = Math.min(containerData.width, limited ? canvasData.width : containerData.width); + var maxCropBoxHeight = Math.min(containerData.height, limited ? canvasData.height : containerData.height); + + // The min/maxCropBoxWidth/Height must be less than container's width/height + minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width); + minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height); + + if (aspectRatio) { + if (minCropBoxWidth && minCropBoxHeight) { + if (minCropBoxHeight * aspectRatio > minCropBoxWidth) { + minCropBoxHeight = minCropBoxWidth / aspectRatio; + } else { + minCropBoxWidth = minCropBoxHeight * aspectRatio; + } + } else if (minCropBoxWidth) { + minCropBoxHeight = minCropBoxWidth / aspectRatio; + } else if (minCropBoxHeight) { + minCropBoxWidth = minCropBoxHeight * aspectRatio; + } + + if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) { + maxCropBoxHeight = maxCropBoxWidth / aspectRatio; + } else { + maxCropBoxWidth = maxCropBoxHeight * aspectRatio; + } + } + + // The minWidth/Height must be less than maxWidth/Height + cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth); + cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight); + cropBoxData.maxWidth = maxCropBoxWidth; + cropBoxData.maxHeight = maxCropBoxHeight; + } + + if (positionLimited) { + if (limited) { + cropBoxData.minLeft = Math.max(0, canvasData.left); + cropBoxData.minTop = Math.max(0, canvasData.top); + cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width; + cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height; + } else { + cropBoxData.minLeft = 0; + cropBoxData.minTop = 0; + cropBoxData.maxLeft = containerData.width - cropBoxData.width; + cropBoxData.maxTop = containerData.height - cropBoxData.height; + } + } + }, + renderCropBox: function renderCropBox() { + var options = this.options, + containerData = this.containerData, + cropBoxData = this.cropBoxData; + + + if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) { + cropBoxData.left = cropBoxData.oldLeft; + } + + if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) { + cropBoxData.top = cropBoxData.oldTop; + } + + cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth); + cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); + + this.limitCropBox(false, true); + + cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft); + cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop); + cropBoxData.oldLeft = cropBoxData.left; + cropBoxData.oldTop = cropBoxData.top; + + if (options.movable && options.cropBoxMovable) { + // Turn to move the canvas when the crop box is equal to the container + setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL); + } + + setStyle(this.cropBox, assign({ + width: cropBoxData.width, + height: cropBoxData.height + }, getTransforms({ + translateX: cropBoxData.left, + translateY: cropBoxData.top + }))); + + if (this.cropped && this.limited) { + this.limitCanvas(true, true); + } + + if (!this.disabled) { + this.output(); + } + }, + output: function output() { + this.preview(); + dispatchEvent(this.element, EVENT_CROP, this.getData()); + } +}; + +var preview = { + initPreview: function initPreview() { + var crossOrigin = this.crossOrigin; + var preview = this.options.preview; + + var url = crossOrigin ? this.crossOriginUrl : this.url; + var image = document.createElement('img'); + + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + + image.src = url; + this.viewBox.appendChild(image); + this.viewBoxImage = image; + + if (!preview) { + return; + } + + var previews = preview; + + if (typeof preview === 'string') { + previews = this.element.ownerDocument.querySelectorAll(preview); + } else if (preview.querySelector) { + previews = [preview]; + } + + this.previews = previews; + + forEach(previews, function (el) { + var img = document.createElement('img'); + + // Save the original size for recover + setData(el, DATA_PREVIEW, { + width: el.offsetWidth, + height: el.offsetHeight, + html: el.innerHTML + }); + + if (crossOrigin) { + img.crossOrigin = crossOrigin; + } + + img.src = url; + + /** + * Override img element styles + * Add `display:block` to avoid margin top issue + * Add `height:auto` to override `height` attribute on IE8 + * (Occur only when margin-top <= -height) + */ + img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;"'; + + el.innerHTML = ''; + el.appendChild(img); + }); + }, + resetPreview: function resetPreview() { + forEach(this.previews, function (element) { + var data = getData(element, DATA_PREVIEW); + + setStyle(element, { + width: data.width, + height: data.height + }); + + element.innerHTML = data.html; + removeData(element, DATA_PREVIEW); + }); + }, + preview: function preview() { + var imageData = this.imageData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + var cropBoxWidth = cropBoxData.width, + cropBoxHeight = cropBoxData.height; + var width = imageData.width, + height = imageData.height; + + var left = cropBoxData.left - canvasData.left - imageData.left; + var top = cropBoxData.top - canvasData.top - imageData.top; + + if (!this.cropped || this.disabled) { + return; + } + + setStyle(this.viewBoxImage, assign({ + width: width, + height: height + }, getTransforms(assign({ + translateX: -left, + translateY: -top + }, imageData)))); + + forEach(this.previews, function (element) { + var data = getData(element, DATA_PREVIEW); + var originalWidth = data.width; + var originalHeight = data.height; + var newWidth = originalWidth; + var newHeight = originalHeight; + var ratio = 1; + + if (cropBoxWidth) { + ratio = originalWidth / cropBoxWidth; + newHeight = cropBoxHeight * ratio; + } + + if (cropBoxHeight && newHeight > originalHeight) { + ratio = originalHeight / cropBoxHeight; + newWidth = cropBoxWidth * ratio; + newHeight = originalHeight; + } + + setStyle(element, { + width: newWidth, + height: newHeight + }); + + setStyle(element.getElementsByTagName('img')[0], assign({ + width: width * ratio, + height: height * ratio + }, getTransforms(assign({ + translateX: -left * ratio, + translateY: -top * ratio + }, imageData)))); + }); + } +}; + +var events = { + bind: function bind() { + var element = this.element, + options = this.options, + cropper = this.cropper; + + + if (isFunction(options.cropstart)) { + addListener(element, EVENT_CROP_START, options.cropstart); + } + + if (isFunction(options.cropmove)) { + addListener(element, EVENT_CROP_MOVE, options.cropmove); + } + + if (isFunction(options.cropend)) { + addListener(element, EVENT_CROP_END, options.cropend); + } + + if (isFunction(options.crop)) { + addListener(element, EVENT_CROP, options.crop); + } + + if (isFunction(options.zoom)) { + addListener(element, EVENT_ZOOM, options.zoom); + } + + addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this)); + + if (options.zoomable && options.zoomOnWheel) { + addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this)); + } + + if (options.toggleDragModeOnDblclick) { + addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this)); + } + + addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this)); + addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this)); + + if (options.responsive) { + addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this)); + } + }, + unbind: function unbind() { + var element = this.element, + options = this.options, + cropper = this.cropper; + + + if (isFunction(options.cropstart)) { + removeListener(element, EVENT_CROP_START, options.cropstart); + } + + if (isFunction(options.cropmove)) { + removeListener(element, EVENT_CROP_MOVE, options.cropmove); + } + + if (isFunction(options.cropend)) { + removeListener(element, EVENT_CROP_END, options.cropend); + } + + if (isFunction(options.crop)) { + removeListener(element, EVENT_CROP, options.crop); + } + + if (isFunction(options.zoom)) { + removeListener(element, EVENT_ZOOM, options.zoom); + } + + removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart); + + if (options.zoomable && options.zoomOnWheel) { + removeListener(cropper, EVENT_WHEEL, this.onWheel); + } + + if (options.toggleDragModeOnDblclick) { + removeListener(cropper, EVENT_DBLCLICK, this.onDblclick); + } + + removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove); + removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd); + + if (options.responsive) { + removeListener(window, EVENT_RESIZE, this.onResize); + } + } +}; + +var handlers = { + resize: function resize() { + var options = this.options, + container = this.container, + containerData = this.containerData; + + var minContainerWidth = Number(options.minContainerWidth) || 200; + var minContainerHeight = Number(options.minContainerHeight) || 100; + + if (this.disabled || containerData.width <= minContainerWidth || containerData.height <= minContainerHeight) { + return; + } + + var ratio = container.offsetWidth / containerData.width; + + // Resize when width changed or height changed + if (ratio !== 1 || container.offsetHeight !== containerData.height) { + var canvasData = void 0; + var cropBoxData = void 0; + + if (options.restore) { + canvasData = this.getCanvasData(); + cropBoxData = this.getCropBoxData(); + } + + this.render(); + + if (options.restore) { + this.setCanvasData(forEach(canvasData, function (n, i) { + canvasData[i] = n * ratio; + })); + this.setCropBoxData(forEach(cropBoxData, function (n, i) { + cropBoxData[i] = n * ratio; + })); + } + } + }, + dblclick: function dblclick() { + if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) { + return; + } + + this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP); + }, + wheel: function wheel(e) { + var _this = this; + + var ratio = Number(this.options.wheelZoomRatio) || 0.1; + var delta = 1; + + if (this.disabled) { + return; + } + + e.preventDefault(); + + // Limit wheel speed to prevent zoom too fast (#21) + if (this.wheeling) { + return; + } + + this.wheeling = true; + + setTimeout(function () { + _this.wheeling = false; + }, 50); + + if (e.deltaY) { + delta = e.deltaY > 0 ? 1 : -1; + } else if (e.wheelDelta) { + delta = -e.wheelDelta / 120; + } else if (e.detail) { + delta = e.detail > 0 ? 1 : -1; + } + + this.zoom(-delta * ratio, e); + }, + cropStart: function cropStart(e) { + if (this.disabled) { + return; + } + + var options = this.options, + pointers = this.pointers; + + var action = void 0; + + if (e.changedTouches) { + // Handle touch event + forEach(e.changedTouches, function (touch) { + pointers[touch.identifier] = getPointer(touch); + }); + } else { + // Handle mouse event and pointer event + pointers[e.pointerId || 0] = getPointer(e); + } + + if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) { + action = ACTION_ZOOM; + } else { + action = getData(e.target, DATA_ACTION); + } + + if (!REGEXP_ACTIONS.test(action)) { + return; + } + + if (dispatchEvent(this.element, EVENT_CROP_START, { + originalEvent: e, + action: action + }) === false) { + return; + } + + e.preventDefault(); + + this.action = action; + this.cropping = false; + + if (action === ACTION_CROP) { + this.cropping = true; + addClass(this.dragBox, CLASS_MODAL); + } + }, + cropMove: function cropMove(e) { + var action = this.action; + + + if (this.disabled || !action) { + return; + } + + var pointers = this.pointers; + + + e.preventDefault(); + + if (dispatchEvent(this.element, EVENT_CROP_MOVE, { + originalEvent: e, + action: action + }) === false) { + return; + } + + if (e.changedTouches) { + forEach(e.changedTouches, function (touch) { + assign(pointers[touch.identifier], getPointer(touch, true)); + }); + } else { + assign(pointers[e.pointerId || 0], getPointer(e, true)); + } + + this.change(e); + }, + cropEnd: function cropEnd(e) { + if (this.disabled) { + return; + } + + var action = this.action, + pointers = this.pointers; + + + if (e.changedTouches) { + forEach(e.changedTouches, function (touch) { + delete pointers[touch.identifier]; + }); + } else { + delete pointers[e.pointerId || 0]; + } + + if (!action) { + return; + } + + e.preventDefault(); + + if (!Object.keys(pointers).length) { + this.action = ''; + } + + if (this.cropping) { + this.cropping = false; + toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal); + } + + dispatchEvent(this.element, EVENT_CROP_END, { + originalEvent: e, + action: action + }); + } +}; + +var change = { + change: function change(e) { + var options = this.options, + canvasData = this.canvasData, + containerData = this.containerData, + cropBoxData = this.cropBoxData, + pointers = this.pointers; + var action = this.action; + var aspectRatio = options.aspectRatio; + var left = cropBoxData.left, + top = cropBoxData.top, + width = cropBoxData.width, + height = cropBoxData.height; + + var right = left + width; + var bottom = top + height; + var minLeft = 0; + var minTop = 0; + var maxWidth = containerData.width; + var maxHeight = containerData.height; + var renderable = true; + var offset = void 0; + + // Locking aspect ratio in "free mode" by holding shift key + if (!aspectRatio && e.shiftKey) { + aspectRatio = width && height ? width / height : 1; + } + + if (this.limited) { + minLeft = cropBoxData.minLeft; + minTop = cropBoxData.minTop; + + maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width); + maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height); + } + + var pointer = pointers[Object.keys(pointers)[0]]; + var range = { + x: pointer.endX - pointer.startX, + y: pointer.endY - pointer.startY + }; + var check = function check(side) { + switch (side) { + case ACTION_EAST: + if (right + range.x > maxWidth) { + range.x = maxWidth - right; + } + + break; + + case ACTION_WEST: + if (left + range.x < minLeft) { + range.x = minLeft - left; + } + + break; + + case ACTION_NORTH: + if (top + range.y < minTop) { + range.y = minTop - top; + } + + break; + + case ACTION_SOUTH: + if (bottom + range.y > maxHeight) { + range.y = maxHeight - bottom; + } + + break; + + default: + } + }; + + switch (action) { + // Move crop box + case ACTION_ALL: + left += range.x; + top += range.y; + break; + + // Resize crop box + case ACTION_EAST: + if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + renderable = false; + break; + } + + check(ACTION_EAST); + width += range.x; + + if (aspectRatio) { + height = width / aspectRatio; + top -= range.x / aspectRatio / 2; + } + + if (width < 0) { + action = ACTION_WEST; + width = 0; + } + + break; + + case ACTION_NORTH: + if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + + if (aspectRatio) { + width = height * aspectRatio; + left += range.y * aspectRatio / 2; + } + + if (height < 0) { + action = ACTION_SOUTH; + height = 0; + } + + break; + + case ACTION_WEST: + if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + renderable = false; + break; + } + + check(ACTION_WEST); + width -= range.x; + left += range.x; + + if (aspectRatio) { + height = width / aspectRatio; + top += range.x / aspectRatio / 2; + } + + if (width < 0) { + action = ACTION_EAST; + width = 0; + } + + break; + + case ACTION_SOUTH: + if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) { + renderable = false; + break; + } + + check(ACTION_SOUTH); + height += range.y; + + if (aspectRatio) { + width = height * aspectRatio; + left -= range.y * aspectRatio / 2; + } + + if (height < 0) { + action = ACTION_NORTH; + height = 0; + } + + break; + + case ACTION_NORTH_EAST: + if (aspectRatio) { + if (range.y <= 0 && (top <= minTop || right >= maxWidth)) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + width = height * aspectRatio; + } else { + check(ACTION_NORTH); + check(ACTION_EAST); + + if (range.x >= 0) { + if (right < maxWidth) { + width += range.x; + } else if (range.y <= 0 && top <= minTop) { + renderable = false; + } + } else { + width += range.x; + } + + if (range.y <= 0) { + if (top > minTop) { + height -= range.y; + top += range.y; + } + } else { + height -= range.y; + top += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_SOUTH_WEST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_NORTH_WEST; + width = 0; + } else if (height < 0) { + action = ACTION_SOUTH_EAST; + height = 0; + } + + break; + + case ACTION_NORTH_WEST: + if (aspectRatio) { + if (range.y <= 0 && (top <= minTop || left <= minLeft)) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + width = height * aspectRatio; + left += range.y * aspectRatio; + } else { + check(ACTION_NORTH); + check(ACTION_WEST); + + if (range.x <= 0) { + if (left > minLeft) { + width -= range.x; + left += range.x; + } else if (range.y <= 0 && top <= minTop) { + renderable = false; + } + } else { + width -= range.x; + left += range.x; + } + + if (range.y <= 0) { + if (top > minTop) { + height -= range.y; + top += range.y; + } + } else { + height -= range.y; + top += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_SOUTH_EAST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_NORTH_EAST; + width = 0; + } else if (height < 0) { + action = ACTION_SOUTH_WEST; + height = 0; + } + + break; + + case ACTION_SOUTH_WEST: + if (aspectRatio) { + if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) { + renderable = false; + break; + } + + check(ACTION_WEST); + width -= range.x; + left += range.x; + height = width / aspectRatio; + } else { + check(ACTION_SOUTH); + check(ACTION_WEST); + + if (range.x <= 0) { + if (left > minLeft) { + width -= range.x; + left += range.x; + } else if (range.y >= 0 && bottom >= maxHeight) { + renderable = false; + } + } else { + width -= range.x; + left += range.x; + } + + if (range.y >= 0) { + if (bottom < maxHeight) { + height += range.y; + } + } else { + height += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_NORTH_EAST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_SOUTH_EAST; + width = 0; + } else if (height < 0) { + action = ACTION_NORTH_WEST; + height = 0; + } + + break; + + case ACTION_SOUTH_EAST: + if (aspectRatio) { + if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) { + renderable = false; + break; + } + + check(ACTION_EAST); + width += range.x; + height = width / aspectRatio; + } else { + check(ACTION_SOUTH); + check(ACTION_EAST); + + if (range.x >= 0) { + if (right < maxWidth) { + width += range.x; + } else if (range.y >= 0 && bottom >= maxHeight) { + renderable = false; + } + } else { + width += range.x; + } + + if (range.y >= 0) { + if (bottom < maxHeight) { + height += range.y; + } + } else { + height += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_NORTH_WEST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_SOUTH_WEST; + width = 0; + } else if (height < 0) { + action = ACTION_NORTH_EAST; + height = 0; + } + + break; + + // Move canvas + case ACTION_MOVE: + this.move(range.x, range.y); + renderable = false; + break; + + // Zoom canvas + case ACTION_ZOOM: + this.zoom(getMaxZoomRatio(pointers), e); + renderable = false; + break; + + // Create crop box + case ACTION_CROP: + if (!range.x || !range.y) { + renderable = false; + break; + } + + offset = getOffset(this.cropper); + left = pointer.startX - offset.left; + top = pointer.startY - offset.top; + width = cropBoxData.minWidth; + height = cropBoxData.minHeight; + + if (range.x > 0) { + action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST; + } else if (range.x < 0) { + left -= width; + action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST; + } + + if (range.y < 0) { + top -= height; + } + + // Show the crop box if is hidden + if (!this.cropped) { + removeClass(this.cropBox, CLASS_HIDDEN); + this.cropped = true; + + if (this.limited) { + this.limitCropBox(true, true); + } + } + + break; + + default: + } + + if (renderable) { + cropBoxData.width = width; + cropBoxData.height = height; + cropBoxData.left = left; + cropBoxData.top = top; + this.action = action; + this.renderCropBox(); + } + + // Override + forEach(pointers, function (p) { + p.startX = p.endX; + p.startY = p.endY; + }); + } +}; + +var methods = { + // Show the crop box manually + crop: function crop() { + if (this.ready && !this.cropped && !this.disabled) { + this.cropped = true; + this.limitCropBox(true, true); + + if (this.options.modal) { + addClass(this.dragBox, CLASS_MODAL); + } + + removeClass(this.cropBox, CLASS_HIDDEN); + this.setCropBoxData(this.initialCropBoxData); + } + + return this; + }, + + + // Reset the image and crop box to their initial states + reset: function reset() { + if (this.ready && !this.disabled) { + this.imageData = assign({}, this.initialImageData); + this.canvasData = assign({}, this.initialCanvasData); + this.cropBoxData = assign({}, this.initialCropBoxData); + this.renderCanvas(); + + if (this.cropped) { + this.renderCropBox(); + } + } + + return this; + }, + + + // Clear the crop box + clear: function clear() { + if (this.cropped && !this.disabled) { + assign(this.cropBoxData, { + left: 0, + top: 0, + width: 0, + height: 0 + }); + + this.cropped = false; + this.renderCropBox(); + this.limitCanvas(true, true); + + // Render canvas after crop box rendered + this.renderCanvas(); + removeClass(this.dragBox, CLASS_MODAL); + addClass(this.cropBox, CLASS_HIDDEN); + } + + return this; + }, + + + /** + * Replace the image's src and rebuild the cropper + * @param {string} url - The new URL. + * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one. + * @returns {Cropper} this + */ + replace: function replace(url) { + var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!this.disabled && url) { + if (this.isImg) { + this.element.src = url; + } + + if (hasSameSize) { + this.url = url; + this.image.src = url; + + if (this.ready) { + this.viewBoxImage.src = url; + + forEach(this.previews, function (element) { + element.getElementsByTagName('img')[0].src = url; + }); + } + } else { + if (this.isImg) { + this.replaced = true; + } + + this.options.data = null; + this.uncreate(); + this.load(url); + } + } + + return this; + }, + + + // Enable (unfreeze) the cropper + enable: function enable() { + if (this.ready && this.disabled) { + this.disabled = false; + removeClass(this.cropper, CLASS_DISABLED); + } + + return this; + }, + + + // Disable (freeze) the cropper + disable: function disable() { + if (this.ready && !this.disabled) { + this.disabled = true; + addClass(this.cropper, CLASS_DISABLED); + } + + return this; + }, + + + /** + * Destroy the cropper and remove the instance from the image + * @returns {Cropper} this + */ + destroy: function destroy() { + var element = this.element; + + + if (!getData(element, NAMESPACE)) { + return this; + } + + if (this.isImg && this.replaced) { + element.src = this.originalUrl; + } + + this.uncreate(); + removeData(element, NAMESPACE); + + return this; + }, + + + /** + * Move the canvas with relative offsets + * @param {number} offsetX - The relative offset distance on the x-axis. + * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis. + * @returns {Cropper} this + */ + move: function move(offsetX) { + var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX; + var _canvasData = this.canvasData, + left = _canvasData.left, + top = _canvasData.top; + + + return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY)); + }, + + + /** + * Move the canvas to an absolute point + * @param {number} x - The x-axis coordinate. + * @param {number} [y=x] - The y-axis coordinate. + * @returns {Cropper} this + */ + moveTo: function moveTo(x) { + var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x; + var canvasData = this.canvasData; + + var changed = false; + + x = Number(x); + y = Number(y); + + if (this.ready && !this.disabled && this.options.movable) { + if (isNumber(x)) { + canvasData.left = x; + changed = true; + } + + if (isNumber(y)) { + canvasData.top = y; + changed = true; + } + + if (changed) { + this.renderCanvas(true); + } + } + + return this; + }, + + + /** + * Zoom the canvas with a relative ratio + * @param {number} ratio - The target ratio. + * @param {Event} _originalEvent - The original event if any. + * @returns {Cropper} this + */ + zoom: function zoom(ratio, _originalEvent) { + var canvasData = this.canvasData; + + + ratio = Number(ratio); + + if (ratio < 0) { + ratio = 1 / (1 - ratio); + } else { + ratio = 1 + ratio; + } + + return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent); + }, + + + /** + * Zoom the canvas to an absolute ratio + * @param {number} ratio - The target ratio. + * @param {Object} pivot - The zoom pivot point coordinate. + * @param {Event} _originalEvent - The original event if any. + * @returns {Cropper} this + */ + zoomTo: function zoomTo(ratio, pivot, _originalEvent) { + var options = this.options, + canvasData = this.canvasData; + var width = canvasData.width, + height = canvasData.height, + naturalWidth = canvasData.naturalWidth, + naturalHeight = canvasData.naturalHeight; + + + ratio = Number(ratio); + + if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) { + var newWidth = naturalWidth * ratio; + var newHeight = naturalHeight * ratio; + + if (dispatchEvent(this.element, EVENT_ZOOM, { + originalEvent: _originalEvent, + oldRatio: width / naturalWidth, + ratio: newWidth / naturalWidth + }) === false) { + return this; + } + + if (_originalEvent) { + var pointers = this.pointers; + + var offset = getOffset(this.cropper); + var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : { + pageX: _originalEvent.pageX, + pageY: _originalEvent.pageY + }; + + // Zoom from the triggering point of the event + canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width); + canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height); + } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) { + canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width); + canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height); + } else { + // Zoom from the center of the canvas + canvasData.left -= (newWidth - width) / 2; + canvasData.top -= (newHeight - height) / 2; + } + + canvasData.width = newWidth; + canvasData.height = newHeight; + this.renderCanvas(true); + } + + return this; + }, + + + /** + * Rotate the canvas with a relative degree + * @param {number} degree - The rotate degree. + * @returns {Cropper} this + */ + rotate: function rotate(degree) { + return this.rotateTo((this.imageData.rotate || 0) + Number(degree)); + }, + + + /** + * Rotate the canvas to an absolute degree + * @param {number} degree - The rotate degree. + * @returns {Cropper} this + */ + rotateTo: function rotateTo(degree) { + degree = Number(degree); + + if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) { + this.imageData.rotate = degree % 360; + this.renderCanvas(true, true); + } + + return this; + }, + + + /** + * Scale the image on the x-axis. + * @param {number} scaleX - The scale ratio on the x-axis. + * @returns {Cropper} this + */ + scaleX: function scaleX(_scaleX) { + var scaleY = this.imageData.scaleY; + + + return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1); + }, + + + /** + * Scale the image on the y-axis. + * @param {number} scaleY - The scale ratio on the y-axis. + * @returns {Cropper} this + */ + scaleY: function scaleY(_scaleY) { + var scaleX = this.imageData.scaleX; + + + return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY); + }, + + + /** + * Scale the image + * @param {number} scaleX - The scale ratio on the x-axis. + * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis. + * @returns {Cropper} this + */ + scale: function scale(scaleX) { + var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX; + var imageData = this.imageData; + + var transformed = false; + + scaleX = Number(scaleX); + scaleY = Number(scaleY); + + if (this.ready && !this.disabled && this.options.scalable) { + if (isNumber(scaleX)) { + imageData.scaleX = scaleX; + transformed = true; + } + + if (isNumber(scaleY)) { + imageData.scaleY = scaleY; + transformed = true; + } + + if (transformed) { + this.renderCanvas(true, true); + } + } + + return this; + }, + + + /** + * Get the cropped area position and size data (base on the original image) + * @param {boolean} [rounded=false] - Indicate if round the data values or not. + * @returns {Object} The result cropped data. + */ + getData: function getData$$1() { + var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var options = this.options, + imageData = this.imageData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + + var data = void 0; + + if (this.ready && this.cropped) { + data = { + x: cropBoxData.left - canvasData.left, + y: cropBoxData.top - canvasData.top, + width: cropBoxData.width, + height: cropBoxData.height + }; + + var ratio = imageData.width / imageData.naturalWidth; + + forEach(data, function (n, i) { + n /= ratio; + data[i] = rounded ? Math.round(n) : n; + }); + } else { + data = { + x: 0, + y: 0, + width: 0, + height: 0 + }; + } + + if (options.rotatable) { + data.rotate = imageData.rotate || 0; + } + + if (options.scalable) { + data.scaleX = imageData.scaleX || 1; + data.scaleY = imageData.scaleY || 1; + } + + return data; + }, + + + /** + * Set the cropped area position and size with new data + * @param {Object} data - The new data. + * @returns {Cropper} this + */ + setData: function setData$$1(data) { + var options = this.options, + imageData = this.imageData, + canvasData = this.canvasData; + + var cropBoxData = {}; + + if (this.ready && !this.disabled && isPlainObject(data)) { + var transformed = false; + + if (options.rotatable) { + if (isNumber(data.rotate) && data.rotate !== imageData.rotate) { + imageData.rotate = data.rotate; + transformed = true; + } + } + + if (options.scalable) { + if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) { + imageData.scaleX = data.scaleX; + transformed = true; + } + + if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) { + imageData.scaleY = data.scaleY; + transformed = true; + } + } + + if (transformed) { + this.renderCanvas(true, true); + } + + var ratio = imageData.width / imageData.naturalWidth; + + if (isNumber(data.x)) { + cropBoxData.left = data.x * ratio + canvasData.left; + } + + if (isNumber(data.y)) { + cropBoxData.top = data.y * ratio + canvasData.top; + } + + if (isNumber(data.width)) { + cropBoxData.width = data.width * ratio; + } + + if (isNumber(data.height)) { + cropBoxData.height = data.height * ratio; + } + + this.setCropBoxData(cropBoxData); + } + + return this; + }, + + + /** + * Get the container size data. + * @returns {Object} The result container data. + */ + getContainerData: function getContainerData() { + return this.ready ? assign({}, this.containerData) : {}; + }, + + + /** + * Get the image position and size data. + * @returns {Object} The result image data. + */ + getImageData: function getImageData() { + return this.sized ? assign({}, this.imageData) : {}; + }, + + + /** + * Get the canvas position and size data. + * @returns {Object} The result canvas data. + */ + getCanvasData: function getCanvasData() { + var canvasData = this.canvasData; + + var data = {}; + + if (this.ready) { + forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) { + data[n] = canvasData[n]; + }); + } + + return data; + }, + + + /** + * Set the canvas position and size with new data. + * @param {Object} data - The new canvas data. + * @returns {Cropper} this + */ + setCanvasData: function setCanvasData(data) { + var canvasData = this.canvasData; + var aspectRatio = canvasData.aspectRatio; + + + if (this.ready && !this.disabled && isPlainObject(data)) { + if (isNumber(data.left)) { + canvasData.left = data.left; + } + + if (isNumber(data.top)) { + canvasData.top = data.top; + } + + if (isNumber(data.width)) { + canvasData.width = data.width; + canvasData.height = data.width / aspectRatio; + } else if (isNumber(data.height)) { + canvasData.height = data.height; + canvasData.width = data.height * aspectRatio; + } + + this.renderCanvas(true); + } + + return this; + }, + + + /** + * Get the crop box position and size data. + * @returns {Object} The result crop box data. + */ + getCropBoxData: function getCropBoxData() { + var cropBoxData = this.cropBoxData; + + var data = void 0; + + if (this.ready && this.cropped) { + data = { + left: cropBoxData.left, + top: cropBoxData.top, + width: cropBoxData.width, + height: cropBoxData.height + }; + } + + return data || {}; + }, + + + /** + * Set the crop box position and size with new data. + * @param {Object} data - The new crop box data. + * @returns {Cropper} this + */ + setCropBoxData: function setCropBoxData(data) { + var cropBoxData = this.cropBoxData; + var aspectRatio = this.options.aspectRatio; + + var widthChanged = void 0; + var heightChanged = void 0; + + if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) { + if (isNumber(data.left)) { + cropBoxData.left = data.left; + } + + if (isNumber(data.top)) { + cropBoxData.top = data.top; + } + + if (isNumber(data.width) && data.width !== cropBoxData.width) { + widthChanged = true; + cropBoxData.width = data.width; + } + + if (isNumber(data.height) && data.height !== cropBoxData.height) { + heightChanged = true; + cropBoxData.height = data.height; + } + + if (aspectRatio) { + if (widthChanged) { + cropBoxData.height = cropBoxData.width / aspectRatio; + } else if (heightChanged) { + cropBoxData.width = cropBoxData.height * aspectRatio; + } + } + + this.renderCropBox(); + } + + return this; + }, + + + /** + * Get a canvas drawn the cropped image. + * @param {Object} [options={}] - The config options. + * @returns {HTMLCanvasElement} - The result canvas. + */ + getCroppedCanvas: function getCroppedCanvas() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (!this.ready || !window.HTMLCanvasElement) { + return null; + } + + var canvasData = this.canvasData; + + var source = getSourceCanvas(this.image, this.imageData, canvasData, options); + + // Returns the source canvas if it is not cropped. + if (!this.cropped) { + return source; + } + + var _getData = this.getData(), + initialX = _getData.x, + initialY = _getData.y, + initialWidth = _getData.width, + initialHeight = _getData.height; + + var ratio = source.width / Math.floor(canvasData.naturalWidth); + + if (ratio !== 1) { + initialX *= ratio; + initialY *= ratio; + initialWidth *= ratio; + initialHeight *= ratio; + } + + var aspectRatio = initialWidth / initialHeight; + var maxSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.maxWidth || Infinity, + height: options.maxHeight || Infinity + }); + var minSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.minWidth || 0, + height: options.minHeight || 0 + }, 'cover'); + + var _getAdjustedSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.width || (ratio !== 1 ? source.width : initialWidth), + height: options.height || (ratio !== 1 ? source.height : initialHeight) + }), + width = _getAdjustedSizes.width, + height = _getAdjustedSizes.height; + + width = Math.min(maxSizes.width, Math.max(minSizes.width, width)); + height = Math.min(maxSizes.height, Math.max(minSizes.height, height)); + + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + + canvas.width = normalizeDecimalNumber(width); + canvas.height = normalizeDecimalNumber(height); + + context.fillStyle = options.fillColor || 'transparent'; + context.fillRect(0, 0, width, height); + + var _options$imageSmoothi = options.imageSmoothingEnabled, + imageSmoothingEnabled = _options$imageSmoothi === undefined ? true : _options$imageSmoothi, + imageSmoothingQuality = options.imageSmoothingQuality; + + + context.imageSmoothingEnabled = imageSmoothingEnabled; + + if (imageSmoothingQuality) { + context.imageSmoothingQuality = imageSmoothingQuality; + } + + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage + var sourceWidth = source.width; + var sourceHeight = source.height; + + // Source canvas parameters + var srcX = initialX; + var srcY = initialY; + var srcWidth = void 0; + var srcHeight = void 0; + + // Destination canvas parameters + var dstX = void 0; + var dstY = void 0; + var dstWidth = void 0; + var dstHeight = void 0; + + if (srcX <= -initialWidth || srcX > sourceWidth) { + srcX = 0; + srcWidth = 0; + dstX = 0; + dstWidth = 0; + } else if (srcX <= 0) { + dstX = -srcX; + srcX = 0; + srcWidth = Math.min(sourceWidth, initialWidth + srcX); + dstWidth = srcWidth; + } else if (srcX <= sourceWidth) { + dstX = 0; + srcWidth = Math.min(initialWidth, sourceWidth - srcX); + dstWidth = srcWidth; + } + + if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) { + srcY = 0; + srcHeight = 0; + dstY = 0; + dstHeight = 0; + } else if (srcY <= 0) { + dstY = -srcY; + srcY = 0; + srcHeight = Math.min(sourceHeight, initialHeight + srcY); + dstHeight = srcHeight; + } else if (srcY <= sourceHeight) { + dstY = 0; + srcHeight = Math.min(initialHeight, sourceHeight - srcY); + dstHeight = srcHeight; + } + + var params = [srcX, srcY, srcWidth, srcHeight]; + + // Avoid "IndexSizeError" + if (dstWidth > 0 && dstHeight > 0) { + var scale = width / initialWidth; + + params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale); + } + + // All the numerical parameters should be integer for `drawImage` + // https://github.com/fengyuanchen/cropper/issues/476 + context.drawImage.apply(context, [source].concat(toConsumableArray(params.map(function (param) { + return Math.floor(normalizeDecimalNumber(param)); + })))); + + return canvas; + }, + + + /** + * Change the aspect ratio of the crop box. + * @param {number} aspectRatio - The new aspect ratio. + * @returns {Cropper} this + */ + setAspectRatio: function setAspectRatio(aspectRatio) { + var options = this.options; + + + if (!this.disabled && !isUndefined(aspectRatio)) { + // 0 -> NaN + options.aspectRatio = Math.max(0, aspectRatio) || NaN; + + if (this.ready) { + this.initCropBox(); + + if (this.cropped) { + this.renderCropBox(); + } + } + } + + return this; + }, + + + /** + * Change the drag mode. + * @param {string} mode - The new drag mode. + * @returns {Cropper} this + */ + setDragMode: function setDragMode(mode) { + var options = this.options, + dragBox = this.dragBox, + face = this.face; + + + if (this.ready && !this.disabled) { + var croppable = mode === DRAG_MODE_CROP; + var movable = options.movable && mode === DRAG_MODE_MOVE; + + mode = croppable || movable ? mode : DRAG_MODE_NONE; + + options.dragMode = mode; + setData(dragBox, DATA_ACTION, mode); + toggleClass(dragBox, CLASS_CROP, croppable); + toggleClass(dragBox, CLASS_MOVE, movable); + + if (!options.cropBoxMovable) { + // Sync drag mode to crop box when it is not movable + setData(face, DATA_ACTION, mode); + toggleClass(face, CLASS_CROP, croppable); + toggleClass(face, CLASS_MOVE, movable); + } + } + + return this; + } +}; + +var AnotherCropper = WINDOW.Cropper; + +var Cropper = function () { + /** + * Create a new Cropper. + * @param {Element} element - The target element for cropping. + * @param {Object} [options={}] - The configuration options. + */ + function Cropper(element) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + classCallCheck(this, Cropper); + + if (!element || !REGEXP_TAG_NAME.test(element.tagName)) { + throw new Error('The first argument is required and must be an or element.'); + } + + this.element = element; + this.options = assign({}, DEFAULTS, isPlainObject(options) && options); + this.cropped = false; + this.disabled = false; + this.pointers = {}; + this.ready = false; + this.reloading = false; + this.replaced = false; + this.sized = false; + this.sizing = false; + this.init(); + } + + createClass(Cropper, [{ + key: 'init', + value: function init() { + var element = this.element; + + var tagName = element.tagName.toLowerCase(); + var url = void 0; + + if (getData(element, NAMESPACE)) { + return; + } + + setData(element, NAMESPACE, this); + + if (tagName === 'img') { + this.isImg = true; + + // e.g.: "img/picture.jpg" + url = element.getAttribute('src') || ''; + this.originalUrl = url; + + // Stop when it's a blank image + if (!url) { + return; + } + + // e.g.: "http://example.com/img/picture.jpg" + url = element.src; + } else if (tagName === 'canvas' && window.HTMLCanvasElement) { + url = element.toDataURL(); + } + + this.load(url); + } + }, { + key: 'load', + value: function load(url) { + var _this = this; + + if (!url) { + return; + } + + this.url = url; + this.imageData = {}; + + var element = this.element, + options = this.options; + + + if (!options.checkOrientation || !window.ArrayBuffer) { + this.clone(); + return; + } + + // XMLHttpRequest disallows to open a Data URL in some browsers like IE11 and Safari + if (REGEXP_DATA_URL.test(url)) { + if (REGEXP_DATA_URL_JPEG.test(url)) { + this.read(dataURLToArrayBuffer(url)); + } else { + this.clone(); + } + + return; + } + + var xhr = new XMLHttpRequest(); + + this.reloading = true; + this.xhr = xhr; + + var done = function done() { + _this.reloading = false; + _this.xhr = null; + }; + + xhr.ontimeout = done; + xhr.onabort = done; + xhr.onerror = function () { + done(); + _this.clone(); + }; + + xhr.onload = function () { + done(); + _this.read(xhr.response); + }; + + // Bust cache when there is a "crossOrigin" property + if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) { + url = addTimestamp(url); + } + + xhr.open('get', url); + xhr.responseType = 'arraybuffer'; + xhr.withCredentials = element.crossOrigin === 'use-credentials'; + xhr.send(); + } + }, { + key: 'read', + value: function read(arrayBuffer) { + var options = this.options, + imageData = this.imageData; + + var orientation = getOrientation(arrayBuffer); + var rotate = 0; + var scaleX = 1; + var scaleY = 1; + + if (orientation > 1) { + this.url = arrayBufferToDataURL(arrayBuffer, 'image/jpeg'); + + var _parseOrientation = parseOrientation(orientation); + + rotate = _parseOrientation.rotate; + scaleX = _parseOrientation.scaleX; + scaleY = _parseOrientation.scaleY; + } + + if (options.rotatable) { + imageData.rotate = rotate; + } + + if (options.scalable) { + imageData.scaleX = scaleX; + imageData.scaleY = scaleY; + } + + this.clone(); + } + }, { + key: 'clone', + value: function clone() { + var element = this.element, + url = this.url; + + var crossOrigin = void 0; + var crossOriginUrl = void 0; + + if (this.options.checkCrossOrigin && isCrossOriginURL(url)) { + crossOrigin = element.crossOrigin; + + + if (crossOrigin) { + crossOriginUrl = url; + } else { + crossOrigin = 'anonymous'; + + // Bust cache when there is not a "crossOrigin" property + crossOriginUrl = addTimestamp(url); + } + } + + this.crossOrigin = crossOrigin; + this.crossOriginUrl = crossOriginUrl; + + var image = document.createElement('img'); + + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + + image.src = crossOriginUrl || url; + + var start = this.start.bind(this); + var stop = this.stop.bind(this); + + this.image = image; + this.onStart = start; + this.onStop = stop; + + if (this.isImg) { + if (element.complete) { + // start asynchronously to keep `this.cropper` is accessible in `ready` event handler. + this.timeout = setTimeout(start, 0); + } else { + addListener(element, EVENT_LOAD, start, { + once: true + }); + } + } else { + image.onload = start; + image.onerror = stop; + addClass(image, CLASS_HIDE); + element.parentNode.insertBefore(image, element.nextSibling); + } + } + }, { + key: 'start', + value: function start(event) { + var _this2 = this; + + var image = this.isImg ? this.element : this.image; + + if (event) { + image.onload = null; + image.onerror = null; + } + + this.sizing = true; + + var IS_SAFARI = WINDOW.navigator && /(Macintosh|iPhone|iPod|iPad).*AppleWebKit/i.test(WINDOW.navigator.userAgent); + var done = function done(naturalWidth, naturalHeight) { + assign(_this2.imageData, { + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + aspectRatio: naturalWidth / naturalHeight + }); + _this2.sizing = false; + _this2.sized = true; + _this2.build(); + }; + + // Modern browsers (except Safari) + if (image.naturalWidth && !IS_SAFARI) { + done(image.naturalWidth, image.naturalHeight); + return; + } + + var sizingImage = document.createElement('img'); + var body = document.body || document.documentElement; + + this.sizingImage = sizingImage; + + sizingImage.onload = function () { + done(sizingImage.width, sizingImage.height); + + if (!IS_SAFARI) { + body.removeChild(sizingImage); + } + }; + + sizingImage.src = image.src; + + // iOS Safari will convert the image automatically + // with its orientation once append it into DOM (#279) + if (!IS_SAFARI) { + sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;'; + body.appendChild(sizingImage); + } + } + }, { + key: 'stop', + value: function stop() { + var image = this.image; + + + image.onload = null; + image.onerror = null; + image.parentNode.removeChild(image); + this.image = null; + } + }, { + key: 'build', + value: function build() { + if (!this.sized || this.ready) { + return; + } + + var element = this.element, + options = this.options, + image = this.image; + + // Create cropper elements + + var container = element.parentNode; + var template = document.createElement('div'); + + template.innerHTML = TEMPLATE; + + var cropper = template.querySelector('.' + NAMESPACE + '-container'); + var canvas = cropper.querySelector('.' + NAMESPACE + '-canvas'); + var dragBox = cropper.querySelector('.' + NAMESPACE + '-drag-box'); + var cropBox = cropper.querySelector('.' + NAMESPACE + '-crop-box'); + var face = cropBox.querySelector('.' + NAMESPACE + '-face'); + + this.container = container; + this.cropper = cropper; + this.canvas = canvas; + this.dragBox = dragBox; + this.cropBox = cropBox; + this.viewBox = cropper.querySelector('.' + NAMESPACE + '-view-box'); + this.face = face; + + canvas.appendChild(image); + + // Hide the original image + addClass(element, CLASS_HIDDEN); + + // Inserts the cropper after to the current image + container.insertBefore(cropper, element.nextSibling); + + // Show the image if is hidden + if (!this.isImg) { + removeClass(image, CLASS_HIDE); + } + + this.initPreview(); + this.bind(); + + options.aspectRatio = Math.max(0, options.aspectRatio) || NaN; + options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0; + + addClass(cropBox, CLASS_HIDDEN); + + if (!options.guides) { + addClass(cropBox.getElementsByClassName(NAMESPACE + '-dashed'), CLASS_HIDDEN); + } + + if (!options.center) { + addClass(cropBox.getElementsByClassName(NAMESPACE + '-center'), CLASS_HIDDEN); + } + + if (options.background) { + addClass(cropper, NAMESPACE + '-bg'); + } + + if (!options.highlight) { + addClass(face, CLASS_INVISIBLE); + } + + if (options.cropBoxMovable) { + addClass(face, CLASS_MOVE); + setData(face, DATA_ACTION, ACTION_ALL); + } + + if (!options.cropBoxResizable) { + addClass(cropBox.getElementsByClassName(NAMESPACE + '-line'), CLASS_HIDDEN); + addClass(cropBox.getElementsByClassName(NAMESPACE + '-point'), CLASS_HIDDEN); + } + + this.render(); + this.ready = true; + this.setDragMode(options.dragMode); + + if (options.autoCrop) { + this.crop(); + } + + this.setData(options.data); + + if (isFunction(options.ready)) { + addListener(element, EVENT_READY, options.ready, { + once: true + }); + } + + dispatchEvent(element, EVENT_READY); + } + }, { + key: 'unbuild', + value: function unbuild() { + if (!this.ready) { + return; + } + + this.ready = false; + this.unbind(); + this.resetPreview(); + this.cropper.parentNode.removeChild(this.cropper); + removeClass(this.element, CLASS_HIDDEN); + } + }, { + key: 'uncreate', + value: function uncreate() { + var element = this.element; + + + if (this.ready) { + this.unbuild(); + this.ready = false; + this.cropped = false; + } else if (this.sizing) { + this.sizingImage.onload = null; + this.sizing = false; + this.sized = false; + } else if (this.reloading) { + this.xhr.abort(); + } else if (this.isImg) { + if (element.complete) { + clearTimeout(this.timeout); + } else { + removeListener(element, EVENT_LOAD, this.onStart); + } + } else if (this.image) { + this.stop(); + } + } + + /** + * Get the no conflict cropper class. + * @returns {Cropper} The cropper class. + */ + + }], [{ + key: 'noConflict', + value: function noConflict() { + window.Cropper = AnotherCropper; + return Cropper; + } + + /** + * Change the default options. + * @param {Object} options - The new default options. + */ + + }, { + key: 'setDefaults', + value: function setDefaults(options) { + assign(DEFAULTS, isPlainObject(options) && options); + } + }]); + return Cropper; +}(); + +assign(Cropper.prototype, render, preview, events, handlers, change, methods); + +if ($.fn) { + var AnotherCropper$1 = $.fn.cropper; + var NAMESPACE$1 = 'cropper'; + + $.fn.cropper = function jQueryCropper(option) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var result = void 0; + + this.each(function (i, element) { + var $element = $(element); + var isDestroy = option === 'destroy'; + var cropper = $element.data(NAMESPACE$1); + + if (!cropper) { + if (isDestroy) { + return; + } + + var options = $.extend({}, $element.data(), $.isPlainObject(option) && option); + + cropper = new Cropper(element, options); + $element.data(NAMESPACE$1, cropper); + } + + if (typeof option === 'string') { + var fn = cropper[option]; + + if ($.isFunction(fn)) { + result = fn.apply(cropper, args); + + if (result === cropper) { + result = undefined; + } + + if (isDestroy) { + $element.removeData(NAMESPACE$1); + } + } + } + }); + + return result !== undefined ? result : this; + }; + + $.fn.cropper.Constructor = Cropper; + $.fn.cropper.setDefaults = Cropper.setDefaults; + $.fn.cropper.noConflict = function noConflict() { + $.fn.cropper = AnotherCropper$1; + return this; + }; +} diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.js b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.js new file mode 100644 index 0000000..36881f7 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.js @@ -0,0 +1,3761 @@ +/*! + * Cropper v4.0.0 + * https://github.com/fengyuanchen/cropper + * + * Copyright (c) 2014-2018 Chen Fengyuan + * Released under the MIT license + * + * Date: 2018-04-01T06:27:27.267Z + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) : + typeof define === 'function' && define.amd ? define(['jquery'], factory) : + (factory(global.jQuery)); +}(this, (function ($) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + + var IN_BROWSER = typeof window !== 'undefined'; + var WINDOW = IN_BROWSER ? window : {}; + var NAMESPACE = 'cropper'; + + // Actions + var ACTION_ALL = 'all'; + var ACTION_CROP = 'crop'; + var ACTION_MOVE = 'move'; + var ACTION_ZOOM = 'zoom'; + var ACTION_EAST = 'e'; + var ACTION_WEST = 'w'; + var ACTION_SOUTH = 's'; + var ACTION_NORTH = 'n'; + var ACTION_NORTH_EAST = 'ne'; + var ACTION_NORTH_WEST = 'nw'; + var ACTION_SOUTH_EAST = 'se'; + var ACTION_SOUTH_WEST = 'sw'; + + // Classes + var CLASS_CROP = NAMESPACE + '-crop'; + var CLASS_DISABLED = NAMESPACE + '-disabled'; + var CLASS_HIDDEN = NAMESPACE + '-hidden'; + var CLASS_HIDE = NAMESPACE + '-hide'; + var CLASS_INVISIBLE = NAMESPACE + '-invisible'; + var CLASS_MODAL = NAMESPACE + '-modal'; + var CLASS_MOVE = NAMESPACE + '-move'; + + // Data keys + var DATA_ACTION = 'action'; + var DATA_PREVIEW = 'preview'; + + // Drag modes + var DRAG_MODE_CROP = 'crop'; + var DRAG_MODE_MOVE = 'move'; + var DRAG_MODE_NONE = 'none'; + + // Events + var EVENT_CROP = 'crop'; + var EVENT_CROP_END = 'cropend'; + var EVENT_CROP_MOVE = 'cropmove'; + var EVENT_CROP_START = 'cropstart'; + var EVENT_DBLCLICK = 'dblclick'; + var EVENT_LOAD = 'load'; + var EVENT_POINTER_DOWN = WINDOW.PointerEvent ? 'pointerdown' : 'touchstart mousedown'; + var EVENT_POINTER_MOVE = WINDOW.PointerEvent ? 'pointermove' : 'touchmove mousemove'; + var EVENT_POINTER_UP = WINDOW.PointerEvent ? 'pointerup pointercancel' : 'touchend touchcancel mouseup'; + var EVENT_READY = 'ready'; + var EVENT_RESIZE = 'resize'; + var EVENT_WHEEL = 'wheel mousewheel DOMMouseScroll'; + var EVENT_ZOOM = 'zoom'; + + // RegExps + var REGEXP_ACTIONS = /^(?:e|w|s|n|se|sw|ne|nw|all|crop|move|zoom)$/; + var REGEXP_DATA_URL = /^data:/; + var REGEXP_DATA_URL_JPEG = /^data:image\/jpeg;base64,/; + var REGEXP_TAG_NAME = /^(?:img|canvas)$/i; + + var DEFAULTS = { + // Define the view mode of the cropper + viewMode: 0, // 0, 1, 2, 3 + + // Define the dragging mode of the cropper + dragMode: DRAG_MODE_CROP, // 'crop', 'move' or 'none' + + // Define the aspect ratio of the crop box + aspectRatio: NaN, + + // An object with the previous cropping result data + data: null, + + // A selector for adding extra containers to preview + preview: '', + + // Re-render the cropper when resize the window + responsive: true, + + // Restore the cropped area after resize the window + restore: true, + + // Check if the current image is a cross-origin image + checkCrossOrigin: true, + + // Check the current image's Exif Orientation information + checkOrientation: true, + + // Show the black modal + modal: true, + + // Show the dashed lines for guiding + guides: true, + + // Show the center indicator for guiding + center: true, + + // Show the white modal to highlight the crop box + highlight: true, + + // Show the grid background + background: true, + + // Enable to crop the image automatically when initialize + autoCrop: true, + + // Define the percentage of automatic cropping area when initializes + autoCropArea: 0.8, + + // Enable to move the image + movable: true, + + // Enable to rotate the image + rotatable: true, + + // Enable to scale the image + scalable: true, + + // Enable to zoom the image + zoomable: true, + + // Enable to zoom the image by dragging touch + zoomOnTouch: true, + + // Enable to zoom the image by wheeling mouse + zoomOnWheel: true, + + // Define zoom ratio when zoom the image by wheeling mouse + wheelZoomRatio: 0.1, + + // Enable to move the crop box + cropBoxMovable: true, + + // Enable to resize the crop box + cropBoxResizable: true, + + // Toggle drag mode between "crop" and "move" when click twice on the cropper + toggleDragModeOnDblclick: true, + + // Size limitation + minCanvasWidth: 0, + minCanvasHeight: 0, + minCropBoxWidth: 0, + minCropBoxHeight: 0, + minContainerWidth: 200, + minContainerHeight: 100, + + // Shortcuts of events + ready: null, + cropstart: null, + cropmove: null, + cropend: null, + crop: null, + zoom: null + }; + + var TEMPLATE = '
' + '
' + '
' + '
' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
'; + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + + var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + + var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } + }; + + /** + * Check if the given value is not a number. + */ + var isNaN = Number.isNaN || WINDOW.isNaN; + + /** + * Check if the given value is a number. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a number, else `false`. + */ + function isNumber(value) { + return typeof value === 'number' && !isNaN(value); + } + + /** + * Check if the given value is undefined. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is undefined, else `false`. + */ + function isUndefined(value) { + return typeof value === 'undefined'; + } + + /** + * Check if the given value is an object. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is an object, else `false`. + */ + function isObject(value) { + return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value !== null; + } + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + /** + * Check if the given value is a plain object. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a plain object, else `false`. + */ + + function isPlainObject(value) { + if (!isObject(value)) { + return false; + } + + try { + var _constructor = value.constructor; + var prototype = _constructor.prototype; + + + return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf'); + } catch (e) { + return false; + } + } + + /** + * Check if the given value is a function. + * @param {*} value - The value to check. + * @returns {boolean} Returns `true` if the given value is a function, else `false`. + */ + function isFunction(value) { + return typeof value === 'function'; + } + + /** + * Iterate the given data. + * @param {*} data - The data to iterate. + * @param {Function} callback - The process function for each element. + * @returns {*} The original data. + */ + function forEach(data, callback) { + if (data && isFunction(callback)) { + if (Array.isArray(data) || isNumber(data.length) /* array-like */) { + var length = data.length; + + var i = void 0; + + for (i = 0; i < length; i += 1) { + if (callback.call(data, data[i], i, data) === false) { + break; + } + } + } else if (isObject(data)) { + Object.keys(data).forEach(function (key) { + callback.call(data, data[key], key, data); + }); + } + } + + return data; + } + + /** + * Extend the given object. + * @param {*} obj - The object to be extended. + * @param {*} args - The rest objects which will be merged to the first object. + * @returns {Object} The extended object. + */ + var assign = Object.assign || function assign(obj) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (isObject(obj) && args.length > 0) { + args.forEach(function (arg) { + if (isObject(arg)) { + Object.keys(arg).forEach(function (key) { + obj[key] = arg[key]; + }); + } + }); + } + + return obj; + }; + + var REGEXP_DECIMALS = /\.\d*(?:0|9){12}\d*$/i; + + /** + * Normalize decimal number. + * Check out {@link http://0.30000000000000004.com/} + * @param {number} value - The value to normalize. + * @param {number} [times=100000000000] - The times for normalizing. + * @returns {number} Returns the normalized number. + */ + function normalizeDecimalNumber(value) { + var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000; + + return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value; + } + + var REGEXP_SUFFIX = /^(?:width|height|left|top|marginLeft|marginTop)$/; + + /** + * Apply styles to the given element. + * @param {Element} element - The target element. + * @param {Object} styles - The styles for applying. + */ + function setStyle(element, styles) { + var style = element.style; + + + forEach(styles, function (value, property) { + if (REGEXP_SUFFIX.test(property) && isNumber(value)) { + value += 'px'; + } + + style[property] = value; + }); + } + + /** + * Check if the given element has a special class. + * @param {Element} element - The element to check. + * @param {string} value - The class to search. + * @returns {boolean} Returns `true` if the special class was found. + */ + function hasClass(element, value) { + return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1; + } + + /** + * Add classes to the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be added. + */ + function addClass(element, value) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + addClass(elem, value); + }); + return; + } + + if (element.classList) { + element.classList.add(value); + return; + } + + var className = element.className.trim(); + + if (!className) { + element.className = value; + } else if (className.indexOf(value) < 0) { + element.className = className + ' ' + value; + } + } + + /** + * Remove classes from the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be removed. + */ + function removeClass(element, value) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + removeClass(elem, value); + }); + return; + } + + if (element.classList) { + element.classList.remove(value); + return; + } + + if (element.className.indexOf(value) >= 0) { + element.className = element.className.replace(value, ''); + } + } + + /** + * Add or remove classes from the given element. + * @param {Element} element - The target element. + * @param {string} value - The classes to be toggled. + * @param {boolean} added - Add only. + */ + function toggleClass(element, value, added) { + if (!value) { + return; + } + + if (isNumber(element.length)) { + forEach(element, function (elem) { + toggleClass(elem, value, added); + }); + return; + } + + // IE10-11 doesn't support the second parameter of `classList.toggle` + if (added) { + addClass(element, value); + } else { + removeClass(element, value); + } + } + + var REGEXP_HYPHENATE = /([a-z\d])([A-Z])/g; + + /** + * Transform the given string from camelCase to kebab-case + * @param {string} value - The value to transform. + * @returns {string} The transformed value. + */ + function hyphenate(value) { + return value.replace(REGEXP_HYPHENATE, '$1-$2').toLowerCase(); + } + + /** + * Get data from the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to get. + * @returns {string} The data value. + */ + function getData(element, name) { + if (isObject(element[name])) { + return element[name]; + } else if (element.dataset) { + return element.dataset[name]; + } + + return element.getAttribute('data-' + hyphenate(name)); + } + + /** + * Set data to the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to set. + * @param {string} data - The data value. + */ + function setData(element, name, data) { + if (isObject(data)) { + element[name] = data; + } else if (element.dataset) { + element.dataset[name] = data; + } else { + element.setAttribute('data-' + hyphenate(name), data); + } + } + + /** + * Remove data from the given element. + * @param {Element} element - The target element. + * @param {string} name - The data key to remove. + */ + function removeData(element, name) { + if (isObject(element[name])) { + try { + delete element[name]; + } catch (e) { + element[name] = undefined; + } + } else if (element.dataset) { + // #128 Safari not allows to delete dataset property + try { + delete element.dataset[name]; + } catch (e) { + element.dataset[name] = undefined; + } + } else { + element.removeAttribute('data-' + hyphenate(name)); + } + } + + var REGEXP_SPACES = /\s\s*/; + var onceSupported = function () { + var supported = false; + + if (IN_BROWSER) { + var once = false; + var listener = function listener() {}; + var options = Object.defineProperty({}, 'once', { + get: function get$$1() { + supported = true; + return once; + }, + + + /** + * This setter can fix a `TypeError` in strict mode + * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Getter_only} + * @param {boolean} value - The value to set + */ + set: function set$$1(value) { + once = value; + } + }); + + WINDOW.addEventListener('test', listener, options); + WINDOW.removeEventListener('test', listener, options); + } + + return supported; + }(); + + /** + * Remove event listener from the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Function} listener - The event listener. + * @param {Object} options - The event options. + */ + function removeListener(element, type, listener) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + var handler = listener; + + type.trim().split(REGEXP_SPACES).forEach(function (event) { + if (!onceSupported) { + var listeners = element.listeners; + + + if (listeners && listeners[event] && listeners[event][listener]) { + handler = listeners[event][listener]; + delete listeners[event][listener]; + + if (Object.keys(listeners[event]).length === 0) { + delete listeners[event]; + } + + if (Object.keys(listeners).length === 0) { + delete element.listeners; + } + } + } + + element.removeEventListener(event, handler, options); + }); + } + + /** + * Add event listener to the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Function} listener - The event listener. + * @param {Object} options - The event options. + */ + function addListener(element, type, listener) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + var _handler = listener; + + type.trim().split(REGEXP_SPACES).forEach(function (event) { + if (options.once && !onceSupported) { + var _element$listeners = element.listeners, + listeners = _element$listeners === undefined ? {} : _element$listeners; + + + _handler = function handler() { + for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + delete listeners[event][listener]; + element.removeEventListener(event, _handler, options); + listener.apply(element, args); + }; + + if (!listeners[event]) { + listeners[event] = {}; + } + + if (listeners[event][listener]) { + element.removeEventListener(event, listeners[event][listener], options); + } + + listeners[event][listener] = _handler; + element.listeners = listeners; + } + + element.addEventListener(event, _handler, options); + }); + } + + /** + * Dispatch event on the target element. + * @param {Element} element - The event target. + * @param {string} type - The event type(s). + * @param {Object} data - The additional event data. + * @returns {boolean} Indicate if the event is default prevented or not. + */ + function dispatchEvent(element, type, data) { + var event = void 0; + + // Event and CustomEvent on IE9-11 are global objects, not constructors + if (isFunction(Event) && isFunction(CustomEvent)) { + event = new CustomEvent(type, { + detail: data, + bubbles: true, + cancelable: true + }); + } else { + event = document.createEvent('CustomEvent'); + event.initCustomEvent(type, true, true, data); + } + + return element.dispatchEvent(event); + } + + /** + * Get the offset base on the document. + * @param {Element} element - The target element. + * @returns {Object} The offset data. + */ + function getOffset(element) { + var box = element.getBoundingClientRect(); + + return { + left: box.left + (window.pageXOffset - document.documentElement.clientLeft), + top: box.top + (window.pageYOffset - document.documentElement.clientTop) + }; + } + + var location = WINDOW.location; + + var REGEXP_ORIGINS = /^(https?:)\/\/([^:/?#]+):?(\d*)/i; + + /** + * Check if the given URL is a cross origin URL. + * @param {string} url - The target URL. + * @returns {boolean} Returns `true` if the given URL is a cross origin URL, else `false`. + */ + function isCrossOriginURL(url) { + var parts = url.match(REGEXP_ORIGINS); + + return parts && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port); + } + + /** + * Add timestamp to the given URL. + * @param {string} url - The target URL. + * @returns {string} The result URL. + */ + function addTimestamp(url) { + var timestamp = 'timestamp=' + new Date().getTime(); + + return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp; + } + + /** + * Get transforms base on the given object. + * @param {Object} obj - The target object. + * @returns {string} A string contains transform values. + */ + function getTransforms(_ref) { + var rotate = _ref.rotate, + scaleX = _ref.scaleX, + scaleY = _ref.scaleY, + translateX = _ref.translateX, + translateY = _ref.translateY; + + var values = []; + + if (isNumber(translateX) && translateX !== 0) { + values.push('translateX(' + translateX + 'px)'); + } + + if (isNumber(translateY) && translateY !== 0) { + values.push('translateY(' + translateY + 'px)'); + } + + // Rotate should come first before scale to match orientation transform + if (isNumber(rotate) && rotate !== 0) { + values.push('rotate(' + rotate + 'deg)'); + } + + if (isNumber(scaleX) && scaleX !== 1) { + values.push('scaleX(' + scaleX + ')'); + } + + if (isNumber(scaleY) && scaleY !== 1) { + values.push('scaleY(' + scaleY + ')'); + } + + var transform = values.length ? values.join(' ') : 'none'; + + return { + WebkitTransform: transform, + msTransform: transform, + transform: transform + }; + } + + /** + * Get the max ratio of a group of pointers. + * @param {string} pointers - The target pointers. + * @returns {number} The result ratio. + */ + function getMaxZoomRatio(pointers) { + var pointers2 = assign({}, pointers); + var ratios = []; + + forEach(pointers, function (pointer, pointerId) { + delete pointers2[pointerId]; + + forEach(pointers2, function (pointer2) { + var x1 = Math.abs(pointer.startX - pointer2.startX); + var y1 = Math.abs(pointer.startY - pointer2.startY); + var x2 = Math.abs(pointer.endX - pointer2.endX); + var y2 = Math.abs(pointer.endY - pointer2.endY); + var z1 = Math.sqrt(x1 * x1 + y1 * y1); + var z2 = Math.sqrt(x2 * x2 + y2 * y2); + var ratio = (z2 - z1) / z1; + + ratios.push(ratio); + }); + }); + + ratios.sort(function (a, b) { + return Math.abs(a) < Math.abs(b); + }); + + return ratios[0]; + } + + /** + * Get a pointer from an event object. + * @param {Object} event - The target event object. + * @param {boolean} endOnly - Indicates if only returns the end point coordinate or not. + * @returns {Object} The result pointer contains start and/or end point coordinates. + */ + function getPointer(_ref2, endOnly) { + var pageX = _ref2.pageX, + pageY = _ref2.pageY; + + var end = { + endX: pageX, + endY: pageY + }; + + return endOnly ? end : assign({ + startX: pageX, + startY: pageY + }, end); + } + + /** + * Get the center point coordinate of a group of pointers. + * @param {Object} pointers - The target pointers. + * @returns {Object} The center point coordinate. + */ + function getPointersCenter(pointers) { + var pageX = 0; + var pageY = 0; + var count = 0; + + forEach(pointers, function (_ref3) { + var startX = _ref3.startX, + startY = _ref3.startY; + + pageX += startX; + pageY += startY; + count += 1; + }); + + pageX /= count; + pageY /= count; + + return { + pageX: pageX, + pageY: pageY + }; + } + + /** + * Check if the given value is a finite number. + */ + var isFinite = Number.isFinite || WINDOW.isFinite; + + /** + * Get the max sizes in a rectangle under the given aspect ratio. + * @param {Object} data - The original sizes. + * @param {string} [type='contain'] - The adjust type. + * @returns {Object} The result sizes. + */ + function getAdjustedSizes(_ref4) // or 'cover' + { + var aspectRatio = _ref4.aspectRatio, + height = _ref4.height, + width = _ref4.width; + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain'; + + var isValidNumber = function isValidNumber(value) { + return isFinite(value) && value > 0; + }; + + if (isValidNumber(width) && isValidNumber(height)) { + var adjustedWidth = height * aspectRatio; + + if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) { + height = width / aspectRatio; + } else { + width = height * aspectRatio; + } + } else if (isValidNumber(width)) { + height = width / aspectRatio; + } else if (isValidNumber(height)) { + width = height * aspectRatio; + } + + return { + width: width, + height: height + }; + } + + /** + * Get the new sizes of a rectangle after rotated. + * @param {Object} data - The original sizes. + * @returns {Object} The result sizes. + */ + function getRotatedSizes(_ref5) { + var width = _ref5.width, + height = _ref5.height, + degree = _ref5.degree; + + degree = Math.abs(degree) % 180; + + if (degree === 90) { + return { + width: height, + height: width + }; + } + + var arc = degree % 90 * Math.PI / 180; + var sinArc = Math.sin(arc); + var cosArc = Math.cos(arc); + var newWidth = width * cosArc + height * sinArc; + var newHeight = width * sinArc + height * cosArc; + + return degree > 90 ? { + width: newHeight, + height: newWidth + } : { + width: newWidth, + height: newHeight + }; + } + + /** + * Get a canvas which drew the given image. + * @param {HTMLImageElement} image - The image for drawing. + * @param {Object} imageData - The image data. + * @param {Object} canvasData - The canvas data. + * @param {Object} options - The options. + * @returns {HTMLCanvasElement} The result canvas. + */ + function getSourceCanvas(image, _ref6, _ref7, _ref8) { + var imageAspectRatio = _ref6.aspectRatio, + imageNaturalWidth = _ref6.naturalWidth, + imageNaturalHeight = _ref6.naturalHeight, + _ref6$rotate = _ref6.rotate, + rotate = _ref6$rotate === undefined ? 0 : _ref6$rotate, + _ref6$scaleX = _ref6.scaleX, + scaleX = _ref6$scaleX === undefined ? 1 : _ref6$scaleX, + _ref6$scaleY = _ref6.scaleY, + scaleY = _ref6$scaleY === undefined ? 1 : _ref6$scaleY; + var aspectRatio = _ref7.aspectRatio, + naturalWidth = _ref7.naturalWidth, + naturalHeight = _ref7.naturalHeight; + var _ref8$fillColor = _ref8.fillColor, + fillColor = _ref8$fillColor === undefined ? 'transparent' : _ref8$fillColor, + _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled, + imageSmoothingEnabled = _ref8$imageSmoothingE === undefined ? true : _ref8$imageSmoothingE, + _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality, + imageSmoothingQuality = _ref8$imageSmoothingQ === undefined ? 'low' : _ref8$imageSmoothingQ, + _ref8$maxWidth = _ref8.maxWidth, + maxWidth = _ref8$maxWidth === undefined ? Infinity : _ref8$maxWidth, + _ref8$maxHeight = _ref8.maxHeight, + maxHeight = _ref8$maxHeight === undefined ? Infinity : _ref8$maxHeight, + _ref8$minWidth = _ref8.minWidth, + minWidth = _ref8$minWidth === undefined ? 0 : _ref8$minWidth, + _ref8$minHeight = _ref8.minHeight, + minHeight = _ref8$minHeight === undefined ? 0 : _ref8$minHeight; + + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + var maxSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: maxWidth, + height: maxHeight + }); + var minSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: minWidth, + height: minHeight + }, 'cover'); + var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth)); + var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight)); + + // Note: should always use image's natural sizes for drawing as + // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90 + var destMaxSizes = getAdjustedSizes({ + aspectRatio: imageAspectRatio, + width: maxWidth, + height: maxHeight + }); + var destMinSizes = getAdjustedSizes({ + aspectRatio: imageAspectRatio, + width: minWidth, + height: minHeight + }, 'cover'); + var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth)); + var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight)); + var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight]; + + canvas.width = normalizeDecimalNumber(width); + canvas.height = normalizeDecimalNumber(height); + context.fillStyle = fillColor; + context.fillRect(0, 0, width, height); + context.save(); + context.translate(width / 2, height / 2); + context.rotate(rotate * Math.PI / 180); + context.scale(scaleX, scaleY); + context.imageSmoothingEnabled = imageSmoothingEnabled; + context.imageSmoothingQuality = imageSmoothingQuality; + context.drawImage.apply(context, [image].concat(toConsumableArray(params.map(function (param) { + return Math.floor(normalizeDecimalNumber(param)); + })))); + context.restore(); + return canvas; + } + + var fromCharCode = String.fromCharCode; + + /** + * Get string from char code in data view. + * @param {DataView} dataView - The data view for read. + * @param {number} start - The start index. + * @param {number} length - The read length. + * @returns {string} The read result. + */ + + function getStringFromCharCode(dataView, start, length) { + var str = ''; + var i = void 0; + + length += start; + + for (i = start; i < length; i += 1) { + str += fromCharCode(dataView.getUint8(i)); + } + + return str; + } + + var REGEXP_DATA_URL_HEAD = /^data:.*,/; + + /** + * Transform Data URL to array buffer. + * @param {string} dataURL - The Data URL to transform. + * @returns {ArrayBuffer} The result array buffer. + */ + function dataURLToArrayBuffer(dataURL) { + var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, ''); + var binary = atob(base64); + var arrayBuffer = new ArrayBuffer(binary.length); + var uint8 = new Uint8Array(arrayBuffer); + + forEach(uint8, function (value, i) { + uint8[i] = binary.charCodeAt(i); + }); + + return arrayBuffer; + } + + /** + * Transform array buffer to Data URL. + * @param {ArrayBuffer} arrayBuffer - The array buffer to transform. + * @param {string} mimeType - The mime type of the Data URL. + * @returns {string} The result Data URL. + */ + function arrayBufferToDataURL(arrayBuffer, mimeType) { + var uint8 = new Uint8Array(arrayBuffer); + var data = ''; + + // TypedArray.prototype.forEach is not supported in some browsers. + forEach(uint8, function (value) { + data += fromCharCode(value); + }); + + return 'data:' + mimeType + ';base64,' + btoa(data); + } + + /** + * Get orientation value from given array buffer. + * @param {ArrayBuffer} arrayBuffer - The array buffer to read. + * @returns {number} The read orientation value. + */ + function getOrientation(arrayBuffer) { + var dataView = new DataView(arrayBuffer); + var orientation = void 0; + var littleEndian = void 0; + var app1Start = void 0; + var ifdStart = void 0; + + // Only handle JPEG image (start by 0xFFD8) + if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) { + var length = dataView.byteLength; + var offset = 2; + + while (offset < length) { + if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) { + app1Start = offset; + break; + } + + offset += 1; + } + } + + if (app1Start) { + var exifIDCode = app1Start + 4; + var tiffOffset = app1Start + 10; + + if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') { + var endianness = dataView.getUint16(tiffOffset); + + littleEndian = endianness === 0x4949; + + if (littleEndian || endianness === 0x4D4D /* bigEndian */) { + if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) { + var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian); + + if (firstIFDOffset >= 0x00000008) { + ifdStart = tiffOffset + firstIFDOffset; + } + } + } + } + } + + if (ifdStart) { + var _length = dataView.getUint16(ifdStart, littleEndian); + var _offset = void 0; + var i = void 0; + + for (i = 0; i < _length; i += 1) { + _offset = ifdStart + i * 12 + 2; + + if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) { + // 8 is the offset of the current tag's value + _offset += 8; + + // Get the original orientation value + orientation = dataView.getUint16(_offset, littleEndian); + + // Override the orientation with its default value + dataView.setUint16(_offset, 1, littleEndian); + break; + } + } + } + + return orientation; + } + + /** + * Parse Exif Orientation value. + * @param {number} orientation - The orientation to parse. + * @returns {Object} The parsed result. + */ + function parseOrientation(orientation) { + var rotate = 0; + var scaleX = 1; + var scaleY = 1; + + switch (orientation) { + // Flip horizontal + case 2: + scaleX = -1; + break; + + // Rotate left 180° + case 3: + rotate = -180; + break; + + // Flip vertical + case 4: + scaleY = -1; + break; + + // Flip vertical and rotate right 90° + case 5: + rotate = 90; + scaleY = -1; + break; + + // Rotate right 90° + case 6: + rotate = 90; + break; + + // Flip horizontal and rotate right 90° + case 7: + rotate = 90; + scaleX = -1; + break; + + // Rotate left 90° + case 8: + rotate = -90; + break; + + default: + } + + return { + rotate: rotate, + scaleX: scaleX, + scaleY: scaleY + }; + } + + var render = { + render: function render() { + this.initContainer(); + this.initCanvas(); + this.initCropBox(); + this.renderCanvas(); + + if (this.cropped) { + this.renderCropBox(); + } + }, + initContainer: function initContainer() { + var element = this.element, + options = this.options, + container = this.container, + cropper = this.cropper; + + + addClass(cropper, CLASS_HIDDEN); + removeClass(element, CLASS_HIDDEN); + + var containerData = { + width: Math.max(container.offsetWidth, Number(options.minContainerWidth) || 200), + height: Math.max(container.offsetHeight, Number(options.minContainerHeight) || 100) + }; + + this.containerData = containerData; + + setStyle(cropper, { + width: containerData.width, + height: containerData.height + }); + + addClass(element, CLASS_HIDDEN); + removeClass(cropper, CLASS_HIDDEN); + }, + + + // Canvas (image wrapper) + initCanvas: function initCanvas() { + var containerData = this.containerData, + imageData = this.imageData; + var viewMode = this.options.viewMode; + + var rotated = Math.abs(imageData.rotate) % 180 === 90; + var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth; + var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight; + var aspectRatio = naturalWidth / naturalHeight; + var canvasWidth = containerData.width; + var canvasHeight = containerData.height; + + if (containerData.height * aspectRatio > containerData.width) { + if (viewMode === 3) { + canvasWidth = containerData.height * aspectRatio; + } else { + canvasHeight = containerData.width / aspectRatio; + } + } else if (viewMode === 3) { + canvasHeight = containerData.width / aspectRatio; + } else { + canvasWidth = containerData.height * aspectRatio; + } + + var canvasData = { + aspectRatio: aspectRatio, + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + width: canvasWidth, + height: canvasHeight + }; + + canvasData.left = (containerData.width - canvasWidth) / 2; + canvasData.top = (containerData.height - canvasHeight) / 2; + canvasData.oldLeft = canvasData.left; + canvasData.oldTop = canvasData.top; + + this.canvasData = canvasData; + this.limited = viewMode === 1 || viewMode === 2; + this.limitCanvas(true, true); + this.initialImageData = assign({}, imageData); + this.initialCanvasData = assign({}, canvasData); + }, + limitCanvas: function limitCanvas(sizeLimited, positionLimited) { + var options = this.options, + containerData = this.containerData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + var viewMode = options.viewMode; + var aspectRatio = canvasData.aspectRatio; + + var cropped = this.cropped && cropBoxData; + + if (sizeLimited) { + var minCanvasWidth = Number(options.minCanvasWidth) || 0; + var minCanvasHeight = Number(options.minCanvasHeight) || 0; + + if (viewMode > 1) { + minCanvasWidth = Math.max(minCanvasWidth, containerData.width); + minCanvasHeight = Math.max(minCanvasHeight, containerData.height); + + if (viewMode === 3) { + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } else { + minCanvasHeight = minCanvasWidth / aspectRatio; + } + } + } else if (viewMode > 0) { + if (minCanvasWidth) { + minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0); + } else if (minCanvasHeight) { + minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0); + } else if (cropped) { + minCanvasWidth = cropBoxData.width; + minCanvasHeight = cropBoxData.height; + + if (minCanvasHeight * aspectRatio > minCanvasWidth) { + minCanvasWidth = minCanvasHeight * aspectRatio; + } else { + minCanvasHeight = minCanvasWidth / aspectRatio; + } + } + } + + var _getAdjustedSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: minCanvasWidth, + height: minCanvasHeight + }); + + minCanvasWidth = _getAdjustedSizes.width; + minCanvasHeight = _getAdjustedSizes.height; + + + canvasData.minWidth = minCanvasWidth; + canvasData.minHeight = minCanvasHeight; + canvasData.maxWidth = Infinity; + canvasData.maxHeight = Infinity; + } + + if (positionLimited) { + if (viewMode) { + var newCanvasLeft = containerData.width - canvasData.width; + var newCanvasTop = containerData.height - canvasData.height; + + canvasData.minLeft = Math.min(0, newCanvasLeft); + canvasData.minTop = Math.min(0, newCanvasTop); + canvasData.maxLeft = Math.max(0, newCanvasLeft); + canvasData.maxTop = Math.max(0, newCanvasTop); + + if (cropped && this.limited) { + canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width)); + canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height)); + canvasData.maxLeft = cropBoxData.left; + canvasData.maxTop = cropBoxData.top; + + if (viewMode === 2) { + if (canvasData.width >= containerData.width) { + canvasData.minLeft = Math.min(0, newCanvasLeft); + canvasData.maxLeft = Math.max(0, newCanvasLeft); + } + + if (canvasData.height >= containerData.height) { + canvasData.minTop = Math.min(0, newCanvasTop); + canvasData.maxTop = Math.max(0, newCanvasTop); + } + } + } + } else { + canvasData.minLeft = -canvasData.width; + canvasData.minTop = -canvasData.height; + canvasData.maxLeft = containerData.width; + canvasData.maxTop = containerData.height; + } + } + }, + renderCanvas: function renderCanvas(changed, transformed) { + var canvasData = this.canvasData, + imageData = this.imageData; + + + if (transformed) { + var _getRotatedSizes = getRotatedSizes({ + width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1), + height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1), + degree: imageData.rotate || 0 + }), + naturalWidth = _getRotatedSizes.width, + naturalHeight = _getRotatedSizes.height; + + var width = canvasData.width * (naturalWidth / canvasData.naturalWidth); + var height = canvasData.height * (naturalHeight / canvasData.naturalHeight); + + canvasData.left -= (width - canvasData.width) / 2; + canvasData.top -= (height - canvasData.height) / 2; + canvasData.width = width; + canvasData.height = height; + canvasData.aspectRatio = naturalWidth / naturalHeight; + canvasData.naturalWidth = naturalWidth; + canvasData.naturalHeight = naturalHeight; + this.limitCanvas(true, false); + } + + if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) { + canvasData.left = canvasData.oldLeft; + } + + if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) { + canvasData.top = canvasData.oldTop; + } + + canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth); + canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight); + + this.limitCanvas(false, true); + + canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft); + canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop); + canvasData.oldLeft = canvasData.left; + canvasData.oldTop = canvasData.top; + + setStyle(this.canvas, assign({ + width: canvasData.width, + height: canvasData.height + }, getTransforms({ + translateX: canvasData.left, + translateY: canvasData.top + }))); + + this.renderImage(changed); + + if (this.cropped && this.limited) { + this.limitCropBox(true, true); + } + }, + renderImage: function renderImage(changed) { + var canvasData = this.canvasData, + imageData = this.imageData; + + var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth); + var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight); + + assign(imageData, { + width: width, + height: height, + left: (canvasData.width - width) / 2, + top: (canvasData.height - height) / 2 + }); + setStyle(this.image, assign({ + width: imageData.width, + height: imageData.height + }, getTransforms(assign({ + translateX: imageData.left, + translateY: imageData.top + }, imageData)))); + + if (changed) { + this.output(); + } + }, + initCropBox: function initCropBox() { + var options = this.options, + canvasData = this.canvasData; + var aspectRatio = options.aspectRatio; + + var autoCropArea = Number(options.autoCropArea) || 0.8; + var cropBoxData = { + width: canvasData.width, + height: canvasData.height + }; + + if (aspectRatio) { + if (canvasData.height * aspectRatio > canvasData.width) { + cropBoxData.height = cropBoxData.width / aspectRatio; + } else { + cropBoxData.width = cropBoxData.height * aspectRatio; + } + } + + this.cropBoxData = cropBoxData; + this.limitCropBox(true, true); + + // Initialize auto crop area + cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth); + cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); + + // The width/height of auto crop area must large than "minWidth/Height" + cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea); + cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea); + cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2; + cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2; + cropBoxData.oldLeft = cropBoxData.left; + cropBoxData.oldTop = cropBoxData.top; + + this.initialCropBoxData = assign({}, cropBoxData); + }, + limitCropBox: function limitCropBox(sizeLimited, positionLimited) { + var options = this.options, + containerData = this.containerData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData, + limited = this.limited; + var aspectRatio = options.aspectRatio; + + + if (sizeLimited) { + var minCropBoxWidth = Number(options.minCropBoxWidth) || 0; + var minCropBoxHeight = Number(options.minCropBoxHeight) || 0; + var maxCropBoxWidth = Math.min(containerData.width, limited ? canvasData.width : containerData.width); + var maxCropBoxHeight = Math.min(containerData.height, limited ? canvasData.height : containerData.height); + + // The min/maxCropBoxWidth/Height must be less than container's width/height + minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width); + minCropBoxHeight = Math.min(minCropBoxHeight, containerData.height); + + if (aspectRatio) { + if (minCropBoxWidth && minCropBoxHeight) { + if (minCropBoxHeight * aspectRatio > minCropBoxWidth) { + minCropBoxHeight = minCropBoxWidth / aspectRatio; + } else { + minCropBoxWidth = minCropBoxHeight * aspectRatio; + } + } else if (minCropBoxWidth) { + minCropBoxHeight = minCropBoxWidth / aspectRatio; + } else if (minCropBoxHeight) { + minCropBoxWidth = minCropBoxHeight * aspectRatio; + } + + if (maxCropBoxHeight * aspectRatio > maxCropBoxWidth) { + maxCropBoxHeight = maxCropBoxWidth / aspectRatio; + } else { + maxCropBoxWidth = maxCropBoxHeight * aspectRatio; + } + } + + // The minWidth/Height must be less than maxWidth/Height + cropBoxData.minWidth = Math.min(minCropBoxWidth, maxCropBoxWidth); + cropBoxData.minHeight = Math.min(minCropBoxHeight, maxCropBoxHeight); + cropBoxData.maxWidth = maxCropBoxWidth; + cropBoxData.maxHeight = maxCropBoxHeight; + } + + if (positionLimited) { + if (limited) { + cropBoxData.minLeft = Math.max(0, canvasData.left); + cropBoxData.minTop = Math.max(0, canvasData.top); + cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width; + cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height; + } else { + cropBoxData.minLeft = 0; + cropBoxData.minTop = 0; + cropBoxData.maxLeft = containerData.width - cropBoxData.width; + cropBoxData.maxTop = containerData.height - cropBoxData.height; + } + } + }, + renderCropBox: function renderCropBox() { + var options = this.options, + containerData = this.containerData, + cropBoxData = this.cropBoxData; + + + if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) { + cropBoxData.left = cropBoxData.oldLeft; + } + + if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) { + cropBoxData.top = cropBoxData.oldTop; + } + + cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth); + cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); + + this.limitCropBox(false, true); + + cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft); + cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop); + cropBoxData.oldLeft = cropBoxData.left; + cropBoxData.oldTop = cropBoxData.top; + + if (options.movable && options.cropBoxMovable) { + // Turn to move the canvas when the crop box is equal to the container + setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL); + } + + setStyle(this.cropBox, assign({ + width: cropBoxData.width, + height: cropBoxData.height + }, getTransforms({ + translateX: cropBoxData.left, + translateY: cropBoxData.top + }))); + + if (this.cropped && this.limited) { + this.limitCanvas(true, true); + } + + if (!this.disabled) { + this.output(); + } + }, + output: function output() { + this.preview(); + dispatchEvent(this.element, EVENT_CROP, this.getData()); + } + }; + + var preview = { + initPreview: function initPreview() { + var crossOrigin = this.crossOrigin; + var preview = this.options.preview; + + var url = crossOrigin ? this.crossOriginUrl : this.url; + var image = document.createElement('img'); + + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + + image.src = url; + this.viewBox.appendChild(image); + this.viewBoxImage = image; + + if (!preview) { + return; + } + + var previews = preview; + + if (typeof preview === 'string') { + previews = this.element.ownerDocument.querySelectorAll(preview); + } else if (preview.querySelector) { + previews = [preview]; + } + + this.previews = previews; + + forEach(previews, function (el) { + var img = document.createElement('img'); + + // Save the original size for recover + setData(el, DATA_PREVIEW, { + width: el.offsetWidth, + height: el.offsetHeight, + html: el.innerHTML + }); + + if (crossOrigin) { + img.crossOrigin = crossOrigin; + } + + img.src = url; + + /** + * Override img element styles + * Add `display:block` to avoid margin top issue + * Add `height:auto` to override `height` attribute on IE8 + * (Occur only when margin-top <= -height) + */ + img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;"'; + + el.innerHTML = ''; + el.appendChild(img); + }); + }, + resetPreview: function resetPreview() { + forEach(this.previews, function (element) { + var data = getData(element, DATA_PREVIEW); + + setStyle(element, { + width: data.width, + height: data.height + }); + + element.innerHTML = data.html; + removeData(element, DATA_PREVIEW); + }); + }, + preview: function preview() { + var imageData = this.imageData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + var cropBoxWidth = cropBoxData.width, + cropBoxHeight = cropBoxData.height; + var width = imageData.width, + height = imageData.height; + + var left = cropBoxData.left - canvasData.left - imageData.left; + var top = cropBoxData.top - canvasData.top - imageData.top; + + if (!this.cropped || this.disabled) { + return; + } + + setStyle(this.viewBoxImage, assign({ + width: width, + height: height + }, getTransforms(assign({ + translateX: -left, + translateY: -top + }, imageData)))); + + forEach(this.previews, function (element) { + var data = getData(element, DATA_PREVIEW); + var originalWidth = data.width; + var originalHeight = data.height; + var newWidth = originalWidth; + var newHeight = originalHeight; + var ratio = 1; + + if (cropBoxWidth) { + ratio = originalWidth / cropBoxWidth; + newHeight = cropBoxHeight * ratio; + } + + if (cropBoxHeight && newHeight > originalHeight) { + ratio = originalHeight / cropBoxHeight; + newWidth = cropBoxWidth * ratio; + newHeight = originalHeight; + } + + setStyle(element, { + width: newWidth, + height: newHeight + }); + + setStyle(element.getElementsByTagName('img')[0], assign({ + width: width * ratio, + height: height * ratio + }, getTransforms(assign({ + translateX: -left * ratio, + translateY: -top * ratio + }, imageData)))); + }); + } + }; + + var events = { + bind: function bind() { + var element = this.element, + options = this.options, + cropper = this.cropper; + + + if (isFunction(options.cropstart)) { + addListener(element, EVENT_CROP_START, options.cropstart); + } + + if (isFunction(options.cropmove)) { + addListener(element, EVENT_CROP_MOVE, options.cropmove); + } + + if (isFunction(options.cropend)) { + addListener(element, EVENT_CROP_END, options.cropend); + } + + if (isFunction(options.crop)) { + addListener(element, EVENT_CROP, options.crop); + } + + if (isFunction(options.zoom)) { + addListener(element, EVENT_ZOOM, options.zoom); + } + + addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this)); + + if (options.zoomable && options.zoomOnWheel) { + addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this)); + } + + if (options.toggleDragModeOnDblclick) { + addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this)); + } + + addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this)); + addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this)); + + if (options.responsive) { + addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this)); + } + }, + unbind: function unbind() { + var element = this.element, + options = this.options, + cropper = this.cropper; + + + if (isFunction(options.cropstart)) { + removeListener(element, EVENT_CROP_START, options.cropstart); + } + + if (isFunction(options.cropmove)) { + removeListener(element, EVENT_CROP_MOVE, options.cropmove); + } + + if (isFunction(options.cropend)) { + removeListener(element, EVENT_CROP_END, options.cropend); + } + + if (isFunction(options.crop)) { + removeListener(element, EVENT_CROP, options.crop); + } + + if (isFunction(options.zoom)) { + removeListener(element, EVENT_ZOOM, options.zoom); + } + + removeListener(cropper, EVENT_POINTER_DOWN, this.onCropStart); + + if (options.zoomable && options.zoomOnWheel) { + removeListener(cropper, EVENT_WHEEL, this.onWheel); + } + + if (options.toggleDragModeOnDblclick) { + removeListener(cropper, EVENT_DBLCLICK, this.onDblclick); + } + + removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove); + removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd); + + if (options.responsive) { + removeListener(window, EVENT_RESIZE, this.onResize); + } + } + }; + + var handlers = { + resize: function resize() { + var options = this.options, + container = this.container, + containerData = this.containerData; + + var minContainerWidth = Number(options.minContainerWidth) || 200; + var minContainerHeight = Number(options.minContainerHeight) || 100; + + if (this.disabled || containerData.width <= minContainerWidth || containerData.height <= minContainerHeight) { + return; + } + + var ratio = container.offsetWidth / containerData.width; + + // Resize when width changed or height changed + if (ratio !== 1 || container.offsetHeight !== containerData.height) { + var canvasData = void 0; + var cropBoxData = void 0; + + if (options.restore) { + canvasData = this.getCanvasData(); + cropBoxData = this.getCropBoxData(); + } + + this.render(); + + if (options.restore) { + this.setCanvasData(forEach(canvasData, function (n, i) { + canvasData[i] = n * ratio; + })); + this.setCropBoxData(forEach(cropBoxData, function (n, i) { + cropBoxData[i] = n * ratio; + })); + } + } + }, + dblclick: function dblclick() { + if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) { + return; + } + + this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP); + }, + wheel: function wheel(e) { + var _this = this; + + var ratio = Number(this.options.wheelZoomRatio) || 0.1; + var delta = 1; + + if (this.disabled) { + return; + } + + e.preventDefault(); + + // Limit wheel speed to prevent zoom too fast (#21) + if (this.wheeling) { + return; + } + + this.wheeling = true; + + setTimeout(function () { + _this.wheeling = false; + }, 50); + + if (e.deltaY) { + delta = e.deltaY > 0 ? 1 : -1; + } else if (e.wheelDelta) { + delta = -e.wheelDelta / 120; + } else if (e.detail) { + delta = e.detail > 0 ? 1 : -1; + } + + this.zoom(-delta * ratio, e); + }, + cropStart: function cropStart(e) { + if (this.disabled) { + return; + } + + var options = this.options, + pointers = this.pointers; + + var action = void 0; + + if (e.changedTouches) { + // Handle touch event + forEach(e.changedTouches, function (touch) { + pointers[touch.identifier] = getPointer(touch); + }); + } else { + // Handle mouse event and pointer event + pointers[e.pointerId || 0] = getPointer(e); + } + + if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) { + action = ACTION_ZOOM; + } else { + action = getData(e.target, DATA_ACTION); + } + + if (!REGEXP_ACTIONS.test(action)) { + return; + } + + if (dispatchEvent(this.element, EVENT_CROP_START, { + originalEvent: e, + action: action + }) === false) { + return; + } + + e.preventDefault(); + + this.action = action; + this.cropping = false; + + if (action === ACTION_CROP) { + this.cropping = true; + addClass(this.dragBox, CLASS_MODAL); + } + }, + cropMove: function cropMove(e) { + var action = this.action; + + + if (this.disabled || !action) { + return; + } + + var pointers = this.pointers; + + + e.preventDefault(); + + if (dispatchEvent(this.element, EVENT_CROP_MOVE, { + originalEvent: e, + action: action + }) === false) { + return; + } + + if (e.changedTouches) { + forEach(e.changedTouches, function (touch) { + assign(pointers[touch.identifier], getPointer(touch, true)); + }); + } else { + assign(pointers[e.pointerId || 0], getPointer(e, true)); + } + + this.change(e); + }, + cropEnd: function cropEnd(e) { + if (this.disabled) { + return; + } + + var action = this.action, + pointers = this.pointers; + + + if (e.changedTouches) { + forEach(e.changedTouches, function (touch) { + delete pointers[touch.identifier]; + }); + } else { + delete pointers[e.pointerId || 0]; + } + + if (!action) { + return; + } + + e.preventDefault(); + + if (!Object.keys(pointers).length) { + this.action = ''; + } + + if (this.cropping) { + this.cropping = false; + toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal); + } + + dispatchEvent(this.element, EVENT_CROP_END, { + originalEvent: e, + action: action + }); + } + }; + + var change = { + change: function change(e) { + var options = this.options, + canvasData = this.canvasData, + containerData = this.containerData, + cropBoxData = this.cropBoxData, + pointers = this.pointers; + var action = this.action; + var aspectRatio = options.aspectRatio; + var left = cropBoxData.left, + top = cropBoxData.top, + width = cropBoxData.width, + height = cropBoxData.height; + + var right = left + width; + var bottom = top + height; + var minLeft = 0; + var minTop = 0; + var maxWidth = containerData.width; + var maxHeight = containerData.height; + var renderable = true; + var offset = void 0; + + // Locking aspect ratio in "free mode" by holding shift key + if (!aspectRatio && e.shiftKey) { + aspectRatio = width && height ? width / height : 1; + } + + if (this.limited) { + minLeft = cropBoxData.minLeft; + minTop = cropBoxData.minTop; + + maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width); + maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height); + } + + var pointer = pointers[Object.keys(pointers)[0]]; + var range = { + x: pointer.endX - pointer.startX, + y: pointer.endY - pointer.startY + }; + var check = function check(side) { + switch (side) { + case ACTION_EAST: + if (right + range.x > maxWidth) { + range.x = maxWidth - right; + } + + break; + + case ACTION_WEST: + if (left + range.x < minLeft) { + range.x = minLeft - left; + } + + break; + + case ACTION_NORTH: + if (top + range.y < minTop) { + range.y = minTop - top; + } + + break; + + case ACTION_SOUTH: + if (bottom + range.y > maxHeight) { + range.y = maxHeight - bottom; + } + + break; + + default: + } + }; + + switch (action) { + // Move crop box + case ACTION_ALL: + left += range.x; + top += range.y; + break; + + // Resize crop box + case ACTION_EAST: + if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + renderable = false; + break; + } + + check(ACTION_EAST); + width += range.x; + + if (aspectRatio) { + height = width / aspectRatio; + top -= range.x / aspectRatio / 2; + } + + if (width < 0) { + action = ACTION_WEST; + width = 0; + } + + break; + + case ACTION_NORTH: + if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + + if (aspectRatio) { + width = height * aspectRatio; + left += range.y * aspectRatio / 2; + } + + if (height < 0) { + action = ACTION_SOUTH; + height = 0; + } + + break; + + case ACTION_WEST: + if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + renderable = false; + break; + } + + check(ACTION_WEST); + width -= range.x; + left += range.x; + + if (aspectRatio) { + height = width / aspectRatio; + top += range.x / aspectRatio / 2; + } + + if (width < 0) { + action = ACTION_EAST; + width = 0; + } + + break; + + case ACTION_SOUTH: + if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) { + renderable = false; + break; + } + + check(ACTION_SOUTH); + height += range.y; + + if (aspectRatio) { + width = height * aspectRatio; + left -= range.y * aspectRatio / 2; + } + + if (height < 0) { + action = ACTION_NORTH; + height = 0; + } + + break; + + case ACTION_NORTH_EAST: + if (aspectRatio) { + if (range.y <= 0 && (top <= minTop || right >= maxWidth)) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + width = height * aspectRatio; + } else { + check(ACTION_NORTH); + check(ACTION_EAST); + + if (range.x >= 0) { + if (right < maxWidth) { + width += range.x; + } else if (range.y <= 0 && top <= minTop) { + renderable = false; + } + } else { + width += range.x; + } + + if (range.y <= 0) { + if (top > minTop) { + height -= range.y; + top += range.y; + } + } else { + height -= range.y; + top += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_SOUTH_WEST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_NORTH_WEST; + width = 0; + } else if (height < 0) { + action = ACTION_SOUTH_EAST; + height = 0; + } + + break; + + case ACTION_NORTH_WEST: + if (aspectRatio) { + if (range.y <= 0 && (top <= minTop || left <= minLeft)) { + renderable = false; + break; + } + + check(ACTION_NORTH); + height -= range.y; + top += range.y; + width = height * aspectRatio; + left += range.y * aspectRatio; + } else { + check(ACTION_NORTH); + check(ACTION_WEST); + + if (range.x <= 0) { + if (left > minLeft) { + width -= range.x; + left += range.x; + } else if (range.y <= 0 && top <= minTop) { + renderable = false; + } + } else { + width -= range.x; + left += range.x; + } + + if (range.y <= 0) { + if (top > minTop) { + height -= range.y; + top += range.y; + } + } else { + height -= range.y; + top += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_SOUTH_EAST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_NORTH_EAST; + width = 0; + } else if (height < 0) { + action = ACTION_SOUTH_WEST; + height = 0; + } + + break; + + case ACTION_SOUTH_WEST: + if (aspectRatio) { + if (range.x <= 0 && (left <= minLeft || bottom >= maxHeight)) { + renderable = false; + break; + } + + check(ACTION_WEST); + width -= range.x; + left += range.x; + height = width / aspectRatio; + } else { + check(ACTION_SOUTH); + check(ACTION_WEST); + + if (range.x <= 0) { + if (left > minLeft) { + width -= range.x; + left += range.x; + } else if (range.y >= 0 && bottom >= maxHeight) { + renderable = false; + } + } else { + width -= range.x; + left += range.x; + } + + if (range.y >= 0) { + if (bottom < maxHeight) { + height += range.y; + } + } else { + height += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_NORTH_EAST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_SOUTH_EAST; + width = 0; + } else if (height < 0) { + action = ACTION_NORTH_WEST; + height = 0; + } + + break; + + case ACTION_SOUTH_EAST: + if (aspectRatio) { + if (range.x >= 0 && (right >= maxWidth || bottom >= maxHeight)) { + renderable = false; + break; + } + + check(ACTION_EAST); + width += range.x; + height = width / aspectRatio; + } else { + check(ACTION_SOUTH); + check(ACTION_EAST); + + if (range.x >= 0) { + if (right < maxWidth) { + width += range.x; + } else if (range.y >= 0 && bottom >= maxHeight) { + renderable = false; + } + } else { + width += range.x; + } + + if (range.y >= 0) { + if (bottom < maxHeight) { + height += range.y; + } + } else { + height += range.y; + } + } + + if (width < 0 && height < 0) { + action = ACTION_NORTH_WEST; + height = 0; + width = 0; + } else if (width < 0) { + action = ACTION_SOUTH_WEST; + width = 0; + } else if (height < 0) { + action = ACTION_NORTH_EAST; + height = 0; + } + + break; + + // Move canvas + case ACTION_MOVE: + this.move(range.x, range.y); + renderable = false; + break; + + // Zoom canvas + case ACTION_ZOOM: + this.zoom(getMaxZoomRatio(pointers), e); + renderable = false; + break; + + // Create crop box + case ACTION_CROP: + if (!range.x || !range.y) { + renderable = false; + break; + } + + offset = getOffset(this.cropper); + left = pointer.startX - offset.left; + top = pointer.startY - offset.top; + width = cropBoxData.minWidth; + height = cropBoxData.minHeight; + + if (range.x > 0) { + action = range.y > 0 ? ACTION_SOUTH_EAST : ACTION_NORTH_EAST; + } else if (range.x < 0) { + left -= width; + action = range.y > 0 ? ACTION_SOUTH_WEST : ACTION_NORTH_WEST; + } + + if (range.y < 0) { + top -= height; + } + + // Show the crop box if is hidden + if (!this.cropped) { + removeClass(this.cropBox, CLASS_HIDDEN); + this.cropped = true; + + if (this.limited) { + this.limitCropBox(true, true); + } + } + + break; + + default: + } + + if (renderable) { + cropBoxData.width = width; + cropBoxData.height = height; + cropBoxData.left = left; + cropBoxData.top = top; + this.action = action; + this.renderCropBox(); + } + + // Override + forEach(pointers, function (p) { + p.startX = p.endX; + p.startY = p.endY; + }); + } + }; + + var methods = { + // Show the crop box manually + crop: function crop() { + if (this.ready && !this.cropped && !this.disabled) { + this.cropped = true; + this.limitCropBox(true, true); + + if (this.options.modal) { + addClass(this.dragBox, CLASS_MODAL); + } + + removeClass(this.cropBox, CLASS_HIDDEN); + this.setCropBoxData(this.initialCropBoxData); + } + + return this; + }, + + + // Reset the image and crop box to their initial states + reset: function reset() { + if (this.ready && !this.disabled) { + this.imageData = assign({}, this.initialImageData); + this.canvasData = assign({}, this.initialCanvasData); + this.cropBoxData = assign({}, this.initialCropBoxData); + this.renderCanvas(); + + if (this.cropped) { + this.renderCropBox(); + } + } + + return this; + }, + + + // Clear the crop box + clear: function clear() { + if (this.cropped && !this.disabled) { + assign(this.cropBoxData, { + left: 0, + top: 0, + width: 0, + height: 0 + }); + + this.cropped = false; + this.renderCropBox(); + this.limitCanvas(true, true); + + // Render canvas after crop box rendered + this.renderCanvas(); + removeClass(this.dragBox, CLASS_MODAL); + addClass(this.cropBox, CLASS_HIDDEN); + } + + return this; + }, + + + /** + * Replace the image's src and rebuild the cropper + * @param {string} url - The new URL. + * @param {boolean} [hasSameSize] - Indicate if the new image has the same size as the old one. + * @returns {Cropper} this + */ + replace: function replace(url) { + var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!this.disabled && url) { + if (this.isImg) { + this.element.src = url; + } + + if (hasSameSize) { + this.url = url; + this.image.src = url; + + if (this.ready) { + this.viewBoxImage.src = url; + + forEach(this.previews, function (element) { + element.getElementsByTagName('img')[0].src = url; + }); + } + } else { + if (this.isImg) { + this.replaced = true; + } + + this.options.data = null; + this.uncreate(); + this.load(url); + } + } + + return this; + }, + + + // Enable (unfreeze) the cropper + enable: function enable() { + if (this.ready && this.disabled) { + this.disabled = false; + removeClass(this.cropper, CLASS_DISABLED); + } + + return this; + }, + + + // Disable (freeze) the cropper + disable: function disable() { + if (this.ready && !this.disabled) { + this.disabled = true; + addClass(this.cropper, CLASS_DISABLED); + } + + return this; + }, + + + /** + * Destroy the cropper and remove the instance from the image + * @returns {Cropper} this + */ + destroy: function destroy() { + var element = this.element; + + + if (!getData(element, NAMESPACE)) { + return this; + } + + if (this.isImg && this.replaced) { + element.src = this.originalUrl; + } + + this.uncreate(); + removeData(element, NAMESPACE); + + return this; + }, + + + /** + * Move the canvas with relative offsets + * @param {number} offsetX - The relative offset distance on the x-axis. + * @param {number} [offsetY=offsetX] - The relative offset distance on the y-axis. + * @returns {Cropper} this + */ + move: function move(offsetX) { + var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX; + var _canvasData = this.canvasData, + left = _canvasData.left, + top = _canvasData.top; + + + return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY)); + }, + + + /** + * Move the canvas to an absolute point + * @param {number} x - The x-axis coordinate. + * @param {number} [y=x] - The y-axis coordinate. + * @returns {Cropper} this + */ + moveTo: function moveTo(x) { + var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x; + var canvasData = this.canvasData; + + var changed = false; + + x = Number(x); + y = Number(y); + + if (this.ready && !this.disabled && this.options.movable) { + if (isNumber(x)) { + canvasData.left = x; + changed = true; + } + + if (isNumber(y)) { + canvasData.top = y; + changed = true; + } + + if (changed) { + this.renderCanvas(true); + } + } + + return this; + }, + + + /** + * Zoom the canvas with a relative ratio + * @param {number} ratio - The target ratio. + * @param {Event} _originalEvent - The original event if any. + * @returns {Cropper} this + */ + zoom: function zoom(ratio, _originalEvent) { + var canvasData = this.canvasData; + + + ratio = Number(ratio); + + if (ratio < 0) { + ratio = 1 / (1 - ratio); + } else { + ratio = 1 + ratio; + } + + return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent); + }, + + + /** + * Zoom the canvas to an absolute ratio + * @param {number} ratio - The target ratio. + * @param {Object} pivot - The zoom pivot point coordinate. + * @param {Event} _originalEvent - The original event if any. + * @returns {Cropper} this + */ + zoomTo: function zoomTo(ratio, pivot, _originalEvent) { + var options = this.options, + canvasData = this.canvasData; + var width = canvasData.width, + height = canvasData.height, + naturalWidth = canvasData.naturalWidth, + naturalHeight = canvasData.naturalHeight; + + + ratio = Number(ratio); + + if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) { + var newWidth = naturalWidth * ratio; + var newHeight = naturalHeight * ratio; + + if (dispatchEvent(this.element, EVENT_ZOOM, { + originalEvent: _originalEvent, + oldRatio: width / naturalWidth, + ratio: newWidth / naturalWidth + }) === false) { + return this; + } + + if (_originalEvent) { + var pointers = this.pointers; + + var offset = getOffset(this.cropper); + var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : { + pageX: _originalEvent.pageX, + pageY: _originalEvent.pageY + }; + + // Zoom from the triggering point of the event + canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width); + canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height); + } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) { + canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width); + canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height); + } else { + // Zoom from the center of the canvas + canvasData.left -= (newWidth - width) / 2; + canvasData.top -= (newHeight - height) / 2; + } + + canvasData.width = newWidth; + canvasData.height = newHeight; + this.renderCanvas(true); + } + + return this; + }, + + + /** + * Rotate the canvas with a relative degree + * @param {number} degree - The rotate degree. + * @returns {Cropper} this + */ + rotate: function rotate(degree) { + return this.rotateTo((this.imageData.rotate || 0) + Number(degree)); + }, + + + /** + * Rotate the canvas to an absolute degree + * @param {number} degree - The rotate degree. + * @returns {Cropper} this + */ + rotateTo: function rotateTo(degree) { + degree = Number(degree); + + if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) { + this.imageData.rotate = degree % 360; + this.renderCanvas(true, true); + } + + return this; + }, + + + /** + * Scale the image on the x-axis. + * @param {number} scaleX - The scale ratio on the x-axis. + * @returns {Cropper} this + */ + scaleX: function scaleX(_scaleX) { + var scaleY = this.imageData.scaleY; + + + return this.scale(_scaleX, isNumber(scaleY) ? scaleY : 1); + }, + + + /** + * Scale the image on the y-axis. + * @param {number} scaleY - The scale ratio on the y-axis. + * @returns {Cropper} this + */ + scaleY: function scaleY(_scaleY) { + var scaleX = this.imageData.scaleX; + + + return this.scale(isNumber(scaleX) ? scaleX : 1, _scaleY); + }, + + + /** + * Scale the image + * @param {number} scaleX - The scale ratio on the x-axis. + * @param {number} [scaleY=scaleX] - The scale ratio on the y-axis. + * @returns {Cropper} this + */ + scale: function scale(scaleX) { + var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX; + var imageData = this.imageData; + + var transformed = false; + + scaleX = Number(scaleX); + scaleY = Number(scaleY); + + if (this.ready && !this.disabled && this.options.scalable) { + if (isNumber(scaleX)) { + imageData.scaleX = scaleX; + transformed = true; + } + + if (isNumber(scaleY)) { + imageData.scaleY = scaleY; + transformed = true; + } + + if (transformed) { + this.renderCanvas(true, true); + } + } + + return this; + }, + + + /** + * Get the cropped area position and size data (base on the original image) + * @param {boolean} [rounded=false] - Indicate if round the data values or not. + * @returns {Object} The result cropped data. + */ + getData: function getData$$1() { + var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var options = this.options, + imageData = this.imageData, + canvasData = this.canvasData, + cropBoxData = this.cropBoxData; + + var data = void 0; + + if (this.ready && this.cropped) { + data = { + x: cropBoxData.left - canvasData.left, + y: cropBoxData.top - canvasData.top, + width: cropBoxData.width, + height: cropBoxData.height + }; + + var ratio = imageData.width / imageData.naturalWidth; + + forEach(data, function (n, i) { + n /= ratio; + data[i] = rounded ? Math.round(n) : n; + }); + } else { + data = { + x: 0, + y: 0, + width: 0, + height: 0 + }; + } + + if (options.rotatable) { + data.rotate = imageData.rotate || 0; + } + + if (options.scalable) { + data.scaleX = imageData.scaleX || 1; + data.scaleY = imageData.scaleY || 1; + } + + return data; + }, + + + /** + * Set the cropped area position and size with new data + * @param {Object} data - The new data. + * @returns {Cropper} this + */ + setData: function setData$$1(data) { + var options = this.options, + imageData = this.imageData, + canvasData = this.canvasData; + + var cropBoxData = {}; + + if (this.ready && !this.disabled && isPlainObject(data)) { + var transformed = false; + + if (options.rotatable) { + if (isNumber(data.rotate) && data.rotate !== imageData.rotate) { + imageData.rotate = data.rotate; + transformed = true; + } + } + + if (options.scalable) { + if (isNumber(data.scaleX) && data.scaleX !== imageData.scaleX) { + imageData.scaleX = data.scaleX; + transformed = true; + } + + if (isNumber(data.scaleY) && data.scaleY !== imageData.scaleY) { + imageData.scaleY = data.scaleY; + transformed = true; + } + } + + if (transformed) { + this.renderCanvas(true, true); + } + + var ratio = imageData.width / imageData.naturalWidth; + + if (isNumber(data.x)) { + cropBoxData.left = data.x * ratio + canvasData.left; + } + + if (isNumber(data.y)) { + cropBoxData.top = data.y * ratio + canvasData.top; + } + + if (isNumber(data.width)) { + cropBoxData.width = data.width * ratio; + } + + if (isNumber(data.height)) { + cropBoxData.height = data.height * ratio; + } + + this.setCropBoxData(cropBoxData); + } + + return this; + }, + + + /** + * Get the container size data. + * @returns {Object} The result container data. + */ + getContainerData: function getContainerData() { + return this.ready ? assign({}, this.containerData) : {}; + }, + + + /** + * Get the image position and size data. + * @returns {Object} The result image data. + */ + getImageData: function getImageData() { + return this.sized ? assign({}, this.imageData) : {}; + }, + + + /** + * Get the canvas position and size data. + * @returns {Object} The result canvas data. + */ + getCanvasData: function getCanvasData() { + var canvasData = this.canvasData; + + var data = {}; + + if (this.ready) { + forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) { + data[n] = canvasData[n]; + }); + } + + return data; + }, + + + /** + * Set the canvas position and size with new data. + * @param {Object} data - The new canvas data. + * @returns {Cropper} this + */ + setCanvasData: function setCanvasData(data) { + var canvasData = this.canvasData; + var aspectRatio = canvasData.aspectRatio; + + + if (this.ready && !this.disabled && isPlainObject(data)) { + if (isNumber(data.left)) { + canvasData.left = data.left; + } + + if (isNumber(data.top)) { + canvasData.top = data.top; + } + + if (isNumber(data.width)) { + canvasData.width = data.width; + canvasData.height = data.width / aspectRatio; + } else if (isNumber(data.height)) { + canvasData.height = data.height; + canvasData.width = data.height * aspectRatio; + } + + this.renderCanvas(true); + } + + return this; + }, + + + /** + * Get the crop box position and size data. + * @returns {Object} The result crop box data. + */ + getCropBoxData: function getCropBoxData() { + var cropBoxData = this.cropBoxData; + + var data = void 0; + + if (this.ready && this.cropped) { + data = { + left: cropBoxData.left, + top: cropBoxData.top, + width: cropBoxData.width, + height: cropBoxData.height + }; + } + + return data || {}; + }, + + + /** + * Set the crop box position and size with new data. + * @param {Object} data - The new crop box data. + * @returns {Cropper} this + */ + setCropBoxData: function setCropBoxData(data) { + var cropBoxData = this.cropBoxData; + var aspectRatio = this.options.aspectRatio; + + var widthChanged = void 0; + var heightChanged = void 0; + + if (this.ready && this.cropped && !this.disabled && isPlainObject(data)) { + if (isNumber(data.left)) { + cropBoxData.left = data.left; + } + + if (isNumber(data.top)) { + cropBoxData.top = data.top; + } + + if (isNumber(data.width) && data.width !== cropBoxData.width) { + widthChanged = true; + cropBoxData.width = data.width; + } + + if (isNumber(data.height) && data.height !== cropBoxData.height) { + heightChanged = true; + cropBoxData.height = data.height; + } + + if (aspectRatio) { + if (widthChanged) { + cropBoxData.height = cropBoxData.width / aspectRatio; + } else if (heightChanged) { + cropBoxData.width = cropBoxData.height * aspectRatio; + } + } + + this.renderCropBox(); + } + + return this; + }, + + + /** + * Get a canvas drawn the cropped image. + * @param {Object} [options={}] - The config options. + * @returns {HTMLCanvasElement} - The result canvas. + */ + getCroppedCanvas: function getCroppedCanvas() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (!this.ready || !window.HTMLCanvasElement) { + return null; + } + + var canvasData = this.canvasData; + + var source = getSourceCanvas(this.image, this.imageData, canvasData, options); + + // Returns the source canvas if it is not cropped. + if (!this.cropped) { + return source; + } + + var _getData = this.getData(), + initialX = _getData.x, + initialY = _getData.y, + initialWidth = _getData.width, + initialHeight = _getData.height; + + var ratio = source.width / Math.floor(canvasData.naturalWidth); + + if (ratio !== 1) { + initialX *= ratio; + initialY *= ratio; + initialWidth *= ratio; + initialHeight *= ratio; + } + + var aspectRatio = initialWidth / initialHeight; + var maxSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.maxWidth || Infinity, + height: options.maxHeight || Infinity + }); + var minSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.minWidth || 0, + height: options.minHeight || 0 + }, 'cover'); + + var _getAdjustedSizes = getAdjustedSizes({ + aspectRatio: aspectRatio, + width: options.width || (ratio !== 1 ? source.width : initialWidth), + height: options.height || (ratio !== 1 ? source.height : initialHeight) + }), + width = _getAdjustedSizes.width, + height = _getAdjustedSizes.height; + + width = Math.min(maxSizes.width, Math.max(minSizes.width, width)); + height = Math.min(maxSizes.height, Math.max(minSizes.height, height)); + + var canvas = document.createElement('canvas'); + var context = canvas.getContext('2d'); + + canvas.width = normalizeDecimalNumber(width); + canvas.height = normalizeDecimalNumber(height); + + context.fillStyle = options.fillColor || 'transparent'; + context.fillRect(0, 0, width, height); + + var _options$imageSmoothi = options.imageSmoothingEnabled, + imageSmoothingEnabled = _options$imageSmoothi === undefined ? true : _options$imageSmoothi, + imageSmoothingQuality = options.imageSmoothingQuality; + + + context.imageSmoothingEnabled = imageSmoothingEnabled; + + if (imageSmoothingQuality) { + context.imageSmoothingQuality = imageSmoothingQuality; + } + + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.drawImage + var sourceWidth = source.width; + var sourceHeight = source.height; + + // Source canvas parameters + var srcX = initialX; + var srcY = initialY; + var srcWidth = void 0; + var srcHeight = void 0; + + // Destination canvas parameters + var dstX = void 0; + var dstY = void 0; + var dstWidth = void 0; + var dstHeight = void 0; + + if (srcX <= -initialWidth || srcX > sourceWidth) { + srcX = 0; + srcWidth = 0; + dstX = 0; + dstWidth = 0; + } else if (srcX <= 0) { + dstX = -srcX; + srcX = 0; + srcWidth = Math.min(sourceWidth, initialWidth + srcX); + dstWidth = srcWidth; + } else if (srcX <= sourceWidth) { + dstX = 0; + srcWidth = Math.min(initialWidth, sourceWidth - srcX); + dstWidth = srcWidth; + } + + if (srcWidth <= 0 || srcY <= -initialHeight || srcY > sourceHeight) { + srcY = 0; + srcHeight = 0; + dstY = 0; + dstHeight = 0; + } else if (srcY <= 0) { + dstY = -srcY; + srcY = 0; + srcHeight = Math.min(sourceHeight, initialHeight + srcY); + dstHeight = srcHeight; + } else if (srcY <= sourceHeight) { + dstY = 0; + srcHeight = Math.min(initialHeight, sourceHeight - srcY); + dstHeight = srcHeight; + } + + var params = [srcX, srcY, srcWidth, srcHeight]; + + // Avoid "IndexSizeError" + if (dstWidth > 0 && dstHeight > 0) { + var scale = width / initialWidth; + + params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale); + } + + // All the numerical parameters should be integer for `drawImage` + // https://github.com/fengyuanchen/cropper/issues/476 + context.drawImage.apply(context, [source].concat(toConsumableArray(params.map(function (param) { + return Math.floor(normalizeDecimalNumber(param)); + })))); + + return canvas; + }, + + + /** + * Change the aspect ratio of the crop box. + * @param {number} aspectRatio - The new aspect ratio. + * @returns {Cropper} this + */ + setAspectRatio: function setAspectRatio(aspectRatio) { + var options = this.options; + + + if (!this.disabled && !isUndefined(aspectRatio)) { + // 0 -> NaN + options.aspectRatio = Math.max(0, aspectRatio) || NaN; + + if (this.ready) { + this.initCropBox(); + + if (this.cropped) { + this.renderCropBox(); + } + } + } + + return this; + }, + + + /** + * Change the drag mode. + * @param {string} mode - The new drag mode. + * @returns {Cropper} this + */ + setDragMode: function setDragMode(mode) { + var options = this.options, + dragBox = this.dragBox, + face = this.face; + + + if (this.ready && !this.disabled) { + var croppable = mode === DRAG_MODE_CROP; + var movable = options.movable && mode === DRAG_MODE_MOVE; + + mode = croppable || movable ? mode : DRAG_MODE_NONE; + + options.dragMode = mode; + setData(dragBox, DATA_ACTION, mode); + toggleClass(dragBox, CLASS_CROP, croppable); + toggleClass(dragBox, CLASS_MOVE, movable); + + if (!options.cropBoxMovable) { + // Sync drag mode to crop box when it is not movable + setData(face, DATA_ACTION, mode); + toggleClass(face, CLASS_CROP, croppable); + toggleClass(face, CLASS_MOVE, movable); + } + } + + return this; + } + }; + + var AnotherCropper = WINDOW.Cropper; + + var Cropper = function () { + /** + * Create a new Cropper. + * @param {Element} element - The target element for cropping. + * @param {Object} [options={}] - The configuration options. + */ + function Cropper(element) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + classCallCheck(this, Cropper); + + if (!element || !REGEXP_TAG_NAME.test(element.tagName)) { + throw new Error('The first argument is required and must be an or element.'); + } + + this.element = element; + this.options = assign({}, DEFAULTS, isPlainObject(options) && options); + this.cropped = false; + this.disabled = false; + this.pointers = {}; + this.ready = false; + this.reloading = false; + this.replaced = false; + this.sized = false; + this.sizing = false; + this.init(); + } + + createClass(Cropper, [{ + key: 'init', + value: function init() { + var element = this.element; + + var tagName = element.tagName.toLowerCase(); + var url = void 0; + + if (getData(element, NAMESPACE)) { + return; + } + + setData(element, NAMESPACE, this); + + if (tagName === 'img') { + this.isImg = true; + + // e.g.: "img/picture.jpg" + url = element.getAttribute('src') || ''; + this.originalUrl = url; + + // Stop when it's a blank image + if (!url) { + return; + } + + // e.g.: "http://example.com/img/picture.jpg" + url = element.src; + } else if (tagName === 'canvas' && window.HTMLCanvasElement) { + url = element.toDataURL(); + } + + this.load(url); + } + }, { + key: 'load', + value: function load(url) { + var _this = this; + + if (!url) { + return; + } + + this.url = url; + this.imageData = {}; + + var element = this.element, + options = this.options; + + + if (!options.checkOrientation || !window.ArrayBuffer) { + this.clone(); + return; + } + + // XMLHttpRequest disallows to open a Data URL in some browsers like IE11 and Safari + if (REGEXP_DATA_URL.test(url)) { + if (REGEXP_DATA_URL_JPEG.test(url)) { + this.read(dataURLToArrayBuffer(url)); + } else { + this.clone(); + } + + return; + } + + var xhr = new XMLHttpRequest(); + + this.reloading = true; + this.xhr = xhr; + + var done = function done() { + _this.reloading = false; + _this.xhr = null; + }; + + xhr.ontimeout = done; + xhr.onabort = done; + xhr.onerror = function () { + done(); + _this.clone(); + }; + + xhr.onload = function () { + done(); + _this.read(xhr.response); + }; + + // Bust cache when there is a "crossOrigin" property + if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) { + url = addTimestamp(url); + } + + xhr.open('get', url); + xhr.responseType = 'arraybuffer'; + xhr.withCredentials = element.crossOrigin === 'use-credentials'; + xhr.send(); + } + }, { + key: 'read', + value: function read(arrayBuffer) { + var options = this.options, + imageData = this.imageData; + + var orientation = getOrientation(arrayBuffer); + var rotate = 0; + var scaleX = 1; + var scaleY = 1; + + if (orientation > 1) { + this.url = arrayBufferToDataURL(arrayBuffer, 'image/jpeg'); + + var _parseOrientation = parseOrientation(orientation); + + rotate = _parseOrientation.rotate; + scaleX = _parseOrientation.scaleX; + scaleY = _parseOrientation.scaleY; + } + + if (options.rotatable) { + imageData.rotate = rotate; + } + + if (options.scalable) { + imageData.scaleX = scaleX; + imageData.scaleY = scaleY; + } + + this.clone(); + } + }, { + key: 'clone', + value: function clone() { + var element = this.element, + url = this.url; + + var crossOrigin = void 0; + var crossOriginUrl = void 0; + + if (this.options.checkCrossOrigin && isCrossOriginURL(url)) { + crossOrigin = element.crossOrigin; + + + if (crossOrigin) { + crossOriginUrl = url; + } else { + crossOrigin = 'anonymous'; + + // Bust cache when there is not a "crossOrigin" property + crossOriginUrl = addTimestamp(url); + } + } + + this.crossOrigin = crossOrigin; + this.crossOriginUrl = crossOriginUrl; + + var image = document.createElement('img'); + + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + + image.src = crossOriginUrl || url; + + var start = this.start.bind(this); + var stop = this.stop.bind(this); + + this.image = image; + this.onStart = start; + this.onStop = stop; + + if (this.isImg) { + if (element.complete) { + // start asynchronously to keep `this.cropper` is accessible in `ready` event handler. + this.timeout = setTimeout(start, 0); + } else { + addListener(element, EVENT_LOAD, start, { + once: true + }); + } + } else { + image.onload = start; + image.onerror = stop; + addClass(image, CLASS_HIDE); + element.parentNode.insertBefore(image, element.nextSibling); + } + } + }, { + key: 'start', + value: function start(event) { + var _this2 = this; + + var image = this.isImg ? this.element : this.image; + + if (event) { + image.onload = null; + image.onerror = null; + } + + this.sizing = true; + + var IS_SAFARI = WINDOW.navigator && /(Macintosh|iPhone|iPod|iPad).*AppleWebKit/i.test(WINDOW.navigator.userAgent); + var done = function done(naturalWidth, naturalHeight) { + assign(_this2.imageData, { + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + aspectRatio: naturalWidth / naturalHeight + }); + _this2.sizing = false; + _this2.sized = true; + _this2.build(); + }; + + // Modern browsers (except Safari) + if (image.naturalWidth && !IS_SAFARI) { + done(image.naturalWidth, image.naturalHeight); + return; + } + + var sizingImage = document.createElement('img'); + var body = document.body || document.documentElement; + + this.sizingImage = sizingImage; + + sizingImage.onload = function () { + done(sizingImage.width, sizingImage.height); + + if (!IS_SAFARI) { + body.removeChild(sizingImage); + } + }; + + sizingImage.src = image.src; + + // iOS Safari will convert the image automatically + // with its orientation once append it into DOM (#279) + if (!IS_SAFARI) { + sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;'; + body.appendChild(sizingImage); + } + } + }, { + key: 'stop', + value: function stop() { + var image = this.image; + + + image.onload = null; + image.onerror = null; + image.parentNode.removeChild(image); + this.image = null; + } + }, { + key: 'build', + value: function build() { + if (!this.sized || this.ready) { + return; + } + + var element = this.element, + options = this.options, + image = this.image; + + // Create cropper elements + + var container = element.parentNode; + var template = document.createElement('div'); + + template.innerHTML = TEMPLATE; + + var cropper = template.querySelector('.' + NAMESPACE + '-container'); + var canvas = cropper.querySelector('.' + NAMESPACE + '-canvas'); + var dragBox = cropper.querySelector('.' + NAMESPACE + '-drag-box'); + var cropBox = cropper.querySelector('.' + NAMESPACE + '-crop-box'); + var face = cropBox.querySelector('.' + NAMESPACE + '-face'); + + this.container = container; + this.cropper = cropper; + this.canvas = canvas; + this.dragBox = dragBox; + this.cropBox = cropBox; + this.viewBox = cropper.querySelector('.' + NAMESPACE + '-view-box'); + this.face = face; + + canvas.appendChild(image); + + // Hide the original image + addClass(element, CLASS_HIDDEN); + + // Inserts the cropper after to the current image + container.insertBefore(cropper, element.nextSibling); + + // Show the image if is hidden + if (!this.isImg) { + removeClass(image, CLASS_HIDE); + } + + this.initPreview(); + this.bind(); + + options.aspectRatio = Math.max(0, options.aspectRatio) || NaN; + options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0; + + addClass(cropBox, CLASS_HIDDEN); + + if (!options.guides) { + addClass(cropBox.getElementsByClassName(NAMESPACE + '-dashed'), CLASS_HIDDEN); + } + + if (!options.center) { + addClass(cropBox.getElementsByClassName(NAMESPACE + '-center'), CLASS_HIDDEN); + } + + if (options.background) { + addClass(cropper, NAMESPACE + '-bg'); + } + + if (!options.highlight) { + addClass(face, CLASS_INVISIBLE); + } + + if (options.cropBoxMovable) { + addClass(face, CLASS_MOVE); + setData(face, DATA_ACTION, ACTION_ALL); + } + + if (!options.cropBoxResizable) { + addClass(cropBox.getElementsByClassName(NAMESPACE + '-line'), CLASS_HIDDEN); + addClass(cropBox.getElementsByClassName(NAMESPACE + '-point'), CLASS_HIDDEN); + } + + this.render(); + this.ready = true; + this.setDragMode(options.dragMode); + + if (options.autoCrop) { + this.crop(); + } + + this.setData(options.data); + + if (isFunction(options.ready)) { + addListener(element, EVENT_READY, options.ready, { + once: true + }); + } + + dispatchEvent(element, EVENT_READY); + } + }, { + key: 'unbuild', + value: function unbuild() { + if (!this.ready) { + return; + } + + this.ready = false; + this.unbind(); + this.resetPreview(); + this.cropper.parentNode.removeChild(this.cropper); + removeClass(this.element, CLASS_HIDDEN); + } + }, { + key: 'uncreate', + value: function uncreate() { + var element = this.element; + + + if (this.ready) { + this.unbuild(); + this.ready = false; + this.cropped = false; + } else if (this.sizing) { + this.sizingImage.onload = null; + this.sizing = false; + this.sized = false; + } else if (this.reloading) { + this.xhr.abort(); + } else if (this.isImg) { + if (element.complete) { + clearTimeout(this.timeout); + } else { + removeListener(element, EVENT_LOAD, this.onStart); + } + } else if (this.image) { + this.stop(); + } + } + + /** + * Get the no conflict cropper class. + * @returns {Cropper} The cropper class. + */ + + }], [{ + key: 'noConflict', + value: function noConflict() { + window.Cropper = AnotherCropper; + return Cropper; + } + + /** + * Change the default options. + * @param {Object} options - The new default options. + */ + + }, { + key: 'setDefaults', + value: function setDefaults(options) { + assign(DEFAULTS, isPlainObject(options) && options); + } + }]); + return Cropper; + }(); + + assign(Cropper.prototype, render, preview, events, handlers, change, methods); + + if ($.fn) { + var AnotherCropper$1 = $.fn.cropper; + var NAMESPACE$1 = 'cropper'; + + $.fn.cropper = function jQueryCropper(option) { + for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var result = void 0; + + this.each(function (i, element) { + var $element = $(element); + var isDestroy = option === 'destroy'; + var cropper = $element.data(NAMESPACE$1); + + if (!cropper) { + if (isDestroy) { + return; + } + + var options = $.extend({}, $element.data(), $.isPlainObject(option) && option); + + cropper = new Cropper(element, options); + $element.data(NAMESPACE$1, cropper); + } + + if (typeof option === 'string') { + var fn = cropper[option]; + + if ($.isFunction(fn)) { + result = fn.apply(cropper, args); + + if (result === cropper) { + result = undefined; + } + + if (isDestroy) { + $element.removeData(NAMESPACE$1); + } + } + } + }); + + return result !== undefined ? result : this; + }; + + $.fn.cropper.Constructor = Cropper; + $.fn.cropper.setDefaults = Cropper.setDefaults; + $.fn.cropper.noConflict = function noConflict() { + $.fn.cropper = AnotherCropper$1; + return this; + }; + } + +}))); diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.min.css b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.min.css new file mode 100644 index 0000000..96d5de7 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.min.css @@ -0,0 +1,9 @@ +/*! + * Cropper v4.0.0 + * https://github.com/fengyuanchen/cropper + * + * Copyright (c) 2014-2018 Chen Fengyuan + * Released under the MIT license + * + * Date: 2018-04-01T06:26:32.417Z + */.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-canvas,.cropper-crop-box,.cropper-drag-box,.cropper-modal,.cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-canvas,.cropper-wrap-box{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline-color:rgba(51,153,255,.75);outline:1px solid #39f;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:after,.cropper-center:before{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width:768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width:992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width:1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC")}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed} \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.min.js b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.min.js new file mode 100644 index 0000000..4b45114 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/cropper/cropper.min.js @@ -0,0 +1,10 @@ +/*! + * Cropper v4.0.0 + * https://github.com/fengyuanchen/cropper + * + * Copyright (c) 2014-2018 Chen Fengyuan + * Released under the MIT license + * + * Date: 2018-04-01T06:27:27.267Z + */ +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],i):i(t.jQuery)}(this,function(d){"use strict";d=d&&d.hasOwnProperty("default")?d.default:d;var n="undefined"!=typeof window,r=n?window:{},l="cropper",k="all",T="crop",W="move",E="zoom",H="e",N="w",L="s",O="n",z="ne",Y="nw",X="se",R="sw",h=l+"-crop",t=l+"-disabled",S=l+"-hidden",p=l+"-hide",o=l+"-modal",m=l+"-move",u="action",g="preview",s="crop",c="move",f="none",a="crop",v="cropend",w="cropmove",b="cropstart",x="dblclick",y="load",M=r.PointerEvent?"pointerdown":"touchstart mousedown",C=r.PointerEvent?"pointermove":"touchmove mousemove",D=r.PointerEvent?"pointerup pointercancel":"touchend touchcancel mouseup",B="ready",A="resize",I="wheel mousewheel DOMMouseScroll",j="zoom",U=/^(?:e|w|s|n|se|sw|ne|nw|all|crop|move|zoom)$/,P=/^data:/,q=/^data:image\/jpeg;base64,/,$=/^(?:img|canvas)$/i,Q={viewMode:0,dragMode:s,aspectRatio:NaN,data:null,preview:"",responsive:!0,restore:!0,checkCrossOrigin:!0,checkOrientation:!0,modal:!0,guides:!0,center:!0,highlight:!0,background:!0,autoCrop:!0,autoCropArea:.8,movable:!0,rotatable:!0,scalable:!0,zoomable:!0,zoomOnTouch:!0,zoomOnWheel:!0,wheelZoomRatio:.1,cropBoxMovable:!0,cropBoxResizable:!0,toggleDragModeOnDblclick:!0,minCanvasWidth:0,minCanvasHeight:0,minCropBoxWidth:0,minCropBoxHeight:0,minContainerWidth:200,minContainerHeight:100,ready:null,cropstart:null,cropmove:null,cropend:null,crop:null,zoom:null},i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},F=function(t,i){if(!(t instanceof i))throw new TypeError("Cannot call a class as a function")},Z=function(){function a(t,i){for(var e=0;et.width?3===e?r=t.height*h:s=t.width/h:3===e?s=t.width/h:r=t.height*h;var c={aspectRatio:h,naturalWidth:n,naturalHeight:o,width:r,height:s};c.left=(t.width-r)/2,c.top=(t.height-s)/2,c.oldLeft=c.left,c.oldTop=c.top,this.canvasData=c,this.limited=1===e||2===e,this.limitCanvas(!0,!0),this.initialImageData=et({},i),this.initialCanvasData=et({},c)},limitCanvas:function(t,i){var e=this.options,a=this.containerData,n=this.canvasData,o=this.cropBoxData,h=e.viewMode,r=n.aspectRatio,s=this.cropped&&o;if(t){var c=Number(e.minCanvasWidth)||0,d=Number(e.minCanvasHeight)||0;1=a.width&&(n.minLeft=Math.min(0,p),n.maxLeft=Math.max(0,p)),n.height>=a.height&&(n.minTop=Math.min(0,m),n.maxTop=Math.max(0,m))))}else n.minLeft=-n.width,n.minTop=-n.height,n.maxLeft=a.width,n.maxTop=a.height},renderCanvas:function(t,i){var e=this.canvasData,a=this.imageData;if(i){var n=function(t){var i=t.width,e=t.height,a=t.degree;if(90==(a=Math.abs(a)%180))return{width:e,height:i};var n=a%90*Math.PI/180,o=Math.sin(n),h=Math.cos(n),r=i*h+e*o,s=i*o+e*h;return 90e.maxWidth||e.widthe.maxHeight||e.heighti.width?n.height=n.width/e:n.width=n.height*e),this.cropBoxData=n,this.limitCropBox(!0,!0),n.width=Math.min(Math.max(n.width,n.minWidth),n.maxWidth),n.height=Math.min(Math.max(n.height,n.minHeight),n.maxHeight),n.width=Math.max(n.minWidth,n.width*a),n.height=Math.max(n.minHeight,n.height*a),n.left=i.left+(i.width-n.width)/2,n.top=i.top+(i.height-n.height)/2,n.oldLeft=n.left,n.oldTop=n.top,this.initialCropBoxData=et({},n)},limitCropBox:function(t,i){var e=this.options,a=this.containerData,n=this.canvasData,o=this.cropBoxData,h=this.limited,r=e.aspectRatio;if(t){var s=Number(e.minCropBoxWidth)||0,c=Number(e.minCropBoxHeight)||0,d=Math.min(a.width,h?n.width:a.width),l=Math.min(a.height,h?n.height:a.height);s=Math.min(s,a.width),c=Math.min(c,a.height),r&&(s&&c?se.maxWidth||e.widthe.maxHeight||e.height=i.width&&e.height>=i.height?W:k),ot(this.cropBox,et({width:e.width,height:e.height},kt({translateX:e.left,translateY:e.top}))),this.cropped&&this.limited&&this.limitCanvas(!0,!0),this.disabled||this.output()},output:function(){this.preview(),wt(this.element,a,this.getData())}},zt={initPreview:function(){var e=this.crossOrigin,t=this.options.preview,a=e?this.crossOriginUrl:this.url,i=document.createElement("img");if(e&&(i.crossOrigin=e),i.src=a,this.viewBox.appendChild(i),this.viewBoxImage=i,t){var n=t;"string"==typeof t?n=this.element.ownerDocument.querySelectorAll(t):t.querySelector&&(n=[t]),it(this.previews=n,function(t){var i=document.createElement("img");pt(t,g,{width:t.offsetWidth,height:t.offsetHeight,html:t.innerHTML}),e&&(i.crossOrigin=e),i.src=a,i.style.cssText='display:block;width:100%;height:auto;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important;image-orientation:0deg!important;"',t.innerHTML="",t.appendChild(i)})}},resetPreview:function(){it(this.previews,function(t){var i=lt(t,g);ot(t,{width:i.width,height:i.height}),t.innerHTML=i.html,mt(t,g)})},preview:function(){var r=this.imageData,t=this.canvasData,i=this.cropBoxData,s=i.width,c=i.height,d=r.width,l=r.height,p=i.left-t.left-r.left,m=i.top-t.top-r.top;this.cropped&&!this.disabled&&(ot(this.viewBoxImage,et({width:d,height:l},kt(et({translateX:-p,translateY:-m},r)))),it(this.previews,function(t){var i=lt(t,g),e=i.width,a=i.height,n=e,o=a,h=1;s&&(o=c*(h=e/s)),c&&af&&(D.x=f-p);break;case N:s+D.xv&&(D.y=v-m)}};switch(h){case k:s+=D.x,c+=D.y;break;case H:if(0<=D.x&&(f<=p||r&&(c<=g||v<=m))){w=!1;break}B(H),d+=D.x,r&&(l=d/r,c-=D.x/r/2),d<0&&(h=N,d=0);break;case O:if(D.y<=0&&(c<=g||r&&(s<=u||f<=p))){w=!1;break}B(O),l-=D.y,c+=D.y,r&&(d=l*r,s+=D.y*r/2),l<0&&(h=L,l=0);break;case N:if(D.x<=0&&(s<=u||r&&(c<=g||v<=m))){w=!1;break}B(N),d-=D.x,s+=D.x,r&&(l=d/r,c+=D.x/r/2),d<0&&(h=H,d=0);break;case L:if(0<=D.y&&(v<=m||r&&(s<=u||f<=p))){w=!1;break}B(L),l+=D.y,r&&(d=l*r,s-=D.y*r/2),l<0&&(h=O,l=0);break;case z:if(r){if(D.y<=0&&(c<=g||f<=p)){w=!1;break}B(O),l-=D.y,c+=D.y,d=l*r}else B(O),B(H),0<=D.x?p or element.");this.element=t,this.options=et({},Q,_(i)&&i),this.cropped=!1,this.disabled=!1,this.pointers={},this.ready=!1,this.reloading=!1,this.replaced=!1,this.sized=!1,this.sizing=!1,this.init()}return Z(e,[{key:"init",value:function(){var t=this.element,i=t.tagName.toLowerCase(),e=void 0;if(!lt(t,l)){if(pt(t,l,this),"img"===i){if(this.isImg=!0,e=t.getAttribute("src")||"",!(this.originalUrl=e))return;e=t.src}else"canvas"===i&&window.HTMLCanvasElement&&(e=t.toDataURL());this.load(e)}}},{key:"load",value:function(t){var i=this;if(t){this.url=t,this.imageData={};var e=this.element,a=this.options;if(a.checkOrientation&&window.ArrayBuffer)if(P.test(t))q.test(t)?this.read((n=t.replace(Nt,""),o=atob(n),h=new ArrayBuffer(o.length),it(r=new Uint8Array(h),function(t,i){r[i]=o.charCodeAt(i)}),h)):this.clone();else{var n,o,h,r,s=new XMLHttpRequest;this.reloading=!0,this.xhr=s;var c=function(){i.reloading=!1,i.xhr=null};s.ontimeout=c,s.onabort=c,s.onerror=function(){c(),i.clone()},s.onload=function(){c(),i.read(s.response)},a.checkCrossOrigin&&Dt(t)&&e.crossOrigin&&(t=Bt(t)),s.open("get",t),s.responseType="arraybuffer",s.withCredentials="use-credentials"===e.crossOrigin,s.send()}else this.clone()}}},{key:"read",value:function(t){var i,e,a,n=this.options,o=this.imageData,h=Lt(t),r=0,s=1,c=1;if(1
';var o=n.querySelector("."+l+"-container"),h=o.querySelector("."+l+"-canvas"),r=o.querySelector("."+l+"-drag-box"),s=o.querySelector("."+l+"-crop-box"),c=s.querySelector("."+l+"-face");this.container=a,this.cropper=o,this.canvas=h,this.dragBox=r,this.cropBox=s,this.viewBox=o.querySelector("."+l+"-view-box"),this.face=c,h.appendChild(e),ht(t,S),a.insertBefore(o,t.nextSibling),this.isImg||rt(e,p),this.initPreview(),this.bind(),i.aspectRatio=Math.max(0,i.aspectRatio)||NaN,i.viewMode=Math.max(0,Math.min(3,Math.round(i.viewMode)))||0,ht(s,S),i.guides||ht(s.getElementsByClassName(l+"-dashed"),S),i.center||ht(s.getElementsByClassName(l+"-center"),S),i.background&&ht(o,l+"-bg"),i.highlight||ht(c,"cropper-invisible"),i.cropBoxMovable&&(ht(c,m),pt(c,u,k)),i.cropBoxResizable||(ht(s.getElementsByClassName(l+"-line"),S),ht(s.getElementsByClassName(l+"-point"),S)),this.render(),this.ready=!0,this.setDragMode(i.dragMode),i.autoCrop&&this.crop(),this.setData(i.data),tt(i.ready)&&vt(t,B,i.ready,{once:!0}),wt(t,B)}}},{key:"unbuild",value:function(){this.ready&&(this.ready=!1,this.unbind(),this.resetPreview(),this.cropper.parentNode.removeChild(this.cropper),rt(this.element,S))}},{key:"uncreate",value:function(){var t=this.element;this.ready?(this.unbuild(),this.ready=!1,this.cropped=!1):this.sizing?(this.sizingImage.onload=null,this.sizing=!1,this.sized=!1):this.reloading?this.xhr.abort():this.isImg?t.complete?clearTimeout(this.timeout):ft(t,y,this.onStart):this.image&&this.stop()}}],[{key:"noConflict",value:function(){return window.Cropper=At,e}},{key:"setDefaults",value:function(t){et(Q,_(t)&&t)}}]),e}();if(et(It.prototype,Ot,zt,Yt,Xt,Rt,St),d.fn){var jt=d.fn.cropper,Ut="cropper";d.fn.cropper=function(r){for(var t=arguments.length,s=Array(1 div { + display: inline-block;; + margin-right: 10px; +} +.img-preview { + overflow: hidden; +} +.img-preview-box .img-preview-lg { + width: 150px; + height: 150px; +} +.img-preview-box .img-preview-md { + width: 100px; + height: 100px; +} +.img-preview-box .img-preview-sm { + width: 50px; + height: 50px; + border-radius: 50%; +} \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/library.css b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/library.css new file mode 100644 index 0000000..5cccbc3 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/library.css @@ -0,0 +1,167 @@ +body{ + background-color: #edf7f9; !important; + font-family: Arial, 黑体, Tahoma; +} +.nav_library{ + width: 100%; + height: 80px; + background-color: #155070; + padding-left: 50px; + padding-right: 50px; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; + box-sizing: border-box; +} +.nav_left{ + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} +.nav_left img{ + width: 60px; + height: 60px; + margin-right: 20px; +} +.nav_left p span{ + font-size: 24px; + font-weight: bold; + color: #ffffff; +} +.container_top{ + height: 45px; + line-height: 45px; + font-weight: bold; + border-bottom: 1px solid #ccc; +} +.top_insert{ + width: 100%; + background-color: #ffffff; + padding: 45px 50px 20px; + margin-bottom: 10px; +} +.del_con span{ + color: #cccccc; + margin-left: 20px; +} +.bot_pic_con{ + background-color: #ffffff; + padding: 50px; +} +.news_box{ + margin-bottom: 20px; + overflow: hidden; +} +.news_box li{ + margin-bottom: 20px; +} +.row_dif{ + margin-left: -10px; + margin-right: -10px; +} +.small_card{ + padding-left: 10px; + padding-right: 10px; + position: relative; +} +.news_box li a img { + margin-bottom: 20px; + width: 100%; +} +.p_title{ + margin-bottom:10px ; + text-align: center; +} +.p_title span { + color: #283138; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + font-weight: 600; + font-size: 15px; +} +.p_con span { + color: #283138; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + line-height: 1.6; +} +.pic_check{ + position: absolute; + top: 10px; + left: 30px; +} +/*分页*/ +.fenye{ + width: 100%; + padding-bottom: 20px; + overflow: hidden; +} +.fenye .fenye_list{ + text-align: center; + overflow: hidden; + float: right; +} +.fenye_list a{ + color: #283138; +} +#fenye_list{ + overflow: hidden; + float: left; +} +.fenye .fenye_list ul li{ + float: left; + margin-right: 10px; + list-style-type: none; +} +.fensiprev,.fensinext{ + line-height: 30px; + display: block; + width: 60px; + height: 30px; + text-decoration: none; + cursor: pointer; +} +.fenye .fenye_list ul li .ye{ + display: block; + height: 30px; + width: 30px; + text-align: center; + line-height: 30px; + text-decoration: none; + cursor: pointer; +} +.fenye_list .page{ + display: block; + height: 30px; + float: left; + text-align: center; + line-height: 30px; + text-decoration: none; +} +.fenye_list #fenye_list li .index{ + background: #01b9d1; + color: white; +} +.fenye .fenye_list ul li .ye:hover{ + background: #01b9d1; + color: white; +} +/*分页*/ \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/list.css b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/list.css new file mode 100644 index 0000000..5b2a9fe --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/list.css @@ -0,0 +1,102 @@ +body{ + background-color: #edf7f9; + font-family: Arial, 黑体, Tahoma; +} + +.nav_library{ + width: 100%; + height: 80px; + background-color: #155070; + padding-left: 50px; + padding-right: 50px; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; + box-sizing: border-box; +} +.nav_left{ + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} +.nav_left img{ + width: 60px; + height: 60px; + margin-right: 20px; +} +.nav_left p span{ + font-size: 24px; + font-weight: bold; + color: #ffffff; +} + +.container_top{ + height: 45px; + line-height: 45px; + font-weight: bold; + border-bottom: 1px solid #ccc; + margin: 0 auto; +} + +.box_content{ + /* width: 1024px; */ + margin: 0 auto; +} +.content_bot{ + /* background-color: #ffffff; */ + margin: 0 auto; +} +#mytable th,td{ + background-color:#ffffff; + height: 40px; + text-align: center; +} +.video_box{ + background-color: #edf7f9; +} +.video_fps{ + text-align: center; +} + +.video_fps p{ + height: 45px; + line-height: 45px; + font-weight: bold; + text-align: center; +} +.video_inner{ + height:400px; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} + +.video_loading{ + height:400px; + display: flex; + justify-content: center; + align-items: center; +} +#canvas{ + /* vertical-align:top; */ + max-width:100%; + max-height:400px; +} diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/testvideo.css b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/testvideo.css new file mode 100644 index 0000000..52316c2 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/css/testvideo.css @@ -0,0 +1,71 @@ +body{ + background-color: #edf7f9; + font-family: Arial, 宋体, Tahoma; +} + +.nav{ + width: 100%; + height: 80px; + background-color: #155070; + padding-left: 50px; + padding-right: 50px; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; + box-sizing: border-box; +} +.nav_left{ + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + justify-content: space-between; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; +} +.nav_left img{ + width: 60px; + height: 60px; + margin-right: 20px; +} +.nav_left p span{ + font-size: 24px; + font-weight: bold; + color: #ffffff; +} +.refresh{ + position: absolute; + left: 50%; + top: 50%; + margin: -6px 0 0 -6px ; + +} + +.video_top{ + width: 1024px; + margin: 0 auto; + height: 50px; + line-height: 50px; + font-weight: bold; + +} +.video_content{ + width: 1024px; + margin: 0 auto; +} +.video_fps{ + text-align: right; + padding-right: 100px; +} +.video_inner{ + text-align: center; + position: relative; +} diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/loading.gif b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..227509e2d48a816161c742f2e36d0c04bd1398fc GIT binary patch literal 8069 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 rl0CHMaVX>r(YhGteZ6QG0Ar)99N)TAb$9{( zJaZG%Q-e|yQz{EjrrIztFe_$;M3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWscy1?p^1XIrJkXw zp^1f|j)IYap|QS!vA&_PuAz~Yfu)t9sR9%z0c|TvNwW%aaf8|g1^l#~=$>Fbx5 zm+O@q>*W`v>l<2HTIw4Z=^Gj80#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH*nV6WA zUs__T1av9H3%LbwWAlok!2}F2{ffi_eM3D1ke6TzeSPsO&CP|YE-nd5MYtEM!Nnn! z1*!T$sm1xFMajU3OH&3}Rbb^@l$uzQUlfv`p92fUfQF8Rr&xv6<2Fuf@Vy+%0of>J_m0nlcb)S}F?)D*X({9FaFkF7Fsy2Zc^ zr+HAlDY)HYfK#tN&@uX;ctwh5m=G}WfSB-93*^AleQF*su@?bT^|}4FQ49=>-JULv zAr-e`0)4ez0wwI8-zk3nxQyL6`IF&eW0%b{TO&M-q`8AmMg3%bvtdC*z_vODZ&gj# zSw}fmDsp!&sX2G1ch)h9@@HlC=WLHVHrv>){$5)(@80vHZHWvF8p*89YL{LWu39j& zY$tcWs}}R57h)6rG@d9q-OSu&AnRSU@_KKrP*{lfRnPFb>HF-r6n$bUz1wkjukX=G zcNHsBHw2a?<(-j;-hV<*PAiUc^{!qMr{|AeW(5Cym9aY5L2Y4tif&za^?|vUJA|G0 zR8DPW(BZ!_dl|1+0>hHeYHkWa%AQJx(!CaXiQScmobtCrfaS34y@?z8Z{+;9>;G{= zQGx5<;bmtwWGF55duO{aZNB#6$S3`0^EHy${ojk~G4{6A?(*EezBq=}JNw7cJ&xsh z_kLW}cv0vw`}DNFDaK19wrFfm;rYO1EH(2+?E#K+U#`_n(^Rn7S6cmXO=;Vcg=YB| zl#j{ZH(wW*DyZx7x=JeL$6v8_hU@2yrKjIq<5sawc(KP;liT87yp_KH6G&iiPd`*& TVtQ^5sHF0A^>bP0l+XkK^sdp8 literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u2.png b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2a67d430ad943058e1bef137b9c654185ed8df0 GIT binary patch literal 1324 zcmeAS@N?(olHy`uVBq!ia0vp@KrFz)1SFjfCglMs$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%!-*I5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8hm3bwJ6}oxF$}kgLQj3#|G7CyF^YauyCMG83 zmzLNn0bL65LT&-v*t}wBFaZNhzap_f-%!s0;1ij}LWqob>fi<^s?qnn|jtA(Ydshfq9xuK(p zfs2cap(#wSOMY@`Zfaf$Om7NYud4x0y`YqkTL84#CABECEH%ZgC_h&L>|?7;+-`Bf zX&zK>3Qo7UxZ>2S4|I$^C|;4`872fwJRl}K)dD&2bf20BOzcI#RP9oKHHLwKaiOP+ zV@SoVo*-LqW=Da$dvC|+&C>7ea%^(j7|2rZpryM;cgu%#j&Eg63T0+ViHjfbZ@3V| z+~qZ4!ZH0t;==kGJB_DT%-(&sRIlrp!;!|jscHAmR9kP3;Aj*m+F@~Ww)D%Uv;faT z0<&MdkD4hd)yo=inM0@Jnuhfr!>W+`zaG7a&?#88cde|w>|H75#HFXzlMmeFt2fAb zyLMsp6r*{Uv!|Aa8%tkFEnoljbko$1U&4Z{@6%7uPG71%`Bx`PrQY|Jgq|9qG^Q9k znb7d`$tv*+wI;G1_Of}xuQ@4WRikW?&urU}Hxb+Q|7Iw)f84wJ)2D;A-)?5@*y9ze z5xGr@Pk8##SAX*Kf>$xIGTwjebZEofxo19iKV35E;al$7#7+9EPB|qoFf_MB^%OpF zXk)0HQJiqxmve>e^{jh~_mz|#sGKgL$@1%Of7RQk*0Bz{AKCfpwSVP4`TSv-LckII zW;KZn9fy#}w4QEx88-uiyG2D+wOVp44-KB~{1|si;tyNKTBYhaGYaeeCgsl+_va2h q7WG0fh;yD?r_NF#N7sJ>2@Kg!t~^a{@;?hIzdT+2T-G@yGywnx=hzVd literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u3.png b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u3.png new file mode 100644 index 0000000000000000000000000000000000000000..927cded1f0359366e18549a48bd8ea9304d1daad GIT binary patch literal 1604 zcmeAS@N?(olHy`uVBq!ia0vp^fv4 zq}24xJX@vryZ0+8WTx0Eg`4^s_!c;)W@LI)6{QAO`Gq7`WhYyvDB0U7*i={n4aiL` zNmQuF&B-gas<2f8n`;GRgM{^!6u?SKvTcwn`Gu2HtFf>sxx70H< zH8im>)KM@pFf`UTFxEFT)-^P;GO)BVG*y5CC7^9ZDQQ+gE^bh}fIM5JjFOT9D}DX) z@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal z@=Hr>m4GgVcp0+w{G(ayiGsVi#$;Hgr&D_w%%*nve(AC1p!qC;(!pzCc zz}e8;z{v!r*Cju>G&eP`1g19yq1OnfUQkNNEdbi=l3J8mmYU*Ll%J~r_OVqaPPdr3 z;WQ7bHwCv_3~=hz2RcR{6t76}3=;w-9uO0rYJnVhx=+mmCiWs=sxD2sB*DPIwA0hY zF{I*_&E%8*!htf!pX<(Ddb(ucmVj%URyd?|JD9jQ?Wy>{)Y&Pn+FZ^~d=i z93CtX&sS6N2st9b&(xXNxlQcIC9#ZjE91E{%^&CAdU4w4)3p1ae%98%U%2yW>^eJv z zR%XBPB^kk!kJ37wJHDK^w~(Lyu2)^l^jp&3jMWQ1vUIbYwpl1)DO0}c_UuaABad&E zM69&j?JE1bwn9m?!E4%fZ+m~=#s{JY43$sn6^vzxI1{X8*3Rn7+o{VqPd&qS`I=O% z2bFuxKc(#YdRYJI%~y;Z9s-{}tDHza+1@?Nwcqq}#AY^Op(_lUE?rWUd+L<+XGg5( zt(wut#VCJMTk=PLQoZGxZ|<$xwnoYG;#RDaa4N@+*61o%#7| zca^5-4Ec^{q1B%w9&56#y6VF^;lZ^=|8SQX(j9FTn|6c-`MR~`*;!qD>wI)h26x=s zNs7+;Q~z6jTz6L7SJzf1=);T3K0RTV(U0nbG literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u4.png b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u4.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7b37fe5f63bab3010aa82a53440c5c9d2aab95 GIT binary patch literal 376086 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

je69=GJ59j=ND`}MB zqie_~oSte+Dg{J#BSiZHNFe}G;S3bGk^+Il!XTJNQ`fVCoEP0#`2h>ec4XKoso07( z*Y^e&{DX4K;moCWA^{+6H$6^ymlQ05F~+Lu5IshuX1QwHXH)}%ItjoMX zWs1MiG^XBwS}cphInDqGqG)N7VB{_~I0J3}tqL)4gGvj+X^MZ-<7-PxJptq{0fR0( zX~fVm+tLl-l2a!DLNZxv;1ZPNpn02Ft6@dR>`>qD6i7-~J4AFghy?`oj8N$UsEDVV@y5II&CZb1>G-%+FjRM$8Wi4$)OBel&58~QfLvzG! z>CPYcXRA&Wl@L=68=8?%N@37&AXYe#}P9L)hJNybv%+}8?xXKQnr{m=@Kf)ysSXrk&_k#GI1Ch%7eBn zw>i$5(JJ9RVRJ+f0bJtDaJ6|5gH{Hn1%t?z`le?OdoRh6@vgJn)%1u}HmPjPZ8hFC zzgtFTkvABDz8mJ`iJum|Lo*;pdBX-?MScj!WNogkDg z3UIYL%Sm{If<`OSBUYYQ39$4xGYgVyRhBH0 zKB7TP9JKBzsjWGWV%offyEW7f{S5%))zA;vEnrQ^=;4GDHpqSST7#H@QCW=-|9}lspv$32d{CZW?Z$Rdku%iMFBP#n)=q=KPBuj0Ulks|1(x z9-HqDFci+{p)RsXL;!;}VUpad`UJ=fBInIVon%=a&vc|l?0ms4C+7uqYpXOBW-l;s zPVJ)PgUC=cXzmEC9?QPFRZk9jCv0+dxgl!9Z#Lz+;eAm-h7y(W%rw{<&})+#IoGri z*x!NqW`*UcH&lxm*R(f!wu&e->oeZ6gH5nKr4$dwEN~-6by*1?Apo(AQmtQ7 zGJ^b2W3$}>3RK~EYIbF0gKiO09--EyJwP7!eeu zuDvpAXJ{$>JL*D}(CefPxgK<>jl?Jm5YRrZm=g^W_5!9EmAtt%C?D#l zUKtBS?l8x9#O^iuScRK%-)euEcIaK7j7gPB}lCnWP(6Vvki{PlW%T5i|% zbQkKbn^%ofmM6i{I=V>0>3BFCDS(uTij&@hLLC|V$h7oTrq*b|PASjV^!uyO?`P*3tY9gOm7*i5@B`z&<2c;^c>m*1@BYUhzW(N?bi7|A z9iH*5>@G}x zyz}9$_wP%Xjv@VKkc#AAJgasHuf&|$2}95i1xS$ojYCB4UcJ8wZKBjh5TqsMfYdU6 z5(gFF2=!mqrf4(G-x#lhufsvU8MFe_8$p%sLD<_lJsbIZ)x?I{Lom^7m=vIqOtaCc z9ve0iHlWZw)bstbxw|~Z^PCS(h)1XN^>|t94?VnF-oCv|2k^yFTGZ<~O)`qk-c5&r z;x5}Fe!%c!0FdvA9VpZ=zLnYu-h5d!2tvLSqB3I|(0l~Xa6wkZwPvkr?|BjE=F9DT zxkZ}c>8O)`)6}TsfiNVhS&3GL3kMiJ96GphJk|v~93F5{{h3gD$gN#hjT`3g?(idKgNdW--I*An; z24W`T>1f@Ea32*C$VXG_elwIqYpRSZy%sinyS60_(Z-c^0tcSRiC)zW)*x~w)a5yN zq?q$~!{((~>Mb-RW=aFH5+lMi($}ptQy{XhYhM@_ExSWFw9DAS{n|8_L43d{afo}b z9h*Fa$f$*dCr(nSAc6(0jP8z*p>t|R27(n+ntGMiHoF)~bL7O@cR;g6A1x8!2CZav zyRf9q8?RwM$s$e+_B%|xkmI2pMM&68ZA?P*0_~arBz0AlwrYl6l5Ws)ss9D$a3Y69 z=L}$*Hrs}J8m+c@N`gy`7tK0xmipXL7}T|$mZ`1EEoJ(sRC$5zgB(V2#`7QuqKr#~ z0hbl+uuOHR=jXwZ66V@$vjwigDj!c^^J%tRD~K40X+>2~x3MLYd`X>;`mK7#4K8{nz46_d%J@vDZ}iE$t3!^fqb{kZdw~pfu^jJqc;yCKj4#Qd)S&E@SP zmnNLq2oYVM+rd%?ZmQ8GV(YJdDTo3_$Ttkrj= z-V}Hg@*vkk&o}g2Qb@=ndpZB5qlj4ZHU2?X;~j0Xokq{mNZgR}o}Ds=O}_$s!1-W0 z1-*cD#6YOL+1S|45n=1XHzq~VZ&p&1*NWUV z^Hmtz<)z!^aK za#AZ4;DIF6%DALO4hxZ=ImT!jrS0j+7&|%G5nkIr+bA8uGxOPzTCc++h$Vz}9|ZGfw!$Z&I@O{RL-9neGVvlN&sa!i| zjLE!g&2#M@&bQ_K*1Rot%o2T@$J|B2GS5cqY_H3eq9qBjDoKbM4UPc>%92W>o!|SXA6@>Pakpa6Xd@!pxwP5Ub6}3E64H2=?(g!O zH`i&JAqQ2khw)(jWL1OI(j?uc%&J0I=HSB15K1SHz)f3#k<-QVHOXcWEAB%3<`N~nQRO`?eZ+jMl3kH$V}0gI(aM? z_``6oz4;`w1A#i==LJzkY=@609!r6UGfT^9$aC?Mx?Nv+S*PHa`V{5`n#KjHDi<(R z&;zV(?qZ}HDDDDrx0EqNR{z9MQNN_%CbUEs)v^hnJd5nO1+F`lJKvOy#tmKczDj#v z%Ie{Ysxl+_P)iGltFPk|`*3`o7-f8`n@$LXUDZ>&Haf~Mm-jY=kb4Db)J#A_OC_Hh z|0?p!Ms$LK4|#u5TL`wwJ(z~On-vink6eo^B?07Bx+ zz}6;aE}3_X|EjAPsU8uotgbmaY3wYJMEhq$%Su*nxQH?g zNqhIZy7reK`905ZT-x5||^DvB!r=yRB1%XyLp zF`hGXTFips+R#X!2&YyzwUk9xS6eHazkjHI-;V7ivj#J!qJ0yzaW`@HNXTjpT-lM~ zIc*(^7OG^K>^m(TtX+LEnzO%%L{4^z0mAMfr0aN)dJ<#XF9yL{PJNNR*{vdiKwm-y+^^Or~Q3igDT ziZNRejm8(ODa)x$mHwin^3;af2vF5pZv#%gQ=(bp{~Tc_p4A>{4gHj z%_x^`u-AJ1N3)KDzdH@?AQJh(g8wM<1@KK|!H{AGZijP?A7G=1W{3vWPrneMXGat5 zBIQVnTWY9Hx1rTWgBid@QzJO&kOf%({Bpf|5$YWLJiPE?a;}O0JXz$_b%g?&gB{OW z!gc{r*BgKbjB0>Dv-ea|_g<5zG*60-DEEN6#}0rCtJ80(uP`tny)KfW21em(yl?=W zO--~Wy|G%Pp(pk*uxhF>r?GNs3t)EE@zCF!m8=4q(+T-f@O~k3)|xfQ{2MnG@+PP* zO&14pbYzWk$EZ$*ju#rM=09(h^~=OLle#5mgCFu1YRB>};Rd|C_6EdrQ8wFM38-=>b-FmyC@V`~Z)AvEFKaf~$Ce zfH~kABAa=-r`*F)RF?5Zrb!0S6fmVHjD%I-E$m%@rE>)EE;+dTe*z5O9S{GlAU z_FXgeRE`t8<9dwX$_KCvz@xzouwy~Fi_%&O#dUe}>G_Ax&(9yerpryt zx(CUbh2!#_NQ$%ad56Ea7usll#Oi8sUi zM$JTl(X;>*&S*BGz$22(zT8YWntVj_&3hCiXI&m41ZL#iPH2b!6k53u@Fx*nT;0T0 z{adcqfIlB3q9zB7-VcUD*7|Z@e02okoJRZRp>ACnSxZ;9);cAZ#iIm!y2W@E%NG&- zMF|%9&FQY**T-=(Ku?seH;)|Mz zsPX^+WuWCGLTigkGsK~9l~!9AG0S4}e5K+0bbXc+rgnczUMy>C@gwIG6zVO<12qm~ zkh6U4{Nw`0I*(%z<-CQ|UflAf;aW|rvq_Bt(QI6n)!Rn$O3`$gjo8lQ`p~RP>P>Ug zQx&CT%VFsi-Gb?QJ!o$0g6Iw1@qJf>E9p{NXp-Xqg_6dlXHufX+`8E0FrG$hO6eEg zi<5dKdU2%5GKOYtAY|^5Mn>H$Ip$iokv|wY+fIsn$$7C5bsa{IBsl6XY3)T>1|ttR zAm`k&O)gsTSUmA=^|MiNP>ZYubtkvZ7k}uC2BJ9ToLcf6r8}Pyfu<@!3H>G?u;C-5 zO2ApS+?HGYA~`8g#NG|I$vKzT0fD|l1`gJQ&2g~H-e@80>8d=aONUjs)JY_YFD?I? zor#6zgQqy^hQcUdmY>T`-5y9uqtCT#T0r6yj4?t$iS|QiOM;@7&CXY&MhZ`TJib;Z zgqxI^T~M^SXrE-8HWOX6I7$p^5YK3_i0pFY~p_s96=AmV3s+iuH7%^fSF@eB>jpU>-ukJm4su3sO^vW|=k zvm~)=r;7nC6nEZ@<0OTO)s~5TTbZsOMj`mgIc>_$_P9YGYL3(=nYJ0lIJ(y*r@mfNY(2F^1t3T}AI!XSho}v~Fqt+-CvzF9 zArXV=+)o|keV4Ixf|dKmnx3IJX@y&vlmxze?3k`WWC}O}ven_Pb@%f+LzT4HO@pRt zRTVoKda3CLpa+BU&Qu_Wh$9`7jObrCvv?{epi|7a#9lsZ_PTA)mRm1V zW@c4@E8d#=vP)q_m&!3@T?XF5yT~=7e^GX&d;+=@!-j8Y8Qevu`Y$q0yY!=p$w9+s zj8FqenHTO_HHMHFY+@iENJmHZzVh=e#a+Pe(nw(FL;KL@pM?!j_Sflt? zG4&Ghf*q`GX_0|vJ*lsm=X=HmCAGgXjHS=&$_TAn-T$Hp?*A(I{V%zmbblDTtHDe2 z0y8bkuIN=~kcVY@KrVFM;EL#8Bu=9+)yjpLFdhX;*82f-cB@sVVg8=`E8JQ@mXx+& zEp&?eE9_m`!cX|Am8L@9v39UqFa@NID5l6zbe3IITVbz$>&vgpuXxc|(m&P@A$*}kn%pVvdt#wg*S_9$}3H#*-mk# zUnPZADXDpB>hk>{_HV= zC_5d;^|G8lpWT}8$5R;(47bFPctm+EHP<@N7;;+36IL|s37|qmuWN7Vw%lf;i82nc z5VZu9za*Pk3Y`@`$?T9}B`1smffRoj%KtDfmmL4kRnmoP$D=j0?U6)QL(JFV`qBO2 z@pk%Cxhwho!QGvLw~NMzqFAPyFE=kKtE|oG^V8v9|L8t{^dBChvj2<#P!Oso?eB*P z!*F*_=ELK9Ntfs!k9SF2PN&*$p6bUtrF0sHuW1l_@<_t|WWlcz5AM_^>ui)kf@wF@ ztHf@JMlxToX1bYi!e}lx#NNpCB9BUIC)!5)8ktE*%*MvF-{|pq%TE$SdSUFnQti~s zM{N5MXjzZdATl|zkq^b(fUG(J=glf#3~-De#(MUiqxoO|?Wt~VL%!4>`=@te4Nz;H zi)ecCm#2@lB!7OMMIIxarJZiq(_#2;>;3(sXk;I=jrpm#n*?S0X*wLH)5Ga>8l=sd z*1X2#Z!z%AB_Wf_Y7fitxTg9`--V~aq)%V|J+AYz{DaICoY8~;2Mw+e=!^!r0*_5H z5K=P5Tz|WqP9lgIdr2=`kW_B<$`54mvbj-kMKm2U;zB!AFN8Gl#wU>a5D11YST%3b z-btl9ytx;XqWYuJ_ZTtX65+<7mcECP680rA@KHQ0)|;dih_^Uf*wr}|7EfW)BE}J; zLKb4ed<>s=jmvzyYULqu?~RUZ(PS9k{mvNEdA=?Cl(yk8)we~~lHk=6;)#^{9UY8{ z1DQrkHP5Czal&4j?YvT`+A#yYCaEFd4#M!2t+#l7c_qk?VS2R_#pPl&8P%y>xs1{^ zVpYKKFs^=eyQo$W2Hh)!gA)vNYmAX)hGcHu05ljWW>cRld@Pt{im;S1oZ?@vSMkj) zFb1H6y5sMOITErK!Z7eO8|sHDO%Np>4;sP^dUk9!s-fqG5!&O3M*Z_6L~JspTpOl> zEXtN62VT1C)_aVj5gIKlZiKufko20Ft`^tAk#La~kQ~M!G1eoH8R?s4WF)dLWQh2o zy8&uJ=In|+UjsyR)-w><&$4kcemc`QDYeR%V`Fyip7v%VAS+WAx*y1mV1^Kp0UtbM zhncb$&V4r0KQ_oi^E9P7DY|3Lk9Ll{}^W8et%_?1o zdfu(I(9!WkF}-xQfoe+zDe!O!P*lRSr_i@20T=Mu0Um?7yH%DdwnLmmp$Y7=CV`e1 zZ~iLiWwRegIt4iz7XWA7k6&wAL+-b%x30A zJl-wny&AY341swl$`X83viAMh>b-B?cj6ABaJuT9Wti%z4Uz(fmR(TBhw%X6zUvP9 z5SP=9-(wQz8RtU@fF+q)oAF}Ezc*QY8h2g4F@d#bb|Xf(yhXh0!EpO< z@YB}z%q1|w6w8$vwpS!qg8-bq3}~s7fiNj5zPQpuNu(BzeyoA!E5d;v+;D)eA^u|# z6NNzd5YrB3y1)fUX#SWW7tftSMgyt2^tLq7EHnuND~O?%5$gRQm&h~rpct6OuPS|8 zy{KTr&}{iQn{y0{wwmGv&k2#nlxYx@eOZ^wW#Jf1DiL}5glplmmwXIHGii*CIxlIf zZa1E^GaDMVGYVE`Y{=+kv`#{h-2e_~zItE|$E{u`1`^eZ>mdb_MocDU6;hEP`U2!I zHn$L-?U{BQ3&a!-rSTNpX|RV;o|^jeoKF)N$woC6Lj9lD<+d!dJ!kj$7@wZjhX>x@ z4Vq_T?>NFWoM7b3C4PNcpU>;%RzN+m3c>8aw0fGx@gWXJJ&fz;UftJEbwypKynG7j z%_Oze>JK;hm1B_-B4{8K7l!NTP0@q4e9Ld3*iH=A%rZ+`&lpyX=e9e|eFuTu?v?k* z45M7~t59}B<2MYuTfn(%8uzBV<8qKM@+P%so4!e99IXgdk8J%?Bt=#-W0ut#-#&@A;DCBCY4L;&{X?N5J87={95#@%PCAdlE z{)t0eM$L(Ru6SJxd`jvridl_n6I8>Y?w(c?K`>JnE`8RL#1##}Y?NjPz{6_UVl|VU zCzB8g!5sG7VhWEy>8ia+O*U4@^>vL_0-BT4i7Z|Pc30%KuM`-3zTIfV-L9!vW#PIG z2t`%AkU)i+`S%r)qlQ$bVtf81N7rrMF(68Hnx>Inuse-P?Y=B1F?Jj}%^Lx9@O1;b zTjzR?IUFpEFa>XsGpeAo-PwEhR9j-dxw&^+=B(*x1@_ZOm~9mItr-_a_K0@{WutDS z)FHrhI&E05v9?9O>)?_}Mp=FC>Xz>WVhd_W&JC^T_SBpNde$}O(A!96M zTYY650a3ExjKgj!A%miPH$RcvHNh znJWMwq@WblbIR|p+ zp!86D_+~Ks|7rMYO%F2v&e(G2-M{-qv~*}sK%0D6c_IW3N{ks0||K_a}vviSTsv>wjnWSd$TrJ9>QaS-8 z_Xv|;owc@!?60u`?DsA|F>@U-FimNn*wo0RTietaaQh3ei+9@G=J`!ArCl5d56xn` z(^}c{1MEI*rVqJaMqIRs?~5s?>Fv3-dv>YjuQ<(vVKwHukjpnAS>DMQckHNNz1QEH z4VPE+lvV?m?=x)7HV}QW^_3SfFR-ZkmNdXs(L%6F4{Q0WmL!xuor}<1o|G&i!C6e@db&ou%}HPn49A=tSy1vnF$0(p=mB(|IvpKBcdp?tXZe zrr{Yf;)PCW&ESk>O8xDJl&0tT{nPdMe6F9;!lw-NyO`#uA&X~!3i2k*aIc0fED6Nu z{0-zo%O{_{!ab*!Q!x+Os8Kt0V#s2j#J9EH@5N}_%`!!&7WDLIz9u{Mn^~SsdMlH1 zrf#$4HNK^fH1<3D0cXudz(A#y7n5i39=ZjMg?c`|2%FViGU%IGV{6vcB@`c%Abc<( zY?MhI^RQA~W#Z0vnEmGOqp6EV6nf!chPxv98%LcK5;Fh>X(GFJG4Dx-@!8s2tWA*r z?Ll;6V)d7oEMdxq=VvXbp4|b>v)CagcapbP2HlWsi!YV;-vezOL}Pj}>nd6c_&l`& zc4NyeropcsVC%Zj5^TlT*ygeRI~8JLdk?OLi0yI;>srs4ahapbqr3WX%w+j*YyV|=fV(eoF{3VGn|D2(u1MLw>4SbxiE5sDNHM@pJ+_MCYCLV@7ueaM<-jouA*I95jq)S#CJ z>;vl18bqY$5(m%ROmW@>z1)@hCL1CWHL)hE_KcEXyAk>tUwM@22ohzab(|F6$mm)$ z8(y~eantMcs7a<`NGDLgah<^!7{~GM?j(;I#?oDdE}2cmZU?Kpzyc3@_NC5lod42J z>rB_0Sptw)Wmt{@gFj?AC`1WyHmkT4BhM1XYSai5jb7JFSVzIM!)T}ag^ai4M?@3o zg4)6d9VJ;pA@#7D>l5aiZpgFADW#Ez1&0^WVPe4e7PNydy*uGJ+Zhdl5>VHG1D2|4 zAQ-+i22L4#mNvNfjS{LWFb`ol&)U|**4I-iRWP0}npbOS3tXRdK4R#xqYonyEQC`O z62<6KspJAAP-7oU7{H661|%kGAV*$D1Xz;AlS(*bOjN(c1#}0=`Vo(*tWs6X+GSqX zDq|}i^0eZ&KG@C8v9#zV$8aVc;_TS4yIN!8SPD*(^7VSXU2m83vjL65BSYTW##HCn zRyPbNU2wtbHb^EI6M10MC!6tr6monVD<7}H=%NTB%fIyWd6~QiFIjxYF-$`c94!;C z)gHbN5G2n2a)nL5nb-35@%s1}ub1-hkp1Az#=N(B&zeba{XO#>AD=FtzN`_d72Vb{ zjeF^XXrS{Rp|UUC)RMq;{p>N=*qj_*&`il(VrIFc52E5VCirF&*W4!Pij;U*LbI+9 zDr9WbwNsI$S3N6cz(d`(;W|mx3cn{EtJ6_UjqTDFFry6+-V$F>or-szbO?=Z;hG7d zQ=2o(PqET(fDW2Fj=9REfxW}=M%DTDb^L6LvF1&w|0cfaF`jLGM9Q7d9!z*Pq;QSN zH`;C`SVas#_huj&I7HedmHsw$k+!V&KF47@JL3!)XTyG1m zTzOvXEct?Bh#fIe9>hc~4L5P48`kIg3a8-~k4JZW<1i(hjt?%xLNbu-FuuiQ!RnRc znOt@XJT?B*(7wim>RvHkyO(JE@IQ?=6cjUb0unxG9BDm9;S!+2_*HfloB z+HOj}c#ud)7F}XB#zr`gvMtDL-6LdOGT55QiCo?_X|_#0Zm-SV+_&T>5Z}hpH5OhEgv}^_tY;=Pj>b!czQmZXiC%(QL$r_o4x$Zvj zN|;y>LUdzG)-v`M#mY89zpymAwEgF>XI%ES#(pEiZ8qQNRoYhKWU` znn%AAPIOGvyLz8KefZ_$$6xN=KCFl}jNChmW}wQnbd)Tm`fEmCPu~NnC~HE9jSLAL zVtf#AlFeKjTLfL8di3;Z%h=`|tbx&;WGSyu*P}csKbiPnOuUBt&yVRTPc|#}4R|2% z&SfsoXZLjWx7smJKmXqUAMy*I{jmP{LtR(NDm8)2(W={EIi4^6_y0cr{7ZU1UlH5n z;Vo>?;)&DQsXY38KBYe%>@VZ-C+P&Hhvn{fiyg0XttIkW+}YR#)thktZ@|5$qj1Vt z9>5>I)OOa94C&FT;%f|9G}TR(D_UM@m=@{OYmt$TwD#5$eLNZ&=B;LdFHZf=TC&u3 z$LUZ@2{*Z62|4NHJ3|ia!Trlc&*0L4N2bW=VNYtCZC!64yLbaX5c${3SF@aDd~TF5 zZ4UUn7T!3pQpFPEwQu7CTF zFn_Gu)ANd~17Y2Sa2Nv-hgqg?@);I8%w@oA^dzY|`C5P5n^n%2_vv#O>>KytG<>Wd z?fm8X@b>NDIG*m`%N{xeM7U|=i(y@N@l3scS(5nQ)IYv~gjI`z>zr49y^yV4_j=-l zF}Hx|;MThN9_xd6&iJl&4PG&F-o zVBuF~0!PB#oT@9SV4>Tbs~H6WD7w^s=U-K?R<7ndKyq7kIsRgS4)^ z#uk^U0&)B@Px`Oh(irGR)?7oO6w-6TY@%^iQC_X|av-A_9VIhHx2Xh!Tgm%|SB3Qc zqWX6{hKtWzN?7&{ZpCF{Y5~kfRw;7OYhje(hvOu{PHt=YG^j4yAp$R~^~s1RL2-_m zFH5Y)(3r8u*N-={7V2t-j%gfGqt=31K2+^n^L$+;rpRXz0tlZQ0CnI@x9csN z)0|~DC7%qY>j+Udq)o^@Nlo`B6Vq5_K)qR0ojZhft7#%Ta`p7nYZ z3Yd`HqvTALo}&(}#2AEH>oo5c#WXW)!mo+XxAx^Pj~AJ;2cn!n2$HI{!X~9;jRLn+ zY4d!dO_K0x<*XGuAGe!?Hj%aM$ct5Ai|z`pEB2bYkwXTlq+FhS9vzc?`=C&-vL*zv z%>@cs50u;006##$zuaa4xpEf>?raWq`i_j?b+xrZ%~=N;J;|KUd8mC@5kt6>xlV2w zUPF5&VD;JYRcvE z%_OR9ztL`)-{1Syuks_l`z=aJ(Q-jJu8shg(Kr*|nDb8I1oHNMXzqtQxziRRl=@=W z{c4Y6LtD@68pXO4wGyOCtw7!0Isf0`LzEXn{EZiaUAKs(re$K40Mun(MMZJBEjLJ$ z+$g%FW;9af2->Zfw!0hPclx)A5sh&J>}BM8N}23DpmwiKkHirVzK3~i*dv@JN<&bK zSxfV0mGB@2CC8O_QDP`?s7pRO13iUNT+gXUYY+f_ivw**{W&<9Q_U*XPRg4$WfR5o zgyy5w7F1D(q)hm?pLV$!e%YPLLt}d~<*doS%gz*C5kYbr?RI?b$C2#})(d6TFT}b= zYsXDUW+(h=bg{Chzr7*~XhIniq=+x=!ao>(Q?_yJhL$r>j?QsKqZyhl7f6S2nelC;or=va$TmrU;SlU zk}7yqQj9bKQMys^dkd>8hG@3opB1w&OlfL2;8ShhkVyv_81wC9$|`rWwv*8Z7=IEk zut{@Bg$GR^m(4)}??_5rVZfVXiGN$3KVH)pYk$t8fFTHqcgVpNW&9lNWv+*_Pj&k| znDoQ>IX{1~^J7_s13w2$XBxA%VCXol>%;Tq@b&rrwv17RjGW?$vmZ47V&;3u^If_= z_~kcty*G2+TkeME<6W(4kM=FKo3%PKijsrpFv-(G!07eK~)Yb6vuSAY?yGZ-4uDwTiz^hjo3zBstZ! zWA6Xf_0Jq*cks~c&|-%A*a0_?YANr7Kg}~4@(V98jrNJoobL9 zOQ2t_Y_}wP5lhed==<`;|86MpI{p0=rhoDOI3sT3`4=bdlKDYBWbiBwKfI}{eXq z2i3*l%($e1kYn&~Vynq!G0K%^?(0>Gh|3zEZ`WEXNY7m>?BXy&Lc6@skwbp$!96)) zpPb*Gzk*pkynFk`2O)yguDtG+L;aCyXb!Tq>4WYIKCGj7=PBjBcqtC>Z6hojQt`QM z8Xngi_=u9mnTL!gL1+!G(;2zFW~+=U8QYVQ;>DL3Lt{PK2V(5<-&VU>yycF^N^v6w z3BEhBFfC-WopG*vM0FP!j{$IN{T(Uf&XOaIL4qI*5nc>KFGU340HI+V>s1LUjSb({ zY%_dz-9jCG$8jR+^n;;vAWgb95COs;$*WwXVGXRZC~3DCbmC3Nja`;OUXamscIx0% zC~%c%3LT(lb(axM>&Sh@L!{5KMLjyaRq~71*q}q$4QDOVjEP^?i$I1|F7>76B8kY2 z=apSvCAN%_#7bym6()LKu+8Q72AhJ-OFh>Qhe7BMmXgb1jq7E(;ik-`LU^5n`? z1kETU6&@jxQ6F9IeWVJ7oLc5NB&|RlFX4`3fCE9@0u86|aGVtjHGzfd0V3m!GWY~E1um;{ z#9P9v)=|2yN@J@*hz0hwp)>uyty9Vio@e=9*QoY+VCzAR3N0fLa!i}{k&d}XGfCDp zJPPTaAZ-+_l8@s-tY+jW5l}J0q=s-iC&C^c4vgQ4&95J=vmnLwPTv)OH&_vlMJK5> z-1d<{&pB&ZYA+LE2`Vg^zrfW@$$obnvN{bcQkk@goFn4_;mgH+0M(sGOP9f zW$n$nBssD(G248Jh}^1B1vGl)u!qu6(t~vLFt7Rn`rCTc(K+HAY1r&(b~n2L6l%-N z*nF`?_T78U+#|CJ04aiKFe@uF!o%F$?)EL*${|5%(&Q$Q1f6=PcP?$soWFn5rMoS( zuE`aEpFOrZPP1yi4tHnWnTPh>U-#$pQ0!r8N@`umWoukXhZQGNo-D!wQ?2M+2@$98;~Y+LpAYhLI^@^wch}M8J!Urj zX1lrCZt?S*z6bS4JMOC=59e`=0|wRVln;KAb~%ms$#Yc4S*YW~obw4bB*ycC(}v+X z;CnpKavkPY;8)}6$~HNvQrlOrz?WsvEtOR+2Lb15X_+4)XPZJ;7u8iMf^%}_LMf&i z?m5d`kCCr^ zKEQDjTV3RlRj~i57yDrH-d5~^%Vah(FiK*Pi>5bQl2Bf3iYSouF)n1nsQ+j=S>gB{ zMK?9k^i+bnIJ{NxX>BoMSFvy_PHbe&@Cu0xndDlX3Sze2*36-ox;B}ji;gtX(;$Ef zVY_NvQ{sEQ1mi9W8ewEaz!#E@F+(_h+63r^N0uN(1JA?o+BZgH6LiLy2sGjASiF z&;(|sy?B8ed!`jBWV4I@U*#z9ej>;njmMRU<)ngJmhzo~8xKGjA0?0@vnt4v%ntB! z4Q>RvHp8%vWn(-kFL9Sh_;^j*%ZG0oxInoTNhXs0UYU~$ zyIa>j#`+~RTM$>wlZwMU5SoKom5nBk9Ig!8IcyLf8jq0xgN6GE#TA8FlckI=UJoiU$yzfnZ7@7{-XBZ zsWcdpU`sBUIcI025J&SdoUqiykvN_=LO^!RGAU*ziMJDMU7)PO_*&xsMpSHimD!N;0eD?((Agv`*YDu_FH25OJvi47>*-bbNU%hB|jYDM$!o2t) zMWWt$-R1B9vw59YJAe19>Ax6MP4C_Vj$t;N{&@RqtNtc$-tW>c&cpamAN~7}AM@+~ z;l1}~E(o#vm>g%en0voy)0ewl*C6O_Og`NQMAn2sc|_F9`vzy!+xT_JRcVEa}+p=B9K_m$#HCiVooI~!4`8-$e!<|wP17`h)%A=DP675 zUp$CtavBRmkzCP4D&>PM{*gQufkI!>4Hjsc;*7GA?Cp`a(S(#8yfK>=6<&NcU#>D0 z{YlbLV~7N!u9Ia!d(L4vnSotl)3IK?`(&v&#!_x$0_@KcdkUi6WoU8}i$_S2@T7E348Q0x zA{YmoZ5Lq^re7Py))EM+?qA8x{j^+pT4qBmAs|D6GM2DhWr}WH!FPXxm??8I&5#cm~^Ro$O{Xh)=#70qfoMI)1-WgeL>kpYR)mcgZI zGtYf|nTx=j{XwpX$37QCR2cYRRp(=x_UimdB9<1|_?)5V6FlZ4)#-w>uLzoSp(#@} zlz)oQ`=wgGJi>OgTUwb7TXjDdU|&X|yyif$N6zVUS>MadP1h?aoO+DIha9I=r;7kH zLsL*tLK-h`Swy3=xjJe0K8$Zrj;Ftz=6EEKqsUz{A;5BJcB?u#?B!Gxy(-9LQdVn7 z+BbRDbL44-Rvk6!o78ypz5`Fk3t{rPl(@ba`Rc+IswNF(h+fCWNgy(My+wrETb4qr zryA_bou~ruQGnuWj&&W3vg|HvW<_>%VGL5CXs61TmvF3vv6AGK75T2)irg!Z6ro$I zMR8hR7`CP#J0}XN>d1TQx3QYmR{+ALM*MQ3(3~w*L5G4tDL@=i#+6WLKGFGJ zH8azq9#IEFi^9aETuf4ze%W;cKar7G7PbK8(hpc%r0Vf{(ZpD=0W2j>&k}1Z!mf`- zQ{JPK<^USV8JTyplL(iDI?qVLsxv_B7tlcASxJIoLgphrE}sU-yz{G*?=3ac1OU(J zQLggaZP(6CJ2qx+Qjw7%C%-sBnb$XUoIoJ@X&Uy2^XY`XvEq7hEjE$TJdMLJk7LdU z8%w&J`m#k_UB1v)fdLzdn~NbQ82})1aTAS%Gm&SufLFPklJ;gI+IJydDtYi~Fis-J zhBh|oX>)JK5bu!HvZomurEU!%vx}^o{?z7To*^T!3gBi@7f40lVJ#O^wdhk?$-LA# zJzcry%vB^SOShjXdBnPap%U6>4a~^Feyn_yg$_r5oJR6*-5;O=o8wSppxmB+Xn&mG z6n8z^PIYW3msW#=DCS~-mlnOeXyp4$seh(3vb6nEJUx%{wyY&zR_JrDNvN|%Y4+zPF8Khm)Z*R(m!<8Y>ZqTF;kfB$X%`X4^L`@bFot>j<7KIcUqlV-` z&V**8JIn@;-r;b>)8}(e&~u3l@im&1bK^SiXC_$VdGb)#;;AnChsGL6$zF@MiV&y8 zpsgg%95wUKg&w_TpE{(?n0N%C%q7L(wYeTOEM^xKL#)^4F0q);qE|`j=1j?DuJ4NPLLpQSdGsMxV@;^xu0+yFiEWe-l zabh)FePMG~Oyv`ilc-b7ZheIOU&f>&Jd?;C0L||}utlDbN+D>O?VpUaFbJ)lLaGSl zmUkZYUh+fW!Q&Z{_PRIiwl(5rgZF|OrH1`=GxZ#cCqGAlloH=R|0P&1_~g?x&hs?o zXxH>m%WVwke|`{JH4cnk6J#z2a7X=KvTgS)gL;>DQ5zq+^v0csbUwu`Z~ru%^BddK zA;$_W^o&5G13Ql|?%%)o@c!}D&(B@wtQ!b10?q1RZmqjJ`MY=b>i+bQpUOtr%8aBj z6c{B$uZ%zTU6e-LHH5{t%Akv5UFd(nQyu z86m8TREq(aTFp94)S`haZDe+P9F;$!1Fx=2BYH*@)J`;21Xx~kc2lt;i4RU6h0+#S zddSP(<3P*#pUx42$OA$!L;Hvw_F(Q(QcXh*R{$P}qd{#BgSi0ci&LORT>=p;Y;(kD zJKtXq?R7e}G$SViMs8URr?mf;B<_z`Xv+s8;n)15i@TTSe0RmAO!kS zPh*Z6&56i`mTT`}8sBKM>AEi((yosq4MbTngomK+Tl+e{SLc6`U#JQH^*rzLTO7{Kd;7)z z;a}%7^X*^uWBA)>T46M>caEe&`HPNQ;Rr>|i}xvhL?2!Kbx`fLxqI>AwK_m#3ZBG; zj7V0Yvu^gx=SC{l{yhFAfBhSE)T58x@R2^$4*5oITVay}X@0l`^hU9lPzqyMOgiNtkDX5!u>9&>IasFiF?;kAdz`K`Cc z3f+b#;Pn*OEStd9Heu8;$FMZ_KpNI-wJ=~9af!Xl?q_hQZ_xB@OfiUs>8`Z>w5rVd zMT$=)QFzEtx0UL_=%PsxMbFHbl?xX2$V*wD%t9?H@`*w()EKT8pdu03XCiu$g?TYZ zHANY)46zgG0s)Z4#~7o99KiJ42t;`CXB;ZAs4;Ei;Of`^dk$SK+k8++$Z~^xI zaU~&T^J$u7DUyZt&LEJRSgl8}`wXcZMP~2~(SVBol29AHh-(1mcgIdeFHq z$)Yln1Q3u}fPb7Rv*^7h+)Y;kf1KYx7=p*eMJ$fy zLl%6eF`pz?)^0XUzuRuEcDY)=y1L%&t^oJZRjw>K2K7+Vq>cZ2>xaAWt?%C6Gx!e9 z*-%yMh=ZQj1_nN+mZa`lfm$qDXR*j(;-Kot?E3*9*TdtlIvS_Y>*tdE$OJ+ zBAv#Q;}ND_5tM36(;C7l;qeG?JSU0uKsxQExT3=;AHDhPI{{AZNs3O`C!{R{+9vb` z;Chl+`i=4f1a(p%Q0cqPZC;Z{o!a@@c>T8TXWt>^2e{g(+NeJ7)x!g>K{402h}(k& zG3d?oRos6uKA8PK>ZU*4{LjH|;3z{fi1hgODt~9n=lKKC>WaaXGc;_9p`cmN zfaTcJXa1YKee-U8@V~|xG=~58^x`pahhU=`U9{NMrKEA;1<=?VNE2iDytN)t$8C1oP6?ufJ|s!0Cqfu;r3L=3z`<5bFe6YQ(imY~XSUxl zT$aF2g4B8$%}!;NVI}-V`dgOt?>zfX0os2$)#7bsE8}du;W4`8&@>?d!G*f`{U+cg~;uT8@U zhcVZtW6mPg5XkZ-!XpO)sUpQ6nYP|=Q`@0uneQC2W%Fq_JHm9W^=ymXG3ng#-a&4j zD&Ml;Sc~()=cnfDX8n4OyjGgyemXKz9~hP%iorTRO02FQtKTw-?NxvYJLjs!X}nxs zAlZMcEqV5_(mPU30`X$)x=!oWh+BB5Y-Ao=6RZ|d5iwqku}q*>wvFV6>AjwFfb*~z zsz)@RRzA|-lH7tA2Crs>%QRc7CFzxaEz2~mrYY*u-Z^i+*a1hk9tZ2{EL=M9pOQvj z&-H6FJUt)d=*y|LzPxJ5`Bs|FlFHGy<0T^Wi7#?|ijbEVvTDzwT0H(?VeScWSb9APY(L@Y0Gi7 zSaqm1KmJq39Ne6~6bo1mIK}=cy2M<)_K_FlAm5OJ|JTwLsFQI1A(|&dd8{aJ$^Ua! zuf_RS^z52>$YNc7##GTua;g(}PkO;#f_jQGOzdVd$R%SMXrt z`I$Z`3sfiZvcWF~RzfcYc-bkJviMqkLb&8o%|nhIS99K?KmWP2E~&cNc=n@&J(<7` z#5nvsoF5(@x_9sL6MwzE?Q-4P=4uh;pDw01!js{QhMbMij5mprm}PPEGHoFi=#d!b z7bhwr^9B@q*UKbKiK-Nt6D8<-d;I@V4A<{3p!}KUd!=4jL zJd7>#5lupB*QV`m(;WSDK3_oFR25w>BJjyvJe>L&SW%a*G7Hf-E6!{cC?}{gT^-v} zN*7o>FSWagUjWBK!Az!Pj`bX1sHj9ERRru(;gS*6Hve{q))Natdq~ci zzPwRcfetSKMCk~?G~JMgnUr6ElrUJ)W8rsc=zW<)Z!l$m;r%Luc|Kt4kp2*HnB z8mUd9FQ(@83VB8V<|Yp*tndyBdf-_W6m#m1jse3@Amzcd<3P3qkV{7|(2w39&`$_H zD06yD%+D~DgyHX({#A!SGO)Tq+WUSw9Z> za*lq_`@HXar_J>a{r0vajcacqG)4~%EIP@L^?V*I?5Vyx8}xnWLbJ1 zGt42DcMhiLjFO735Iqo(8oe^#ROMbtlYE7GORG_K0WPj&UMlCCAv+=`EZS+I%okwN zY8Mfd(i<(GuADj~_!{Hd%%;4NsS|Uu<~D>s=gKWuwoRo*HaolvTs1OYn+`6q1f!c* zO^xiLIl~YroYgi#Wj)u4mEI!d+SS^CrA9 zr|Zz1({30{8pfET<~XBWMm<WG^g{+{qWV> zd-d@YXWcVTN2rZt)PwnfGIQ!ulWZ4Vw{6;8+wGeC`MMt3wN$A^mVH5-wFKz*Ht)Qk zukHNh*1wu`pCenG6iY`!3xy0!Bk8P(^C?da^WzN#pS&#jOeT1>f(#106Q{J4j3fwS zIy8{GS+$fIL|gtUlJ>FJ5tpHbT1#wW>UIRnG#u=|DDpCfBR#R#*zN@e9+CA0u#$5X4dCP zqw6`o!+Cx8PNhM$U*d{F zSE5b>193(h9NY6leoDjXL`e+t(5n}>`QGl$P3m4OGjGkfgf0j4#}Q%-6oV3FsBmT_ z6FK$ZcHaB9?SDF?uTiPvrgj&qTJ?gN>zFF!ttwn9QQ9}+wXWC`ogi;x0$?nkC7X@g z8S+rWv1Fu+8si7O%U^z@zl55Ke>4x^vWIc(#_=r{R=u&;eBl1K1K4hVI_Wp>a}tk! z`*D~Qz*8!8OnXzWw(ag}m-G0XL)=jM;^Ih+mx(|393(K42@JA?H)@*~`7hIT6Wp)P zA9FtO+C5CiWB%QnyF1A$%#IC?na3jXS(YVYRuI=9=?I7oG>;7q_Cq~~7o*aboi?fOpW9S$L6i5$MWNR&#*ePr!xpa*jaAX49>y82WalK> zT@oL>L|};?)}vu9F~Xzq7+>o5qUz62C^F`sEaR(!oej51- zF{@(sEM?9zz`RzBb7ZraMDDLGtpukd4R0BmLXf`*6RH&Xl}N1{r&$D1xPgS}GuaZO z!JY&(O=>P4)hwFZSf9qV1ORW5#Y!Ersy}tH{7tsp+azZ1l%23qe4va5;yypxe*YYs zZOx;K#psS@2Dn)VLXDXbk)x5RvJ{AVEtIGQ*Qpu8!)ODsND()bwC+I=v%ysSy^J_T zd^NJ}198l#bsuff3r%%=^6YaEo&wjI)_gX_nVWJ^95Zc2{jWJK3l9FG*DWpj6>VkR z;bMB5CI}pf3C7}Arq0^%Q3EGZdnj|*%$><&%iqyz*z4m)f28Kh@;e} z|1m$*jn~gTG?}TZJ;Alp(ve$~h5`%EiMfTq`3UAV>$udN`D8zPgwKy5y&KhsbEHb0 zv6j*%$uXht^84ju%s{BX29|vxl&|NsIF_pn@|5LU+EUWg#N^-)7HJOeOZSN9M3sZ1 zKg9rhde>!qD&>2XOIjX`w5E@x#nnQ7OWI5;7ajdW`-^2tp2;YeXM+i`9MS5DC^c?z zrzw5?Vg{u@MUYEH3ns-yDIU`JhWn3fL@PvRhK9>evhNu|786alMcJ4IQ*32dRVT-y z3B<9{RHlfq*vvxZy0Bbk9$_gj*A%_F_+~}3)hiYppD=4lwBmp&wr+$8)fXMCnpLPe zioTf0EVXDE!N>?g=y;2~?%G_q7RPG2lBxwOZ$ePvRQ!{vYb%yp1dB7P4Q2>h%g&*e zvmp`^@aEb;tj5Mpq9}^`BPc};P`9D!26jHx`tiR|7G;QCTwxK>4oDytKps28Ap8y6L zY?QrA{=W<9a5w*7b9&Ft4oJy*obAiWfrWHoj#IExa-g^e^6|3NQW{bi)6@Vfo)1zs z6@~9lueu$zHm=AOkzr_-y;iLsOgQIqO(+i-{2EHTd_$>cZ_F9i4Nl5U48a??%EFPw z^CMEc&_0F&dm~X{h#HMGhSbwK8ABL|79`6{HcfxW$XO%;SIc_v-8aAf^l{ zHuLC*A)Vf-(=m;QNu@tJnCo`v`Q*)Kp{n2WNTh0dG|FrQw2Kma##{3_2Qkhptysp@1jx*g{FwG>q$$ap-%k(Uq-jJ@$CDj$qWyXVk@L&V%fEj0p9B2* z;^*Z=qL z@e1Sp!$=D<=N&Yn@~5SCu+0U)mF-Z|o58<*f1e9BRu!QW(3{=W>nq!Dc6Vx0dR#^c zEZ|T4zDeJyIiB>F?rh#C|99JWAY)7;L-EHOfHB?G`A&b)G^9CW8xDz)a}HLxWS7_= zv?D`EJ%@}imou2z&3a-^{yaq)Y{Out#!i7~i2i4pS~HrOjZg|u&IE?_3qaa1YJ&ZI zNIQ%h>CrYQ+DbN)<7X2IVi_W<1|)LtnB=6*KdT)BOIcFQ)67U0CKsGo6iu-BmIMC> zuT&-0etHDYf^=C4Yg8xa0cbD8plKK=2MMZxo1h&?eX0EBEuF0*>LsHDZK=6}q02zF znc#`!#H}OS7|JG+Nu_)*kaax`X_3UB$rPc{)NqRRmC0VL)uOJeD{}Bs^dHMj#z|I* ziy$}cePWq#q$vbC*9$s9{8-b<4qYH$iAdMfe1v{|GJ=XXMPyHsBK*N5QvIy@Ox9S0wzQlys80ap^p9hSo|HtK*@y6O|L`w={>$d>_3r9wdvn8*Y((J$ z-)tVI;2*JU&K*wYrtR9kb8y4NX0n=rWgSI`=*M9uU1^{5%2?DRBHJNxV^#rv=&=7y zh+RvAY?GfGhufBGLEGG3xi1EH9{UuJ(+JXOlh|3Wx_ugdw)Ef=eeap zWH=s&{eC>1hS`UFsl~*enlK?1ks<6hZV+hxuViyXc_i6rg6~-xgHR8Uee|#w)poOa zsjt6!q5Azpu2YKpIC(fmtDvACU{mMP+ksZoIF#B_u;7AAp zjV@T_z{=hO72IA4_Y9!95dQr3BRFyoQ_}n_cen(NqGH0p4VpgoDB7KpdNhiKvhJ`-?ZRc}V289KI zY)H`);6i7)_drBzg5Rf-vqtXrmiGd#sssawnrRLj#uV5G+vz3}fZ#K-u<2@jtVvMb zkVgti8=hbmxf^~9hN*DQS5(?bVNS)g9O<;@4Vep*IXDegC5S}ND;z26N{wxMg!|?m6;mRMafa9X#6I0aO zv}buXM*OB~O}CPlVEP+pB>a?eg)QCO#Fi^nkd+lEX;g*L2`d93-qX%YlJ05l*pbO> zT6FICSWPPcXED^qT}$esBsNTqdN%|jYxE{_F@@9o``6YXaIw#>8P!2ZKRRX zYH79UO0^3WIOSd?}EM?oa9po~QwT?5ZZA{@z3eHB4BQh?43ECW# zZDXO?(m0~D(XhZkMusRL?2%B1OpKwxVFBP;&iM6gPIG&6-CbWJo;d3G$MMSeSMB`E zHecuUALrx#@VLQLb)h(40Z2w!_%J``CZ?zIi;ED5+a2 zaAh4>-i^I&a-N^em~=kcr|1W8SwL#-NJo~mGV{-lkdmec0}x;IL(yp1Hu|+QKf8(> zL-uj(uUb0vWuP8dz7%Rc!DB|v8W+To)udgUa}dHh1&QeBYX(F$gv@4zza!_?1dx>F z%m5#*$$3z+0MRs4bUDpep-*~>1boumAm#oWH<2vR3+T;i_Hn|tVg)Qqi8A3;5fe-( zp;2?SdVTmquJ7}CJMF$s+U?VCgW3=y%UsF}%B)}Mt9(~amYf>Q9Ug~%A}B^+&nYGx zm-eNvws{wWh(Ly+fmG;Y8Feq!Z9%zX8H4JH4oA+9B~WP=%hczO>2OaZ?E_KTh;xXG z^#L%7kjvxS_(!wfDdd3RzwG|k$-bh{-q146q#bJWCpksZN&;^X;xn^%cv#!G1oBi% zaK6+Ut?AB6^Lj5o77Kgcv?Yo+RL~cAGJjqYn~KSwLcVP_!r5J*%8?{qJRJ!4`t}?1 zw=}PA{+s%{-yL7Bx}7CcGk!7nsk&yRZz;CCP)aB#S#wRi<8VCdKaA6t&lL z0t_PDuBiY2Xm^_JKdJisrT#AeMQ>6wLVmbS`p}&1kHcLj7ch$^{d??f_A%>IpIK_=N|q9I7?*ABra#rAWC79wZ&eN4b|+%;38c5Unm?)zv_nT;YK$qMC)1 zb{_d_?pRSU<_-jB0F<8406x&sZ)!4ti4+4ctFs_0r;}^1BT{3~MVsGLv`~~mM;#Wk zn1Ia2=_;A)Vv2W{iUlytiWq^CPttA?)B@g^9PV;C?3w=Tp3Rs3ZU5*>NULaTd>E)G zuo^G-3wTn9$CrSt`9h*`bAoR7=**~n(`$Q4; z$$0OXUhF6QTa#LJSl0L5$b7R9UCc9o)=y@77n+ry<9#iw4K#EPCQY1UI_Dtv88+Iw zX=GSReC2@dgpZDT+OW~bg>3C-5d!H)h;2_sici;#%hR9=LtrhJT68V)IXZXgq+&}T z#Ols|K`czG39hQrr$2%LxRe223-oIB8AjjdmQ=@8%WXx_lE)|@9q70%aMu0IBzP{n zQ+lqT`BU0^m8A*(UesR7RvTCNkyO<;=^*i{<+qOFcfz8ry40F0$=LMNq4Pon?Lv4{ zuP5+&WzNiJ>}rf%Uy7(MX)V$zgsz`>IHsSpKtK3P&n&mnqGMUuU+J^ALjUXDH(iLu zKKX9d)}=0#Ru#~ulZrnip!-Ci?h~g5Pt8{fa4WP#kKg+aa0(!_|Y zZjZH~wRxsZ{j7+sg0?C>>lm^gqc1685~)tTR&TCvT={

X*Q#Aoy|X!!#rz6 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 z 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 JPDHLkV1kI7rf>iN literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u5.png b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u5.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc805f115fdcb63db312af47aff9f3f1a585689 GIT binary patch literal 1517 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!ZaB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxR5#hc&_u!9QqR!T z(8R(}N5ROz&{*HVSl`fC*U-qyz|zXlQ~?TIxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7KMf<|~|UP^v> zu_jo#udkJ7UU5lcUUI6Zi>(sS0KLr26e~kFXD3$^15+0>Cv!tXR|`u+3ui||XGb$P za{~hdb5odJm;B_?+|;}hnBEkGUNf9}K`9}(0BEyIYEfocYKmJ?ey#%8$5xrR-C~T> zJgD9j+-@UI2$*<4On9mVa^UGcH4m8Bi-4*6vIn~@0|Qf%r;B4q z#jTzo-wa_#iQ3<@QtMQYrdJEmz@gmxv=r9Nsa;J)i$*w_N%iw{rGfv(G;) zc_5|Y*OvEk##XhRyByXUFPytMOv-$}tn;Qnob}GT)7js(#w%&GF1W=#!+5jI|2hN4 zs2m|?^C0(d-DMtG${lL_oA<_T6f}Czw14Z`)`|K>{Sz+Pt&ggyd8=yD$=LHcxnf@R zi6Xg$jUN`4+Br2xES#^}{Hf~0oDFM!)OhRX(Hav%lp@dhMFn; zGuCmp*Oc1T8$VTP(Mk@ts|TmvpLSAg=B=YYxx2Jc;_{&8F-g$PfEx2)Y z&e~8fnfba?3}&5jcoy@5d%x4}O`G+M!sMb7m;8R4e={yiWph?Tcdf*sLrtB3=gO+Q z`22VJ)U91zdknW`JmoYEeSblPowM}D{s$2^I*%?@Q4QJ6;hLjh^uF=P>F)3t)9m9{ l1Gage-I^>u?b;u)1cu##fj`#d&*1?Tz@DytF6*2UngCYBJk|gJ literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u6.png b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/images/u6.png new file mode 100644 index 0000000000000000000000000000000000000000..8e57d8f7f8e92cfa6fc117dd7cad9455a6bf2cea GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^{2^y1^Ixc*;"); + + //title-- + //content--object{type[1 for input, 0 for text], text[display in content]} + //btnFlag--1 for OK+Cancel, 0 for OK + function initHtml(title, content, btnFlag, ok, cancel) { + var div = ""; + div += "
"; + div += "

" + title + "

" + div += "
"; + if (content.type == 0) { + div += "

" + content.text + "

" + } else if (content.type == 1) { + div += ""; + } + if (btnFlag == 0) { + div += "
OK
"; + } else if (btnFlag == 1) { + div += "
OKCancel
"; + } + div += "
"; + $mask.html(div); + $mask.find("input").val($mask.find("input").val()); + if (content.type == 1) { + $mask.find(".ok").on("click", function() { + var retText = $mask.find("input").val(); + hide(); + if (ok) { + ok(retText); + } + }); + $mask.find(".cancel").on("click", function() { + var retText = $mask.find("input").val(); + hide(); + if (cancel) { + cancel(retText); + } + }); + } else { + $mask.find(".ok").on("click", function() { + hide(); + if (ok) { + ok(); + } + }); + $mask.find(".cancel").on("click", function() { + hide(); + if (cancel) { + cancel(); + } + }); + } + } + + function calcBoxPos() { + var $box = $mask.find("#dlg-box"); + var mask_w = $mask.outerWidth(); + var mask_h = $mask.outerHeight(); + var box_w = $box.outerWidth(); + var box_h = $box.outerHeight(); + var pos_left = (mask_w - box_w) / 2 + "px"; + var pos_top = (mask_h - box_h) / 2 + "px"; + $box.css("left", pos_left).css("top", pos_top); + } + + function show() { + $("body").prepend($mask); + $mask.css("display", "block"); + if ($mask.find("input") && $mask.find("input")[0]) { + $mask.find("input")[0].focus(); + } + calcBoxPos(); + $(window).resize(calcBoxPos); + } + + function hide() { + $mask.css("display", "none"); + $mask.remove(); + } + + return { + hide: hide, + tip: function(title, text, ok) { + initHtml(title, { type: 0, text: text }, 0, ok, null); + show(); + }, + input: function(title, text, placeholder, ok, cancel) { + initHtml(title, { type: 1, text: text, placeholder: placeholder }, 1, ok, cancel); + show(); + }, + confirm: function(title, text, ok, cancel) { + initHtml(title, { type: 0, text: text }, 1, ok, cancel); + show(); + } + } +})(); \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/dialog.min.js b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/dialog.min.js new file mode 100644 index 0000000..b2c094c --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/dialog.min.js @@ -0,0 +1 @@ +var dialog = (function Dialog() { var e = $("
"); function d(j, h, i, f, g) { var k = ""; k += "
"; k += "

" + j + "

"; if (h.type == 0) { k += "

" + h.text + "

" } else { if (h.type == 1) { k += "" } } if (i == 0) { k += "
OK
" } else { if (i == 1) { k += "
OKCancel
" } } k += "
"; e.html(k); e.find("input").val(e.find("input").val()); if (h.type == 1) { e.find(".ok").on("click", function() { var l = e.find("input").val(); b(); if (f) { f(l) } }); e.find(".cancel").on("click", function() { var l = e.find("input").val(); b(); if (g) { g(l) } }) } else { e.find(".ok").on("click", function() { b(); if (f) { f() } }); e.find(".cancel").on("click", function() { b(); if (g) { g() } }) } } function c() { var k = e.find("#dlg-box"); var h = e.outerWidth(); var j = e.outerHeight(); var l = k.outerWidth(); var g = k.outerHeight(); var f = (h - l) / 2 + "px"; var i = (j - g) / 2 + "px"; k.css("left", f).css("top", i) } function a() { $("body").prepend(e); e.css("display", "block"); if (e.find("input") && e.find("input")[0]) { e.find("input")[0].focus() } c(); $(window).resize(c) } function b() { e.css("display", "none"); e.remove() } return { hide: b, tip: function(h, g, f) { d(h, { type: 0, text: g }, 0, f, null); a() }, input: function(j, i, h, f, g) { d(j, { type: 1, text: i, placeholder: h }, 1, f, g); a() }, confirm: function(i, h, f, g) { d(i, { type: 0, text: h }, 1, f, g); a() } } })(); \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/index.js b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/index.js new file mode 100644 index 0000000..e69de29 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/jquery-1.10.2.min.js b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/jquery-1.10.2.min.js new file mode 100644 index 0000000..8569bc4 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/presenterserver/facial_recognition/ui/static/js/jquery-1.10.2.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="
","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
t
",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("

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 P+sZL|oX%+-o%#O{o;*mg literal 0 HcmV?d00001 diff --git a/cplusplus/common/atlasutil/src/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/cplusplus/common/atlasutil/src/.ipynb_checkpoints/Untitled-checkpoint.ipynb new file mode 100644 index 0000000..363fcab --- /dev/null +++ b/cplusplus/common/atlasutil/src/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/cplusplus/common/atlasutil/src/Untitled.ipynb b/cplusplus/common/atlasutil/src/Untitled.ipynb new file mode 100644 index 0000000..363fcab --- /dev/null +++ b/cplusplus/common/atlasutil/src/Untitled.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/cplusplus/common/atlasutil/src/acl_device.cpp b/cplusplus/common/atlasutil/src/acl_device.cpp new file mode 100644 index 0000000..cb2b765 --- /dev/null +++ b/cplusplus/common/atlasutil/src/acl_device.cpp @@ -0,0 +1,113 @@ +/** +* Copyright 2020 Huawei Technologies 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 utils.cpp +* Description: handle file operations +*/ +#include "atlas_utils.h" +#include "acl_device.h" + +using namespace std; + +AclDevice::AclDevice(): +deviceId_(0), +aclConfig_(""), +runMode_(ACL_HOST), +context_(nullptr), +useDefaultCtx_(true), +isReleased_(false) { +} + +AclDevice::AclDevice(int32_t devId, + const string& aclConfigPath, + bool useDefaultCtx): +deviceId_(devId), +aclConfig_(aclConfigPath), +runMode_(ACL_HOST), +context_(nullptr), +useDefaultCtx_(useDefaultCtx), +isReleased_(false) { +} + +AclDevice::~AclDevice() { + Release(); +} + +AtlasError AclDevice::Init() { + // ACL init + aclError ret = aclInit(aclConfig_.c_str()); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Acl init failed"); + return ATLAS_ERROR; + } + ATLAS_LOG_INFO("Acl init ok"); + + // open device + ret = aclrtSetDevice(deviceId_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Acl open device %d failed", deviceId_); + return ATLAS_ERROR; + } + ATLAS_LOG_INFO("Open device %d ok", deviceId_); + + if (useDefaultCtx_) { + ret = aclrtGetCurrentContext(&context_); + if ((ret != ACL_ERROR_NONE) || (context_ == nullptr)) { + ATLAS_LOG_ERROR("Get current acl context error:%d", ret); + return ATLAS_ERROR_GET_ACL_CONTEXT; + } + } else { + ret = aclrtCreateContext(&context_, deviceId_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Create acl context failed, error:%d", ret); + return ATLAS_ERROR_CREATE_ACL_CONTEXT; + } + } + + ret = aclrtGetRunMode(&runMode_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("acl get run mode failed"); + return ATLAS_ERROR; + } + + return ATLAS_OK; +} + +void AclDevice::Release() { + if (isReleased_) return; + + aclError ret; + if ((useDefaultCtx_ == false) && (context_ != nullptr)) { + ret = aclrtDestroyContext(context_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("destroy context failed"); + } + context_ = nullptr; + } + + ret = aclrtResetDevice(deviceId_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("reset device failed"); + } + ATLAS_LOG_INFO("Reset device %d ok", deviceId_); + + ret = aclFinalize(); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("finalize acl failed"); + } + ATLAS_LOG_INFO("Finalize acl ok"); + + isReleased_ = true; +} diff --git a/cplusplus/common/atlasutil/src/atlas_app.cpp b/cplusplus/common/atlasutil/src/atlas_app.cpp new file mode 100644 index 0000000..db120e7 --- /dev/null +++ b/cplusplus/common/atlasutil/src/atlas_app.cpp @@ -0,0 +1,245 @@ +/** +* @file sample_process.cpp +* +* Copyright (C) 2020. Huawei Technologies Co., Ltd. All rights reserved. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ + +#include "acl/acl.h" +#include "atlas_app.h" +#include "atlas_thread_mgr.h" + +using namespace std; + +namespace { +const uint32_t kWaitInterval = 10000; +const uint32_t kThreadExitRetry = 3; +} + +AtlasApp::AtlasApp():isReleased_(false), waitEnd_(false){ + Init(); +} + +AtlasApp::~AtlasApp(){ + ReleaseThreads(); +} + +AtlasError AtlasApp::Init() { + AtlasThreadMgr* thMgr = new AtlasThreadMgr(nullptr, "main"); + threadList_.push_back(thMgr); + thMgr->SetStatus(THREAD_RUNNING); + return ATLAS_OK; +} + +int AtlasApp::CreateAtlasThread(AtlasThread* thInst, const string& instName, + aclrtContext context, aclrtRunMode runMode) +{ + int instId = CreateAtlasThreadMgr(thInst, instName, context, runMode); + if (instId == INVALID_INSTANCE_ID) { + ATLAS_LOG_ERROR("Add thread instance %s failed", instName.c_str()); + return INVALID_INSTANCE_ID; + } + + threadList_[instId]->CreateThread(); + AtlasError ret = threadList_[instId]->WaitThreadInitEnd(); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Create thread failed, error %d", ret); + return INVALID_INSTANCE_ID; + } + + return instId; +} + +int AtlasApp::CreateAtlasThreadMgr(AtlasThread* thInst, const string& instName, + aclrtContext context, aclrtRunMode runMode){ + if (!CheckThreadNameUnique(instName)) { + ATLAS_LOG_ERROR("The thread instance name is not unique"); + return INVALID_INSTANCE_ID; + } + + int instId = threadList_.size(); + AtlasError ret = thInst->BaseConfig(instId, instName, context, runMode); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Create thread instance failed for error %d", ret); + return INVALID_INSTANCE_ID; + } + + AtlasThreadMgr* thMgr = new AtlasThreadMgr(thInst, instName); + threadList_.push_back(thMgr); + + return instId; +} + +bool AtlasApp::CheckThreadNameUnique(const string& threadName) { + if (threadName.size() == 0) return true; + + for (size_t i = 0; i < threadList_.size(); i++) { + if (threadName == threadList_[i]->GetThreadName()) { + return false; + } + } + + return true; +} + +int AtlasApp::Start(vector& threadParamTbl) { + for (size_t i = 0; i < threadParamTbl.size(); i++) { + int instId = CreateAtlasThreadMgr(threadParamTbl[i].threadInst, + threadParamTbl[i].threadInstName, + threadParamTbl[i].context, + threadParamTbl[i].runMode); + if (instId == INVALID_INSTANCE_ID) { + ATLAS_LOG_ERROR("Create thread instance failed"); + return ATLAS_ERROR; + } + threadParamTbl[i].threadInstId = instId; + } + //Note:The instance id must generate first, then create thread, + //for the user thread get other thread instance id in Init function + for (size_t i = 0; i < threadParamTbl.size(); i++) { + threadList_[threadParamTbl[i].threadInstId]->CreateThread(); + } + + for (size_t i = 0; i < threadParamTbl.size(); i++) { + int instId = threadParamTbl[i].threadInstId; + AtlasError ret = threadList_[instId]->WaitThreadInitEnd(); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Create thread %s failed, error %d", + threadParamTbl[i].threadInstName.c_str(), ret); + return ret; + } + } + + return ATLAS_OK; +} + +int AtlasApp::GetAtlasThreadIdByName(const string& threadName) { + if (threadName.empty()) { + ATLAS_LOG_ERROR("search name is empty"); + return INVALID_INSTANCE_ID; + } + + for (uint32_t i = 0; i < threadList_.size(); i++) { + if (threadList_[i]->GetThreadName() == threadName) { + return i; + } + } + + return INVALID_INSTANCE_ID; +} + +AtlasError AtlasApp::SendMessage(int dest, int msgId, shared_ptr data) { + if ((uint32_t)dest > threadList_.size()) { + ATLAS_LOG_ERROR("Send message to %d failed for thread not exist", dest); + return ATLAS_ERROR_DEST_INVALID; + } + + shared_ptr pMessage = make_shared(); + pMessage->dest = dest; + pMessage->msgId = msgId; + pMessage->data = data; + + return threadList_[dest]->PushMsgToQueue(pMessage); +} + +void AtlasApp::Wait() { + while (true) { + usleep(kWaitInterval); + if (waitEnd_) break; + } + threadList_[kMainThreadId]->SetStatus(THREAD_EXITED); +} + +bool AtlasApp::CheckThreadAbnormal() { + for (size_t i = 0; i < threadList_.size(); i++) { + if (threadList_[i]->GetStatus() == THREAD_ERROR) { + return true; + } + } + + return false; +} + +void AtlasApp::Wait(AtlasMsgProcess msgProcess, void* param) { + AtlasThreadMgr* mainMgr = threadList_[0]; + + if (mainMgr == nullptr) { + ATLAS_LOG_ERROR("Atlas app wait exit for message process function is nullptr"); + return; + } + + while (true) { + if (waitEnd_) break; + + shared_ptr msg = mainMgr->PopMsgFromQueue(); + if (msg == nullptr) { + usleep(kWaitInterval); + continue; + } + int ret = msgProcess(msg->msgId, msg->data, param); + if (ret) { + ATLAS_LOG_ERROR("Atlas app exit for message %d process error:%d", msg->msgId, ret); + break; + } + } + threadList_[kMainThreadId]->SetStatus(THREAD_EXITED); +} + +void AtlasApp::Exit() { + ReleaseThreads(); +} + +void AtlasApp::ReleaseThreads() { + if (isReleased_) return; + threadList_[kMainThreadId]->SetStatus(THREAD_EXITED); + + for (uint32_t i = 1; i < threadList_.size(); i++) { + if ((threadList_[i] != nullptr) && + (threadList_[i]->GetStatus() == THREAD_RUNNING)) + threadList_[i]->SetStatus(THREAD_EXITING); + } + + int retry = kThreadExitRetry; + while(retry >= 0) { + bool exitFinish = true; + for (uint32_t i = 0; i < threadList_.size(); i++) { + if (threadList_[i] == nullptr) + continue; + if (threadList_[i]->GetStatus() > THREAD_EXITING) { + delete threadList_[i]; + threadList_[i] = nullptr; + ATLAS_LOG_INFO("Atlas thread %d released", i); + } else { + exitFinish = false; + } + } + + if (exitFinish) + break; + + sleep(1); + retry--; + } + isReleased_ = true; +} + +AtlasApp& CreateAtlasAppInstance() { + return AtlasApp::GetInstance(); +} + +AtlasApp& GetAtlasAppInstance() { + return AtlasApp::GetInstance(); +} + +AtlasError SendMessage(int dest, int msgId, shared_ptr data) { + AtlasApp& app = AtlasApp::GetInstance(); + return app.SendMessage(dest, msgId, data); +} + +int GetAtlasThreadIdByName(const string& threadName) { + AtlasApp& app = AtlasApp::GetInstance(); + return app.GetAtlasThreadIdByName(threadName); +} diff --git a/cplusplus/common/atlasutil/src/atlas_model.cpp b/cplusplus/common/atlasutil/src/atlas_model.cpp new file mode 100644 index 0000000..9656dce --- /dev/null +++ b/cplusplus/common/atlasutil/src/atlas_model.cpp @@ -0,0 +1,374 @@ +/** +* Copyright 2020 Huawei Technologies 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 model_process.cpp +* Description: handle model process +*/ +#include "atlas_model.h" +#include +#include "atlas_utils.h" +using namespace std; + +AtlasModel::AtlasModel() +:modelPath_(""), loadFlag_(false), modelId_(0), modelMemPtr_(nullptr), +modelMemSize_(0),modelWeightPtr_(nullptr),modelWeightSize_(0), +modelDesc_(nullptr), input_(nullptr), output_(nullptr), outputsNum_(0), +isReleased_(false) { +} + +AtlasModel::AtlasModel(const string& modelPath) +:modelPath_(modelPath), loadFlag_(false), modelId_(0), modelMemPtr_(nullptr), +modelMemSize_(0),modelWeightPtr_(nullptr),modelWeightSize_(0), +modelDesc_(nullptr), input_(nullptr), output_(nullptr), outputsNum_(0), +isReleased_(false) { +} + +AtlasModel::~AtlasModel() { + DestroyResource(); +} + +void AtlasModel::DestroyResource() { + if (isReleased_) { + return; + } + + Unload(); + DestroyDesc(); + DestroyInput(); + DestroyOutput(); + isReleased_ = true; +} + + +AtlasError AtlasModel::Init() { + aclError aclRet = aclrtGetRunMode(&runMode_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("acl get run mode failed"); + return ATLAS_ERROR_GET_RUM_MODE; + } + + AtlasError ret = LoadModelFromFile(modelPath_); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Load model from file failed, error: %d", ret); + return ret; + } + + ret = CreateDesc(); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("execute CreateDesc failed"); + return ret; + } + + ret = CreateOutput(); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("execute CreateOutput failed"); + return ret; + } + + ATLAS_LOG_INFO("Init model %s success", modelPath_.c_str()); + + return ATLAS_OK; +} + +AtlasError AtlasModel::Init(const string& modelPath) { + modelPath_.assign(modelPath.c_str()); + return Init(); +} + +AtlasError AtlasModel::LoadModelFromFile(const string& modelPath) { + if (loadFlag_) { + ATLAS_LOG_ERROR("%s is loaded already", modelPath.c_str()); + return ATLAS_ERROR_LOAD_MODEL_REPEATED; + } + + aclError ret = aclmdlLoadFromFile(modelPath.c_str(), &modelId_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Load model(%s) from file return %d", + modelPath.c_str(), ret); + return ATLAS_ERROR_LOAD_MODEL; + } + + loadFlag_ = true; + ATLAS_LOG_INFO("Load model %s success", modelPath.c_str()); + + return ATLAS_OK; +} + +AtlasError AtlasModel::CreateDesc() { + modelDesc_ = aclmdlCreateDesc(); + if (modelDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create model(%s) description failed", + modelPath_.c_str()); + return ATLAS_ERROR_CREATE_MODEL_DESC; + } + + aclError ret = aclmdlGetDesc(modelDesc_, modelId_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Get model(%s) description failed", + modelPath_.c_str()); + return ATLAS_ERROR_GET_MODEL_DESC; + } + + ATLAS_LOG_INFO("Create model description success"); + return ATLAS_OK; +} + +void AtlasModel::DestroyDesc() +{ + if (modelDesc_ != nullptr) { + (void)aclmdlDestroyDesc(modelDesc_); + modelDesc_ = nullptr; + } +} + +AtlasError AtlasModel::CreateInput(void *input, uint32_t size) { + vector inputData = {{input, size}}; + return CreateInput(inputData); +} + +AtlasError AtlasModel::CreateInput(void *input1, uint32_t input1size, + void* input2, uint32_t input2size) { + vector inputData = {{input1, input1size}, {input2, input2size}}; + return CreateInput(inputData); +} + +AtlasError AtlasModel::CreateInput(vector& inputData) { + uint32_t dataNum = inputData.size(); + + if (dataNum == 0) { + ATLAS_LOG_ERROR("Create input failed for no input data"); + return ATLAS_ERROR_INVALID_ARGS; + } + + input_ = aclmdlCreateDataset(); + if (input_ == nullptr) { + ATLAS_LOG_ERROR("Create input failed for create dataset failed"); + return ATLAS_ERROR_CREATE_DATASET; + } + + for (uint32_t i = 0; i < inputData.size(); i++) { + AtlasError atlRet = AddDatasetBuffer(input_, + inputData[i].data, + inputData[i].size); + if (atlRet != ATLAS_OK) { + ATLAS_LOG_ERROR("Create input failed for " + "add dataset buffer error %d", atlRet); + return ATLAS_ERROR_ADD_DATASET_BUFFER; + } + } + + return ATLAS_OK; +} + +AtlasError AtlasModel::CreateOutput() +{ + if (modelDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create output failed for no model(%s) description", + modelPath_.c_str()); + return ATLAS_ERROR_NO_MODEL_DESC; + } + + output_ = aclmdlCreateDataset(); + if (output_ == nullptr) { + ATLAS_LOG_ERROR("Create output failed for create dataset error"); + return ATLAS_ERROR_CREATE_DATASET; + } + + outputsNum_ = aclmdlGetNumOutputs(modelDesc_); + for (size_t i = 0; i < outputsNum_; ++i) { + size_t bufSize = aclmdlGetOutputSizeByIndex(modelDesc_, i); + + void *outputBuffer = nullptr; + aclError ret = aclrtMalloc(&outputBuffer, bufSize, + ACL_MEM_MALLOC_NORMAL_ONLY); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Create output failed for malloc " + "device failed, size %d", (int)bufSize); + return ATLAS_ERROR_MALLOC_DEVICE; + } + + AtlasError atlRet = AddDatasetBuffer(output_, outputBuffer, bufSize); + if (atlRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Create output failed for " + "add dataset buffer error %d", atlRet); + aclrtFree(outputBuffer); + return ATLAS_ERROR_ADD_DATASET_BUFFER; + } + } + + ATLAS_LOG_INFO("Create model(%s) output success", modelPath_.c_str()); + return ATLAS_OK; +} + +AtlasError AtlasModel::AddDatasetBuffer(aclmdlDataset *dataset, + void* buffer, uint32_t bufferSize) { + aclDataBuffer* dataBuf = aclCreateDataBuffer(buffer, bufferSize); + if (dataBuf == nullptr) { + ATLAS_LOG_ERROR("Create data buffer error"); + return ATLAS_ERROR_CREATE_DATA_BUFFER; + } + + aclError ret = aclmdlAddDatasetBuffer(dataset, dataBuf); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Add dataset buffer error %d", ret); + aclDestroyDataBuffer(dataBuf); + return ATLAS_ERROR_ADD_DATASET_BUFFER; + } + + return ATLAS_OK; +} + +AtlasError AtlasModel::Execute(vector& inferOutputs, + void *data, uint32_t size) { + AtlasError ret = CreateInput(data, size); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Create mode input dataset failed"); + return ret; + } + + ret = Execute(inferOutputs); + if (ret != ATLAS_OK) { + DestroyInput(); + ATLAS_LOG_ERROR("Execute model inference failed"); + return ret; + } + DestroyInput(); + + return ATLAS_OK; +} + +AtlasError AtlasModel::Execute(vector& inferOutputs) { + aclError ret = aclmdlExecute(modelId_, input_, output_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Execute model(%s) error:%d", modelPath_.c_str(), ret); + return ATLAS_ERROR_EXECUTE_MODEL; + } + + for (uint32_t i = 0; i < outputsNum_; i++) { + InferenceOutput out; + AtlasError ret = GetOutputItem(out, i); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Get the %dth interference output failed, " + "error: %d", i, ret); + return ret; + } + inferOutputs.push_back(out); + } + + return ATLAS_OK; +} + +AtlasError AtlasModel::GetOutputItem(InferenceOutput& out, + uint32_t idx) { + aclDataBuffer* dataBuffer = aclmdlGetDatasetBuffer(output_, idx); + if (dataBuffer == nullptr) { + ATLAS_LOG_ERROR("Get the %dth dataset buffer from model " + "inference output failed", idx); + return ATLAS_ERROR_GET_DATASET_BUFFER; + } + + void* dataBufferDev = aclGetDataBufferAddr(dataBuffer); + if (dataBufferDev == nullptr) { + ATLAS_LOG_ERROR("Get the %dth dataset buffer address " + "from model inference output failed", idx); + return ATLAS_ERROR_GET_DATA_BUFFER_ADDR; + } + + size_t bufferSize = aclGetDataBufferSize(dataBuffer); + if (bufferSize == 0) { + ATLAS_LOG_ERROR("The %dth dataset buffer size of " + "model inference output is 0", idx); + return ATLAS_ERROR_GET_DATA_BUFFER_SIZE; + } + + void* data = CopyDataToHost(dataBufferDev, bufferSize, + runMode_, MEMORY_NORMAL); + if (data == nullptr) { + ATLAS_LOG_ERROR("Copy inference output to host failed"); + return ATLAS_ERROR_COPY_DATA; + } + + out.data = SHARED_PRT_U8_BUF(data); + out.size = bufferSize; + + return ATLAS_OK; +} + +void AtlasModel::DestroyInput() +{ + if (input_ == nullptr) { + return; + } + + for (size_t i = 0; i < aclmdlGetDatasetNumBuffers(input_); ++i) { + aclDataBuffer* dataBuffer = aclmdlGetDatasetBuffer(input_, i); + aclDestroyDataBuffer(dataBuffer); + } + aclmdlDestroyDataset(input_); + input_ = nullptr; +} + +void AtlasModel::DestroyOutput() +{ + if (output_ == nullptr) { + return; + } + + for (size_t i = 0; i < aclmdlGetDatasetNumBuffers(output_); ++i) { + aclDataBuffer* dataBuffer = aclmdlGetDatasetBuffer(output_, i); + void* data = aclGetDataBufferAddr(dataBuffer); + (void)aclrtFree(data); + (void)aclDestroyDataBuffer(dataBuffer); + } + + (void)aclmdlDestroyDataset(output_); + output_ = nullptr; +} + +void AtlasModel::Unload() +{ + if (!loadFlag_) { + ATLAS_LOG_INFO("Model(%s) had not been loaded or unload already", + modelPath_.c_str()); + return; + } + + aclError ret = aclmdlUnload(modelId_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Unload model(%s) error:%d", modelPath_.c_str(), ret); + } + + if (modelDesc_ != nullptr) { + (void)aclmdlDestroyDesc(modelDesc_); + modelDesc_ = nullptr; + } + + if (modelMemPtr_ != nullptr) { + aclrtFree(modelMemPtr_); + modelMemPtr_ = nullptr; + modelMemSize_ = 0; + } + + if (modelWeightPtr_ != nullptr) { + aclrtFree(modelWeightPtr_); + modelWeightPtr_ = nullptr; + modelWeightSize_ = 0; + } + + loadFlag_ = false; + ATLAS_LOG_INFO("Unload model %s success", modelPath_.c_str()); +} + + diff --git a/cplusplus/common/atlasutil/src/atlas_thread.cpp b/cplusplus/common/atlasutil/src/atlas_thread.cpp new file mode 100644 index 0000000..bd58968 --- /dev/null +++ b/cplusplus/common/atlasutil/src/atlas_thread.cpp @@ -0,0 +1,43 @@ +/** +* Copyright 2020 Huawei Technologies 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 utils.cpp +* Description: handle file operations +*/ +#include "atlas_thread.h" + +AtlasThread::AtlasThread() +:context_(nullptr), runMode_(ACL_HOST), +instanceId_(INVALID_INSTANCE_ID), instanceName_(""), baseConfiged_(false) { +} + +AtlasError AtlasThread::BaseConfig(int instanceId, + const string& threadName, + aclrtContext context, + aclrtRunMode runMode) { + if (baseConfiged_) { + return ATLAS_ERROR_INITED_ALREADY; + } + + instanceId_ = instanceId; + instanceName_.assign(threadName.c_str()); + context_ = context; + runMode_ = runMode; + + baseConfiged_ = true; + + return ATLAS_OK; +} + diff --git a/cplusplus/common/atlasutil/src/atlas_thread_mgr.cpp b/cplusplus/common/atlasutil/src/atlas_thread_mgr.cpp new file mode 100644 index 0000000..51b8890 --- /dev/null +++ b/cplusplus/common/atlasutil/src/atlas_thread_mgr.cpp @@ -0,0 +1,107 @@ +#include "atlas_thread_mgr.h" +#include "atlas_utils.h" + +namespace { + const uint32_t kMsgQueueSize = 256; + const uint32_t kWait10Milliseconds = 10000; + const uint32_t kWaitThreadStart = 1000; +} + + +AtlasThreadMgr::AtlasThreadMgr(AtlasThread* userThreadInstance, const string& threadName) +:name_(threadName), +userInstance_(userThreadInstance), +isExit_(false), +status_(THREAD_READY), +msgQueue_(kMsgQueueSize) { +} + +AtlasThreadMgr::~AtlasThreadMgr() { + userInstance_ = nullptr; + while(!msgQueue_.Empty()) { + msgQueue_.Pop(); + } +} + +void AtlasThreadMgr::CreateThread() { + thread engine(&AtlasThreadMgr::ThreadEntry, (void *)this); + engine.detach(); +} + +void AtlasThreadMgr::ThreadEntry(void* arg){ + AtlasThreadMgr* thMgr = (AtlasThreadMgr*)arg; + AtlasThread* userInstance = thMgr->GetUserInstance(); + if (userInstance == nullptr) { + ATLAS_LOG_ERROR("Atlas thread exit for user thread instance is null"); + return; + } + + string& instName = userInstance->SelfInstanceName(); + aclrtContext context = userInstance->GetContext(); + aclError aclRet = aclrtSetCurrentContext(context); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Thread %s set context failed, error: %d", + instName.c_str(), aclRet); + return; + } + + int ret = userInstance->Init(); + if (ret) { + ATLAS_LOG_ERROR("Thread %s init error %d, thread exit", + instName.c_str(), ret); + thMgr->SetStatus(THREAD_ERROR); + return; + } + + thMgr->SetStatus(THREAD_RUNNING); + while(THREAD_RUNNING == thMgr->GetStatus()) { + // 从队列中取数据 + shared_ptr msg = thMgr->PopMsgFromQueue(); + if(msg == nullptr) { + usleep(kWait10Milliseconds); + continue; + } + // 线程消息处理函数 + ret = userInstance->Process(msg->msgId, msg->data); + msg->data = nullptr; + if (ret) { + ATLAS_LOG_ERROR("Thread %s process function return " + "error %d, thread exit", instName.c_str(), ret); + thMgr->SetStatus(THREAD_ERROR); + return; + } + usleep(0); + } + thMgr->SetStatus(THREAD_EXITED); + + return; +} + +AtlasError AtlasThreadMgr::WaitThreadInitEnd() { + while(true) { + if (status_ == THREAD_RUNNING) { + break; + } else if (status_ > THREAD_RUNNING) { + string& instName = userInstance_->SelfInstanceName(); + ATLAS_LOG_ERROR("Thread instance %s status change to %d, " + "app start failed", instName.c_str(), status_); + return ATLAS_ERROR_START_THREAD; + } else { + usleep(kWaitThreadStart); + } + } + + return ATLAS_OK; +} + +AtlasError AtlasThreadMgr::PushMsgToQueue(shared_ptr& pMessage) { + if (status_ != THREAD_RUNNING) { + ATLAS_LOG_ERROR("Thread instance %s status(%d) is invalid, " + "can not reveive message", name_.c_str(), status_); + return ATLAS_ERROR_THREAD_ABNORMAL; + } + return msgQueue_.Push(pMessage)? ATLAS_OK : ATLAS_ERROR_ENQUEUE; +} + + + diff --git a/cplusplus/common/atlasutil/src/atlas_utils.cpp b/cplusplus/common/atlasutil/src/atlas_utils.cpp new file mode 100644 index 0000000..8377078 --- /dev/null +++ b/cplusplus/common/atlasutil/src/atlas_utils.cpp @@ -0,0 +1,431 @@ +/** +* Copyright 2020 Huawei Technologies 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 utils.cpp +* Description: handle file operations +*/ +#include "atlas_utils.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" + +using namespace std; + +namespace { +const std::string kImagePathSeparator = ","; +const int kStatSuccess = 0; +const std::string kFileSperator = "/"; +const std::string kPathSeparator = "/"; +// output image prefix +const std::string kOutputFilePrefix = "out_"; + +const string kRegexIpAddr = + "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[0-9])\\." + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)" + ":([1-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|" + "6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])$"; + +// regex for verify video file name +const string kRegexVideoFile = "^.+\\.(mp4|h264|h265)$"; + +// regex for verify RTSP rtsp://ip:port/channelname +//const string kRegexRtsp = "^rtsp://[0-9a-zA-Z]*:[0-9a-zA-Z]*@.+"; +const string kRegexRtsp = "^rtsp://.*"; + + +} + +bool IsDigitStr(const string& str) { + for (uint32_t i = 0; i &pathVec) { + char *charPath = const_cast(path.c_str()); + const char *charSplit = kImagePathSeparator.c_str(); + char *imageFile = strtok(charPath, charSplit); + while (imageFile) { + pathVec.emplace_back(imageFile); + imageFile = strtok(nullptr, charSplit); + } +} + +void GetPathFiles(const string &path, vector &fileVec) { + struct dirent *direntPtr = nullptr; + DIR *dir = nullptr; + if (IsDirectory(path)) { + dir = opendir(path.c_str()); + while ((direntPtr = readdir(dir)) != nullptr) { + // skip . and .. + if (direntPtr->d_name[0] == '.') { + continue; + } + + // file path + string fullPath = path + kPathSeparator + direntPtr->d_name; + // directory need recursion + if (IsDirectory(fullPath)) { + GetPathFiles(fullPath, fileVec); + } else { + // put file + fileVec.emplace_back(fullPath); + } + } + } + else { + fileVec.emplace_back(path); + } +} + +void GetAllFiles(const string &pathList, vector &fileVec) { + // split file path + vector pathVec; + SplitPath(pathList, pathVec); + + for (string everyPath : pathVec) { + // check path exist or not + if (!IsPathExist(pathList)) { + ATLAS_LOG_ERROR("Failed to deal path=%s. Reason: not exist or can not access.", + everyPath.c_str()); + continue; + } + // get files in path and sub-path + GetPathFiles(everyPath, fileVec); + } +} + +void* MallocMemory(uint32_t dataSize, MemoryType memType) { + void* buffer = nullptr; + aclError aclRet = ACL_ERROR_NONE; + + switch(memType){ + case MEMORY_NORMAL: + buffer = new uint8_t[dataSize]; + break; + case MEMORY_HOST: + aclRet = aclrtMallocHost(&buffer, dataSize); + break; + case MEMORY_DEVICE: + aclRet = aclrtMalloc(&buffer, dataSize, ACL_MEM_MALLOC_HUGE_FIRST); + break; + case MEMORY_DVPP: + aclRet = acldvppMalloc(&buffer, dataSize); + break; + default: + ATLAS_LOG_ERROR("Invalid memory type %d", memType); + aclRet = ACL_ERROR_INVALID_PARAM; + break; + } + + if ((aclRet != ACL_ERROR_NONE) || (buffer == nullptr)) { + ATLAS_LOG_ERROR("Malloc memory failed, type: %d, errorno:%d", + memType, aclRet); + return nullptr; + } + + return buffer; +} + +void FreeMemory(void* mem, MemoryType memType) { + switch(memType){ + case MEMORY_NORMAL: + delete[]((uint8_t *)mem); + break; + case MEMORY_HOST: + aclrtFreeHost(mem); + break; + case MEMORY_DEVICE: + aclrtFree(mem); + break; + case MEMORY_DVPP: + acldvppFree(mem); + break; + default: + ATLAS_LOG_ERROR("Invalid memory type %d", memType); + break; + } +} + +aclrtMemcpyKind GetCopyPolicy(aclrtRunMode srcDev, + CopyDirection direct, MemoryType memType) { + aclrtMemcpyKind policy = ACL_MEMCPY_HOST_TO_HOST; + + if (direct == TO_DEVICE) { + if (srcDev == ACL_HOST) + policy = ACL_MEMCPY_HOST_TO_DEVICE; + else + policy = ACL_MEMCPY_DEVICE_TO_DEVICE; + } else {//TO_HOST + if (srcDev == ACL_HOST) + policy = ACL_MEMCPY_DEVICE_TO_HOST; + else + policy = ACL_MEMCPY_DEVICE_TO_DEVICE; + } + + return policy; +} + +void* CopyDataToDevice(const void* data, uint32_t size, + aclrtRunMode curRunMode, MemoryType memType) { + if ((data == nullptr) || (size == 0) || + ((curRunMode != ACL_HOST) && (curRunMode != ACL_DEVICE)) || + (memType >= MEMORY_INVALID_TYPE) || (memType == MEMORY_HOST)) { + ATLAS_LOG_ERROR("Copy data args invalid, data %p, " + "size %d, src dev %d, memory type %d", + data, size, curRunMode, memType); + return nullptr; + } + + aclrtMemcpyKind policy = GetCopyPolicy(curRunMode, TO_DEVICE, memType); + + return CopyData(data, size, policy, memType); +} + +AtlasError CopyDataToDeviceEx(void* dest, uint32_t destSize, + const void* src, uint32_t srcSize, + aclrtRunMode runMode) { + aclrtMemcpyKind policy = ACL_MEMCPY_HOST_TO_DEVICE; + if (runMode == ACL_DEVICE) { + policy = ACL_MEMCPY_DEVICE_TO_DEVICE; + } + + aclError aclRet = aclrtMemcpy(dest, destSize, src, srcSize, policy); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Copy data to device failed, aclRet is %d", aclRet); + return ATLAS_ERROR; + } + + return ATLAS_OK; +} + +void* CopyDataToHost(const void* data, uint32_t size, + aclrtRunMode curRunMode, MemoryType memType) { + if ((data == nullptr) || (size == 0) || + ((curRunMode != ACL_HOST) && (curRunMode != ACL_DEVICE)) || + ((memType != MEMORY_HOST) && (memType != MEMORY_NORMAL))) { + ATLAS_LOG_ERROR("Copy data args invalid, data %p, " + "size %d, src dev %d, memory type %d", + data, size, curRunMode, memType); + return nullptr; + } + + aclrtMemcpyKind policy = GetCopyPolicy(curRunMode, TO_HOST, memType); + + return CopyData(data, size, policy, memType); +} + +AtlasError CopyDataToHostEx(void* dest, uint32_t destSize, + const void* src, uint32_t srcSize, + aclrtRunMode runMode) { + aclrtMemcpyKind policy = ACL_MEMCPY_DEVICE_TO_HOST; + if (runMode == ACL_DEVICE) { + policy = ACL_MEMCPY_DEVICE_TO_DEVICE; + } + + aclError aclRet = aclrtMemcpy(dest, destSize, src, srcSize, policy); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Copy data to device failed, aclRet is %d", aclRet); + return ATLAS_ERROR; + } + + return ATLAS_OK; +} + +void* CopyData(const void* data, uint32_t size, + aclrtMemcpyKind policy, MemoryType memType) { + void* buffer = MallocMemory(size, memType); + if (buffer == nullptr) return nullptr; + + aclError aclRet = aclrtMemcpy(buffer, size, data, size, policy); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Copy data to device failed, aclRet is %d", aclRet); + FreeMemory(buffer, memType); + return nullptr; + } + + return buffer; +} + +AtlasError CopyImageToLocal(ImageData& destImage, + ImageData& srcImage, aclrtRunMode curRunMode) { + void* data = CopyDataToHost(srcImage.data.get(), srcImage.size, + curRunMode, MEMORY_NORMAL); + if (data == nullptr) { + return ATLAS_ERROR_COPY_DATA; + } + + destImage.format = srcImage.format; + destImage.width = srcImage.width; + destImage.height = srcImage.height; + destImage.size = srcImage.size; + destImage.alignWidth = srcImage.alignWidth; + destImage.alignHeight = srcImage.alignHeight; + destImage.data = SHARED_PRT_U8_BUF(data); + + return ATLAS_OK; +} + +AtlasError CopyImageToDevice(ImageData& destImage, ImageData& srcImage, + aclrtRunMode curRunMode, MemoryType memType) { + void* data = CopyDataToDevice(srcImage.data.get(), srcImage.size, + curRunMode, memType); + if (data == nullptr) { + return ATLAS_ERROR_COPY_DATA; + } + + destImage.format = srcImage.format; + destImage.width = srcImage.width; + destImage.height = srcImage.height; + destImage.size = srcImage.size; + destImage.alignWidth = srcImage.alignWidth; + destImage.alignHeight = srcImage.alignHeight; + + if(memType == MEMORY_DEVICE) + destImage.data = SHARED_PRT_DEV_BUF(data); + else + destImage.data = SHARED_PRT_DVPP_BUF(data); + + return ATLAS_OK; +} + +AtlasError ReadBinFile(const string& fileName, void* data, uint32_t& size) { + struct stat sBuf; + int fileStatus = stat(fileName.data(), &sBuf); + if (fileStatus == -1) { + ATLAS_LOG_ERROR("failed to get file"); + return ATLAS_ERROR_ACCESS_FILE; + } + if (S_ISREG(sBuf.st_mode) == 0) { + ATLAS_LOG_ERROR("%s is not a file, please enter a file", + fileName.c_str()); + return ATLAS_ERROR_INVALID_FILE; + } + std::ifstream binFile(fileName, std::ifstream::binary); + if (binFile.is_open() == false) { + ATLAS_LOG_ERROR("open file %s failed", fileName.c_str()); + return ATLAS_ERROR_OPEN_FILE; + } + + binFile.seekg(0, binFile.end); + uint32_t binFileBufferLen = binFile.tellg(); + if (binFileBufferLen == 0) { + ATLAS_LOG_ERROR("binfile is empty, filename is %s", fileName.c_str()); + binFile.close(); + return ATLAS_ERROR_INVALID_FILE; + } + + binFile.seekg(0, binFile.beg); + + uint8_t* binFileBufferData = new(std::nothrow) uint8_t[binFileBufferLen]; + if (binFileBufferData == nullptr) { + ATLAS_LOG_ERROR("malloc binFileBufferData failed"); + binFile.close(); + return ATLAS_ERROR_MALLOC; + } + binFile.read((char *)binFileBufferData, binFileBufferLen); + binFile.close(); + + data = binFileBufferData; + size = binFileBufferLen; + + return ATLAS_OK; +} + +AtlasError ReadJpeg(ImageData& image, std::string& fileName) { + uint32_t size = 0; + void* buf = nullptr; + + ReadBinFile(fileName, buf, size); + + int32_t ch = 0; + acldvppJpegGetImageInfo(buf, size, + &(image.width), &(image.height), &ch); + image.data.reset((uint8_t *)buf, [](uint8_t* p) { delete[](p); }); + image.size = size; + + return ATLAS_OK; +} + +void SaveBinFile(const string& filename, const void* data, uint32_t size) { + FILE *outFileFp = fopen(filename.c_str(), "wb+"); + if (outFileFp == nullptr) { + ATLAS_LOG_ERROR("Save file %s failed for open error", filename.c_str()); + return; + } + fwrite(data, 1, size, outFileFp); + + fflush(outFileFp); + fclose(outFileFp); +} diff --git a/cplusplus/common/atlasutil/src/atlas_videocapture.cpp b/cplusplus/common/atlasutil/src/atlas_videocapture.cpp new file mode 100644 index 0000000..5d72c19 --- /dev/null +++ b/cplusplus/common/atlasutil/src/atlas_videocapture.cpp @@ -0,0 +1,131 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include "atlas_utils.h" +#include "atlas_videocapture.h" + +#ifdef ENABLE_BOARD_CAMARE +#include "camera.h" +#endif + +#include "video_decode.h" + + +using namespace std; + +AtlasVideoCapture::AtlasVideoCapture():cap_(nullptr) { +#ifdef ENABLE_BOARD_CAMARE + cap_ = new Camera(1280, 720, 20); + Open(); +#endif +} + +AtlasVideoCapture::AtlasVideoCapture(uint32_t cameraId, uint32_t width, + uint32_t height, uint32_t fps) +:cap_(nullptr) { +#ifdef ENABLE_BOARD_CAMARE + cap_ = new Camera(cameraId, width, height, fps); + Open(); +#endif +} + +AtlasVideoCapture::~AtlasVideoCapture() { + if (cap_ != nullptr) { + Close(); + delete cap_; + cap_ = nullptr; + } +} + +AtlasVideoCapture::AtlasVideoCapture(const string& videoPath, aclrtContext context){ + cap_ = new VideoDecode(videoPath, context); + Open(); +} + +bool AtlasVideoCapture::IsOpened() { + if (cap_ != nullptr) { + return cap_->IsOpened(); + } else { + return false; + } +} + +AtlasError AtlasVideoCapture::Set(StreamProperty key, uint32_t value) { + if (cap_ != nullptr) { + return cap_->Set(key, value); + } else { + return ATLAS_ERROR_UNSURPPORT_VIDEO_CAPTURE; + } +} + +uint32_t AtlasVideoCapture::Get(StreamProperty key) { + if (cap_ != nullptr) { + return cap_->Get(key); + } else { + return 0; + } +} + +AtlasError AtlasVideoCapture::Read(ImageData& frame) { + if (cap_ != nullptr) { + return cap_->Read(frame); + } else { + return ATLAS_ERROR_UNSURPPORT_VIDEO_CAPTURE; + } +} + +AtlasError AtlasVideoCapture::Close() { + if (cap_ != nullptr) { + return cap_->Close(); + } else { + return ATLAS_ERROR_UNSURPPORT_VIDEO_CAPTURE; + } +} + +AtlasError AtlasVideoCapture::Open() { + if (cap_ != nullptr) { + return cap_->Open(); + } else { + return ATLAS_ERROR_UNSURPPORT_VIDEO_CAPTURE; + } +} + + + diff --git a/cplusplus/common/atlasutil/src/camera.cpp b/cplusplus/common/atlasutil/src/camera.cpp new file mode 100644 index 0000000..357f6d0 --- /dev/null +++ b/cplusplus/common/atlasutil/src/camera.cpp @@ -0,0 +1,294 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include "atlas_utils.h" + + +using namespace std; + +extern "C" { +#include "peripheral_api.h" +#include "camera.h" + + +CameraResolution gCameraResTbl[] = {{1920, 1080}, + {1280, 720}, + {704, 576}, + {704, 288}, + {352, 288}}; + +Camera::Camera(uint32_t width, uint32_t height, uint32_t fps) +: width_(width), height_(height), +size_(YUV420SP_SIZE(width_, height_)), fps_(fps) { + MediaLibInit(); + if (IsAccessible(CAMERA_ID_0)) { + id_ = CAMERA_ID_0; + } else if (IsAccessible(CAMERA_ID_1)) { + id_ = CAMERA_ID_1; + } else { + id_ = CAMERA_ID_INVALID; + ATLAS_LOG_ERROR("No camera accessable in device"); + } + + if (id_ != CAMERA_ID_INVALID) + ATLAS_LOG_INFO("No specified carmera id, use camera%d", id_); +} + +Camera::Camera(uint32_t id, uint32_t width, uint32_t height, uint32_t fps) +: id_(id), width_(width), height_(height), +size_(YUV420SP_SIZE(width_, height_)), fps_(fps){ + MediaLibInit(); +} + +bool Camera::IsAccessible(uint32_t id) { + CameraStatus status = QueryCameraStatus(id); + if (status == CAMERA_STATUS_OPEN) { + return true; + } + + if (status == CAMERA_STATUS_CLOSED) { + if (LIBMEDIA_STATUS_FAILED == OpenCamera(id)) { + ATLAS_LOG_ERROR("Open camera %d failed when test accessable", id); + return false; + } + if (LIBMEDIA_STATUS_FAILED == CloseCamera(id)) { + ATLAS_LOG_ERROR("Close camera %d failed when test accessable", id); + return false; + } + return true; + } + + return false; +} + +bool Camera::IsValidWidth(int width) { + for (uint32_t i = 0; i < SIZEOF_ARRAY(gCameraResTbl); i++) { + if (gCameraResTbl[i].width == width) + return true; + } + + return false; +} + +bool Camera::IsValidHeight(int height) { + for (uint32_t i = 0; i < SIZEOF_ARRAY(gCameraResTbl); i++) { + if (gCameraResTbl[i].height == height) + return true; + } + + return false; +} + +bool Camera::IsValidFps(int fps) { + return (fps > 0) && (fps <= 20); +} + +AtlasError Camera::SetProperty() { + int ret = SetCameraProperty(id_, CAMERA_PROP_FPS, &(fps_)); + if (ret == LIBMEDIA_STATUS_FAILED) { + ATLAS_LOG_ERROR("Set camera fps failed"); + return ATLAS_ERROR_SET_CAMERA; + } + + CameraResolution resolution; + resolution.width = width_; + resolution.height = height_; + + ret = SetCameraProperty(id_, CAMERA_PROP_RESOLUTION, &resolution); + if (ret == LIBMEDIA_STATUS_FAILED) { + ATLAS_LOG_ERROR("Set camera resolution failed"); + return ATLAS_ERROR_SET_CAMERA; + } + + CameraCapMode mode = CAMERA_CAP_ACTIVE; + ret = SetCameraProperty(id_, CAMERA_PROP_CAP_MODE, &mode); + if (ret == LIBMEDIA_STATUS_FAILED) { + ATLAS_LOG_ERROR("Set camera mode:%d failed", mode); + return ATLAS_ERROR_SET_CAMERA; + } + + return ATLAS_OK; +} + +AtlasError Camera::Open() { + if (id_ == CAMERA_ID_INVALID) { + ATLAS_LOG_ERROR("No camera is accessiable"); + return ATLAS_ERROR_CAMERA_NO_ACCESSABLE; + } + + CameraStatus status = QueryCameraStatus(id_); + if ((status == CAMERA_NOT_EXISTS) || (status == CAMERA_STATUS_UNKOWN)) { + ATLAS_LOG_ERROR("Camera %d status is error %d", id_, status); + return ATLAS_ERROR_CAMERA_NO_ACCESSABLE; + } + + if ((status != CAMERA_STATUS_OPEN) && + (LIBMEDIA_STATUS_FAILED == OpenCamera(id_))) { + ATLAS_LOG_ERROR("Open camera %d failed.", id_); + return ATLAS_ERROR_OPEN_CAMERA; + } + + AtlasError ret = SetProperty(); + if (ret != ATLAS_OK) { + Close(); + ATLAS_LOG_ERROR("Set camera%d property failed", id_); + return ret; + } + + ATLAS_LOG_INFO("Open camera %d success", id_); + + return ATLAS_OK; +} + +bool Camera::IsOpened() { + if (id_ == CAMERA_ID_INVALID) { + return false; + } + + return (CAMERA_STATUS_OPEN == QueryCameraStatus(id_)); +} + +AtlasError Camera::Read(ImageData& image) { + if (id_ == CAMERA_ID_INVALID) { + return ATLAS_ERROR_CAMERA_NO_ACCESSABLE; + } + + int size = (int)size_; + void* buffer = nullptr; + aclError aclRet = acldvppMalloc(&buffer, size); + if ((aclRet != ACL_ERROR_NONE) || (buffer == nullptr)) { + ATLAS_LOG_ERROR("Malloc dvpp memory failed, error:%d", aclRet); + return ATLAS_ERROR_MALLOC_DVPP; + } + + int ret = ReadFrameFromCamera(id_, buffer, &size); + if ((ret == LIBMEDIA_STATUS_FAILED) || (size != (int)size_)) { + ATLAS_LOG_ERROR("Get image from camera %d failed, size %d", id_, size); + return ATLAS_ERROR_READ_CAMERA_FRAME; + } + + image.format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + image.width = width_; + image.height = height_; + image.alignWidth = width_; + image.alignHeight = height_; + image.size = (uint32_t)size_; + image.data = SHARED_PRT_DVPP_BUF(buffer); + + return ATLAS_OK; +} + +uint32_t Camera::Get(StreamProperty key) { + uint32_t value = 0; + + switch(key){ + case FRAME_WIDTH: + value = width_; + break; + case FRAME_HEIGHT: + value = height_; + break; + case VIDEO_FPS: + value = fps_; + break; + default: + ATLAS_LOG_ERROR("Unsurpport property %d to get for camera", key); + break; + } + + return value; +} + +AtlasError Camera::Set(StreamProperty key, int value) { + AtlasError ret = ATLAS_OK; + + switch(key){ + case FRAME_WIDTH: + { + if (IsValidWidth(value)) { + width_ = value; + } else { + ret = ATLAS_ERROR_INVALID_PROPERTY_VALUE; + } + break; + } + case FRAME_HEIGHT: + { + if (IsValidHeight(value)) { + height_ = value; + } else { + ret = ATLAS_ERROR_INVALID_PROPERTY_VALUE; + } + break; + } + case VIDEO_FPS: + { + if (IsValidFps(value)) { + fps_ = value; + } else { + ret = ATLAS_ERROR_INVALID_PROPERTY_VALUE; + } + break; + } + default: + { + ret = ATLAS_ERROR_UNSURPPORT_PROPERTY; + ATLAS_LOG_ERROR("Unsurpport property %d to set for camera", key); + break; + } + } + + return ret; +} + +AtlasError Camera::Close() { + if (id_ == CAMERA_ID_INVALID) { + return ATLAS_ERROR_CAMERA_NO_ACCESSABLE; + } + + if (LIBMEDIA_STATUS_FAILED == CloseCamera(id_)) { + ATLAS_LOG_ERROR("Close camera %d failed", id_); + } + + return ATLAS_OK; +} + + +} diff --git a/cplusplus/common/atlasutil/src/camera.h b/cplusplus/common/atlasutil/src/camera.h new file mode 100644 index 0000000..ba6b985 --- /dev/null +++ b/cplusplus/common/atlasutil/src/camera.h @@ -0,0 +1,75 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ +#pragma once + +#include "atlas_utils.h" +#include "atlas_videocapture.h" + +#define CAMERA_NUM (2) +#define CAMERA(i) (g_CameraMgr.cap[i]) + + +class Camera : public AtlasVideoCapBase { +public: + Camera(uint32_t width, uint32_t height, uint32_t fps); + Camera(uint32_t id, uint32_t width, uint32_t height, uint32_t fps); + ~Camera(){}; + + bool IsOpened(); + + AtlasError Read(ImageData& frame); + AtlasError Close(); + + AtlasError Open(); + bool IsAccessible(uint32_t id); + AtlasError Set(StreamProperty key, int value); + uint32_t Get(StreamProperty key); + +private: + bool IsValidWidth(int width); + bool IsValidHeight(int height); + bool IsValidFps(int fps); + AtlasError SetProperty(); + CameraId GetOneAccessableSlot(); + +private: + uint32_t id_; + uint32_t width_; + uint32_t height_; + uint32_t size_; + uint32_t fps_; +}; + + + + diff --git a/cplusplus/common/atlasutil/src/dvpp_cropandpaste.cpp b/cplusplus/common/atlasutil/src/dvpp_cropandpaste.cpp new file mode 100644 index 0000000..8e30553 --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_cropandpaste.cpp @@ -0,0 +1,218 @@ +/** +* Copyright 2020 Huawei Technologies 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 dvpp_process.cpp +* Description: handle dvpp process +*/ + +#include +#include "acl/acl.h" +#include "atlas_utils.h" +#include "dvpp_cropandpaste.h" + +using namespace std; + +DvppCropAndPaste::DvppCropAndPaste(aclrtStream& stream, + acldvppChannelDesc *dvppChannelDesc, + uint32_t ltHorz, uint32_t ltVert, + uint32_t rbHorz, uint32_t rbVert) +: stream_(stream), dvppChannelDesc_(dvppChannelDesc), vpcInputDesc_(nullptr), +vpcOutputDesc_(nullptr), vpcOutBufferDev_(nullptr),vpcOutBufferSize_(0), +cropArea_(nullptr), pasteArea_(nullptr){ + // Change the left top coordinate to even numver + ltHorz_ = (ltHorz >> 1) << 1; + ltVert_ = (ltVert >> 1) << 1; + + // Change the left top coordinate to odd numver + rbHorz_ = ((rbHorz >> 1) << 1) - 1; + rbVert_ = ((rbVert >> 1) << 1) - 1; + + size_.width = rbHorz_ - ltHorz_; + size_.height = rbVert_ - ltVert_; +} + +DvppCropAndPaste::~DvppCropAndPaste() { + DestroyCropAndPasteResource(); +} + +AtlasError DvppCropAndPaste::InitCropAndPasteInputDesc(ImageData& inputImage) { + uint32_t alignWidth = ALIGN_UP16(inputImage.width); + uint32_t alignHeight = ALIGN_UP2(inputImage.height); + if (alignWidth == 0 || alignHeight == 0) { + ATLAS_LOG_ERROR("Invalid image parameters, width %d, height %d", + inputImage.width, inputImage.height); + return ATLAS_ERROR; + } + + uint32_t inputBufferSize = YUV420SP_SIZE(alignWidth, alignHeight); + vpcInputDesc_ = acldvppCreatePicDesc(); + if (vpcInputDesc_ == nullptr) { + ATLAS_LOG_ERROR("Dvpp crop create pic desc failed"); + return ATLAS_ERROR; + } + + acldvppSetPicDescData(vpcInputDesc_, inputImage.data.get()); + acldvppSetPicDescFormat(vpcInputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); + acldvppSetPicDescWidth(vpcInputDesc_, inputImage.width); + acldvppSetPicDescHeight(vpcInputDesc_, inputImage.height); + acldvppSetPicDescWidthStride(vpcInputDesc_, alignWidth); + acldvppSetPicDescHeightStride(vpcInputDesc_, alignHeight); + acldvppSetPicDescSize(vpcInputDesc_, inputBufferSize); + + return ATLAS_OK; +} + +AtlasError DvppCropAndPaste::InitCropAndPasteOutputDesc() +{ + int cropOutWidth = size_.width; + int cropOutHeight = size_.height; + int cropOutWidthStride = ALIGN_UP16(cropOutWidth); + int cropOutHeightStride = ALIGN_UP2(cropOutHeight); + + if (cropOutWidthStride == 0 || cropOutHeightStride == 0) { + ATLAS_LOG_ERROR("Crop image align widht(%d) and height(%d) failed", + size_.width, size_.height); + return ATLAS_ERROR; + } + + vpcOutBufferSize_ = YUV420SP_SIZE(cropOutWidthStride, + cropOutHeightStride); + aclError aclRet = acldvppMalloc(&vpcOutBufferDev_, vpcOutBufferSize_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Dvpp crop malloc output memory failed, crop " + "width %d, height %d size %d, error %d", + size_.width, size_.height, + vpcOutBufferSize_, aclRet); + return ATLAS_ERROR; + } + + vpcOutputDesc_ = acldvppCreatePicDesc(); + if (vpcOutputDesc_ == nullptr) { + ATLAS_LOG_ERROR("Dvpp crop create pic desc failed"); + return ATLAS_ERROR; + } + acldvppSetPicDescData(vpcOutputDesc_, vpcOutBufferDev_); + acldvppSetPicDescFormat(vpcOutputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); + acldvppSetPicDescWidth(vpcOutputDesc_, cropOutWidth); + acldvppSetPicDescHeight(vpcOutputDesc_, cropOutHeight); + acldvppSetPicDescWidthStride(vpcOutputDesc_, cropOutWidthStride); + acldvppSetPicDescHeightStride(vpcOutputDesc_, cropOutHeightStride); + acldvppSetPicDescSize(vpcOutputDesc_, vpcOutBufferSize_); + + return ATLAS_OK; +} + +AtlasError DvppCropAndPaste::InitCropAndPasteResource(ImageData& inputImage) { + if (ATLAS_OK != InitCropAndPasteInputDesc(inputImage)) { + ATLAS_LOG_ERROR("Dvpp crop init input failed"); + return ATLAS_ERROR; + } + + if (ATLAS_OK != InitCropAndPasteOutputDesc()) { + ATLAS_LOG_ERROR("Dvpp crop init output failed"); + return ATLAS_ERROR; + } + + return ATLAS_OK; +} + +AtlasError DvppCropAndPaste::Process(ImageData& cropedImage, ImageData& srcImage) +{ + if (ATLAS_OK != InitCropAndPasteResource(srcImage)) { + ATLAS_LOG_ERROR("Dvpp cropandpaste failed for init error"); + return ATLAS_ERROR; + } + + // must even + uint32_t cropLeftOffset = ltHorz_; + // must even + uint32_t cropTopOffset = ltVert_; + // must odd + uint32_t cropRightOffset = rbHorz_; + // must odd + uint32_t cropBottomOffset = rbVert_; + + cropArea_ = acldvppCreateRoiConfig(cropLeftOffset, cropRightOffset, + cropTopOffset, cropBottomOffset); + if (cropArea_ == nullptr) { + ATLAS_LOG_ERROR("acldvppCreateRoiConfig cropArea_ failed"); + return ATLAS_ERROR; + } + + // must even + uint32_t pasteLeftOffset = 0; + // must even + uint32_t pasteTopOffset = 0; + // must odd + uint32_t pasteRightOffset = size_.width; + // must odd + uint32_t pasteBottomOffset = size_.height; + + pasteArea_ = acldvppCreateRoiConfig(pasteLeftOffset, pasteRightOffset, + pasteTopOffset, pasteBottomOffset); + if (pasteArea_ == nullptr) { + ATLAS_LOG_ERROR("acldvppCreateRoiConfig pasteArea_ failed"); + return ATLAS_ERROR; + } + + // crop and patse pic + //TODO: + aclError aclRet = acldvppVpcCropAndPasteAsync(dvppChannelDesc_, vpcInputDesc_, + vpcOutputDesc_, cropArea_, pasteArea_, stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("acldvppVpcCropAndPasteAsync failed, aclRet = %d", aclRet); + return ATLAS_ERROR; + } + + aclRet = aclrtSynchronizeStream(stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("crop and paste aclrtSynchronizeStream failed, aclRet = %d", aclRet); + return ATLAS_ERROR; + } + cropedImage.format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + cropedImage.width = ALIGN_UP16(size_.width); + cropedImage.height = ALIGN_UP2(size_.height); + cropedImage.alignWidth = cropedImage.width; + cropedImage.alignHeight = cropedImage.height; + cropedImage.size = vpcOutBufferSize_; + cropedImage.data = SHARED_PRT_DVPP_BUF(vpcOutBufferDev_); + + DestroyCropAndPasteResource(); + + return ATLAS_OK; +} + +void DvppCropAndPaste::DestroyCropAndPasteResource() +{ + if (cropArea_ != nullptr) { + (void)acldvppDestroyRoiConfig(cropArea_); + cropArea_ = nullptr; + } + + if (pasteArea_ != nullptr) { + (void)acldvppDestroyRoiConfig(pasteArea_); + pasteArea_ = nullptr; + } + + if (vpcInputDesc_ != nullptr) { + (void)acldvppDestroyPicDesc(vpcInputDesc_); + vpcInputDesc_ = nullptr; + } + + if (vpcOutputDesc_ != nullptr) { + (void)acldvppDestroyPicDesc(vpcOutputDesc_); + vpcOutputDesc_ = nullptr; + } +} diff --git a/cplusplus/common/atlasutil/src/dvpp_cropandpaste.h b/cplusplus/common/atlasutil/src/dvpp_cropandpaste.h new file mode 100644 index 0000000..6fee164 --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_cropandpaste.h @@ -0,0 +1,86 @@ +/** +* Copyright 2020 Huawei Technologies 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 dvpp_process.h +* Description: handle dvpp process +*/ +#pragma once +#include + +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" + +class DvppCropAndPaste { + public: + /** + * @brief Constructor + * @param [in] stream: stream + */ + DvppCropAndPaste(aclrtStream &stream, acldvppChannelDesc *dvppChannelDesc, + uint32_t lt_horz, uint32_t lt_vert,uint32_t rb_horz, uint32_t rb_vert); + + /** + * @brief Destructor + */ + ~DvppCropAndPaste(); + + /** + * @brief dvpp global init + * @return AtlasError + */ + AtlasError InitResource(); + + /** + * @brief init dvpp output para + * @param [in] modelInputWidth: model input width + * @param [in] modelInputHeight: model input height + * @return AtlasError + */ + AtlasError InitOutputPara(int modelInputWidth, int modelInputHeight); + + /** + * @brief dvpp process + * @return AtlasError + */ + AtlasError Process(ImageData& resizedImage, ImageData& srcImage); + +private: + AtlasError InitCropAndPasteResource(ImageData& inputImage); + AtlasError InitCropAndPasteInputDesc(ImageData& inputImage); + AtlasError InitCropAndPasteOutputDesc(); + + void DestroyCropAndPasteResource(); + +private: + aclrtStream stream_; + acldvppChannelDesc *dvppChannelDesc_; + + acldvppPicDesc *vpcInputDesc_; + acldvppPicDesc *vpcOutputDesc_; + + void *vpcOutBufferDev_; + uint32_t vpcOutBufferSize_; + + acldvppRoiConfig *cropArea_; + acldvppRoiConfig *pasteArea_; + + Resolution size_; + + uint32_t ltHorz_; + uint32_t rbHorz_; + uint32_t ltVert_; + uint32_t rbVert_; +}; + diff --git a/cplusplus/common/atlasutil/src/dvpp_jpegd.cpp b/cplusplus/common/atlasutil/src/dvpp_jpegd.cpp new file mode 100644 index 0000000..d122591 --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_jpegd.cpp @@ -0,0 +1,112 @@ +/** +* Copyright 2020 Huawei Technologies 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 dvpp_process.cpp +* Description: handle dvpp process +*/ + +#include +#include "acl/acl.h" +#include "dvpp_jpegd.h" + +using namespace std; + +DvppJpegD::DvppJpegD(aclrtStream& stream, acldvppChannelDesc *dvppChannelDesc) + : stream_(stream), dvppChannelDesc_(dvppChannelDesc), + decodeOutBufferDev_(nullptr), decodeOutputDesc_(nullptr) +{ +} + +DvppJpegD::~DvppJpegD() +{ + DestroyDecodeResource(); +} + + +AtlasError DvppJpegD::InitDecodeOutputDesc(ImageData& inputImage) +{ + uint32_t decodeOutWidthStride = ALIGN_UP128(inputImage.width); + uint32_t decodeOutHeightStride = ALIGN_UP16(inputImage.height); + if (decodeOutWidthStride == 0 || decodeOutHeightStride == 0) { + ATLAS_LOG_ERROR("Input image width %d or height %d invalid", + inputImage.width, inputImage.height); + return ATLAS_ERROR_INVALID_ARGS; + } + + uint32_t decodeOutBufferSize = + YUV420SP_SIZE(decodeOutWidthStride, decodeOutHeightStride) * 2; + + aclError aclRet = acldvppMalloc(&decodeOutBufferDev_, decodeOutBufferSize); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Malloc dvpp memory failed, error:%d", aclRet); + return ATLAS_ERROR_MALLOC_DVPP; + } + + decodeOutputDesc_ = acldvppCreatePicDesc(); + if (decodeOutputDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create dvpp pic desc failed"); + return ATLAS_ERROR_CREATE_PIC_DESC; + } + + acldvppSetPicDescData(decodeOutputDesc_, decodeOutBufferDev_); + acldvppSetPicDescFormat(decodeOutputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); + acldvppSetPicDescWidth(decodeOutputDesc_, inputImage.width); + acldvppSetPicDescHeight(decodeOutputDesc_, inputImage.height); + acldvppSetPicDescWidthStride(decodeOutputDesc_, decodeOutWidthStride); + acldvppSetPicDescHeightStride(decodeOutputDesc_, decodeOutHeightStride); + acldvppSetPicDescSize(decodeOutputDesc_, decodeOutBufferSize); + + return ATLAS_OK; +} + +AtlasError DvppJpegD::Process(ImageData& dest, ImageData& src) +{ + int ret = InitDecodeOutputDesc(src); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("InitDecodeOutputDesc failed"); + return ret; + } + + aclError aclRet = acldvppJpegDecodeAsync(dvppChannelDesc_, + reinterpret_cast(src.data.get()), + src.size, decodeOutputDesc_, stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("acldvppJpegDecodeAsync failed, error: %d", aclRet); + return ATLAS_ERROR_JPEGD_ASYNC; + } + + aclRet = aclrtSynchronizeStream(stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Sync stream failed, error: %d", aclRet); + return ATLAS_ERROR_SYNC_STREAM; + } + dest.format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + dest.width = ALIGN_UP128(src.width); + dest.height = ALIGN_UP16(src.height); + dest.alignWidth = dest.width; + dest.alignHeight = dest.height; + dest.size = YUV420SP_SIZE(dest.alignWidth, dest.alignHeight); + dest.data = SHARED_PRT_DVPP_BUF(decodeOutBufferDev_); + + return ATLAS_OK; +} + +void DvppJpegD::DestroyDecodeResource() +{ + if (decodeOutputDesc_ != nullptr) { + acldvppDestroyPicDesc(decodeOutputDesc_); + decodeOutputDesc_ = nullptr; + } +} diff --git a/cplusplus/common/atlasutil/src/dvpp_jpegd.h b/cplusplus/common/atlasutil/src/dvpp_jpegd.h new file mode 100644 index 0000000..ef60419 --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_jpegd.h @@ -0,0 +1,87 @@ +/** +* Copyright 2020 Huawei Technologies 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 dvpp_process.h +* Description: handle dvpp process +*/ +#pragma once +#include + +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" +#include "atlas_utils.h" + +class DvppJpegD { +public: + /** + * @brief Constructor + * @param [in] stream: stream + */ + DvppJpegD(aclrtStream &stream, acldvppChannelDesc *dvppChannelDesc); + + /** + * @brief Destructor + */ + ~DvppJpegD(); + + /** + * @brief dvpp global init + * @return result + */ + AtlasError InitResource(); + + /** + * @brief init dvpp output para + * @param [in] modelInputWidth: model input width + * @param [in] modelInputHeight: model input height + * @return result + */ + AtlasError InitOutputPara(int modelInputWidth, int modelInputHeight); + + /** + * @brief set jpegd input + * @param [in] inDevBuffer: device buffer of input pic + * @param [in] inDevBufferSize: device buffer size of input pic + * @param [in] inputWidth:width of pic + * @param [in] inputHeight:height of pic + */ + void SetInput4JpegD(uint8_t* inDevBuffer, int inDevBufferSize, + int inputWidth, int inputHeight); + AtlasError InitDecodeOutputDesc(ImageData& inputImage); + /** + * @brief gett dvpp output + * @param [in] outputBuffer: pointer which points to dvpp output buffer + * @param [out] outputSize: output size + */ + void GetOutput(void **outputBuffer, int &outputSize); + AtlasError Process(ImageData& dest, ImageData& src); + /** + * @brief release encode resource + */ + void DestroyEncodeResource(); + +private: + void DestroyDecodeResource(); + void DestroyResource(); + void DestroyOutputPara(); + +private: + aclrtStream stream_; + acldvppChannelDesc *dvppChannelDesc_; + + void* decodeOutBufferDev_; // decode output buffer + acldvppPicDesc *decodeOutputDesc_; //decode output desc +}; + diff --git a/cplusplus/common/atlasutil/src/dvpp_jpege.cpp b/cplusplus/common/atlasutil/src/dvpp_jpege.cpp new file mode 100644 index 0000000..5b7786f --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_jpege.cpp @@ -0,0 +1,133 @@ +/** +* Copyright 2020 Huawei Technologies 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 dvpp_process.cpp +* Description: handle dvpp process +*/ + +#include +#include "acl/acl.h" +#include "dvpp_jpege.h" + +using namespace std; + +DvppJpegE::DvppJpegE(aclrtStream& stream, acldvppChannelDesc* dvppChannelDesc) + : stream_(stream), dvppChannelDesc_(dvppChannelDesc), jpegeConfig_(nullptr), encodeOutBufferSize_(0), + encodeOutBufferDev_(nullptr), encodeInputDesc_(nullptr){ +} + + +DvppJpegE::~DvppJpegE() { + +} + +AtlasError DvppJpegE::InitEncodeInputDesc(ImageData& inputImage) +{ + uint32_t alignWidth = ALIGN_UP16(inputImage.width); + uint32_t alignHeight = ALIGN_UP2(inputImage.height); + if (alignWidth == 0 || alignHeight == 0) { + ATLAS_LOG_ERROR("Input image width %d or height %d invalid", + inputImage.width, inputImage.height); + return ATLAS_ERROR_INVALID_ARGS; + } + uint32_t inputBufferSize = YUV420SP_SIZE(alignWidth, alignHeight); + + encodeInputDesc_ = acldvppCreatePicDesc(); + if (encodeInputDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create dvpp pic desc failed"); + return ATLAS_ERROR_CREATE_PIC_DESC; + } + + acldvppSetPicDescData(encodeInputDesc_, + reinterpret_cast(inputImage.data.get())); + acldvppSetPicDescFormat(encodeInputDesc_, inputImage.format); + acldvppSetPicDescWidth(encodeInputDesc_, inputImage.width); + acldvppSetPicDescHeight(encodeInputDesc_, inputImage.height); + acldvppSetPicDescWidthStride(encodeInputDesc_, alignWidth); + acldvppSetPicDescHeightStride(encodeInputDesc_, alignHeight); + acldvppSetPicDescSize(encodeInputDesc_, inputBufferSize); + + return ATLAS_OK; +} + +AtlasError DvppJpegE::InitJpegEResource(ImageData& inputImage) { + uint32_t encodeLevel = 100; // default optimal level (0-100) + + AtlasError ret = InitEncodeInputDesc(inputImage); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Dvpp jpege init input desc failed"); + return ret; + } + + jpegeConfig_ = acldvppCreateJpegeConfig(); + acldvppSetJpegeConfigLevel(jpegeConfig_, encodeLevel); + + acldvppJpegPredictEncSize(encodeInputDesc_, jpegeConfig_, &encodeOutBufferSize_); + aclError aclRet = acldvppMalloc(&encodeOutBufferDev_, encodeOutBufferSize_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Malloc dvpp memory error(%d)", aclRet); + return ATLAS_ERROR_MALLOC_DVPP; + } + + return ATLAS_OK; +} + +AtlasError DvppJpegE::Process(ImageData& destJpegImage, ImageData& srcYuvImage) +{ + AtlasError ret = InitJpegEResource(srcYuvImage); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Dvpp jpege failed for init error"); + return ret; + } + + aclError aclRet = acldvppJpegEncodeAsync(dvppChannelDesc_, + encodeInputDesc_, + encodeOutBufferDev_, + &encodeOutBufferSize_, + jpegeConfig_, stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Dvpp jpege async failed, error:%d", aclRet); + return ATLAS_ERROR_JPEGE_ASYNC; + } + + aclRet = aclrtSynchronizeStream(stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Dvpp jpege sync stream failed, error:%d", aclRet); + return ATLAS_ERROR_SYNC_STREAM; + } + + destJpegImage.width = srcYuvImage.width; + destJpegImage.height = srcYuvImage.height; + destJpegImage.size = encodeOutBufferSize_; + destJpegImage.data.reset((uint8_t*)encodeOutBufferDev_, + [](uint8_t* p) { acldvppFree(p); }); + + DestroyEncodeResource(); + + return ATLAS_OK; +} + +void DvppJpegE::DestroyEncodeResource() +{ + if (jpegeConfig_ != nullptr) { + (void)acldvppDestroyJpegeConfig(jpegeConfig_); + jpegeConfig_ = nullptr; + } + + if (encodeInputDesc_ != nullptr) { + (void)acldvppDestroyPicDesc(encodeInputDesc_); + encodeInputDesc_ = nullptr; + } +} diff --git a/cplusplus/common/atlasutil/src/dvpp_jpege.h b/cplusplus/common/atlasutil/src/dvpp_jpege.h new file mode 100644 index 0000000..54d2c4f --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_jpege.h @@ -0,0 +1,66 @@ +/** +* Copyright 2020 Huawei Technologies 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 dvpp_process.h +* Description: handle dvpp process +*/ +#pragma once +#include + +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" +#include "atlas_utils.h" +#include "dvpp_process.h" + +class DvppJpegE{ +public: + /** + * @brief Constructor + * @param [in] stream: stream + */ + DvppJpegE(aclrtStream &stream, acldvppChannelDesc* dvppChannelDesc); + + /** + * @brief Destructor + */ + ~DvppJpegE(); + + /** + * @brief process encode + * @return result + */ + AtlasError Process(ImageData& destJpegImage, ImageData& srcYuvImage); + + /** + * @brief release encode resource + */ + void DestroyEncodeResource(); + +private: + AtlasError InitJpegEResource(ImageData& inputImage); + AtlasError InitEncodeInputDesc(ImageData& inputImage); + void DestroyResource(); + void DestroyOutputPara(); + + aclrtStream stream_; + acldvppChannelDesc* dvppChannelDesc_; + + acldvppJpegeConfig* jpegeConfig_; + + uint32_t encodeOutBufferSize_; + void* encodeOutBufferDev_; // encode output buffer + acldvppPicDesc* encodeInputDesc_; //encode input desc +}; + diff --git a/cplusplus/common/atlasutil/src/dvpp_mem_mgr.cpp b/cplusplus/common/atlasutil/src/dvpp_mem_mgr.cpp new file mode 100644 index 0000000..670f30b --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_mem_mgr.cpp @@ -0,0 +1,288 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include "atlas_utils.h" +#include "dvpp_mem_mgr.h" + + +using namespace std; + +namespace { + const uint32_t kDvppMemAlign = 128; + const uint32_t kDefaultBlockNum = 2048; + const uint32_t kLevelInvalid = kLevelNum; + const uint32_t kPoolIdInvalid = kPerLevelPoolsNum; + const uint32_t kLevelSmallMax = 512; + const uint32_t kLevelLargeMax = 64; + + const uint32_t kLevel4k = 4 * 1024; + const uint32_t kLevel16k = 16 * 1024; + const uint32_t kLevel64k = 64 * 1024; + const uint32_t kLevel256k = 256 * 1024; + const uint32_t kLevel512k = 512 * 1024; + const uint32_t kLevel1024k = 1024 * 1024; + const uint32_t kLevel2m = 2 * 1024 * 1024; + const uint32_t kLevel4m = 4 * 1024 * 1024; + const uint32_t kLevel8m = 8 * 1024 * 1024; +} + + +DvppMemPool::DvppMemPool() : +blockNum_(0), +freeList_(kDefaultBlockNum) { +} + +DvppMemPool::~DvppMemPool() { + std::lock_guard lock(mutex_lock_); + do { + void* buffer = freeList_.Pop(); + if (!buffer) { + break; + } + acldvppFree(buffer); + blockNum_--; + }while(1); +} + +void* DvppMemPool::MallocMem(uint32_t size, bool& isNewBlock) { + isNewBlock = false; + std::lock_guard lock(mutex_lock_); + void* buffer = freeList_.Pop(); + if (!buffer) { + aclError aclRet = acldvppMalloc(&buffer, size); + if ((aclRet != ACL_ERROR_NONE) || (buffer == nullptr)) { + ATLAS_LOG_ERROR("Acl dvpp malloc return error %d", aclRet); + return nullptr; + } + blockNum_++; + isNewBlock = true; + } + + usedList_.push_back(buffer); + + return buffer; +} + +void DvppMemPool::FreeMem(void* ptr) { + std::lock_guard lock(mutex_lock_); + list::iterator it = usedList_.begin(); + while (it != usedList_.end()) { + if (*it == ptr) { + usedList_.erase(it); + freeList_.Push(ptr); + return; + } + it++; + } + + ATLAS_LOG_ERROR("Free memory %p in pool failed", ptr); + it = usedList_.begin(); + while (it != usedList_.end()) { + it++; + } + + return; +} + +DvppMemPoolMgr::DvppMemPoolMgr() { + levelList_[0].size = kLevel4k; + levelList_[0].maxBlockNum = kLevelSmallMax; + + levelList_[1].size = kLevel16k; + levelList_[1].maxBlockNum = kLevelSmallMax; + + levelList_[2].size = kLevel64k; + levelList_[2].maxBlockNum = kLevelSmallMax; + + levelList_[3].size = kLevel256k; + levelList_[3].maxBlockNum = kLevelSmallMax; + + levelList_[4].size = kLevel512k; + levelList_[4].maxBlockNum = kLevelSmallMax; + + levelList_[5].size = kLevel1024k; + levelList_[5].maxBlockNum = kLevelSmallMax; + + levelList_[6].size = kLevel2m; + levelList_[6].maxBlockNum = kLevelLargeMax; + + levelList_[7].size = kLevel4m; + levelList_[7].maxBlockNum = 512; + + levelList_[8].size = kLevel8m; + levelList_[8].maxBlockNum = kLevelLargeMax; +} + +void* DvppMemPoolMgr::MallocMem(uint32_t size) { + uint32_t wrapSize = size + kDvppMemAlign; + uint32_t level = ChooseLevel(wrapSize); + if (level >= kLevelInvalid) { + return MallocDvppMemory(wrapSize); + } + + + uint32_t index = ChoosePool(level); + if (index >= kPoolIdInvalid) { + return MallocDvppMemory(wrapSize); + } + + bool isNewBlock = false; + void* buffer = levelList_[level].poolTbl[index].MallocMem(wrapSize, isNewBlock); + if (!buffer) { + return nullptr; + } + + if (isNewBlock) { + levelList_[level].totalBlockNum++; + } + + return WrapMem(buffer, level, index, MEM_POOL_MALLOC, size); +} + +void* DvppMemPoolMgr::MallocDvppMemory(uint32_t size) { + void* buffer = nullptr; + aclError aclRet = acldvppMalloc(&buffer, size); + if ((aclRet != ACL_ERROR_NONE) || (buffer == nullptr)) { + ATLAS_LOG_ERROR("Acl dvpp malloc return error %d", aclRet); + return nullptr; + } + return WrapMem(buffer, kLevelInvalid, 0, MEM_ACL_MALLOC, size); +} + +void* DvppMemPoolMgr::WrapMem(void* buffer, uint32_t level, + uint32_t poolId, MallocType mallocType, uint32_t size) { + MallocInfo *info = (MallocInfo *)buffer; + info->level = level; + info->poolId = poolId; + info->size = size; + info->mallocType = mallocType; + return (void *)((uint8_t*)buffer + kDvppMemAlign); +} + +void DvppMemPoolMgr::FreeMem(void* ptr) { + void* buffer = (void *)((uint8_t *)ptr - kDvppMemAlign); + MallocInfo *info = (MallocInfo *)((uint8_t *)ptr - kDvppMemAlign); + if (info->mallocType == MEM_ACL_MALLOC) { + acldvppFree(buffer); + return; + } + + DvppMemPool& pool = levelList_[info->level].poolTbl[info->poolId]; + pool.FreeMem(buffer); + + return; +} + +uint32_t DvppMemPoolMgr::ChooseLevel(uint32_t size) { + for (uint32_t i = 0; i < kLevelNum; i++) { + if (size < levelList_[i].size) { + return i; + } + } + + return kLevelInvalid; +} + +uint32_t DvppMemPoolMgr::ChoosePool(uint32_t level) { + uint32_t index = 0; + PoolLevel& poolLevel = levelList_[level]; + if (poolLevel.totalBlockNum >= poolLevel.maxBlockNum) { + uint32_t maxFreeNum = poolLevel.poolTbl[0].FreeBlockNum(); + for (uint32_t i = 1; i < kPerLevelPoolsNum; i++) { + if (maxFreeNum < poolLevel.poolTbl[i].FreeBlockNum()) { + maxFreeNum = poolLevel.poolTbl[i].FreeBlockNum(); + index = i; + } + if (maxFreeNum == 0) { + index = kPoolIdInvalid; + } + } + } else { + uint32_t minBlockNum = poolLevel.poolTbl[0].BlockNum(); + for (uint32_t i = 1; i < kPerLevelPoolsNum; i++) { + if (minBlockNum > poolLevel.poolTbl[i].BlockNum()) { + minBlockNum = poolLevel.poolTbl[i].BlockNum(); + index = i; + } + } + } + + return index; +} + +void DvppMemPoolMgr::PrintPoolInfo() { + printf("Mem pool: total malloc times %d, total free times %d\n", + totalMallocTimes_, totalFreeTimes_); + for (uint32_t i = 0; i < kLevelNum; i++) { + if (levelList_[i].totalBlockNum == 0) + continue; + + printf("Level: %d\n", levelList_[i].size); + for (uint32_t j = 0; j < kPerLevelPoolsNum; j++) { + DvppMemPool& pool = levelList_[i].poolTbl[j]; + if (pool.BlockNum() == 0) + continue; + + printf("pool %d: block num %d, free:%d, used: %d\n", + j, pool.BlockNum(), pool.FreeBlockNum(), + pool.UsedBlockNum()); + } + } +} + + +void* AtlasDvppMalloc(uint32_t size) { + DvppMemPoolMgr& inst = DvppMemPoolMgr::GetInstance(); + inst.StatisticMalloc(); + return inst.MallocMem(size); +} + +void AtlasDvppFree(void* ptr) { + DvppMemPoolMgr& inst = DvppMemPoolMgr::GetInstance(); + inst.StatisticFree(); + return inst.FreeMem(ptr); +} + +void PrintDvppMgrInfo() { + DvppMemPoolMgr& inst = DvppMemPoolMgr::GetInstance(); + inst.PrintPoolInfo(); +} + + diff --git a/cplusplus/common/atlasutil/src/dvpp_mem_mgr.h b/cplusplus/common/atlasutil/src/dvpp_mem_mgr.h new file mode 100644 index 0000000..c9a9765 --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_mem_mgr.h @@ -0,0 +1,124 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ +#pragma once + +#include +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" + +#include "thread_safe_queue.h" +#include "atlas_error.h" +#include "dvpp_mem_mgr.h" + +namespace { + const uint32_t kLevelNum = 9; + const uint32_t kPerLevelPoolsNum = 4; +} + +enum MallocType { + MEM_ACL_MALLOC = 0, + MEM_POOL_MALLOC, + UNKNOW_MALLOC_TYPE, +}; + +struct MallocInfo { + uint32_t level; + uint32_t poolId; + uint32_t size; + MallocType mallocType; +}; + +class DvppMemPool { +public: + DvppMemPool(); + ~DvppMemPool(); + + void* MallocMem(uint32_t size, bool& isNewBlock); + void FreeMem(void* ptr); + + uint32_t BlockNum() { return blockNum_; } + uint32_t FreeBlockNum() { return freeList_.Size(); } + uint32_t UsedBlockNum() { return usedList_.size(); } +private: + uint32_t blockNum_; + ThreadSafeQueue freeList_; + std::list usedList_; + mutable std::mutex mutex_lock_; +}; + +struct PoolLevel { + uint32_t size; + uint32_t maxBlockNum; + uint32_t totalBlockNum = 0; + DvppMemPool poolTbl[kPerLevelPoolsNum]; +}; + +class DvppMemPoolMgr { +public: + DvppMemPoolMgr(); + + DvppMemPoolMgr(const DvppMemPoolMgr&) = delete; + DvppMemPoolMgr& operator=(const DvppMemPoolMgr&) = delete; + + static DvppMemPoolMgr& GetInstance() { + static DvppMemPoolMgr instance; + return instance; + } + + ~DvppMemPoolMgr() {}; + + void* MallocMem(uint32_t size); + void FreeMem(void* ptr); + + void StatisticMalloc() { totalMallocTimes_++; } + void StatisticFree() { totalFreeTimes_++; } + void PrintPoolInfo(); + +private: + uint32_t ChooseLevel(uint32_t size); + uint32_t ChoosePool(uint32_t level); + void* MallocDvppMemory(uint32_t size); + void* WrapMem(void* buffer, uint32_t level, + uint32_t poolId, MallocType mallocType, uint32_t size); + +private: + PoolLevel levelList_[kLevelNum]; + + uint32_t totalMallocTimes_; + uint32_t totalFreeTimes_; +}; + +void* AtlasDvppMalloc(uint32_t size); +void AtlasDvppFree(void* ptr); +void PrintDvppMgrInfo(); + diff --git a/cplusplus/common/atlasutil/src/dvpp_process.cpp b/cplusplus/common/atlasutil/src/dvpp_process.cpp new file mode 100644 index 0000000..85c80cc --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_process.cpp @@ -0,0 +1,115 @@ +/** +* Copyright 2020 Huawei Technologies 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 dvpp_process.cpp +* Description: handle dvpp process +*/ + +#include +#include "acl/acl.h" +#include "dvpp_resize.h" +#include "dvpp_jpegd.h" +#include "dvpp_jpege.h" +#include "dvpp_process.h" +#include "dvpp_cropandpaste.h" + +using namespace std; + +DvppProcess::DvppProcess() : +isInitOk_(false), stream_(nullptr), +dvppChannelDesc_(nullptr), isReleased_(false) { +} + +DvppProcess::~DvppProcess() { + DestroyResource(); +} + +void DvppProcess::DestroyResource() { + if (isReleased_) { + return; + } + + aclError aclRet; + + if (dvppChannelDesc_ != nullptr) { + aclRet = acldvppDestroyChannel(dvppChannelDesc_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Destroy dvpp channel error: %d", aclRet); + } + + (void)acldvppDestroyChannelDesc(dvppChannelDesc_); + dvppChannelDesc_ = nullptr; + } + + if (stream_ != nullptr) { + aclRet = aclrtDestroyStream(stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Vdec destroy stream failed, error %d", aclRet); + } + stream_ = nullptr; + } + + isReleased_ = true; +} + +AtlasError DvppProcess::Init() { + aclError aclRet = aclrtCreateStream(&stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Create venc stream failed, error %d", aclRet); + return ATLAS_ERROR_CREATE_STREAM; + } + + dvppChannelDesc_ = acldvppCreateChannelDesc(); + if (dvppChannelDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create dvpp channel desc failed"); + return ATLAS_ERROR_CREATE_DVPP_CHANNEL_DESC; + } + + aclRet = acldvppCreateChannel(dvppChannelDesc_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("acldvppCreateChannel failed, aclRet = %d", aclRet); + return ATLAS_ERRROR_CREATE_DVPP_CHANNEL; + } + + isInitOk_ = true; + ATLAS_LOG_INFO("dvpp init resource ok"); + + return ATLAS_OK; +} + +AtlasError DvppProcess::Resize(ImageData& dest, ImageData& src, + uint32_t width, uint32_t height) { + DvppResize resizeOp(stream_, dvppChannelDesc_, width, height); + return resizeOp.Process(dest, src); +} + +AtlasError DvppProcess::JpegD(ImageData& dest, ImageData& src) { + DvppJpegD jpegD(stream_, dvppChannelDesc_); + return jpegD.Process(dest, src); +} + +AtlasError DvppProcess::Crop(ImageData& dest, ImageData& src, + uint32_t ltHorz, uint32_t ltVert, + uint32_t rbHorz, uint32_t rbVert) { + DvppCropAndPaste crop(stream_, dvppChannelDesc_, + ltHorz, ltVert, rbHorz, rbVert); + return crop.Process(dest, src); +} + +AtlasError DvppProcess::JpegE(ImageData& dest, ImageData& src) { + DvppJpegE jpegE(stream_, dvppChannelDesc_); + return jpegE.Process(dest, src); +} + diff --git a/cplusplus/common/atlasutil/src/dvpp_resize.cpp b/cplusplus/common/atlasutil/src/dvpp_resize.cpp new file mode 100644 index 0000000..b9e96e5 --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_resize.cpp @@ -0,0 +1,176 @@ +/** +* Copyright 2020 Huawei Technologies 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 dvpp_process.cpp +* Description: handle dvpp process +*/ + +#include +#include "acl/acl.h" +#include "atlas_utils.h" +#include "dvpp_resize.h" + +using namespace std; + +DvppResize::DvppResize(aclrtStream& stream, acldvppChannelDesc *dvppChannelDesc, + uint32_t width, uint32_t height) +: stream_(stream), dvppChannelDesc_(dvppChannelDesc), +resizeConfig_(nullptr), vpcInputDesc_(nullptr), vpcOutputDesc_(nullptr), +inDevBuffer_(nullptr),vpcOutBufferDev_(nullptr),vpcOutBufferSize_(0) { + size_.width = width; + size_.height = height; +} + +DvppResize::~DvppResize() { + DestroyResizeResource(); +} + +AtlasError DvppResize::InitResizeInputDesc(ImageData& inputImage) { + uint32_t alignWidth = ALIGN_UP16(inputImage.width); + uint32_t alignHeight = ALIGN_UP2(inputImage.height); + if (alignWidth == 0 || alignHeight == 0) { + ATLAS_LOG_ERROR("Input image width %d or height %d invalid", + inputImage.width, inputImage.height); + return ATLAS_ERROR_INVALID_ARGS; + } + + uint32_t inputBufferSize = YUV420SP_SIZE(alignWidth, alignHeight); + vpcInputDesc_ = acldvppCreatePicDesc(); + if (vpcInputDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create dvpp pic desc failed"); + return ATLAS_ERROR_CREATE_PIC_DESC; + } + + acldvppSetPicDescData(vpcInputDesc_, inputImage.data.get()); + acldvppSetPicDescFormat(vpcInputDesc_, inputImage.format); + acldvppSetPicDescWidth(vpcInputDesc_, inputImage.width); + acldvppSetPicDescHeight(vpcInputDesc_, inputImage.height); + acldvppSetPicDescWidthStride(vpcInputDesc_, alignWidth); + acldvppSetPicDescHeightStride(vpcInputDesc_, alignHeight); + acldvppSetPicDescSize(vpcInputDesc_, inputBufferSize); + + return ATLAS_OK; +} + +AtlasError DvppResize::InitResizeOutputDesc() +{ + int resizeOutWidth = size_.width; + int resizeOutHeight = size_.height; + int resizeOutWidthStride = ALIGN_UP16(resizeOutWidth); + int resizeOutHeightStride = ALIGN_UP2(resizeOutHeight); + if (resizeOutWidthStride == 0 || resizeOutHeightStride == 0) { + ATLAS_LOG_ERROR("Align resize width(%d) and height(%d) failed", + size_.width, size_.height); + return ATLAS_ERROR_INVALID_ARGS; + } + + vpcOutBufferSize_ = YUV420SP_SIZE(resizeOutWidthStride, resizeOutHeightStride); + aclError aclRet = acldvppMalloc(&vpcOutBufferDev_, vpcOutBufferSize_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Dvpp resize malloc output buffer failed, " + "size %d, error %d", vpcOutBufferSize_, aclRet); + return ATLAS_ERROR_MALLOC_DVPP; + } + + vpcOutputDesc_ = acldvppCreatePicDesc(); + if (vpcOutputDesc_ == nullptr) { + ATLAS_LOG_ERROR("acldvppCreatePicDesc vpcOutputDesc_ failed"); + return ATLAS_ERROR_CREATE_PIC_DESC; + } + + acldvppSetPicDescData(vpcOutputDesc_, vpcOutBufferDev_); + acldvppSetPicDescFormat(vpcOutputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); + acldvppSetPicDescWidth(vpcOutputDesc_, resizeOutWidth); + acldvppSetPicDescHeight(vpcOutputDesc_, resizeOutHeight); + acldvppSetPicDescWidthStride(vpcOutputDesc_, resizeOutWidthStride); + acldvppSetPicDescHeightStride(vpcOutputDesc_, resizeOutHeightStride); + acldvppSetPicDescSize(vpcOutputDesc_, vpcOutBufferSize_); + + return ATLAS_OK; +} + +AtlasError DvppResize::InitResizeResource(ImageData& inputImage) { + resizeConfig_ = acldvppCreateResizeConfig(); + if (resizeConfig_ == nullptr) { + ATLAS_LOG_ERROR("Dvpp resize init failed for create config failed"); + return ATLAS_ERROR_CREATE_RESIZE_CONFIG; + } + + AtlasError ret = InitResizeInputDesc(inputImage); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("InitResizeInputDesc failed"); + return ret; + } + + ret = InitResizeOutputDesc(); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("InitResizeOutputDesc failed"); + return ret; + } + + return ATLAS_OK; +} + +AtlasError DvppResize::Process(ImageData& resizedImage, ImageData& srcImage) +{ + AtlasError atlRet = InitResizeResource(srcImage); + if (atlRet != ATLAS_OK) { + ATLAS_LOG_ERROR("Dvpp resize failed for init error"); + return atlRet; + } + + // resize pic + aclError aclRet = acldvppVpcResizeAsync(dvppChannelDesc_, vpcInputDesc_, + vpcOutputDesc_, resizeConfig_, stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("acldvppVpcResizeAsync failed, error: %d", aclRet); + return ATLAS_ERROR_RESIZE_ASYNC; + } + + aclRet = aclrtSynchronizeStream(stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("resize aclrtSynchronizeStream failed, error: %d", aclRet); + return ATLAS_ERROR_SYNC_STREAM; + } + resizedImage.format = PIXEL_FORMAT_YUV_SEMIPLANAR_420; + resizedImage.width = size_.width; + resizedImage.height = size_.height; + resizedImage.alignWidth = ALIGN_UP16(size_.width); + resizedImage.alignHeight = ALIGN_UP2(size_.height); + resizedImage.size = vpcOutBufferSize_; + resizedImage.data = SHARED_PRT_DVPP_BUF(vpcOutBufferDev_); + + DestroyResizeResource(); + + return ATLAS_OK; +} + +void DvppResize::DestroyResizeResource() +{ + if (resizeConfig_ != nullptr) { + (void)acldvppDestroyResizeConfig(resizeConfig_); + resizeConfig_ = nullptr; + } + + if (vpcInputDesc_ != nullptr) { + (void)acldvppDestroyPicDesc(vpcInputDesc_); + vpcInputDesc_ = nullptr; + } + + if (vpcOutputDesc_ != nullptr) { + (void)acldvppDestroyPicDesc(vpcOutputDesc_); + vpcOutputDesc_ = nullptr; + } +} diff --git a/cplusplus/common/atlasutil/src/dvpp_resize.h b/cplusplus/common/atlasutil/src/dvpp_resize.h new file mode 100644 index 0000000..315d270 --- /dev/null +++ b/cplusplus/common/atlasutil/src/dvpp_resize.h @@ -0,0 +1,89 @@ +/** +* Copyright 2020 Huawei Technologies 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 dvpp_process.h +* Description: handle dvpp process +*/ +#pragma once +#include + +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" +#include "atlas_utils.h" + +class DvppResize { +public: + /** + * @brief Constructor + * @param [in] stream: stream + */ + DvppResize(aclrtStream &stream, acldvppChannelDesc *dvppChannelDesc, + uint32_t width, uint32_t height); + + /** + * @brief Destructor + */ + ~DvppResize(); + + /** + * @brief dvpp global init + * @return result + */ + AtlasError InitResource(); + + /** + * @brief init dvpp output para + * @param [in] modelInputWidth: model input width + * @param [in] modelInputHeight: model input height + * @return result + */ + AtlasError InitOutputPara(int modelInputWidth, int modelInputHeight); + + /** + * @brief gett dvpp output + * @param [in] outputBuffer: pointer which points to dvpp output buffer + * @param [out] outputSize: output size + */ + void GetOutput(void **outputBuffer, int &outputSize); + + /** + * @brief dvpp process + * @return result + */ + AtlasError Process(ImageData& resizedImage, ImageData& srcImage); + +private: + AtlasError InitResizeResource(ImageData& inputImage); + AtlasError InitResizeInputDesc(ImageData& inputImage); + AtlasError InitResizeOutputDesc(); + + void DestroyResizeResource(); + void DestroyResource(); + void DestroyOutputPara(); + + aclrtStream stream_; + acldvppChannelDesc *dvppChannelDesc_; + + acldvppResizeConfig *resizeConfig_; + + acldvppPicDesc *vpcInputDesc_; // vpc input desc + acldvppPicDesc *vpcOutputDesc_; // vpc output desc + + uint8_t *inDevBuffer_; // input pic dev buffer + void *vpcOutBufferDev_; // vpc output buffer + uint32_t vpcOutBufferSize_; // vpc output size + Resolution size_; +}; + diff --git a/cplusplus/common/atlasutil/src/ffmpeg_decoder.cpp b/cplusplus/common/atlasutil/src/ffmpeg_decoder.cpp new file mode 100644 index 0000000..dd626b1 --- /dev/null +++ b/cplusplus/common/atlasutil/src/ffmpeg_decoder.cpp @@ -0,0 +1,312 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "atlas_utils.h" +#include "ffmpeg_decoder.h" + +using namespace std; + +namespace { + const int kNoFlag = 0; // no flag + + const int kInvalidVideoIndex = -1; // invalid video index + + const string kRtspTransport = "rtspTransport"; // rtsp transport + + const string kUdp = "udp"; // video format udp + + const string kTcp = "tcp"; + + const string kBufferSize = "buffer_size"; // buffer size string + + const string kMaxBufferSize = "10485760"; // maximum buffer size:10MB + + const string kMaxDelayStr = "max_delay"; // maximum delay string + + const string kMaxDelayValue = "100000000"; // maximum delay time:100s + + const string kTimeoutStr = "stimeout"; // timeout string + + const string kTimeoutValue = "5000000"; // timeout:5s + + const string kPktSize = "pkt_size"; // ffmpeg pakect size string + + const string kPktSizeValue = "10485760"; // ffmpeg packet size value:10MB + + const string kReorderQueueSize = "reorder_queue_size"; // reorder queue size + + const string kReorderQueueSizeValue = "0"; // reorder queue size value + + const int kErrorBufferSize = 1024; // buffer size for error info + + const uint32_t kDefaultFps = 5; + + const uint32_t kOneSecUs = 1000 * 1000; +} + +FFmpegDecoder::FFmpegDecoder(const std::string& streamName) +:streamName_(streamName){ + rtspTransport_.assign(kTcp.c_str()); + isFinished_ = false; + isStop_ = false; + GetVideoInfo(); +} + +void FFmpegDecoder::SetTransport(const std::string& transportType) { + rtspTransport_.assign(transportType.c_str()); +}; + +int FFmpegDecoder::GetVideoIndex(AVFormatContext* avFormatContext) { + if (avFormatContext == nullptr) { // verify input pointer + return kInvalidVideoIndex; + } + + // get video index in streams + for (uint32_t i = 0; i < avFormatContext->nb_streams; i++) { + if (avFormatContext->streams[i]->codecpar->codec_type + == AVMEDIA_TYPE_VIDEO) { // check is media type is video + return i; + } + } + + return kInvalidVideoIndex; +} + +void FFmpegDecoder::InitVideoStreamFilter(const AVBitStreamFilter*& videoFilter) { + if (videoType_ == AV_CODEC_ID_H264) { // check video type is h264 + videoFilter = av_bsf_get_by_name("h264_mp4toannexb"); + } + else { // the video type is h265 + videoFilter = av_bsf_get_by_name("hevc_mp4toannexb"); + } +} + +void FFmpegDecoder::SetDictForRtsp(AVDictionary*& avdic) { + ATLAS_LOG_INFO("Set parameters for %s", streamName_.c_str()); + + av_dict_set(&avdic, kRtspTransport.c_str(), rtspTransport_.c_str(), kNoFlag); + av_dict_set(&avdic, kBufferSize.c_str(), kMaxBufferSize.c_str(), kNoFlag); + av_dict_set(&avdic, kMaxDelayStr.c_str(), kMaxDelayValue.c_str(), kNoFlag); + av_dict_set(&avdic, kTimeoutStr.c_str(), kTimeoutValue.c_str(), kNoFlag); + av_dict_set(&avdic, kReorderQueueSize.c_str(), + kReorderQueueSizeValue.c_str(), kNoFlag); + av_dict_set(&avdic, kPktSize.c_str(), kPktSizeValue.c_str(), kNoFlag); + ATLAS_LOG_INFO("Set parameters for %s end", streamName_.c_str()); +} + +bool FFmpegDecoder::OpenVideo(AVFormatContext*& avFormatContext) { + bool ret = true; + AVDictionary* avdic = nullptr; + + av_log_set_level(AV_LOG_DEBUG); + + ATLAS_LOG_INFO("Open video %s ...", streamName_.c_str()); + SetDictForRtsp(avdic); + int openRet = avformat_open_input(&avFormatContext, + streamName_.c_str(), nullptr, + &avdic); + if (openRet < 0) { // check open video result + char buf_error[kErrorBufferSize]; + av_strerror(openRet, buf_error, kErrorBufferSize); + + ATLAS_LOG_ERROR("Could not open video:%s, return :%d, error info:%s", + streamName_.c_str(), openRet, buf_error); + ret = false; + } + + if (avdic != nullptr) { // free AVDictionary + av_dict_free(&avdic); + } + + return ret; +} + +bool FFmpegDecoder::InitVideoParams(int videoIndex, + AVFormatContext* avFormatContext, + AVBSFContext*& bsfCtx) { + const AVBitStreamFilter* videoFilter; + InitVideoStreamFilter(videoFilter); + if (videoFilter == nullptr) { // check video fileter is nullptr + ATLAS_LOG_ERROR("Unkonw bitstream filter, videoFilter is nullptr!"); + return false; + } + + // checke alloc bsf context result + if (av_bsf_alloc(videoFilter, &bsfCtx) < 0) { + ATLAS_LOG_ERROR("Fail to call av_bsf_alloc!"); + return false; + } + + // check copy parameters result + if (avcodec_parameters_copy(bsfCtx->par_in, + avFormatContext->streams[videoIndex]->codecpar) < 0) { + ATLAS_LOG_ERROR("Fail to call avcodec_parameters_copy!"); + return false; + } + + bsfCtx->time_base_in = avFormatContext->streams[videoIndex]->time_base; + + // check initialize bsf contextreult + if (av_bsf_init(bsfCtx) < 0) { + ATLAS_LOG_ERROR("Fail to call av_bsf_init!"); + return false; + } + + return true; +} + +void FFmpegDecoder::Decode(FrameProcessCallBack callback, + void *callbackParam) { + ATLAS_LOG_INFO("Start ffmpeg decode video %s ...", streamName_.c_str()); + avformat_network_init(); // init network + + AVFormatContext* avFormatContext = avformat_alloc_context(); + + // check open video result + if (!OpenVideo(avFormatContext)) { + return; + } + + int videoIndex = GetVideoIndex(avFormatContext); + if (videoIndex == kInvalidVideoIndex) { // check video index is valid + ATLAS_LOG_ERROR("Rtsp %s index is -1", streamName_.c_str()); + return; + } + + AVBSFContext* bsfCtx = nullptr; + // check initialize video parameters result + if (!InitVideoParams(videoIndex, avFormatContext, bsfCtx)) { + return; + } + + ATLAS_LOG_INFO("Start decode frame of video %s ...", streamName_.c_str()); + + AVPacket avPacket; + int processOk = true; + // loop to get every frame from video stream + while ((av_read_frame(avFormatContext, &avPacket) == 0) && processOk && !isStop_) { + if (avPacket.stream_index == videoIndex) { // check current stream is video + // send video packet to ffmpeg + if (av_bsf_send_packet(bsfCtx, &avPacket)) { + ATLAS_LOG_ERROR("Fail to call av_bsf_send_packet, channel id:%s", + streamName_.c_str()); + } + + // receive single frame from ffmpeg + while ((av_bsf_receive_packet(bsfCtx, &avPacket) == 0) && !isStop_) { + int ret = callback(callbackParam, avPacket.data, avPacket.size); + if (ret != 0) { + processOk = false; + break; + } + } + } + av_packet_unref(&avPacket); + } + + av_bsf_free(&bsfCtx); // free AVBSFContext pointer + avformat_close_input(&avFormatContext); // close input video + + isFinished_ = true; + ATLAS_LOG_INFO("Ffmpeg decoder %s finished", streamName_.c_str()); +} + +void FFmpegDecoder::GetVideoInfo() { + avformat_network_init(); // init network + AVFormatContext* avFormatContext = avformat_alloc_context(); + bool ret = OpenVideo(avFormatContext); + if (ret == false) { + ATLAS_LOG_ERROR("Open %s failed", streamName_.c_str()); + return; + } + + if (avformat_find_stream_info(avFormatContext,NULL)<0) { + ATLAS_LOG_ERROR("Get stream info of %s failed", streamName_.c_str()); + return; + } + + int videoIndex = GetVideoIndex(avFormatContext); + if (videoIndex == kInvalidVideoIndex) { // check video index is valid + ATLAS_LOG_ERROR("Video index is %d, current media stream has no " + "video info:%s", + kInvalidVideoIndex, streamName_.c_str()); + + avformat_close_input(&avFormatContext); + return; + } + + AVStream* inStream = avFormatContext->streams[videoIndex]; + + frameWidth_ = inStream->codecpar->width; + frameHeight_ = inStream->codecpar->height; + if (inStream->avg_frame_rate.den) { + fps_ = inStream->avg_frame_rate.num / inStream->avg_frame_rate.den; + } + else { + fps_ = kDefaultFps; + } + + videoType_ = inStream->codecpar->codec_id; + profile_ = inStream->codecpar->profile; + + avformat_close_input(&avFormatContext); + + ATLAS_LOG_INFO("Video %s, type %d, profile %d, width:%d, height:%d, fps:%d", + streamName_.c_str(), videoType_, profile_, frameWidth_, frameHeight_, fps_); + return; +} + + + + + + + + + + diff --git a/cplusplus/common/atlasutil/src/ffmpeg_decoder.h b/cplusplus/common/atlasutil/src/ffmpeg_decoder.h new file mode 100644 index 0000000..486d9ae --- /dev/null +++ b/cplusplus/common/atlasutil/src/ffmpeg_decoder.h @@ -0,0 +1,94 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef VIDEO_FRAME_DECODE_H_ +#define VIDEO_fRAME_DECODE_H_ + +#include +#include +#include + +#include +#include +#include +#include +#include + +extern "C" { +#include +#include +} + +typedef int (*FrameProcessCallBack)(void* callback_param, void *frame_data, + int frame_size); + +class FFmpegDecoder{ +public: + FFmpegDecoder(const std::string& name); + ~FFmpegDecoder(){} + + void Decode(FrameProcessCallBack callback_func, void *callback_param); + int GetFrameWidth() { return frameWidth_; } + int GetFrameHeight() { return frameHeight_; } + int GetVideoType() { return videoType_; } + int GetFps() { return fps_; } + int IsFinished() { return isFinished_; }; + int GetProfile() { return profile_; } + + void SetTransport(const std::string& transportType); + void StopDecode(){ isStop_ = true; } + +private: + int GetVideoIndex(AVFormatContext* av_format_context); + void GetVideoInfo(); + void InitVideoStreamFilter(const AVBitStreamFilter* &video_filter); + bool OpenVideo(AVFormatContext*& av_format_context); + void SetDictForRtsp(AVDictionary* &avdic); + bool InitVideoParams(int videoIndex, + AVFormatContext* av_format_context, + AVBSFContext* &bsf_ctx); + +private: + bool isFinished_; + int frameWidth_; + int frameHeight_; + int videoType_; + int profile_; + int fps_; + std::string streamName_; + std::string rtspTransport_; + + bool isStop_; +}; + +#endif /* VIDEO_DECODE_H_ */ diff --git a/cplusplus/common/atlasutil/src/parse_config.cpp b/cplusplus/common/atlasutil/src/parse_config.cpp new file mode 100644 index 0000000..2a5e668 --- /dev/null +++ b/cplusplus/common/atlasutil/src/parse_config.cpp @@ -0,0 +1,104 @@ +#include "parse_config.h" + +#include +#include +#include +#include + +using namespace std; + +#define COMMENT_CHAR '#' +#define EQUALS_CHAR '=' +#define BLANK_SPACE_CHAR ' ' +#define TABLE_CHAR '\t' + +bool IsSpace(char c) +{ + return (BLANK_SPACE_CHAR == c || TABLE_CHAR == c); +} + +void Trim(string& str) +{ + if (str.empty()) { + return; + } + uint32_t i, start_pos, end_pos; + for (i = 0; i < str.size(); ++i) { + if (!IsSpace(str[i])) { + break; + } + } + if (i == str.size()) { // is all blank space + str = ""; + return; + } + + start_pos = i; + + for (i = str.size() - 1; i >= 0; --i) { + if (!IsSpace(str[i])) { + break; + } + } + end_pos = i; + + str = str.substr(start_pos, end_pos - start_pos + 1); +} + +bool AnalyseLine(const string & line, string & key, string & value) +{ + if (line.empty()) { + return false; + } + + int start_pos = 0; + int end_pos = line.size() - 1; + int pos = 0; + if ((pos = line.find(COMMENT_CHAR)) != -1) { + if (0 == pos) { //the first charactor is # + return false; + } + end_pos = pos - 1; + } + string new_line = line.substr(start_pos, start_pos + 1 - end_pos); // delete comment + + if ((pos = new_line.find(EQUALS_CHAR)) == -1) + return false; // has no = + + key = new_line.substr(0, pos); + value = new_line.substr(pos + 1, end_pos + 1- (pos + 1)); + + Trim(key); + if (key.empty()) { + return false; + } + Trim(value); + return true; +} + +bool ReadConfig(map& config, const char* configFile) +{ + config.clear(); + ifstream infile(configFile); + if (!infile) { + cout << "file open error" << endl; + return false; + } + string line, key, value; + while (getline(infile, line)) { + if (AnalyseLine(line, key, value)) { + config[key] = value; + } + } + + infile.close(); + return true; +} + +void PrintConfig(const map& config) +{ + map::const_iterator mIter = config.begin(); + for (; mIter != config.end(); ++mIter) { + cout << mIter->first << "=" << mIter->second << endl; + } +} diff --git a/cplusplus/common/atlasutil/src/vdec_process.cpp b/cplusplus/common/atlasutil/src/vdec_process.cpp new file mode 100644 index 0000000..30047c3 --- /dev/null +++ b/cplusplus/common/atlasutil/src/vdec_process.cpp @@ -0,0 +1,339 @@ +/** +* @file vdec_process.cpp +* +* Copyright (C) 2020. Huawei Technologies Co., Ltd. All rights reserved. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ +#include "atlas_utils.h" +#include "vdec_process.h" + +using namespace std; + +namespace { + const uint32_t kFrameWidthMax = 4096; + const uint32_t kFrameHeightMax = 4096; +} + +bool g_ReportExit = false; + +VdecProcess::VdecProcess(int channelId, uint32_t width, uint32_t height, + int type, aclvdecCallback callback, uint32_t outFormat) +:channelId_(channelId) +,format_(outFormat) +,enType_(type) +,frameWidth_(width) +,frameHeight_(height) +,callback_(callback) +,isExit_(false) +,isReleased_(false){ + alignWidth_ = ALIGN_UP16(frameWidth_); + alignHeight_ = ALIGN_UP2(frameHeight_); + outputPicSize_ = YUV420SP_SIZE(alignWidth_, alignHeight_); + + vdecChannelDesc_ = nullptr; + inputStreamDesc_ = nullptr; + outputPicDesc_ = nullptr; + outputPicBuf_ = nullptr; + + ATLAS_LOG_INFO("VDEC width %d, height %d", frameWidth_, frameHeight_); +} + +VdecProcess::~VdecProcess(){ + DestroyResource(); +} + +void VdecProcess::DestroyResource(){ + if (isReleased_) return; + + aclError ret; + if (vdecChannelDesc_ != nullptr) { + ret = aclvdecDestroyChannel(vdecChannelDesc_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Vdec destroy channel failed, errorno: %d", ret); + } + aclvdecDestroyChannelDesc(vdecChannelDesc_); + vdecChannelDesc_ = nullptr; + } + + UnsubscribReportThread(); + + if (stream_ != nullptr) { + ret = aclrtDestroyStream(stream_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Vdec destroy stream failed"); + } + stream_ = nullptr; + } + + isReleased_ = true; +} + +void* VdecProcess::SubscribeReportThreadFunc(void *arg) { + ATLAS_LOG_INFO("Start vdec subscribe thread..."); + + // Notice: create context for this thread + int deviceId = 0; + aclrtContext context = nullptr; + aclError ret = aclrtCreateContext(&context, deviceId); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Vdec subscribe thread create" + " context failed, errorno:%d.", ret); + return (void*)ATLAS_ERROR_CREATE_ACL_CONTEXT; + } + + VdecProcess* vdec = (VdecProcess *)arg; + + while (!vdec->IsExit()) { + // Notice: timeout 1000ms + aclrtProcessReport(1000); + } + + ret = aclrtDestroyContext(context); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Vdec subscribe thread destroy" + " context failed, errorno:%d.", ret); + } + + ATLAS_LOG_INFO("Vdec subscribe thread exit!"); + + return (void*)ATLAS_OK; +} + +void VdecProcess::UnsubscribReportThread() { + if ((subscribeThreadId_ == 0) || (stream_ == nullptr)) return; + + (void)aclrtUnSubscribeReport(static_cast(subscribeThreadId_), + stream_); + // destory thread + isExit_ = true; + + void *res = nullptr; + int joinThreadErr = pthread_join(subscribeThreadId_, &res); + if (joinThreadErr) { + ATLAS_LOG_ERROR("Join thread failed, threadId = %lu, err = %d", + subscribeThreadId_, joinThreadErr); + } else { + if ((uint64_t)res != 0) { + ATLAS_LOG_ERROR("thread run failed. ret is %lu.", (uint64_t)res); + } + } + ATLAS_LOG_INFO("Destory report thread success."); +} + +AtlasError VdecProcess::Init() { + ATLAS_LOG_INFO("Vdec process init start..."); + + aclError aclRet = aclrtCreateStream(&stream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Vdec create stream failed, errorno:%d", aclRet); + return ATLAS_ERROR_CREATE_STREAM; + } + ATLAS_LOG_INFO("Vdec create stream ok"); + + int ret = pthread_create(&subscribeThreadId_, nullptr, + SubscribeReportThreadFunc, (void *)this); + if (ret) { + ATLAS_LOG_ERROR("Start vdec subscribe thread failed, return:%d", ret); + return ATLAS_ERROR_CREATE_THREAD; + } + (void)aclrtSubscribeReport(static_cast(subscribeThreadId_), + stream_); + + ret = CreateVdecChannelDesc(); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Create vdec channel failed"); + return ret; + } + + return ATLAS_OK; +} + +AtlasError VdecProcess::CreateVdecChannelDesc() { + vdecChannelDesc_ = aclvdecCreateChannelDesc(); + if (vdecChannelDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create vdec channel desc failed"); + return ATLAS_ERROR_CREATE_DVPP_CHANNEL_DESC; + } + + // channelId: 0-15 + aclError ret = aclvdecSetChannelDescChannelId(vdecChannelDesc_, + channelId_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set vdec channel id to %d failed, errorno:%d", + channelId_, ret); + return ATLAS_ERROR_SET_VDEC_CHANNEL_ID; + } + + ret = aclvdecSetChannelDescThreadId(vdecChannelDesc_, subscribeThreadId_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set vdec channel thread id failed, errorno:%d", ret); + return ATLAS_ERROR_SET_VDEC_CHANNEL_THREAD_ID; + } + + // callback func + ret = aclvdecSetChannelDescCallback(vdecChannelDesc_, callback_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set vdec channel callback failed, errorno:%d", ret); + return ATLAS_ERROR_SET_VDEC_CALLBACK; + } + + ret = aclvdecSetChannelDescEnType(vdecChannelDesc_, + static_cast(enType_)); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set vdec channel entype failed, errorno:%d", ret); + return ATLAS_ERROR_SET_VDEC_ENTYPE; + } + + ret = aclvdecSetChannelDescOutPicFormat(vdecChannelDesc_, + static_cast(format_)); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set vdec channel pic format failed, errorno:%d", ret); + return ATLAS_ERROR_SET_VDEC_PIC_FORMAT; + } + + // create vdec channel + ATLAS_LOG_INFO("Start create vdec channel by desc..."); + ret = aclvdecCreateChannel(vdecChannelDesc_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("fail to create vdec channel"); + return ATLAS_ERROR_CREATE_VDEC_CHANNEL; + } + ATLAS_LOG_INFO("Create vdec channel ok"); + + return ATLAS_OK; +} + +AtlasError VdecProcess::CreateInputStreamDesc(shared_ptr frameData) +{ + inputStreamDesc_ = acldvppCreateStreamDesc(); + if (inputStreamDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create input stream desc failed"); + return ATLAS_ERROR_CREATE_STREAM_DESC; + } + + aclError ret; + //如果是最后一帧,则给dvpp vdec送一个结束帧 + if (frameData->isFinished) { + ret = acldvppSetStreamDescEos(inputStreamDesc_, 1); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set EOS to input stream desc failed, errorno:%d", ret); + return ATLAS_ERROR_SET_STREAM_DESC_EOS; + } + return ATLAS_OK; + } + + ret = acldvppSetStreamDescData(inputStreamDesc_, frameData->data); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set input stream data failed, errorno:%d", ret); + return ATLAS_ERROR_SET_STREAM_DESC_DATA; + } + + // set size for dvpp stream desc + ret = acldvppSetStreamDescSize(inputStreamDesc_, frameData->size); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set input stream size failed, errorno:%d", ret); + return ATLAS_ERROR_SET_STREAM_DESC_SIZE; + } + + acldvppSetStreamDescTimestamp(inputStreamDesc_, frameData->frameId); + + return ATLAS_OK; +} + +AtlasError VdecProcess::CreateOutputPicDesc(size_t size) +{ + // Malloc output device memory + aclError ret = acldvppMalloc(&outputPicBuf_, size); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Malloc vdec output buffer failed when create " + "vdec output desc, errorno:%d", ret); + return ATLAS_ERROR_MALLOC_DVPP; + } + + outputPicDesc_ = acldvppCreatePicDesc(); + if (outputPicDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create vdec output pic desc failed"); + return ATLAS_ERROR_CREATE_PIC_DESC; + } + + ret = acldvppSetPicDescData(outputPicDesc_, outputPicBuf_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set vdec output pic desc data failed, errorno:%d", ret); + return ATLAS_ERROR_SET_PIC_DESC_DATA; + } + + ret = acldvppSetPicDescSize(outputPicDesc_, size); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set vdec output pic size failed, errorno:%d", ret); + return ATLAS_ERROR_SET_PIC_DESC_SIZE; + } + + ret = acldvppSetPicDescFormat(outputPicDesc_, + static_cast(format_)); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set vdec output pic format failed, errorno:%d", ret); + return ATLAS_ERROR_SET_PIC_DESC_FORMAT; + } + + return ATLAS_OK; +} + +AtlasError VdecProcess::Process(shared_ptr frameData, void* userData) +{ + //创建输入desc + AtlasError atlRet = CreateInputStreamDesc(frameData); + if (atlRet != ATLAS_OK) { + ATLAS_LOG_ERROR("Create stream desc failed"); + return atlRet; + } + //创建输出desc + atlRet = CreateOutputPicDesc(outputPicSize_); + if (atlRet != ATLAS_OK) { + ATLAS_LOG_ERROR("Create pic desc failed"); + return atlRet; + } + //将数据送到dvpp vdec解码,解码后dvpp vdec会调用注册的回调函数 + //(VideoDecode::DvppVdecCallback)处理 + aclError ret = aclvdecSendFrame(vdecChannelDesc_, inputStreamDesc_, + outputPicDesc_, nullptr, userData); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Send frame to vdec failed, errorno:%d", ret); + return ATLAS_ERROR_VDEC_SEND_FRAME; + } + + return ATLAS_OK; +} + +AtlasError VdecProcess::SetFormat(uint32_t format) { + if ((format != PIXEL_FORMAT_YUV_SEMIPLANAR_420) || + (format != PIXEL_FORMAT_YVU_SEMIPLANAR_420)) { + ATLAS_LOG_ERROR("Set video decode output image format to %d failed, " + "only support %d(YUV420SP NV12) and %d(YUV420SP NV21)", + format, + (int)PIXEL_FORMAT_YUV_SEMIPLANAR_420, + (int)PIXEL_FORMAT_YVU_SEMIPLANAR_420); + return ATLAS_ERROR_VDEC_FORMAT_INVALID; + } + + format_ = format; + ATLAS_LOG_INFO("Set video decode output image format to %d ok", format); + + return ATLAS_OK; +} + +AtlasError VdecProcess::VideoParamCheck() { + if (((frameWidth_ == 0) || (frameWidth_ > kFrameWidthMax)) || + ((frameHeight_ == 0) || (frameHeight_ > kFrameHeightMax)) || + ((format_ != PIXEL_FORMAT_YUV_SEMIPLANAR_420) && + (format_ != PIXEL_FORMAT_YVU_SEMIPLANAR_420)) || + (enType_ > (uint32_t)H264_HIGH_LEVEL)) { + return ATLAS_ERROR_VDEC_INVALID_PARAM; + } + + return ATLAS_OK; +} + + diff --git a/cplusplus/common/atlasutil/src/vdec_process.h b/cplusplus/common/atlasutil/src/vdec_process.h new file mode 100644 index 0000000..ba5abc8 --- /dev/null +++ b/cplusplus/common/atlasutil/src/vdec_process.h @@ -0,0 +1,75 @@ +/** +* @file vdec_process.h +* +* Copyright (C) 2020. Huawei Technologies Co., Ltd. All rights reserved. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ +#ifndef _VDEC_PROCESS_H_ +#define _VDEC_PROCESS_H_ + +#include +#include +#include "acl/acl.h" +#include "acl/ops/acl_dvpp.h" + +class VdecProcess { +public: + VdecProcess(int channel, uint32_t width, uint32_t height, + int type, aclvdecCallback callback, + uint32_t outFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420); + ~VdecProcess(); + + static void* SubscribeReportThreadFunc(void *arg); + + AtlasError Init(); + void DestroyResource(); + AtlasError Process(std::shared_ptr frameData, void* userData); + AtlasError SetFormat(uint32_t format); + AtlasError VideoParamCheck(); + bool IsExit() { return isExit_; } + +private: + AtlasError CreateVdecChannelDesc(); + AtlasError CreateInputStreamDesc(std::shared_ptr frame); + AtlasError CreateOutputPicDesc(size_t size); + void UnsubscribReportThread(); + +private: + int channelId_; + + /* 1:YUV420 semi-planner(nv12) + 2:YVU420 semi-planner(nv21) + */ + uint32_t format_; + + /* 0:H265 main level + * 1:H264 baseline level + * 2:H264 main level + * 3:H264 high level + */ + uint32_t enType_; + + uint32_t frameWidth_; + uint32_t frameHeight_; + uint32_t alignWidth_; + uint32_t alignHeight_; + uint32_t outputPicSize_; + void *outputPicBuf_; + aclvdecCallback callback_; + + aclrtStream stream_; + + aclvdecChannelDesc *vdecChannelDesc_; + acldvppStreamDesc *inputStreamDesc_; + acldvppPicDesc *outputPicDesc_; + + pthread_t subscribeThreadId_; + bool isExit_; + bool isReleased_; + +}; + +#endif diff --git a/cplusplus/common/atlasutil/src/venc_process.cpp b/cplusplus/common/atlasutil/src/venc_process.cpp new file mode 100644 index 0000000..fb6066c --- /dev/null +++ b/cplusplus/common/atlasutil/src/venc_process.cpp @@ -0,0 +1,409 @@ +/** +* @file venc_process.cpp +* +* Copyright (C) 2020. Huawei Technologies Co., Ltd. All rights reserved. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +*/ +#include +#include +#include +#include + +#include "venc_process.h" + +using namespace std; +namespace { + uint32_t kVencQueueSize = 256; + uint32_t kImageEnQueueRetryTimes = 3; + uint32_t kEnqueueWait = 10000; + uint32_t kOutqueueWait = 10000; + uint32_t kAsyncWait = 10000; + bool g_RunFlag = true; +} + +VencProcess::VencProcess(VencConfig& vencInfo): +vencInfo_(vencInfo), +status_(STATUS_VENC_INIT), +vencProc_(nullptr), +frameImageQueue_(kVencQueueSize){ +} + +AtlasError VencProcess::Init() { + if (status_ != STATUS_VENC_INIT) { + return ATLAS_ERROR; + } + + if (vencInfo_.context == nullptr) { + aclError ret = aclrtGetCurrentContext(&(vencInfo_.context)); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Get current context failed"); + return ATLAS_ERROR_GET_ACL_CONTEXT; + } + } + + thread asyncVencTh = thread(VencProcess::AsyncVencThreadEntry, (void*)this); + asyncVencTh.detach(); + + while(status_ == STATUS_VENC_INIT) { + usleep(kAsyncWait); + } + + return (status_ == STATUS_VENC_WORK)? ATLAS_OK : ATLAS_ERROR_VENC_STATUS; +} + +void VencProcess::AsyncVencThreadEntry(void* arg) { + VencProcess* thisPtr = (VencProcess*)arg; + DvppVenc venc(thisPtr->vencInfo_); + + AtlasError ret = venc.Init(); + if (ret != ATLAS_OK) { + thisPtr->SetStatus(STATUS_VENC_ERROR); + ATLAS_LOG_ERROR("Dvpp venc init acl resource failed, error %d", ret); + return; + } + + thisPtr->SetStatus(STATUS_VENC_WORK); + while(thisPtr->GetStatus() == STATUS_VENC_WORK) { + shared_ptr image = thisPtr->GetEncodeImage(); + if (image == nullptr) { + usleep(kOutqueueWait); + continue; + } + + ret = venc.Process(*image.get()); + if (ret != ATLAS_OK) { + thisPtr->SetStatus(STATUS_VENC_ERROR); + ATLAS_LOG_ERROR("Dvpp venc image failed, error %d", ret); + break; + } + } + + venc.Finish(); + thisPtr->SetStatus(STATUS_VENC_EXIT); +} + +AtlasError VencProcess::Process(ImageData& image) { + if (status_ != STATUS_VENC_WORK) { + ATLAS_LOG_ERROR("The venc(status %d) is not working", status_); + return ATLAS_ERROR_VENC_STATUS; + } + + shared_ptr imagePtr = make_shared(); + imagePtr->format = image.format; + imagePtr->width = image.width; + imagePtr->height = image.height; + imagePtr->alignWidth = image.alignWidth; + imagePtr->alignHeight = image.alignHeight; + imagePtr->size = image.size; + imagePtr->data = image.data; + + for (uint32_t count = 0; count < kImageEnQueueRetryTimes; count++) { + if (frameImageQueue_.Push(imagePtr)) { + return ATLAS_OK; + } + usleep(kEnqueueWait); + } + ATLAS_LOG_ERROR("Venc(%s) lost image for queue full", vencInfo_.outFile.c_str()); + + return ATLAS_ERROR_VENC_QUEUE_FULL; +} + +shared_ptr VencProcess::GetEncodeImage() { + shared_ptr image = frameImageQueue_.Pop(); + return image; +} + +DvppVenc::DvppVenc(VencConfig& vencInfo): +vencInfo_(vencInfo), threadId_(0), +vencChannelDesc_(nullptr), vencFrameConfig_(nullptr), +inputPicDesc_(nullptr), vencStream_(nullptr), +outFp_(nullptr), isFinished_(false){ +} + +DvppVenc::~DvppVenc(){ + DestroyResource(); +} + +void DvppVenc::Callback(acldvppPicDesc *input, + acldvppStreamDesc *output, void *userData) { + void* data = acldvppGetStreamDescData(output); + uint32_t retCode = acldvppGetStreamDescRetCode(output); + if (retCode == 0) { + //encode success, then process output pic + uint32_t size = acldvppGetStreamDescSize(output); + + DvppVenc* venc = (DvppVenc*)userData; + AtlasError ret = venc->SaveVencFile(data, size); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Save venc file failed, error %d", ret); + } else { + ATLAS_LOG_INFO("success to callback, stream size:%u", size); + } + } else { + ATLAS_LOG_ERROR("venc encode frame failed, ret = %u.", retCode); + } + + acldvppDestroyPicDesc(input); +} + +AtlasError DvppVenc::SaveVencFile(void* vencData, uint32_t size) { + AtlasError atlRet = ATLAS_OK; + + void* data = vencData; + if (vencInfo_.runMode == ACL_HOST) { + data = CopyDataToHost(vencData, size, vencInfo_.runMode, MEMORY_NORMAL); + } + + size_t ret = fwrite(data, 1, size, outFp_); + if (ret != size) { + ATLAS_LOG_ERROR("Save venc file %s failed, need write %u bytes, " + "but only write %zu bytes, error: %s", + vencInfo_.outFile.c_str(), size, ret, strerror(errno)); + atlRet = ATLAS_ERROR_WRITE_FILE; + } else { + fflush(outFp_); + } + + if (vencInfo_.runMode == ACL_HOST) { + delete[]((uint8_t *)data); + } + + return atlRet; +} + +AtlasError DvppVenc::Init() { + // create process callback thread + int ret = pthread_create(&threadId_, nullptr, + &DvppVenc::SubscribleThreadFunc, nullptr); + if (ret != 0) { + ATLAS_LOG_ERROR("Create venc subscrible thread failed, error %d", ret); + return ATLAS_ERROR_CREATE_THREAD; + } + + outFp_ = fopen(vencInfo_.outFile.c_str(), "wb+"); + if (outFp_ == nullptr) { + ATLAS_LOG_ERROR("Open file %s failed, error %s", + vencInfo_.outFile.c_str(), strerror(errno)); + return ATLAS_ERROR_OPEN_FILE; + } + + return InitResource(); +} + +void* DvppVenc::SubscribleThreadFunc(void *arg) +{ + // Notice: create context for this thread + aclrtContext context = nullptr; + aclError ret = aclrtCreateContext(&context, 0); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Create context failed, error %d.", ret); + return ((void*)(-1)); + } + + while (g_RunFlag) { + // Notice: timeout 1000ms + (void)aclrtProcessReport(1000); + } + + ret = aclrtDestroyContext(context); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("aclrtDestroyContext failed, ret=%d.", ret); + } + + return (void*)0; +} + +AtlasError DvppVenc::InitResource() +{ + aclError aclRet = aclrtSetCurrentContext(vencInfo_.context); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set context for dvpp venc failed, error %d", aclRet); + return ATLAS_ERROR_SET_ACL_CONTEXT; + } + + AtlasError ret = CreateVencChannel(); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Create venc channel failed, error %d", ret); + return ret; + } + + aclRet = aclrtCreateStream(&vencStream_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Create venc stream failed, error %d", aclRet); + return ATLAS_ERROR_CREATE_STREAM; + } + + aclRet = aclrtSubscribeReport(threadId_, vencStream_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Venc subscrible report failed, error %d", aclRet); + return ATLAS_ERROR_SUBSCRIBE_REPORT; + } + + ret = CreateFrameConfig(); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Create venc frame config failed, error %d", ret); + return ret; + } + + ATLAS_LOG_INFO("venc init resource success"); + return ATLAS_OK; +} + +AtlasError DvppVenc::CreateVencChannel() { + // create vdec channelDesc + vencChannelDesc_ = aclvencCreateChannelDesc(); + if (vencChannelDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create venc channel desc failed"); + return ATLAS_ERROR_CREATE_VENC_CHAN_DESC; + } + + aclvencSetChannelDescThreadId(vencChannelDesc_, threadId_); + aclvencSetChannelDescCallback(vencChannelDesc_, &DvppVenc::Callback); + aclvencSetChannelDescEnType(vencChannelDesc_, vencInfo_.enType); + aclvencSetChannelDescPicFormat(vencChannelDesc_, vencInfo_.format); + aclvencSetChannelDescPicWidth(vencChannelDesc_, vencInfo_.maxWidth); + aclvencSetChannelDescPicHeight(vencChannelDesc_, vencInfo_.maxHeight); + aclvencSetChannelDescKeyFrameInterval(vencChannelDesc_, 16); + + aclError ret = aclvencCreateChannel(vencChannelDesc_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("fail to create venc channel"); + return ATLAS_ERROR_CREATE_VENC_CHAN; + } + return ATLAS_OK; +} + +AtlasError DvppVenc::CreateFrameConfig() { + vencFrameConfig_ = aclvencCreateFrameConfig(); + if (vencFrameConfig_ == nullptr) { + ATLAS_LOG_ERROR("Create frame config"); + return ATLAS_ERROR_VENC_CREATE_FRAME_CONFIG; + } + + AtlasError ret = SetFrameConfig(0, 1); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Set frame config failed, error %d", ret); + return ret; + } + + return ATLAS_OK; +} + +AtlasError DvppVenc::SetFrameConfig(uint8_t eos, uint8_t forceIFrame) +{ + // set eos + aclError ret = aclvencSetFrameConfigEos(vencFrameConfig_, eos); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("fail to set eos, ret = %d", ret); + return ATLAS_ERROR_VENC_SET_EOS; + } + + ret = aclvencSetFrameConfigForceIFrame(vencFrameConfig_, forceIFrame); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("fail to set venc ForceIFrame"); + return ATLAS_ERROR_VENC_SET_IF_FRAME; + } + + return ATLAS_OK; +} + +AtlasError DvppVenc::Process(ImageData& image) +{ + // create picture desc + AtlasError ret = CreateInputPicDesc(image); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("fail to create picture description"); + return ret; + } + + // send frame + acldvppStreamDesc *outputStreamDesc = nullptr; + + ret = aclvencSendFrame(vencChannelDesc_, inputPicDesc_, + static_cast(outputStreamDesc), vencFrameConfig_, (void *)this); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("send venc frame failed, error %d", ret); + return ATLAS_ERROR_VENC_SEND_FRAME; + } + + return ATLAS_OK; +} + +AtlasError DvppVenc::CreateInputPicDesc(ImageData& image) +{ + inputPicDesc_ = acldvppCreatePicDesc(); + if (inputPicDesc_ == nullptr) { + ATLAS_LOG_ERROR("Create input pic desc failed"); + return ATLAS_ERROR_CREATE_PIC_DESC; + } + + acldvppSetPicDescFormat(inputPicDesc_, vencInfo_.format); + acldvppSetPicDescWidth(inputPicDesc_, image.width); + acldvppSetPicDescHeight(inputPicDesc_, image.height); + acldvppSetPicDescWidthStride(inputPicDesc_, ALIGN_UP16(image.width)); + acldvppSetPicDescHeightStride(inputPicDesc_, ALIGN_UP2(image.height)); + acldvppSetPicDescData(inputPicDesc_, image.data.get()); + acldvppSetPicDescSize(inputPicDesc_, image.size); + + return ATLAS_OK; +} + +void DvppVenc::Finish() { + if (isFinished_) { + return; + } + + // set frame config, eos frame + AtlasError ret = SetFrameConfig(1, 0); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Set eos frame config failed, error %d", ret); + return; + } + + // send eos frame + ret = aclvencSendFrame(vencChannelDesc_, nullptr, + nullptr, vencFrameConfig_, nullptr); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("fail to send eos frame, ret=%u", ret); + return; + } + + fclose(outFp_); + outFp_ = nullptr; + isFinished_ = true; + ATLAS_LOG_INFO("venc process success"); + + return; +} + +void DvppVenc::DestroyResource() +{ + Finish(); + + if (vencChannelDesc_ != nullptr) { + (void)aclvencDestroyChannel(vencChannelDesc_); + (void)aclvencDestroyChannelDesc(vencChannelDesc_); + vencChannelDesc_ = nullptr; + } + + if (inputPicDesc_ != nullptr) { + (void)acldvppDestroyPicDesc(inputPicDesc_); + inputPicDesc_ = nullptr; + } + + if (vencStream_ != nullptr) { + aclError ret = aclrtDestroyStream(vencStream_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Vdec destroy stream failed, error %d", ret); + } + vencStream_ = nullptr; + } + + if (vencFrameConfig_ != nullptr) { + (void)aclvencDestroyFrameConfig(vencFrameConfig_); + vencFrameConfig_ = nullptr; + } +} diff --git a/cplusplus/common/atlasutil/src/video_decode.cpp b/cplusplus/common/atlasutil/src/video_decode.cpp new file mode 100644 index 0000000..9ea4a50 --- /dev/null +++ b/cplusplus/common/atlasutil/src/video_decode.cpp @@ -0,0 +1,580 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "atlas_utils.h" +#include "video_decode.h" + +using namespace std; + +namespace { + const int64_t kUsec = 1000000; + const uint32_t kDecodeFrameQueueSize = 256; + const int kDecodeQueueOpWait = 10000; //每次等待10毫秒 + const int kFrameEnQueueRetryTimes = 1000;//为了防止丢帧,ffmpeg解码得到的h26x入队最多等待 100秒 + const int kQueueOpRetryTimes = 1000; + const int kOutputJamWait = 10000; + const int kInvalidTpye = -1; + const int kWaitDecodeFinishInterval = 1000; + + const int kDefaultFps = 1; + const int kReadSlow = 2; + + ChannelIdGenerator channelIdGenerator; +} + +VideoDecode::VideoDecode(const std::string& videoName, aclrtContext context) : +context_(context), streamType_(STREAM_VIDEO), channelId_(INVALID_CHANNEL_ID), +frameId_(0), finFrameCnt_(0), status_(DECODE_UNINIT), streamName_(videoName), +streamFormat_(H264_MAIN_LEVEL), lastDecodeTime_(0), fpsInterval_(0), +ffmpegDecoder_(nullptr), dvppVdec_(nullptr), +frameImageQueue_(kDecodeFrameQueueSize), isStop_(false), isReleased_(false), +isJam_(false) { + if (IsRtspAddr(videoName)) { + streamType_ = STREAM_RTSP; + } +} + +VideoDecode::~VideoDecode() { + DestroyResource(); +} + +void VideoDecode::DestroyResource() { + if (isReleased_) return; + //1. stop ffmpeg + isStop_ = true; + ffmpegDecoder_->StopDecode(); + while ((status_ >= DECODE_START) && (status_ < DECODE_FFMPEG_FINISHED)) { + usleep(kWaitDecodeFinishInterval); + } + //2. delete ffmpeg decoder + delete ffmpegDecoder_; + ffmpegDecoder_ = nullptr; + //3. release dvpp vdec + delete dvppVdec_; + dvppVdec_ = nullptr; + //4. release image memory in decode output queue + do { + shared_ptr frame = FrameImageOutQueue(true); + if (frame == nullptr) { + break; + } + + if (frame->data != nullptr) { + acldvppFree(frame->data.get()); + frame->data = nullptr; + } + }while(1); + //5. release channel id + channelIdGenerator.ReleaseChannelId(channelId_); + + isReleased_ = true; +} + +AtlasError VideoDecode::InitResource() { + aclError aclRet; + //1. Set acl context of video decoder, use current thread context default + if (context_ == nullptr) { + aclRet = aclrtGetCurrentContext(&context_); + if ((aclRet != ACL_ERROR_NONE) || (context_ == nullptr)) { + ATLAS_LOG_ERROR("Get current acl context error:%d", aclRet); + return ATLAS_ERROR_GET_ACL_CONTEXT; + } + } + AtlasError ret = SetAclContext(); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Set video decoder acl context error:%d", aclRet); + return ret; + } + //2.Get current run mode + aclRet = aclrtGetRunMode(&runMode_); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("acl get run mode failed"); + return ATLAS_ERROR_GET_RUM_MODE; + } + + return ATLAS_OK; +} + +AtlasError VideoDecode::InitVdecDecoder() { + //Generate a unique channel id for video decoder + channelId_ = channelIdGenerator.GenerateChannelId(); + if (channelId_ == INVALID_CHANNEL_ID) { + ATLAS_LOG_ERROR("Decoder number excessive %d", VIDEO_CHANNEL_MAX); + return ATLAS_ERROR_TOO_MANY_VIDEO_DECODERS; + } + + //Create dvpp vdec to decode h26x data + dvppVdec_ = new VdecProcess(channelId_, ffmpegDecoder_->GetFrameWidth(), + ffmpegDecoder_->GetFrameHeight(), + streamFormat_, VideoDecode::DvppVdecCallback); + AtlasError ret = dvppVdec_->Init(); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Dvpp vdec init failed"); + } + + return ret; +} + +AtlasError VideoDecode::InitFFmpegDecoder() { + //Create ffmpeg decoder to parse video stream to h26x frame data + ffmpegDecoder_ = new FFmpegDecoder(streamName_); + if (kInvalidTpye == GetVdecType()) { + this->SetStatus(DECODE_ERROR); + delete ffmpegDecoder_; + ATLAS_LOG_ERROR("Video %s type is invalid", streamName_.c_str()); + return ATLAS_ERROR_FFMPEG_DECODER_INIT; + } + + //Get video fps, if no fps, use 1 as default + int fps = ffmpegDecoder_->GetFps(); + if (fps == 0) { + fps = kDefaultFps; + ATLAS_LOG_INFO("Video %s fps is 0, change to %d", + streamName_.c_str(), fps); + } + //Cal the frame interval time(us) + fpsInterval_ = kUsec / fps; + + return ATLAS_OK; +} + +AtlasError VideoDecode::Open() { + //Open video stream, if open failed before, return error directly + if (status_ == DECODE_ERROR) + return ATLAS_ERROR_OPEN_VIDEO_UNREADY; + //If open ok already + if (status_ != DECODE_UNINIT) + return ATLAS_OK; + //Init acl resource + AtlasError ret = InitResource(); + if (ret != ATLAS_OK) { + this->SetStatus(DECODE_ERROR); + ATLAS_LOG_ERROR("Open %s failed for init resource error: %d", + streamName_.c_str(), ret); + return ret; + } + //Init ffmpeg decoder + ret = InitFFmpegDecoder(); + if (ret != ATLAS_OK) { + this->SetStatus(DECODE_ERROR); + ATLAS_LOG_ERROR("Open %s failed for init ffmpeg error: %d", + streamName_.c_str(), ret); + return ret; + } + //Init dvpp vdec decoder + ret = InitVdecDecoder(); + if (ret != ATLAS_OK) { + this->SetStatus(DECODE_ERROR); + ATLAS_LOG_ERROR("Open %s failed for init vdec error: %d", + streamName_.c_str(), ret); + return ret; + } + //Set init ok + this->SetStatus(DECODE_READY); + ATLAS_LOG_INFO("Video %s decode init ok", streamName_.c_str()); + + return ATLAS_OK; +} + +int VideoDecode::GetVdecType() { + //VDEC only support H265 main level,264 baseline level,main level,high level + int type = ffmpegDecoder_->GetVideoType(); + int profile = ffmpegDecoder_->GetProfile(); + if (type == AV_CODEC_ID_HEVC) { + streamFormat_ = H265_MAIN_LEVEL; + } else if (type == AV_CODEC_ID_H264) { + switch(profile) { + case FF_PROFILE_H264_BASELINE: + streamFormat_ = H264_BASELINE_LEVEL; + break; + case FF_PROFILE_H264_MAIN: + streamFormat_ = H264_MAIN_LEVEL; + break; + case FF_PROFILE_H264_HIGH: + case FF_PROFILE_H264_HIGH_10: + case FF_PROFILE_H264_HIGH_10_INTRA: + case FF_PROFILE_H264_MULTIVIEW_HIGH: + case FF_PROFILE_H264_HIGH_422: + case FF_PROFILE_H264_HIGH_422_INTRA: + case FF_PROFILE_H264_STEREO_HIGH: + case FF_PROFILE_H264_HIGH_444: + case FF_PROFILE_H264_HIGH_444_PREDICTIVE: + case FF_PROFILE_H264_HIGH_444_INTRA: + streamFormat_ = H264_HIGH_LEVEL; + break; + default: + ATLAS_LOG_INFO("Not support h264 profile %d, use as mp", profile); + streamFormat_ = H264_MAIN_LEVEL; + break; + } + } else { + streamFormat_ = kInvalidTpye; + ATLAS_LOG_ERROR("Not support stream, type %d, profile %d", type, profile); + } + + return streamFormat_; +} + +//dvpp vdec callback +void VideoDecode::DvppVdecCallback(acldvppStreamDesc *input, + acldvppPicDesc *output, void *userData) +{ + VideoDecode* decoder = (VideoDecode*)userData; + //Get decoded image parameters + shared_ptr image = make_shared(); + image->format = acldvppGetPicDescFormat(output); + image->width = acldvppGetPicDescWidth(output); + image->height = acldvppGetPicDescHeight(output); + image->alignWidth = acldvppGetPicDescWidthStride(output); + image->alignHeight = acldvppGetPicDescHeightStride(output); + image->size = acldvppGetPicDescSize(output); + + void* vdecOutBufferDev = acldvppGetPicDescData(output); + image->data = SHARED_PRT_DVPP_BUF(vdecOutBufferDev); + + //Put the decoded image to queue for read + decoder->ProcessDecodedImage(image); + //Release resouce + aclError ret = acldvppDestroyPicDesc(output); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("fail to destroy pic desc, error %d", ret); + } + + if (input != nullptr) { + void* inputBuf = acldvppGetStreamDescData(input); + if (inputBuf != nullptr) { + acldvppFree(inputBuf); + } + + aclError ret = acldvppDestroyStreamDesc(input); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("fail to destroy input stream desc"); + } + } +} + +void VideoDecode::ProcessDecodedImage(shared_ptr frameData) { + finFrameCnt_++; + if (YUV420SP_SIZE(frameData->width, frameData->height) != frameData->size) { + ATLAS_LOG_ERROR("Invalid decoded frame parameter, " + "width %d, height %d, size %d, buffer %p", + frameData->width, frameData->height, + frameData->size, frameData->data.get()); + return; + } + + FrameImageEnQueue(frameData); + + if ((status_ == DECODE_FFMPEG_FINISHED) && (finFrameCnt_ >= frameId_)) { + ATLAS_LOG_INFO("Last frame decoded by dvpp, change status to %d", + DECODE_DVPP_FINISHED); + this->SetStatus(DECODE_DVPP_FINISHED); + } +} + +AtlasError VideoDecode::FrameImageEnQueue(shared_ptr frameData) { + for (int count = 0; count < kFrameEnQueueRetryTimes; count++) { + if (frameImageQueue_.Push(frameData)) + return ATLAS_OK; + usleep(kDecodeQueueOpWait); + } + ATLAS_LOG_ERROR("Video %s lost decoded image for queue full", + streamName_.c_str()); + + return ATLAS_ERROR_VDEC_QUEUE_FULL; +} + +//start decoder +void VideoDecode::StartFrameDecoder() { + if (status_ == DECODE_READY) { + + decodeThread_ = thread(FrameDecodeThreadFunction, (void*)this); + decodeThread_.detach(); + + status_ = DECODE_START; + } +} + +//ffmpeg decoder entry +void VideoDecode::FrameDecodeThreadFunction(void* decoderSelf) { + VideoDecode* thisPtr = (VideoDecode*)decoderSelf; + + aclError aclRet = thisPtr->SetAclContext(); + if (aclRet != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Set frame decoder context failed, errorno:%d", + aclRet); + return; + } + //start decode until complete + thisPtr->FFmpegDecode(); + if (thisPtr->IsStop()) { + thisPtr->SetStatus(DECODE_FINISHED); + return; + } + thisPtr->SetStatus(DECODE_FFMPEG_FINISHED); + //when ffmpeg decode finish, send eos to vdec + shared_ptr videoFrame = make_shared(); + videoFrame->isFinished = true; + videoFrame->data = nullptr; + videoFrame->size = 0; + thisPtr->dvppVdec_->Process(videoFrame, decoderSelf); + + while((thisPtr->GetStatus() != DECODE_DVPP_FINISHED) && !thisPtr->IsStop()) { + usleep(kWaitDecodeFinishInterval); + } +} + +//callback of ffmpeg decode frame +AtlasError VideoDecode::FrameDecodeCallback(void* decoder, void* frameData, + int frameSize) { + if ((frameData == NULL) || (frameSize == 0)) { + ATLAS_LOG_ERROR("Frame data is null"); + return ATLAS_ERROR_H26X_FRAME; + } + + //将ffmpeg解码得到的h26x数据拷贝到dvpp内存 + VideoDecode* videoDecoder = (VideoDecode*)decoder; + + void* buffer = CopyDataToDevice(frameData, frameSize, + videoDecoder->runMode_, MEMORY_DVPP); + if (buffer == nullptr) { + ATLAS_LOG_ERROR("Copy frame h26x data to dvpp failed"); + return ATLAS_ERROR_COPY_DATA; + } + + shared_ptr videoFrame = make_shared(); + videoDecoder->frameId_++; + videoFrame->frameId = videoDecoder->frameId_; + videoFrame->data = buffer; + videoFrame->size = frameSize; + //使用dvpp vdec解码h26x帧数据 + AtlasError ret = videoDecoder->dvppVdec_->Process(videoFrame, decoder); + if (ret != ATLAS_OK) { + ATLAS_LOG_ERROR("Dvpp vdec process %dth frame failed, error:%d", + videoDecoder->frameId_, ret); + return ret; + } + + //根据视频帧率等待下一帧 + videoDecoder->SleeptoNextFrameTime(); + return ATLAS_OK; +} + +void VideoDecode::SleeptoNextFrameTime() { + while(frameImageQueue_.Size() > kReadSlow) { + if (isStop_) { + return; + } + usleep(kOutputJamWait); + } + + if (streamType_ == STREAM_RTSP) { + usleep(0); + return; + } + + //获取当前时间 + timeval tv; + gettimeofday(&tv, 0); + int64_t now = (int64_t)tv.tv_sec * 1000000 + (int64_t)tv.tv_usec; + + if (lastDecodeTime_ == 0) { + lastDecodeTime_ = now; + return; + } + //计算到解码一帧后还剩余的时间 + int64_t lastInterval = (now - lastDecodeTime_); + int64_t sleepTime = (lastInterval < fpsInterval_)?(fpsInterval_-lastInterval):0; + //耗完一帧解码时间 + usleep(sleepTime); + //记录下一帧解码的开始时间 + gettimeofday(&tv, 0); + lastDecodeTime_ = (int64_t)tv.tv_sec * 1000000 + (int64_t)tv.tv_usec; + + return; +} + +//当前解码器是否准备好 +bool VideoDecode::IsOpened() { + ATLAS_LOG_INFO("Video %s decode status %d", streamName_.c_str(), status_); + return (status_ == DECODE_READY) || (status_ == DECODE_START); +} + +/*读取一帧解码后的yuv图像*/ +AtlasError VideoDecode::Read(ImageData& image) { + //如果当前解码器异常或者解码结束,则直接返回nullptr + if (status_ == DECODE_ERROR) { + ATLAS_LOG_ERROR("Read failed for decode %s failed", + streamName_.c_str()); + return ATLAS_ERROR_VIDEO_DECODER_STATUS; + } + + if (status_ == DECODE_FINISHED) { + ATLAS_LOG_INFO("No frame to read for decode %s finished", + streamName_.c_str()); + return ATLAS_ERROR_DECODE_FINISH; + } + //如果当前只是准备好,但是还未开始解码.Read的调用触发解码开始 + if (status_ == DECODE_READY) { + StartFrameDecoder(); + usleep(kDecodeQueueOpWait); + } + //从解码后图片存放队列读取一帧图片 + bool noWait = (status_ == DECODE_DVPP_FINISHED); + shared_ptr frame = FrameImageOutQueue(noWait); + if (noWait && (frame == nullptr)) { + SetStatus(DECODE_FINISHED); + ATLAS_LOG_INFO("No frame to read anymore"); + return ATLAS_ERROR_DECODE_FINISH; + } + + if (frame == nullptr) { + ATLAS_LOG_ERROR("No frame image to read abnormally"); + return ATLAS_ERROR_READ_EMPTY; + } + + image.format = frame->format; + image.width = frame->width; + image.height = frame->height; + image.alignWidth = frame->alignWidth; + image.alignHeight = frame->alignHeight; + image.size = frame->size; + image.data = frame->data; + + return ATLAS_OK; +} + +shared_ptr VideoDecode::FrameImageOutQueue(bool noWait) { + shared_ptr image = frameImageQueue_.Pop(); + + if (noWait || (image != nullptr)) return image; + + for (int count = 0; count < kQueueOpRetryTimes - 1; count++) { + usleep(kDecodeQueueOpWait); + + image = frameImageQueue_.Pop(); + if (image != nullptr) + return image; + } + + return nullptr; +} + +AtlasError VideoDecode::Set(StreamProperty key, int value) { + AtlasError ret = ATLAS_OK; + switch(key) { + case OUTPUT_IMAGE_FORMAT: + ret = dvppVdec_->SetFormat(value); + break; + case RTSP_TRANSPORT: + ret = SetRtspTransType(value); + break; + default: + ret = ATLAS_ERROR_UNSURPPORT_PROPERTY; + ATLAS_LOG_ERROR("Unsurpport property %d to set for video %s", + (int)key, streamName_.c_str()); + break; + } + + return ret; +} + +AtlasError VideoDecode::SetRtspTransType(uint32_t transCode) { + AtlasError ret = ATLAS_OK; + + if (transCode == RTSP_TRANS_UDP) + ffmpegDecoder_->SetTransport(RTSP_TRANSPORT_UDP); + else if (transCode == RTSP_TRANS_TCP) + ffmpegDecoder_->SetTransport(RTSP_TRANSPORT_TCP); + else { + ret = ATLAS_ERROR_INVALID_PROPERTY_VALUE; + ATLAS_LOG_ERROR("Unsurport rtsp transport property value %d", + transCode); + } + + return ret; +} + +uint32_t VideoDecode::Get(StreamProperty key) { + uint32_t value = 0; + + switch(key){ + case FRAME_WIDTH: + value = ffmpegDecoder_->GetFrameWidth(); + break; + case FRAME_HEIGHT: + value = ffmpegDecoder_->GetFrameHeight(); + break; + case VIDEO_FPS: + value = ffmpegDecoder_->GetFps(); + break; + default: + ATLAS_LOG_ERROR("Unsurpport property %d to get for video", key); + break; + } + + return value; +} + +AtlasError VideoDecode::SetAclContext() { + if (context_ == nullptr) { + ATLAS_LOG_ERROR("Video decoder context is null"); + return ATLAS_ERROR_SET_ACL_CONTEXT; + } + + aclError ret = aclrtSetCurrentContext(context_); + if (ret != ACL_ERROR_NONE) { + ATLAS_LOG_ERROR("Video decoder set context failed, error: %d", ret); + return ATLAS_ERROR_SET_ACL_CONTEXT; + } + + return ATLAS_OK; +} + +AtlasError VideoDecode::Close() { + DestroyResource(); + return ATLAS_OK; +} + diff --git a/cplusplus/common/atlasutil/src/video_decode.h b/cplusplus/common/atlasutil/src/video_decode.h new file mode 100644 index 0000000..5d0cbde --- /dev/null +++ b/cplusplus/common/atlasutil/src/video_decode.h @@ -0,0 +1,184 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef VIDEO_DECODE_H_ +#define VIDEO_DECODE_H_ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "thread_safe_queue.h" +#include "ffmpeg_decoder.h" +#include "vdec_process.h" +#include "atlas_videocapture.h" + +#define INVALID_STREAM_FORMAT -1 + +#define RTSP_TRANSPORT_UDP "udp" +#define RTSP_TRANSPORT_TCP "tcp" + +#define VIDEO_CHANNEL_MAX 23 +#define INVALID_CHANNEL_ID -1 + +enum StreamType { + STREAM_VIDEO = 0, + STREAM_RTSP, +}; + +enum DecodeStatus { + DECODE_ERROR = -1, + DECODE_UNINIT = 0, + DECODE_READY = 1, + DECODE_START = 2, + DECODE_FFMPEG_FINISHED = 3, + DECODE_DVPP_FINISHED = 4, + DECODE_FINISHED = 5 +}; + +class ChannelIdGenerator { +public: + ChannelIdGenerator() { + for (int i = 0; i < VIDEO_CHANNEL_MAX; i++) { + channelId_[i] = INVALID_CHANNEL_ID; + } + } + ~ChannelIdGenerator(){}; + + int GenerateChannelId(void) { + std::lock_guard lock(mutex_lock_); + for (int i = 0; i < VIDEO_CHANNEL_MAX; i++) { + if (channelId_[i] == INVALID_CHANNEL_ID) { + channelId_[i] = i; + return i; + } + } + + return INVALID_CHANNEL_ID; + } + + void ReleaseChannelId(int channelId) { + std::lock_guard lock(mutex_lock_); + if ((channelId >= 0) && (channelId < VIDEO_CHANNEL_MAX)) { + channelId_[channelId] = INVALID_CHANNEL_ID; + } + } + +private: + int channelId_[VIDEO_CHANNEL_MAX]; + mutable std::mutex mutex_lock_; +}; + + +class VideoDecode : public AtlasVideoCapBase { + public: + /** + * @brief VideoDecode constructor + */ + VideoDecode(const std::string& videoName, aclrtContext context = nullptr); + + /** + * @brief VideoDecode destructor + */ + ~VideoDecode(); + + static void FrameDecodeThreadFunction(void* decoderSelf); + static AtlasError FrameDecodeCallback(void* context, void* frameData, + int frameSize); + static void DvppVdecCallback(acldvppStreamDesc *input, + acldvppPicDesc *output, void *userdata); + + AtlasError DecodeH26xFrame(); + void ProcessDecodedImage(std::shared_ptr frameData); + AtlasError Read(ImageData& image); + + void FFmpegDecode() { ffmpegDecoder_->Decode(&VideoDecode::FrameDecodeCallback, (void*) this); } + + bool IsOpened(); + AtlasError Open(); + + void SetStatus(DecodeStatus status) { status_ = status; } + DecodeStatus GetStatus() { return status_; } + + AtlasError Set(StreamProperty key, int value); + uint32_t Get(StreamProperty key); + + void SleeptoNextFrameTime(); + AtlasError SetAclContext(); + AtlasError Close(); + + void DestroyResource(); + bool IsStop() { return isStop_; } + bool IsJam() { return isJam_; } + +private: + AtlasError InitResource(); + AtlasError InitVdecDecoder(); + AtlasError InitFFmpegDecoder(); + void StartFrameDecoder(); + int GetVdecType(); + AtlasError FrameImageEnQueue(std::shared_ptr frameData); + std::shared_ptr FrameImageOutQueue(bool noWait = false); + AtlasError SetRtspTransType(uint32_t transCode); + +private: + aclrtContext context_; + aclrtRunMode runMode_; + StreamType streamType_; + + int channelId_; + uint32_t frameId_; + uint32_t finFrameCnt_; + DecodeStatus status_; + std::string streamName_; + int streamFormat_; + int64_t lastDecodeTime_; + int64_t fpsInterval_; + std::thread decodeThread_; + FFmpegDecoder* ffmpegDecoder_; + VdecProcess* dvppVdec_; + + ThreadSafeQueue> frameImageQueue_; + + bool isStop_; + bool isReleased_; + bool isJam_; +}; + +#endif /* VIDEO_DECODE_H_ */ diff --git a/cplusplus/common/presenteragent/Makefile b/cplusplus/common/presenteragent/Makefile new file mode 100644 index 0000000..5c19aab --- /dev/null +++ b/cplusplus/common/presenteragent/Makefile @@ -0,0 +1,93 @@ +ifndef DDK_PATH +$(error "Can not find DDK_PATH env, please set it in environment!.") +endif + +ifeq ($(mode),) +mode=AtlasDK +endif + +ifeq ($(mode), AtlasDK) +CC := aarch64-linux-gnu-g++ +ARCH := arm +else ifeq ($(mode), ASIC) +CC := g++ +ARCH := x86 +else +$(error "Unsupported mode: "$(mode)", please input: AtlasDK or ASIC.") +endif + + +LOCAL_MODULE_NAME := libpresenteragent.so + +LOCAL_DIR := . +OUT_DIR = out +OBJ_DIR = $(OUT_DIR)/obj +DEPS_DIR = $(OUT_DIR)/deps +LOCAL_LIBRARY=$(OUT_DIR)/$(LOCAL_MODULE_NAME) +OUT_INC_DIR = $(OUT_DIR)/include + +INC_DIR := \ + -I$(LOCAL_DIR) \ + -I$(LOCAL_DIR)/include \ + -I$(DDK_PATH)/acllib/include \ + -I$(HOME)/ascend_ddk/$(ARCH)/include \ + -I$(DDK_PATH)/atc/include/protobuf \ + -I/usr/local/include \ + -I$(LOCAL_DIR)/src \ + +SRCS := $(patsubst $(LOCAL_DIR)/%.cpp, %.cpp, $(shell find $(LOCAL_DIR)/src -name *.cpp)) +OBJS := $(addprefix $(OBJ_DIR)/, $(patsubst %.cpp, %.o,$(SRCS))) + +PROTO_SRCS = $(patsubst $(LOCAL_DIR)/%.cc, %.cc, $(shell find $(LOCAL_DIR)/proto -name *.pb.cc)) +PROTO_OBJS := $(addprefix $(OBJ_DIR)/, $(patsubst %.cc, %.o,$(PROTO_SRCS))) + +ALL_OBJS := $(OBJS) \ + $(PROTO_OBJS) \ + +CC_FLAGS := $(INC_DIR) -std=c++11 -Wall -fPIC -O2 + +LNK_FLAGS := \ + -Wl,-rpath-link=$(DDK_PATH)/atc/lib64 \ + -L$(DDK_PATH)/atc/lib64 \ + -L$(DDK_PATH)/acllib/lib64 \ + -L$(HOME)/ascend_ddk/$(ARCH)/lib \ + -lprotobuf \ + -lascendcl \ + -shared + +all: do_pre_build do_build + +do_pre_build: + $(Q)echo - do [$@] + $(Q)mkdir -p $(OBJ_DIR) + $(Q)mkdir -p $(OUT_INC_DIR) + +do_build: $(LOCAL_LIBRARY) | do_pre_build + $(Q)echo - do [$@] + +$(LOCAL_LIBRARY): $(ALL_OBJS) + $(Q)echo [LD] $@ + $(Q)$(CC) $(CC_FLAGS) -o $@ $^ -Wl,--whole-archive -Wl,--no-whole-archive -Wl,--start-group -Wl,--end-group $(LNK_FLAGS) + $(Q)cp -R $(LOCAL_DIR)/include/* $(OUT_INC_DIR) + +$(OBJS): $(OBJ_DIR)/%.o : %.cpp | do_pre_build + $(Q)echo [CC] $@ + $(Q)mkdir -p $(dir $@) + $(Q)$(CC) $(CC_FLAGS) $(INC_DIR) -c -fstack-protector-all $< -o $@ + + +$(PROTO_OBJS) : proto/presenter_message.pb.cc | do_pre_build + $(Q)echo [CC] $@ + $(Q)mkdir -p $(dir $@) + $(Q)$(CC) $(CC_FLAGS) $(INC_DIR) -c -fstack-protector-all $< -o $@ + +install: all + $(Q)echo [INSTALL] $@ + $(Q)mkdir -p $(HOME)/ascend_ddk/$(ARCH)/include + $(Q)mkdir -p $(HOME)/ascend_ddk/$(ARCH)/lib + $(Q)cp -R $(OUT_INC_DIR)/ascenddk* $(HOME)/ascend_ddk/$(ARCH)/include/ + $(Q)cp -R $(OUT_DIR)/lib*.so $(HOME)/ascend_ddk/$(ARCH)/lib/ + +install pcie: + +clean: diff --git a/cplusplus/common/presenteragent/README_CN.md b/cplusplus/common/presenteragent/README_CN.md new file mode 100644 index 0000000..735db6d --- /dev/null +++ b/cplusplus/common/presenteragent/README_CN.md @@ -0,0 +1,239 @@ +中文|[英文](README.md) + +Presenter部署在Mind Studio所在的Linux服务器上,主要作用是推理结果的展示。 + +Presenter包括Presenter Server与Presenter Agent。 + +- Presenter Agent提供一系列API,用户通过调用API向Presenter Server推送媒体消息。 +- Presenter Server接收Presenter Agent发过来的数据,通过浏览器进行结果展示。 + +## Presenter Server + +- **Description** + + Presenter Server是展示推理结果的软件包,该软件基于python3实现,并用到了第三方web框架tornado,以及底层通信框架protobuf。 + + Presenter Server支持图片模式和视频模式。图片模式展示单张图片,视频模式以图片流的方式展示连续图片。Presenter server通过channel来标记不同的数据源,在浏览器里通过Create按钮添加channel,Delete进行删除,默认支持两路channel,分别是image和video。 + +- **Sample Code** + + Presenter Server源码在样例的工程目录下,config是配置文件目录,修改config.conf进行可服务端ip和port的定制,logging.conf是logging模块的配置;src是源码目录,其中,presenter\_message\_pb2.py 定义protobuf格式,presenter\_socket\_server.py 负责并行接收数据,webapp.py 负责把数据推送到Chrome,进行前台展示;ui是web界面素材所在目录。 + + 与Presenter Agent的消息通信: + + Presenter Server 与Presenter Agent和Chrome的消息通信如下图所示,Chrome上发起创建channel的操作,Presenter Server发送数据到指定channel,Chrome打开此channel,观察推理结果。 + + ![输入图片说明](https://images.gitee.com/uploads/images/2021/0112/114222_18033d3b_7401379.png "屏幕截图.png") + + Presenter Server与Presenter Agent之间消息结构如下,依次是4个字节的消息总长度,1个字节的消息名长度,若干字节的消息消息名,若干字节的protobuf内容。 + + ``` + -------------------------------------------------------------- + |total message len | int | 4 bytes | + |-------------------------------------------------------------- + |message name len | byte | 1 byte | + |-------------------------------------------------------------- + |message name | string | xx bytes | + |-------------------------------------------------------------- + |message body | protobuf | xx bytes | + --------------------------------------------------------------- + ``` + + 主要的消息有两个,一个是打开channel的请求消息OpenChannelRequest ,另一个是发送数据的消息PresentImageRequest ,其在ptorobuf中的定义如下: + + ``` + message OpenChannelRequest { + string channel_name = 1; //channel 名称 + ChannelContentType content_type = 2; //数据模式,用来识别image和video + } + + message PresentImageRequest { + ImageFormat format = 1; // 图片格式,当前仅支持Jpeg + uint32 width = 2; //图片宽度 + uint32 height =3; //图片高度 + bytes data = 4; //图片数据 + } + ``` + + 通过epoll实现多路channel并行工作,实现伪码如下: + + ``` + def _server_listen_thread(self): + """socket server thread, epoll listening all the socket events""" + epoll = select.epoll() + epoll.register(self._sock_server.fileno(), select.EPOLLIN | select.EPOLLHUP) + try: + conns = {} + msgs = {} + while True: + events = epoll.poll(EPOLL_TIMEOUT) + # timeout, but no event come, continue waiting + if not events: + continue + for sock_fileno, event in events: + # new connection request from presenter agent + if self._sock_server.fileno() == sock_fileno: + self._accept_new_socket(epoll, conns) + # remote connection closed + # it means presenter agent exit withot close socket. + elif event & select.EPOLLHUP: + self._clean_connect(sock_fileno, epoll, conns, msgs) + # new data coming in a socket connection + elif event & select.EPOLLIN: + self._process_epollin(sock_fileno, epoll, conns, msgs) + # receive event not recognize + else: + self._clean_connect(sock_fileno, epoll, conns, msgs) + finally: + epoll.unregister(self._sock_server.fileno()) + epoll.close() + self._sock_server.close() + ``` + + 消息解析过程,实现伪码如下,首先是解析消息,包括消息长度,消息名,最后读取protobuf并进行处理。 + + ``` + def _read_sock_and_process_msg(self, sock_fileno, conns, msgs): + # Step1: read msg head + msg_total_len, msg_name_len = self._read_msg_head(sock_fileno, conns) + if msg_total_len is None: + return PRESENTER_ERR + # Step2: read msg name + msg_name = self._read_msg_name(conns[sock_fileno], msg_name_len) + if msg_name == SOCKET_RECEIVE_NULL: + return PRESENTER_ERR + try: + msg_name = msg_name.decode("utf-8") + except UnicodeDecodeError: + return PRESENTER_ERR + # Step3: read msg body + msg_body_len = msg_total_len - MSG_HEAD_LENGTH - msg_name_len + ret = self._read_msg_body(sock_fileno, conns, msgs, msg_name, msg_body_len) + if ret == PRESENTER_ERR: + return ret + # Step4: process msg + ret = self._process_msg(conns[sock_fileno], msg_name, msgs[sock_fileno]) + return ret + ``` + + 解析protobuf,来自Presenter Agent的消息请求共有三个,分别是打开channel、发送数据、发送心跳。 + + ``` + def _process_msg(self, conn, msg_name, msg_data): + # process open channel request + if msg_name == OPEN_CHANNEL_REQUEST_FULL_NAME: + ret = self._process_open_channel(conn, msg_data) + # process image request, receive an image data from presenter agent + elif msg_name == PRESENT_IMAGE_REQUEST_FULL_NAME: + ret = self._process_image_request(conn, msg_data) + # process heartbeat request, it used to keepalive a channel path + elif msg_name == HEART_BEAT_MESSAGE_FULL_NAME: + ret = self._process_heartbeat(conn) + else: + ret = PRESENTER_ERR + return ret + ``` + + +## Present Agent + +Presenter Agent提供一系列API,用户可以调用这些API向Presenter Server推送媒体消息,并在浏览器中查看。当前支持JPEG格式图片的推送。 + +调用流程如下所示: + +![输入图片说明](https://images.gitee.com/uploads/images/2021/0112/114246_8c1504f0_7401379.png "屏幕截图.png") + +1. App调用OpenChannel函数打开与Presenter Server间的通道。 +2. App调用SendMessage函数在该通道上推送媒体消息。推送消息时, 支持在推送的图片上画矩形框。使用时需要将框的左上、右下点的坐标、框的标题设置到PresentImageRequest对象中。 +3. 所有图片发送完成后,App调用CloseChannel函数释放分配的资源。 + +- **Sample Code** + + 以发送图片为例: + + 1. Open channel + + ``` + OpenChannelParam param; + param.hostIp = "127.0.0.1"; //IP address of Presenter Server + param.port = 7006; //port of present service + param.channelName = "image"; + param.contentType = ContentType::kImage; //content type is IMAGE + + Channel *channel = nullptr; + PresenterErrorCode errorCode = OpenChannel(channel, param); + if (errorCode != PresenterErrorCode::kNone) { + return; + } + ``` + + 2. SendMessage + + ``` + ascend::presenter::proto::PresentImageRequest request; + request.set_data(string(reinterpret_cast(buffer), size)); //image data buffer, image shuold be jpeg format + request.set_width(1920); + request.set_height(1280); + + //Set the rectangles info into request. + ascend::presenter::proto::Rectangle_Attr *rectangle_attr = nullptr; + rectangle_attr = request.add_rectangle_list(); //Add one rectangle + rectangle_attr->mutable_left_top()-> set_x(100); + rectangle_attr->mutable_left_top()-> set_y(100); + rectangle_attr->mutable_right_bottom()->set_x(500); + rectangle_attr->mutable_right_bottom()->set_y(500); + rectangle_attr->set_label_text("This is a title"); //Set the title for the rectangle + + ascend::presenter::PresenterErrorCode error_code = ascend::presenter::SendMessage(channel, request) + + ``` + + 3. Close Channel + + ``` + delete channel; + ``` + + + 如果需要发送一系列图片来展示视频的效果,则将[1](#zh-cn_topic_0147635264_li182791110135216)中的contentType改为ContentType::kVideo,并 + + 不断的调用SendMessage即可。 + +- **修改源码** + + 编译源码需要使用protoc编译proto文件,请从[https://github.com/protocolbuffers/protobuf/releases/](http://code.google.com/p/protobuf/downloads/list)中获取软件包protoc-3.5.1-linux- + + x86\_64.zip,并参照包中的readme进行安装。 + + 主要源码结构如下所示: + + ``` + common/presenter/agent PresenterAgent源码根目录 + ├─proto Protobuf消息定义 + ├─include/ascendk/presenter/agent API头文件 + ├─channel.h 通用channel的接口,提供收发protobuf消息的功能 + ├─errors.h 错误码 + ├─presenter_channel.h 封装了发送媒体数据到PresenterServer的功能 + ├─presenter_types.h 封装了发送媒体数据到PresenterServer的功能 + ├─src/asceddk/presenter/agent 源码目录 + ├─channel 与PresenterServer交互相关源码 + ├─default_channel.cpp Channel类的默认实现,维护与Server间的长连接 + ├─default_channel.h Channel类的默认实现的头文件 + ├─channel.cpp Channel类的默认实现的头文件 + ├─codec + ├─connection 提供发送/接收protobuf消息的接口 + ├─net 网络连接相关源码, 完成收发字节数组的接口 + ├─socket.cpp Socket抽象类 + ├─socket_factory.cpp Socket工厂抽象类 + ├─raw_socket.cpp 基于linux原生socket,不提供通道加密功能 + ├─raw_socket_factory.cpp RawSocket的工厂类 + ├─presenter 封装了发送媒体数据到PresenterServer的功能 + ├─util 工具类相关源码 + ├─Makefile + ``` + + 如果修改了presenter\_message.proto,则需要在proto文件夹下执行以下命令编译proto文件: + + protoc presenter\_message.proto --cpp\_out=./ + + diff --git a/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/channel.h b/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/channel.h new file mode 100644 index 0000000..fec3fcf --- /dev/null +++ b/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/channel.h @@ -0,0 +1,184 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_CHANNEL_H_ +#define ASCENDDK_PRESENTER_AGENT_CHANNEL_H_ + +#include +#include +#include +#include + +#include "ascenddk/presenter/agent/errors.h" + +namespace google { +namespace protobuf { +class Message; +} +} + +namespace ascend { +namespace presenter { + +/** + * TLV + */ +struct Tlv { + int tag; + int length; + const char* value; +}; + +/** + * When a message has large fields, this can be used to avoid + * unnecessary memory copies + */ +struct PartialMessageWithTlvs { + const google::protobuf::Message* message; + std::vector tlv_list; +}; + +/** + * Deal with channel initialization + */ +class InitChannelHandler { + public: + InitChannelHandler() = default; + virtual ~InitChannelHandler() = default; + + /** + * @brief Create initialize request + * @return initialize request + */ + virtual google::protobuf::Message* CreateInitRequest() = 0; + + /** + * @brief check the response + * @param [in] response response + * @return check result + */ + virtual bool CheckInitResponse(const google::protobuf::Message& response) = 0; +}; + +/** + * @brief General channel + */ +class Channel { + public: + virtual ~Channel() = default; + + /** + * @brief Open channel + * @return PresenterErrorCode + */ + virtual PresenterErrorCode Open() = 0; + + /** + * @brief send message to server + * @param [in] message message + * @return PresenterErrorCode + */ + virtual PresenterErrorCode SendMessage( + const google::protobuf::Message& message) = 0; + + /** + * @brief send message to server + * @param [in] message message + * @return PresenterErrorCode + */ + virtual PresenterErrorCode SendMessage( + const PartialMessageWithTlvs& message) = 0; + + /** + * @brief send message to server and read the response + * @param [in] message message + * @pararm [out] response response + * @return PresenterErrorCode + */ + virtual PresenterErrorCode SendMessage( + const google::protobuf::Message& message, + std::unique_ptr& response) = 0; + + /** + * @brief send message to server and read the response + * @param [in] message message + * @pararm [out] response response + * @return PresenterErrorCode + */ + virtual PresenterErrorCode SendMessage( + const PartialMessageWithTlvs& message, + std::unique_ptr& response) = 0; + + /** + * @brief recevice a response + * @param [out] response response + * @return PresenterErrorCode + */ + virtual PresenterErrorCode ReceiveMessage( + std::unique_ptr& response) = 0; + + /** + * @brief Get the description of the channel, can be used for logging + * @return description + */ + virtual const std::string& GetDescription() const = 0; +}; + +/** + * Channel Factory + */ +class ChannelFactory { + public: + /** + * @brief create a channel + * @param [in] host_ip host IP of server + * @param [in] port port of server + * @return pointer to channel + */ + static Channel* NewChannel(const std::string& host_ip, uint16_t port); + + /** + * @brief create a channel + * @param [in] host_ip host IP of server + * @param [in] port port of server + * @param [in] handler init handler + * @return pointer to channel + */ + static Channel* NewChannel(const std::string& host_ip, uint16_t port, + std::shared_ptr handler); +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_CHANNEL_H_ */ diff --git a/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/errors.h b/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/errors.h new file mode 100644 index 0000000..07589f7 --- /dev/null +++ b/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/errors.h @@ -0,0 +1,84 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_ERRORS_H_ +#define ASCENDDK_PRESENTER_AGENT_ERRORS_H_ + +namespace ascend { +namespace presenter { + +/** + * PresenterErrorCode + */ +enum class PresenterErrorCode { + // Success, no error + kNone = 0, + + // parameter check error + kInvalidParam, + + // Connect to presenter server error + kConnection, + + // SSL certification error + kSsl, + + // Encode/Decode message error + kCodec, + + // The given channel name is not created in server + kNoSuchChannel, + + // The given channel is opened by another process + kChannelAlreadyOpened, + + // Presenter server return unknown error + kServerReturnedUnknownError, + + // Alloc object error + kBadAlloc, + + // App returned error + kAppDefinedError, + + // Timeout + kSocketTimeout, + + // Uncategorized error + kOther, +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_ERRORS_H_ */ diff --git a/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/presenter_channel.h b/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/presenter_channel.h new file mode 100644 index 0000000..0a6399a --- /dev/null +++ b/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/presenter_channel.h @@ -0,0 +1,85 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_PRESENTER_CHANNEL_H_ +#define ASCENDDK_PRESENTER_AGENT_PRESENTER_CHANNEL_H_ + +#include "ascenddk/presenter/agent/channel.h" +#include "ascenddk/presenter/agent/errors.h" +#include "ascenddk/presenter/agent/presenter_types.h" + +namespace ascend { +namespace presenter { + +/** + * @brief Open a channel to presenter server + * @param [out] channel channel must be a NULL pointer, + * and it will point to an opened channel if + * open successfully + * @param [in] param parameters for opening a channel + * @return PresenterErrorCode + */ +PresenterErrorCode OpenChannel(Channel *&channel, + const OpenChannelParam ¶m); +/** + * @brief Open a channel to presenter server by config file + * @param [out] channel channel must be a NULL pointer, + * and it will point to an opened channel if + * open successfully + * @configFile [in] param config file of channel configuration + * @return PresenterErrorCode + */ +PresenterErrorCode OpenChannelByConfig(Channel*& channel, + const char* configFile); + +/** + * @brief Send the image to server for display through the given channel + * @param [in] channel the channel to send the image with + * @param [in] image the image to display + * @return PresenterErrorCode + */ +PresenterErrorCode PresentImage(Channel *channel, const ImageFrame &image); + +/** + * @brief Send the image message to server for display through the given channel + * @param [in] channel the channel to send the image with + * @param [in] message a protobuf message + * @return PresenterErrorCode + */ +PresenterErrorCode SendMessage(Channel *channel, + const google::protobuf::Message& message); + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_PRESENTER_CHANNEL_H_ */ diff --git a/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/presenter_types.h b/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/presenter_types.h new file mode 100644 index 0000000..3e38af7 --- /dev/null +++ b/cplusplus/common/presenteragent/include/ascenddk/presenter/agent/presenter_types.h @@ -0,0 +1,103 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ +#ifndef ASCENDDK_PRESENTER_AGENT_DATA_TYPES_H_ +#define ASCENDDK_PRESENTER_AGENT_DATA_TYPES_H_ + +#include +#include +#include + +namespace ascend { +namespace presenter { + +/** + * ContentType + */ +enum class ContentType { + // Image + kImage = 0, + + // Video + kVideo = 1, + + // Reserved content type, do not use this + kReserved = 127, +}; + +/** + * ImageFormat + */ +enum class ImageFormat { + // JPEG + kJpeg = 0, + + // Reserved format, do not use this + kReserved = 127, +}; + +/** + * OpenChannelParam + */ +struct OpenChannelParam { + std::string host_ip; + std::uint16_t port; + std::string channel_name; + ContentType content_type; +}; + +struct Point { + std::uint32_t x; + std::uint32_t y; +}; + +struct DetectionResult { + Point lt; //The coordinate of left top point + Point rb; //The coordinate of the right bottom point + std::string result_text; // Face:xx% +}; +/** + * ImageFrame + */ +struct ImageFrame { + ImageFormat format; + std::uint32_t width; + std::uint32_t height; + std::uint32_t size; + unsigned char *data; + std::vector detection_results; +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_DATA_TYPES_H_ */ diff --git a/cplusplus/common/presenteragent/proto/presenter_message.pb.cc b/cplusplus/common/presenteragent/proto/presenter_message.pb.cc new file mode 100644 index 0000000..2f02c10 --- /dev/null +++ b/cplusplus/common/presenteragent/proto/presenter_message.pb.cc @@ -0,0 +1,2723 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: presenter_message.proto + +#include "presenter_message.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) +#include +extern PROTOBUF_INTERNAL_EXPORT_presenter_5fmessage_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Coordinate_presenter_5fmessage_2eproto; +extern PROTOBUF_INTERNAL_EXPORT_presenter_5fmessage_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_Rectangle_Attr_presenter_5fmessage_2eproto; +namespace ascend { +namespace presenter { +namespace proto { +class OpenChannelRequestDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed _instance; +} _OpenChannelRequest_default_instance_; +class OpenChannelResponseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed _instance; +} _OpenChannelResponse_default_instance_; +class HeartbeatMessageDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed _instance; +} _HeartbeatMessage_default_instance_; +class CoordinateDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed _instance; +} _Coordinate_default_instance_; +class Rectangle_AttrDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed _instance; +} _Rectangle_Attr_default_instance_; +class PresentImageRequestDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed _instance; +} _PresentImageRequest_default_instance_; +class PresentImageResponseDefaultTypeInternal { + public: + ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed _instance; +} _PresentImageResponse_default_instance_; +} // namespace proto +} // namespace presenter +} // namespace ascend +static void InitDefaultsscc_info_Coordinate_presenter_5fmessage_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::ascend::presenter::proto::_Coordinate_default_instance_; + new (ptr) ::ascend::presenter::proto::Coordinate(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::ascend::presenter::proto::Coordinate::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Coordinate_presenter_5fmessage_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsscc_info_Coordinate_presenter_5fmessage_2eproto}, {}}; + +static void InitDefaultsscc_info_HeartbeatMessage_presenter_5fmessage_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::ascend::presenter::proto::_HeartbeatMessage_default_instance_; + new (ptr) ::ascend::presenter::proto::HeartbeatMessage(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::ascend::presenter::proto::HeartbeatMessage::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_HeartbeatMessage_presenter_5fmessage_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsscc_info_HeartbeatMessage_presenter_5fmessage_2eproto}, {}}; + +static void InitDefaultsscc_info_OpenChannelRequest_presenter_5fmessage_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::ascend::presenter::proto::_OpenChannelRequest_default_instance_; + new (ptr) ::ascend::presenter::proto::OpenChannelRequest(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::ascend::presenter::proto::OpenChannelRequest::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_OpenChannelRequest_presenter_5fmessage_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsscc_info_OpenChannelRequest_presenter_5fmessage_2eproto}, {}}; + +static void InitDefaultsscc_info_OpenChannelResponse_presenter_5fmessage_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::ascend::presenter::proto::_OpenChannelResponse_default_instance_; + new (ptr) ::ascend::presenter::proto::OpenChannelResponse(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::ascend::presenter::proto::OpenChannelResponse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_OpenChannelResponse_presenter_5fmessage_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsscc_info_OpenChannelResponse_presenter_5fmessage_2eproto}, {}}; + +static void InitDefaultsscc_info_PresentImageRequest_presenter_5fmessage_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::ascend::presenter::proto::_PresentImageRequest_default_instance_; + new (ptr) ::ascend::presenter::proto::PresentImageRequest(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::ascend::presenter::proto::PresentImageRequest::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_PresentImageRequest_presenter_5fmessage_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsscc_info_PresentImageRequest_presenter_5fmessage_2eproto}, { + &scc_info_Rectangle_Attr_presenter_5fmessage_2eproto.base,}}; + +static void InitDefaultsscc_info_PresentImageResponse_presenter_5fmessage_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::ascend::presenter::proto::_PresentImageResponse_default_instance_; + new (ptr) ::ascend::presenter::proto::PresentImageResponse(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::ascend::presenter::proto::PresentImageResponse::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_PresentImageResponse_presenter_5fmessage_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsscc_info_PresentImageResponse_presenter_5fmessage_2eproto}, {}}; + +static void InitDefaultsscc_info_Rectangle_Attr_presenter_5fmessage_2eproto() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::ascend::presenter::proto::_Rectangle_Attr_default_instance_; + new (ptr) ::ascend::presenter::proto::Rectangle_Attr(); + ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr); + } + ::ascend::presenter::proto::Rectangle_Attr::InitAsDefaultInstance(); +} + +::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_Rectangle_Attr_presenter_5fmessage_2eproto = + {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsscc_info_Rectangle_Attr_presenter_5fmessage_2eproto}, { + &scc_info_Coordinate_presenter_5fmessage_2eproto.base,}}; + +static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_presenter_5fmessage_2eproto[7]; +static const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* file_level_enum_descriptors_presenter_5fmessage_2eproto[4]; +static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_presenter_5fmessage_2eproto = nullptr; + +const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_presenter_5fmessage_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::OpenChannelRequest, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::OpenChannelRequest, channel_name_), + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::OpenChannelRequest, content_type_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::OpenChannelResponse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::OpenChannelResponse, error_code_), + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::OpenChannelResponse, error_message_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::HeartbeatMessage, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::Coordinate, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::Coordinate, x_), + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::Coordinate, y_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::Rectangle_Attr, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::Rectangle_Attr, left_top_), + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::Rectangle_Attr, right_bottom_), + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::Rectangle_Attr, label_text_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::PresentImageRequest, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::PresentImageRequest, format_), + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::PresentImageRequest, width_), + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::PresentImageRequest, height_), + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::PresentImageRequest, data_), + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::PresentImageRequest, rectangle_list_), + ~0u, // no _has_bits_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::PresentImageResponse, _internal_metadata_), + ~0u, // no _extensions_ + ~0u, // no _oneof_case_ + ~0u, // no _weak_field_map_ + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::PresentImageResponse, error_code_), + PROTOBUF_FIELD_OFFSET(::ascend::presenter::proto::PresentImageResponse, error_message_), +}; +static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { + { 0, -1, sizeof(::ascend::presenter::proto::OpenChannelRequest)}, + { 7, -1, sizeof(::ascend::presenter::proto::OpenChannelResponse)}, + { 14, -1, sizeof(::ascend::presenter::proto::HeartbeatMessage)}, + { 19, -1, sizeof(::ascend::presenter::proto::Coordinate)}, + { 26, -1, sizeof(::ascend::presenter::proto::Rectangle_Attr)}, + { 34, -1, sizeof(::ascend::presenter::proto::PresentImageRequest)}, + { 44, -1, sizeof(::ascend::presenter::proto::PresentImageResponse)}, +}; + +static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = { + reinterpret_cast(&::ascend::presenter::proto::_OpenChannelRequest_default_instance_), + reinterpret_cast(&::ascend::presenter::proto::_OpenChannelResponse_default_instance_), + reinterpret_cast(&::ascend::presenter::proto::_HeartbeatMessage_default_instance_), + reinterpret_cast(&::ascend::presenter::proto::_Coordinate_default_instance_), + reinterpret_cast(&::ascend::presenter::proto::_Rectangle_Attr_default_instance_), + reinterpret_cast(&::ascend::presenter::proto::_PresentImageRequest_default_instance_), + reinterpret_cast(&::ascend::presenter::proto::_PresentImageResponse_default_instance_), +}; + +const char descriptor_table_protodef_presenter_5fmessage_2eproto[] = + "\n\027presenter_message.proto\022\026ascend.presen" + "ter.proto\"l\n\022OpenChannelRequest\022\024\n\014chann" + "el_name\030\001 \001(\t\022@\n\014content_type\030\002 \001(\0162*.as" + "cend.presenter.proto.ChannelContentType\"" + "n\n\023OpenChannelResponse\022@\n\nerror_code\030\001 \001" + "(\0162,.ascend.presenter.proto.OpenChannelE" + "rrorCode\022\025\n\rerror_message\030\002 \001(\t\"\022\n\020Heart" + "beatMessage\"\"\n\nCoordinate\022\t\n\001x\030\001 \001(\r\022\t\n\001" + "y\030\002 \001(\r\"\224\001\n\016Rectangle_Attr\0224\n\010left_top\030\001" + " \001(\0132\".ascend.presenter.proto.Coordinate" + "\0228\n\014right_bottom\030\002 \001(\0132\".ascend.presente" + "r.proto.Coordinate\022\022\n\nlabel_text\030\003 \001(\t\"\267" + "\001\n\023PresentImageRequest\0223\n\006format\030\001 \001(\0162#" + ".ascend.presenter.proto.ImageFormat\022\r\n\005w" + "idth\030\002 \001(\r\022\016\n\006height\030\003 \001(\r\022\014\n\004data\030\004 \001(\014" + "\022>\n\016rectangle_list\030\005 \003(\0132&.ascend.presen" + "ter.proto.Rectangle_Attr\"o\n\024PresentImage" + "Response\022@\n\nerror_code\030\001 \001(\0162,.ascend.pr" + "esenter.proto.PresentDataErrorCode\022\025\n\rer" + "ror_message\030\002 \001(\t*\245\001\n\024OpenChannelErrorCo" + "de\022\031\n\025kOpenChannelErrorNone\020\000\022\"\n\036kOpenCh" + "annelErrorNoSuchChannel\020\001\022)\n%kOpenChanne" + "lErrorChannelAlreadyOpened\020\002\022#\n\026kOpenCha" + "nnelErrorOther\020\377\377\377\377\377\377\377\377\377\001*P\n\022ChannelCont" + "entType\022\034\n\030kChannelContentTypeImage\020\000\022\034\n" + "\030kChannelContentTypeVideo\020\001*#\n\013ImageForm" + "at\022\024\n\020kImageFormatJpeg\020\000*\244\001\n\024PresentData" + "ErrorCode\022\031\n\025kPresentDataErrorNone\020\000\022$\n " + "kPresentDataErrorUnsupportedType\020\001\022&\n\"kP" + "resentDataErrorUnsupportedFormat\020\002\022#\n\026kP" + "resentDataErrorOther\020\377\377\377\377\377\377\377\377\377\001b\006proto3" + ; +static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_presenter_5fmessage_2eproto_deps[1] = { +}; +static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_presenter_5fmessage_2eproto_sccs[7] = { + &scc_info_Coordinate_presenter_5fmessage_2eproto.base, + &scc_info_HeartbeatMessage_presenter_5fmessage_2eproto.base, + &scc_info_OpenChannelRequest_presenter_5fmessage_2eproto.base, + &scc_info_OpenChannelResponse_presenter_5fmessage_2eproto.base, + &scc_info_PresentImageRequest_presenter_5fmessage_2eproto.base, + &scc_info_PresentImageResponse_presenter_5fmessage_2eproto.base, + &scc_info_Rectangle_Attr_presenter_5fmessage_2eproto.base, +}; +static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_presenter_5fmessage_2eproto_once; +static bool descriptor_table_presenter_5fmessage_2eproto_initialized = false; +const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_presenter_5fmessage_2eproto = { + &descriptor_table_presenter_5fmessage_2eproto_initialized, descriptor_table_protodef_presenter_5fmessage_2eproto, "presenter_message.proto", 1239, + &descriptor_table_presenter_5fmessage_2eproto_once, descriptor_table_presenter_5fmessage_2eproto_sccs, descriptor_table_presenter_5fmessage_2eproto_deps, 7, 0, + schemas, file_default_instances, TableStruct_presenter_5fmessage_2eproto::offsets, + file_level_metadata_presenter_5fmessage_2eproto, 7, file_level_enum_descriptors_presenter_5fmessage_2eproto, file_level_service_descriptors_presenter_5fmessage_2eproto, +}; + +// Force running AddDescriptors() at dynamic initialization time. +static bool dynamic_init_dummy_presenter_5fmessage_2eproto = ( ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_presenter_5fmessage_2eproto), true); +namespace ascend { +namespace presenter { +namespace proto { +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* OpenChannelErrorCode_descriptor() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_presenter_5fmessage_2eproto); + return file_level_enum_descriptors_presenter_5fmessage_2eproto[0]; +} +bool OpenChannelErrorCode_IsValid(int value) { + switch (value) { + case -1: + case 0: + case 1: + case 2: + return true; + default: + return false; + } +} + +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ChannelContentType_descriptor() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_presenter_5fmessage_2eproto); + return file_level_enum_descriptors_presenter_5fmessage_2eproto[1]; +} +bool ChannelContentType_IsValid(int value) { + switch (value) { + case 0: + case 1: + return true; + default: + return false; + } +} + +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ImageFormat_descriptor() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_presenter_5fmessage_2eproto); + return file_level_enum_descriptors_presenter_5fmessage_2eproto[2]; +} +bool ImageFormat_IsValid(int value) { + switch (value) { + case 0: + return true; + default: + return false; + } +} + +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* PresentDataErrorCode_descriptor() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_presenter_5fmessage_2eproto); + return file_level_enum_descriptors_presenter_5fmessage_2eproto[3]; +} +bool PresentDataErrorCode_IsValid(int value) { + switch (value) { + case -1: + case 0: + case 1: + case 2: + return true; + default: + return false; + } +} + + +// =================================================================== + +void OpenChannelRequest::InitAsDefaultInstance() { +} +class OpenChannelRequest::HasBitSetters { + public: +}; + +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int OpenChannelRequest::kChannelNameFieldNumber; +const int OpenChannelRequest::kContentTypeFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +OpenChannelRequest::OpenChannelRequest() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:ascend.presenter.proto.OpenChannelRequest) +} +OpenChannelRequest::OpenChannelRequest(const OpenChannelRequest& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + channel_name_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (from.channel_name().size() > 0) { + channel_name_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.channel_name_); + } + content_type_ = from.content_type_; + // @@protoc_insertion_point(copy_constructor:ascend.presenter.proto.OpenChannelRequest) +} + +void OpenChannelRequest::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_OpenChannelRequest_presenter_5fmessage_2eproto.base); + channel_name_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + content_type_ = 0; +} + +OpenChannelRequest::~OpenChannelRequest() { + // @@protoc_insertion_point(destructor:ascend.presenter.proto.OpenChannelRequest) + SharedDtor(); +} + +void OpenChannelRequest::SharedDtor() { + channel_name_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void OpenChannelRequest::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const OpenChannelRequest& OpenChannelRequest::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_OpenChannelRequest_presenter_5fmessage_2eproto.base); + return *internal_default_instance(); +} + + +void OpenChannelRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:ascend.presenter.proto.OpenChannelRequest) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + channel_name_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + content_type_ = 0; + _internal_metadata_.Clear(); +} + +#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +const char* OpenChannelRequest::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // string channel_name = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_channel_name(), ptr, ctx, "ascend.presenter.proto.OpenChannelRequest.channel_name"); + CHK_(ptr); + } else goto handle_unusual; + continue; + // .ascend.presenter.proto.ChannelContentType content_type = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 16)) { + ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + set_content_type(static_cast<::ascend::presenter::proto::ChannelContentType>(val)); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} +#else // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +bool OpenChannelRequest::MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + // @@protoc_insertion_point(parse_start:ascend.presenter.proto.OpenChannelRequest) + for (;;) { + ::std::pair<::PROTOBUF_NAMESPACE_ID::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // string channel_name = 1; + case 1: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (10 & 0xFF)) { + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadString( + input, this->mutable_channel_name())); + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->channel_name().data(), static_cast(this->channel_name().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, + "ascend.presenter.proto.OpenChannelRequest.channel_name")); + } else { + goto handle_unusual; + } + break; + } + + // .ascend.presenter.proto.ChannelContentType content_type = 2; + case 2: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) { + int value = 0; + DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive< + int, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + set_content_type(static_cast< ::ascend::presenter::proto::ChannelContentType >(value)); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SkipField( + input, tag, _internal_metadata_.mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:ascend.presenter.proto.OpenChannelRequest) + return true; +failure: + // @@protoc_insertion_point(parse_failure:ascend.presenter.proto.OpenChannelRequest) + return false; +#undef DO_ +} +#endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + +void OpenChannelRequest::SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:ascend.presenter.proto.OpenChannelRequest) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string channel_name = 1; + if (this->channel_name().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->channel_name().data(), static_cast(this->channel_name().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "ascend.presenter.proto.OpenChannelRequest.channel_name"); + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->channel_name(), output); + } + + // .ascend.presenter.proto.ChannelContentType content_type = 2; + if (this->content_type() != 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnum( + 2, this->content_type(), output); + } + + if (_internal_metadata_.have_unknown_fields()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( + _internal_metadata_.unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:ascend.presenter.proto.OpenChannelRequest) +} + +::PROTOBUF_NAMESPACE_ID::uint8* OpenChannelRequest::InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:ascend.presenter.proto.OpenChannelRequest) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string channel_name = 1; + if (this->channel_name().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->channel_name().data(), static_cast(this->channel_name().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "ascend.presenter.proto.OpenChannelRequest.channel_name"); + target = + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteStringToArray( + 1, this->channel_name(), target); + } + + // .ascend.presenter.proto.ChannelContentType content_type = 2; + if (this->content_type() != 0) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray( + 2, this->content_type(), target); + } + + if (_internal_metadata_.have_unknown_fields()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:ascend.presenter.proto.OpenChannelRequest) + return target; +} + +size_t OpenChannelRequest::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:ascend.presenter.proto.OpenChannelRequest) + size_t total_size = 0; + + if (_internal_metadata_.have_unknown_fields()) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::ComputeUnknownFieldsSize( + _internal_metadata_.unknown_fields()); + } + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string channel_name = 1; + if (this->channel_name().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->channel_name()); + } + + // .ascend.presenter.proto.ChannelContentType content_type = 2; + if (this->content_type() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->content_type()); + } + + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void OpenChannelRequest::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:ascend.presenter.proto.OpenChannelRequest) + GOOGLE_DCHECK_NE(&from, this); + const OpenChannelRequest* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:ascend.presenter.proto.OpenChannelRequest) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:ascend.presenter.proto.OpenChannelRequest) + MergeFrom(*source); + } +} + +void OpenChannelRequest::MergeFrom(const OpenChannelRequest& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:ascend.presenter.proto.OpenChannelRequest) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.channel_name().size() > 0) { + + channel_name_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.channel_name_); + } + if (from.content_type() != 0) { + set_content_type(from.content_type()); + } +} + +void OpenChannelRequest::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:ascend.presenter.proto.OpenChannelRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void OpenChannelRequest::CopyFrom(const OpenChannelRequest& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:ascend.presenter.proto.OpenChannelRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool OpenChannelRequest::IsInitialized() const { + return true; +} + +void OpenChannelRequest::Swap(OpenChannelRequest* other) { + if (other == this) return; + InternalSwap(other); +} +void OpenChannelRequest::InternalSwap(OpenChannelRequest* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + channel_name_.Swap(&other->channel_name_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(content_type_, other->content_type_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata OpenChannelRequest::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void OpenChannelResponse::InitAsDefaultInstance() { +} +class OpenChannelResponse::HasBitSetters { + public: +}; + +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int OpenChannelResponse::kErrorCodeFieldNumber; +const int OpenChannelResponse::kErrorMessageFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +OpenChannelResponse::OpenChannelResponse() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:ascend.presenter.proto.OpenChannelResponse) +} +OpenChannelResponse::OpenChannelResponse(const OpenChannelResponse& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + error_message_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (from.error_message().size() > 0) { + error_message_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.error_message_); + } + error_code_ = from.error_code_; + // @@protoc_insertion_point(copy_constructor:ascend.presenter.proto.OpenChannelResponse) +} + +void OpenChannelResponse::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_OpenChannelResponse_presenter_5fmessage_2eproto.base); + error_message_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + error_code_ = 0; +} + +OpenChannelResponse::~OpenChannelResponse() { + // @@protoc_insertion_point(destructor:ascend.presenter.proto.OpenChannelResponse) + SharedDtor(); +} + +void OpenChannelResponse::SharedDtor() { + error_message_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void OpenChannelResponse::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const OpenChannelResponse& OpenChannelResponse::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_OpenChannelResponse_presenter_5fmessage_2eproto.base); + return *internal_default_instance(); +} + + +void OpenChannelResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:ascend.presenter.proto.OpenChannelResponse) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + error_message_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + error_code_ = 0; + _internal_metadata_.Clear(); +} + +#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +const char* OpenChannelResponse::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // .ascend.presenter.proto.OpenChannelErrorCode error_code = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 8)) { + ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + set_error_code(static_cast<::ascend::presenter::proto::OpenChannelErrorCode>(val)); + } else goto handle_unusual; + continue; + // string error_message = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_error_message(), ptr, ctx, "ascend.presenter.proto.OpenChannelResponse.error_message"); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} +#else // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +bool OpenChannelResponse::MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + // @@protoc_insertion_point(parse_start:ascend.presenter.proto.OpenChannelResponse) + for (;;) { + ::std::pair<::PROTOBUF_NAMESPACE_ID::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // .ascend.presenter.proto.OpenChannelErrorCode error_code = 1; + case 1: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (8 & 0xFF)) { + int value = 0; + DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive< + int, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + set_error_code(static_cast< ::ascend::presenter::proto::OpenChannelErrorCode >(value)); + } else { + goto handle_unusual; + } + break; + } + + // string error_message = 2; + case 2: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (18 & 0xFF)) { + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadString( + input, this->mutable_error_message())); + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->error_message().data(), static_cast(this->error_message().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, + "ascend.presenter.proto.OpenChannelResponse.error_message")); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SkipField( + input, tag, _internal_metadata_.mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:ascend.presenter.proto.OpenChannelResponse) + return true; +failure: + // @@protoc_insertion_point(parse_failure:ascend.presenter.proto.OpenChannelResponse) + return false; +#undef DO_ +} +#endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + +void OpenChannelResponse::SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:ascend.presenter.proto.OpenChannelResponse) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .ascend.presenter.proto.OpenChannelErrorCode error_code = 1; + if (this->error_code() != 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnum( + 1, this->error_code(), output); + } + + // string error_message = 2; + if (this->error_message().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->error_message().data(), static_cast(this->error_message().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "ascend.presenter.proto.OpenChannelResponse.error_message"); + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->error_message(), output); + } + + if (_internal_metadata_.have_unknown_fields()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( + _internal_metadata_.unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:ascend.presenter.proto.OpenChannelResponse) +} + +::PROTOBUF_NAMESPACE_ID::uint8* OpenChannelResponse::InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:ascend.presenter.proto.OpenChannelResponse) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .ascend.presenter.proto.OpenChannelErrorCode error_code = 1; + if (this->error_code() != 0) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray( + 1, this->error_code(), target); + } + + // string error_message = 2; + if (this->error_message().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->error_message().data(), static_cast(this->error_message().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "ascend.presenter.proto.OpenChannelResponse.error_message"); + target = + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteStringToArray( + 2, this->error_message(), target); + } + + if (_internal_metadata_.have_unknown_fields()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:ascend.presenter.proto.OpenChannelResponse) + return target; +} + +size_t OpenChannelResponse::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:ascend.presenter.proto.OpenChannelResponse) + size_t total_size = 0; + + if (_internal_metadata_.have_unknown_fields()) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::ComputeUnknownFieldsSize( + _internal_metadata_.unknown_fields()); + } + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string error_message = 2; + if (this->error_message().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->error_message()); + } + + // .ascend.presenter.proto.OpenChannelErrorCode error_code = 1; + if (this->error_code() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->error_code()); + } + + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void OpenChannelResponse::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:ascend.presenter.proto.OpenChannelResponse) + GOOGLE_DCHECK_NE(&from, this); + const OpenChannelResponse* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:ascend.presenter.proto.OpenChannelResponse) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:ascend.presenter.proto.OpenChannelResponse) + MergeFrom(*source); + } +} + +void OpenChannelResponse::MergeFrom(const OpenChannelResponse& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:ascend.presenter.proto.OpenChannelResponse) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.error_message().size() > 0) { + + error_message_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.error_message_); + } + if (from.error_code() != 0) { + set_error_code(from.error_code()); + } +} + +void OpenChannelResponse::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:ascend.presenter.proto.OpenChannelResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void OpenChannelResponse::CopyFrom(const OpenChannelResponse& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:ascend.presenter.proto.OpenChannelResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool OpenChannelResponse::IsInitialized() const { + return true; +} + +void OpenChannelResponse::Swap(OpenChannelResponse* other) { + if (other == this) return; + InternalSwap(other); +} +void OpenChannelResponse::InternalSwap(OpenChannelResponse* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + error_message_.Swap(&other->error_message_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(error_code_, other->error_code_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata OpenChannelResponse::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void HeartbeatMessage::InitAsDefaultInstance() { +} +class HeartbeatMessage::HasBitSetters { + public: +}; + +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +HeartbeatMessage::HeartbeatMessage() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:ascend.presenter.proto.HeartbeatMessage) +} +HeartbeatMessage::HeartbeatMessage(const HeartbeatMessage& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + // @@protoc_insertion_point(copy_constructor:ascend.presenter.proto.HeartbeatMessage) +} + +void HeartbeatMessage::SharedCtor() { +} + +HeartbeatMessage::~HeartbeatMessage() { + // @@protoc_insertion_point(destructor:ascend.presenter.proto.HeartbeatMessage) + SharedDtor(); +} + +void HeartbeatMessage::SharedDtor() { +} + +void HeartbeatMessage::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const HeartbeatMessage& HeartbeatMessage::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_HeartbeatMessage_presenter_5fmessage_2eproto.base); + return *internal_default_instance(); +} + + +void HeartbeatMessage::Clear() { +// @@protoc_insertion_point(message_clear_start:ascend.presenter.proto.HeartbeatMessage) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + _internal_metadata_.Clear(); +} + +#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +const char* HeartbeatMessage::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + default: { + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} +#else // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +bool HeartbeatMessage::MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + // @@protoc_insertion_point(parse_start:ascend.presenter.proto.HeartbeatMessage) + for (;;) { + ::std::pair<::PROTOBUF_NAMESPACE_ID::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SkipField( + input, tag, _internal_metadata_.mutable_unknown_fields())); + } +success: + // @@protoc_insertion_point(parse_success:ascend.presenter.proto.HeartbeatMessage) + return true; +failure: + // @@protoc_insertion_point(parse_failure:ascend.presenter.proto.HeartbeatMessage) + return false; +#undef DO_ +} +#endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + +void HeartbeatMessage::SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:ascend.presenter.proto.HeartbeatMessage) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (_internal_metadata_.have_unknown_fields()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( + _internal_metadata_.unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:ascend.presenter.proto.HeartbeatMessage) +} + +::PROTOBUF_NAMESPACE_ID::uint8* HeartbeatMessage::InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:ascend.presenter.proto.HeartbeatMessage) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (_internal_metadata_.have_unknown_fields()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:ascend.presenter.proto.HeartbeatMessage) + return target; +} + +size_t HeartbeatMessage::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:ascend.presenter.proto.HeartbeatMessage) + size_t total_size = 0; + + if (_internal_metadata_.have_unknown_fields()) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::ComputeUnknownFieldsSize( + _internal_metadata_.unknown_fields()); + } + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void HeartbeatMessage::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:ascend.presenter.proto.HeartbeatMessage) + GOOGLE_DCHECK_NE(&from, this); + const HeartbeatMessage* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:ascend.presenter.proto.HeartbeatMessage) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:ascend.presenter.proto.HeartbeatMessage) + MergeFrom(*source); + } +} + +void HeartbeatMessage::MergeFrom(const HeartbeatMessage& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:ascend.presenter.proto.HeartbeatMessage) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + +} + +void HeartbeatMessage::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:ascend.presenter.proto.HeartbeatMessage) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void HeartbeatMessage::CopyFrom(const HeartbeatMessage& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:ascend.presenter.proto.HeartbeatMessage) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool HeartbeatMessage::IsInitialized() const { + return true; +} + +void HeartbeatMessage::Swap(HeartbeatMessage* other) { + if (other == this) return; + InternalSwap(other); +} +void HeartbeatMessage::InternalSwap(HeartbeatMessage* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata HeartbeatMessage::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void Coordinate::InitAsDefaultInstance() { +} +class Coordinate::HasBitSetters { + public: +}; + +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int Coordinate::kXFieldNumber; +const int Coordinate::kYFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +Coordinate::Coordinate() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:ascend.presenter.proto.Coordinate) +} +Coordinate::Coordinate(const Coordinate& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::memcpy(&x_, &from.x_, + static_cast(reinterpret_cast(&y_) - + reinterpret_cast(&x_)) + sizeof(y_)); + // @@protoc_insertion_point(copy_constructor:ascend.presenter.proto.Coordinate) +} + +void Coordinate::SharedCtor() { + ::memset(&x_, 0, static_cast( + reinterpret_cast(&y_) - + reinterpret_cast(&x_)) + sizeof(y_)); +} + +Coordinate::~Coordinate() { + // @@protoc_insertion_point(destructor:ascend.presenter.proto.Coordinate) + SharedDtor(); +} + +void Coordinate::SharedDtor() { +} + +void Coordinate::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const Coordinate& Coordinate::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_Coordinate_presenter_5fmessage_2eproto.base); + return *internal_default_instance(); +} + + +void Coordinate::Clear() { +// @@protoc_insertion_point(message_clear_start:ascend.presenter.proto.Coordinate) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + ::memset(&x_, 0, static_cast( + reinterpret_cast(&y_) - + reinterpret_cast(&x_)) + sizeof(y_)); + _internal_metadata_.Clear(); +} + +#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +const char* Coordinate::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // uint32 x = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 8)) { + x_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // uint32 y = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 16)) { + y_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} +#else // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +bool Coordinate::MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + // @@protoc_insertion_point(parse_start:ascend.presenter.proto.Coordinate) + for (;;) { + ::std::pair<::PROTOBUF_NAMESPACE_ID::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // uint32 x = 1; + case 1: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (8 & 0xFF)) { + + DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive< + ::PROTOBUF_NAMESPACE_ID::uint32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT32>( + input, &x_))); + } else { + goto handle_unusual; + } + break; + } + + // uint32 y = 2; + case 2: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) { + + DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive< + ::PROTOBUF_NAMESPACE_ID::uint32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT32>( + input, &y_))); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SkipField( + input, tag, _internal_metadata_.mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:ascend.presenter.proto.Coordinate) + return true; +failure: + // @@protoc_insertion_point(parse_failure:ascend.presenter.proto.Coordinate) + return false; +#undef DO_ +} +#endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + +void Coordinate::SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:ascend.presenter.proto.Coordinate) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // uint32 x = 1; + if (this->x() != 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt32(1, this->x(), output); + } + + // uint32 y = 2; + if (this->y() != 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt32(2, this->y(), output); + } + + if (_internal_metadata_.have_unknown_fields()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( + _internal_metadata_.unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:ascend.presenter.proto.Coordinate) +} + +::PROTOBUF_NAMESPACE_ID::uint8* Coordinate::InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:ascend.presenter.proto.Coordinate) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // uint32 x = 1; + if (this->x() != 0) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt32ToArray(1, this->x(), target); + } + + // uint32 y = 2; + if (this->y() != 0) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt32ToArray(2, this->y(), target); + } + + if (_internal_metadata_.have_unknown_fields()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:ascend.presenter.proto.Coordinate) + return target; +} + +size_t Coordinate::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:ascend.presenter.proto.Coordinate) + size_t total_size = 0; + + if (_internal_metadata_.have_unknown_fields()) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::ComputeUnknownFieldsSize( + _internal_metadata_.unknown_fields()); + } + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // uint32 x = 1; + if (this->x() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt32Size( + this->x()); + } + + // uint32 y = 2; + if (this->y() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt32Size( + this->y()); + } + + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void Coordinate::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:ascend.presenter.proto.Coordinate) + GOOGLE_DCHECK_NE(&from, this); + const Coordinate* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:ascend.presenter.proto.Coordinate) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:ascend.presenter.proto.Coordinate) + MergeFrom(*source); + } +} + +void Coordinate::MergeFrom(const Coordinate& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:ascend.presenter.proto.Coordinate) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.x() != 0) { + set_x(from.x()); + } + if (from.y() != 0) { + set_y(from.y()); + } +} + +void Coordinate::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:ascend.presenter.proto.Coordinate) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Coordinate::CopyFrom(const Coordinate& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:ascend.presenter.proto.Coordinate) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Coordinate::IsInitialized() const { + return true; +} + +void Coordinate::Swap(Coordinate* other) { + if (other == this) return; + InternalSwap(other); +} +void Coordinate::InternalSwap(Coordinate* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + swap(x_, other->x_); + swap(y_, other->y_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata Coordinate::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void Rectangle_Attr::InitAsDefaultInstance() { + ::ascend::presenter::proto::_Rectangle_Attr_default_instance_._instance.get_mutable()->left_top_ = const_cast< ::ascend::presenter::proto::Coordinate*>( + ::ascend::presenter::proto::Coordinate::internal_default_instance()); + ::ascend::presenter::proto::_Rectangle_Attr_default_instance_._instance.get_mutable()->right_bottom_ = const_cast< ::ascend::presenter::proto::Coordinate*>( + ::ascend::presenter::proto::Coordinate::internal_default_instance()); +} +class Rectangle_Attr::HasBitSetters { + public: + static const ::ascend::presenter::proto::Coordinate& left_top(const Rectangle_Attr* msg); + static const ::ascend::presenter::proto::Coordinate& right_bottom(const Rectangle_Attr* msg); +}; + +const ::ascend::presenter::proto::Coordinate& +Rectangle_Attr::HasBitSetters::left_top(const Rectangle_Attr* msg) { + return *msg->left_top_; +} +const ::ascend::presenter::proto::Coordinate& +Rectangle_Attr::HasBitSetters::right_bottom(const Rectangle_Attr* msg) { + return *msg->right_bottom_; +} +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int Rectangle_Attr::kLeftTopFieldNumber; +const int Rectangle_Attr::kRightBottomFieldNumber; +const int Rectangle_Attr::kLabelTextFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +Rectangle_Attr::Rectangle_Attr() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:ascend.presenter.proto.Rectangle_Attr) +} +Rectangle_Attr::Rectangle_Attr(const Rectangle_Attr& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + label_text_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (from.label_text().size() > 0) { + label_text_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.label_text_); + } + if (from.has_left_top()) { + left_top_ = new ::ascend::presenter::proto::Coordinate(*from.left_top_); + } else { + left_top_ = nullptr; + } + if (from.has_right_bottom()) { + right_bottom_ = new ::ascend::presenter::proto::Coordinate(*from.right_bottom_); + } else { + right_bottom_ = nullptr; + } + // @@protoc_insertion_point(copy_constructor:ascend.presenter.proto.Rectangle_Attr) +} + +void Rectangle_Attr::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Rectangle_Attr_presenter_5fmessage_2eproto.base); + label_text_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + ::memset(&left_top_, 0, static_cast( + reinterpret_cast(&right_bottom_) - + reinterpret_cast(&left_top_)) + sizeof(right_bottom_)); +} + +Rectangle_Attr::~Rectangle_Attr() { + // @@protoc_insertion_point(destructor:ascend.presenter.proto.Rectangle_Attr) + SharedDtor(); +} + +void Rectangle_Attr::SharedDtor() { + label_text_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (this != internal_default_instance()) delete left_top_; + if (this != internal_default_instance()) delete right_bottom_; +} + +void Rectangle_Attr::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const Rectangle_Attr& Rectangle_Attr::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_Rectangle_Attr_presenter_5fmessage_2eproto.base); + return *internal_default_instance(); +} + + +void Rectangle_Attr::Clear() { +// @@protoc_insertion_point(message_clear_start:ascend.presenter.proto.Rectangle_Attr) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + label_text_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (GetArenaNoVirtual() == nullptr && left_top_ != nullptr) { + delete left_top_; + } + left_top_ = nullptr; + if (GetArenaNoVirtual() == nullptr && right_bottom_ != nullptr) { + delete right_bottom_; + } + right_bottom_ = nullptr; + _internal_metadata_.Clear(); +} + +#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +const char* Rectangle_Attr::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // .ascend.presenter.proto.Coordinate left_top = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) { + ptr = ctx->ParseMessage(mutable_left_top(), ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // .ascend.presenter.proto.Coordinate right_bottom = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr = ctx->ParseMessage(mutable_right_bottom(), ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // string label_text = 3; + case 3: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 26)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_label_text(), ptr, ctx, "ascend.presenter.proto.Rectangle_Attr.label_text"); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} +#else // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +bool Rectangle_Attr::MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + // @@protoc_insertion_point(parse_start:ascend.presenter.proto.Rectangle_Attr) + for (;;) { + ::std::pair<::PROTOBUF_NAMESPACE_ID::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // .ascend.presenter.proto.Coordinate left_top = 1; + case 1: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (10 & 0xFF)) { + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadMessage( + input, mutable_left_top())); + } else { + goto handle_unusual; + } + break; + } + + // .ascend.presenter.proto.Coordinate right_bottom = 2; + case 2: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (18 & 0xFF)) { + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadMessage( + input, mutable_right_bottom())); + } else { + goto handle_unusual; + } + break; + } + + // string label_text = 3; + case 3: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (26 & 0xFF)) { + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadString( + input, this->mutable_label_text())); + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->label_text().data(), static_cast(this->label_text().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, + "ascend.presenter.proto.Rectangle_Attr.label_text")); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SkipField( + input, tag, _internal_metadata_.mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:ascend.presenter.proto.Rectangle_Attr) + return true; +failure: + // @@protoc_insertion_point(parse_failure:ascend.presenter.proto.Rectangle_Attr) + return false; +#undef DO_ +} +#endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + +void Rectangle_Attr::SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:ascend.presenter.proto.Rectangle_Attr) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .ascend.presenter.proto.Coordinate left_top = 1; + if (this->has_left_top()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, HasBitSetters::left_top(this), output); + } + + // .ascend.presenter.proto.Coordinate right_bottom = 2; + if (this->has_right_bottom()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, HasBitSetters::right_bottom(this), output); + } + + // string label_text = 3; + if (this->label_text().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->label_text().data(), static_cast(this->label_text().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "ascend.presenter.proto.Rectangle_Attr.label_text"); + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteStringMaybeAliased( + 3, this->label_text(), output); + } + + if (_internal_metadata_.have_unknown_fields()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( + _internal_metadata_.unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:ascend.presenter.proto.Rectangle_Attr) +} + +::PROTOBUF_NAMESPACE_ID::uint8* Rectangle_Attr::InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:ascend.presenter.proto.Rectangle_Attr) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .ascend.presenter.proto.Coordinate left_top = 1; + if (this->has_left_top()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessageToArray( + 1, HasBitSetters::left_top(this), target); + } + + // .ascend.presenter.proto.Coordinate right_bottom = 2; + if (this->has_right_bottom()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessageToArray( + 2, HasBitSetters::right_bottom(this), target); + } + + // string label_text = 3; + if (this->label_text().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->label_text().data(), static_cast(this->label_text().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "ascend.presenter.proto.Rectangle_Attr.label_text"); + target = + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteStringToArray( + 3, this->label_text(), target); + } + + if (_internal_metadata_.have_unknown_fields()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:ascend.presenter.proto.Rectangle_Attr) + return target; +} + +size_t Rectangle_Attr::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:ascend.presenter.proto.Rectangle_Attr) + size_t total_size = 0; + + if (_internal_metadata_.have_unknown_fields()) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::ComputeUnknownFieldsSize( + _internal_metadata_.unknown_fields()); + } + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string label_text = 3; + if (this->label_text().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->label_text()); + } + + // .ascend.presenter.proto.Coordinate left_top = 1; + if (this->has_left_top()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *left_top_); + } + + // .ascend.presenter.proto.Coordinate right_bottom = 2; + if (this->has_right_bottom()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + *right_bottom_); + } + + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void Rectangle_Attr::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:ascend.presenter.proto.Rectangle_Attr) + GOOGLE_DCHECK_NE(&from, this); + const Rectangle_Attr* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:ascend.presenter.proto.Rectangle_Attr) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:ascend.presenter.proto.Rectangle_Attr) + MergeFrom(*source); + } +} + +void Rectangle_Attr::MergeFrom(const Rectangle_Attr& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:ascend.presenter.proto.Rectangle_Attr) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.label_text().size() > 0) { + + label_text_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.label_text_); + } + if (from.has_left_top()) { + mutable_left_top()->::ascend::presenter::proto::Coordinate::MergeFrom(from.left_top()); + } + if (from.has_right_bottom()) { + mutable_right_bottom()->::ascend::presenter::proto::Coordinate::MergeFrom(from.right_bottom()); + } +} + +void Rectangle_Attr::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:ascend.presenter.proto.Rectangle_Attr) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void Rectangle_Attr::CopyFrom(const Rectangle_Attr& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:ascend.presenter.proto.Rectangle_Attr) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool Rectangle_Attr::IsInitialized() const { + return true; +} + +void Rectangle_Attr::Swap(Rectangle_Attr* other) { + if (other == this) return; + InternalSwap(other); +} +void Rectangle_Attr::InternalSwap(Rectangle_Attr* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + label_text_.Swap(&other->label_text_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(left_top_, other->left_top_); + swap(right_bottom_, other->right_bottom_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata Rectangle_Attr::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void PresentImageRequest::InitAsDefaultInstance() { +} +class PresentImageRequest::HasBitSetters { + public: +}; + +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int PresentImageRequest::kFormatFieldNumber; +const int PresentImageRequest::kWidthFieldNumber; +const int PresentImageRequest::kHeightFieldNumber; +const int PresentImageRequest::kDataFieldNumber; +const int PresentImageRequest::kRectangleListFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +PresentImageRequest::PresentImageRequest() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:ascend.presenter.proto.PresentImageRequest) +} +PresentImageRequest::PresentImageRequest(const PresentImageRequest& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr), + rectangle_list_(from.rectangle_list_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + data_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (from.data().size() > 0) { + data_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.data_); + } + ::memcpy(&format_, &from.format_, + static_cast(reinterpret_cast(&height_) - + reinterpret_cast(&format_)) + sizeof(height_)); + // @@protoc_insertion_point(copy_constructor:ascend.presenter.proto.PresentImageRequest) +} + +void PresentImageRequest::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_PresentImageRequest_presenter_5fmessage_2eproto.base); + data_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + ::memset(&format_, 0, static_cast( + reinterpret_cast(&height_) - + reinterpret_cast(&format_)) + sizeof(height_)); +} + +PresentImageRequest::~PresentImageRequest() { + // @@protoc_insertion_point(destructor:ascend.presenter.proto.PresentImageRequest) + SharedDtor(); +} + +void PresentImageRequest::SharedDtor() { + data_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void PresentImageRequest::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const PresentImageRequest& PresentImageRequest::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_PresentImageRequest_presenter_5fmessage_2eproto.base); + return *internal_default_instance(); +} + + +void PresentImageRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:ascend.presenter.proto.PresentImageRequest) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + rectangle_list_.Clear(); + data_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + ::memset(&format_, 0, static_cast( + reinterpret_cast(&height_) - + reinterpret_cast(&format_)) + sizeof(height_)); + _internal_metadata_.Clear(); +} + +#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +const char* PresentImageRequest::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // .ascend.presenter.proto.ImageFormat format = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 8)) { + ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + set_format(static_cast<::ascend::presenter::proto::ImageFormat>(val)); + } else goto handle_unusual; + continue; + // uint32 width = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 16)) { + width_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // uint32 height = 3; + case 3: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 24)) { + height_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; + // bytes data = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 34)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(mutable_data(), ptr, ctx); + CHK_(ptr); + } else goto handle_unusual; + continue; + // repeated .ascend.presenter.proto.Rectangle_Attr rectangle_list = 5; + case 5: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 42)) { + ptr -= 1; + do { + ptr += 1; + ptr = ctx->ParseMessage(add_rectangle_list(), ptr); + CHK_(ptr); + if (!ctx->DataAvailable(ptr)) break; + } while (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) == 42); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} +#else // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +bool PresentImageRequest::MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + // @@protoc_insertion_point(parse_start:ascend.presenter.proto.PresentImageRequest) + for (;;) { + ::std::pair<::PROTOBUF_NAMESPACE_ID::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // .ascend.presenter.proto.ImageFormat format = 1; + case 1: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (8 & 0xFF)) { + int value = 0; + DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive< + int, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + set_format(static_cast< ::ascend::presenter::proto::ImageFormat >(value)); + } else { + goto handle_unusual; + } + break; + } + + // uint32 width = 2; + case 2: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) { + + DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive< + ::PROTOBUF_NAMESPACE_ID::uint32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT32>( + input, &width_))); + } else { + goto handle_unusual; + } + break; + } + + // uint32 height = 3; + case 3: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (24 & 0xFF)) { + + DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive< + ::PROTOBUF_NAMESPACE_ID::uint32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT32>( + input, &height_))); + } else { + goto handle_unusual; + } + break; + } + + // bytes data = 4; + case 4: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (34 & 0xFF)) { + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadBytes( + input, this->mutable_data())); + } else { + goto handle_unusual; + } + break; + } + + // repeated .ascend.presenter.proto.Rectangle_Attr rectangle_list = 5; + case 5: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (42 & 0xFF)) { + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadMessage( + input, add_rectangle_list())); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SkipField( + input, tag, _internal_metadata_.mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:ascend.presenter.proto.PresentImageRequest) + return true; +failure: + // @@protoc_insertion_point(parse_failure:ascend.presenter.proto.PresentImageRequest) + return false; +#undef DO_ +} +#endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + +void PresentImageRequest::SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:ascend.presenter.proto.PresentImageRequest) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .ascend.presenter.proto.ImageFormat format = 1; + if (this->format() != 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnum( + 1, this->format(), output); + } + + // uint32 width = 2; + if (this->width() != 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt32(2, this->width(), output); + } + + // uint32 height = 3; + if (this->height() != 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt32(3, this->height(), output); + } + + // bytes data = 4; + if (this->data().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteBytesMaybeAliased( + 4, this->data(), output); + } + + // repeated .ascend.presenter.proto.Rectangle_Attr rectangle_list = 5; + for (unsigned int i = 0, + n = static_cast(this->rectangle_list_size()); i < n; i++) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteMessageMaybeToArray( + 5, + this->rectangle_list(static_cast(i)), + output); + } + + if (_internal_metadata_.have_unknown_fields()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( + _internal_metadata_.unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:ascend.presenter.proto.PresentImageRequest) +} + +::PROTOBUF_NAMESPACE_ID::uint8* PresentImageRequest::InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:ascend.presenter.proto.PresentImageRequest) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .ascend.presenter.proto.ImageFormat format = 1; + if (this->format() != 0) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray( + 1, this->format(), target); + } + + // uint32 width = 2; + if (this->width() != 0) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt32ToArray(2, this->width(), target); + } + + // uint32 height = 3; + if (this->height() != 0) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt32ToArray(3, this->height(), target); + } + + // bytes data = 4; + if (this->data().size() > 0) { + target = + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteBytesToArray( + 4, this->data(), target); + } + + // repeated .ascend.presenter.proto.Rectangle_Attr rectangle_list = 5; + for (unsigned int i = 0, + n = static_cast(this->rectangle_list_size()); i < n; i++) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: + InternalWriteMessageToArray( + 5, this->rectangle_list(static_cast(i)), target); + } + + if (_internal_metadata_.have_unknown_fields()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:ascend.presenter.proto.PresentImageRequest) + return target; +} + +size_t PresentImageRequest::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:ascend.presenter.proto.PresentImageRequest) + size_t total_size = 0; + + if (_internal_metadata_.have_unknown_fields()) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::ComputeUnknownFieldsSize( + _internal_metadata_.unknown_fields()); + } + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // repeated .ascend.presenter.proto.Rectangle_Attr rectangle_list = 5; + { + unsigned int count = static_cast(this->rectangle_list_size()); + total_size += 1UL * count; + for (unsigned int i = 0; i < count; i++) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( + this->rectangle_list(static_cast(i))); + } + } + + // bytes data = 4; + if (this->data().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::BytesSize( + this->data()); + } + + // .ascend.presenter.proto.ImageFormat format = 1; + if (this->format() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->format()); + } + + // uint32 width = 2; + if (this->width() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt32Size( + this->width()); + } + + // uint32 height = 3; + if (this->height() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt32Size( + this->height()); + } + + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void PresentImageRequest::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:ascend.presenter.proto.PresentImageRequest) + GOOGLE_DCHECK_NE(&from, this); + const PresentImageRequest* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:ascend.presenter.proto.PresentImageRequest) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:ascend.presenter.proto.PresentImageRequest) + MergeFrom(*source); + } +} + +void PresentImageRequest::MergeFrom(const PresentImageRequest& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:ascend.presenter.proto.PresentImageRequest) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + rectangle_list_.MergeFrom(from.rectangle_list_); + if (from.data().size() > 0) { + + data_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.data_); + } + if (from.format() != 0) { + set_format(from.format()); + } + if (from.width() != 0) { + set_width(from.width()); + } + if (from.height() != 0) { + set_height(from.height()); + } +} + +void PresentImageRequest::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:ascend.presenter.proto.PresentImageRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void PresentImageRequest::CopyFrom(const PresentImageRequest& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:ascend.presenter.proto.PresentImageRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool PresentImageRequest::IsInitialized() const { + return true; +} + +void PresentImageRequest::Swap(PresentImageRequest* other) { + if (other == this) return; + InternalSwap(other); +} +void PresentImageRequest::InternalSwap(PresentImageRequest* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + CastToBase(&rectangle_list_)->InternalSwap(CastToBase(&other->rectangle_list_)); + data_.Swap(&other->data_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(format_, other->format_); + swap(width_, other->width_); + swap(height_, other->height_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata PresentImageRequest::GetMetadata() const { + return GetMetadataStatic(); +} + + +// =================================================================== + +void PresentImageResponse::InitAsDefaultInstance() { +} +class PresentImageResponse::HasBitSetters { + public: +}; + +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int PresentImageResponse::kErrorCodeFieldNumber; +const int PresentImageResponse::kErrorMessageFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +PresentImageResponse::PresentImageResponse() + : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) { + SharedCtor(); + // @@protoc_insertion_point(constructor:ascend.presenter.proto.PresentImageResponse) +} +PresentImageResponse::PresentImageResponse(const PresentImageResponse& from) + : ::PROTOBUF_NAMESPACE_ID::Message(), + _internal_metadata_(nullptr) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + error_message_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + if (from.error_message().size() > 0) { + error_message_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.error_message_); + } + error_code_ = from.error_code_; + // @@protoc_insertion_point(copy_constructor:ascend.presenter.proto.PresentImageResponse) +} + +void PresentImageResponse::SharedCtor() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_PresentImageResponse_presenter_5fmessage_2eproto.base); + error_message_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + error_code_ = 0; +} + +PresentImageResponse::~PresentImageResponse() { + // @@protoc_insertion_point(destructor:ascend.presenter.proto.PresentImageResponse) + SharedDtor(); +} + +void PresentImageResponse::SharedDtor() { + error_message_.DestroyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} + +void PresentImageResponse::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const PresentImageResponse& PresentImageResponse::default_instance() { + ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_PresentImageResponse_presenter_5fmessage_2eproto.base); + return *internal_default_instance(); +} + + +void PresentImageResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:ascend.presenter.proto.PresentImageResponse) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + error_message_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); + error_code_ = 0; + _internal_metadata_.Clear(); +} + +#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +const char* PresentImageResponse::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) { +#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure + while (!ctx->Done(&ptr)) { + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag); + CHK_(ptr); + switch (tag >> 3) { + // .ascend.presenter.proto.PresentDataErrorCode error_code = 1; + case 1: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 8)) { + ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + set_error_code(static_cast<::ascend::presenter::proto::PresentDataErrorCode>(val)); + } else goto handle_unusual; + continue; + // string error_message = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18)) { + ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_error_message(), ptr, ctx, "ascend.presenter.proto.PresentImageResponse.error_message"); + CHK_(ptr); + } else goto handle_unusual; + continue; + default: { + handle_unusual: + if ((tag & 7) == 4 || tag == 0) { + ctx->SetLastTag(tag); + goto success; + } + ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx); + CHK_(ptr != nullptr); + continue; + } + } // switch + } // while +success: + return ptr; +failure: + ptr = nullptr; + goto success; +#undef CHK_ +} +#else // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER +bool PresentImageResponse::MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure + ::PROTOBUF_NAMESPACE_ID::uint32 tag; + // @@protoc_insertion_point(parse_start:ascend.presenter.proto.PresentImageResponse) + for (;;) { + ::std::pair<::PROTOBUF_NAMESPACE_ID::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // .ascend.presenter.proto.PresentDataErrorCode error_code = 1; + case 1: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (8 & 0xFF)) { + int value = 0; + DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive< + int, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + set_error_code(static_cast< ::ascend::presenter::proto::PresentDataErrorCode >(value)); + } else { + goto handle_unusual; + } + break; + } + + // string error_message = 2; + case 2: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (18 & 0xFF)) { + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadString( + input, this->mutable_error_message())); + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->error_message().data(), static_cast(this->error_message().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, + "ascend.presenter.proto.PresentImageResponse.error_message")); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SkipField( + input, tag, _internal_metadata_.mutable_unknown_fields())); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:ascend.presenter.proto.PresentImageResponse) + return true; +failure: + // @@protoc_insertion_point(parse_failure:ascend.presenter.proto.PresentImageResponse) + return false; +#undef DO_ +} +#endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + +void PresentImageResponse::SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:ascend.presenter.proto.PresentImageResponse) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .ascend.presenter.proto.PresentDataErrorCode error_code = 1; + if (this->error_code() != 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnum( + 1, this->error_code(), output); + } + + // string error_message = 2; + if (this->error_message().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->error_message().data(), static_cast(this->error_message().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "ascend.presenter.proto.PresentImageResponse.error_message"); + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteStringMaybeAliased( + 2, this->error_message(), output); + } + + if (_internal_metadata_.have_unknown_fields()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( + _internal_metadata_.unknown_fields(), output); + } + // @@protoc_insertion_point(serialize_end:ascend.presenter.proto.PresentImageResponse) +} + +::PROTOBUF_NAMESPACE_ID::uint8* PresentImageResponse::InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const { + // @@protoc_insertion_point(serialize_to_array_start:ascend.presenter.proto.PresentImageResponse) + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // .ascend.presenter.proto.PresentDataErrorCode error_code = 1; + if (this->error_code() != 0) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteEnumToArray( + 1, this->error_code(), target); + } + + // string error_message = 2; + if (this->error_message().size() > 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->error_message().data(), static_cast(this->error_message().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "ascend.presenter.proto.PresentImageResponse.error_message"); + target = + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteStringToArray( + 2, this->error_message(), target); + } + + if (_internal_metadata_.have_unknown_fields()) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( + _internal_metadata_.unknown_fields(), target); + } + // @@protoc_insertion_point(serialize_to_array_end:ascend.presenter.proto.PresentImageResponse) + return target; +} + +size_t PresentImageResponse::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:ascend.presenter.proto.PresentImageResponse) + size_t total_size = 0; + + if (_internal_metadata_.have_unknown_fields()) { + total_size += + ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::ComputeUnknownFieldsSize( + _internal_metadata_.unknown_fields()); + } + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + // string error_message = 2; + if (this->error_message().size() > 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->error_message()); + } + + // .ascend.presenter.proto.PresentDataErrorCode error_code = 1; + if (this->error_code() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::EnumSize(this->error_code()); + } + + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void PresentImageResponse::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_merge_from_start:ascend.presenter.proto.PresentImageResponse) + GOOGLE_DCHECK_NE(&from, this); + const PresentImageResponse* source = + ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated( + &from); + if (source == nullptr) { + // @@protoc_insertion_point(generalized_merge_from_cast_fail:ascend.presenter.proto.PresentImageResponse) + ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this); + } else { + // @@protoc_insertion_point(generalized_merge_from_cast_success:ascend.presenter.proto.PresentImageResponse) + MergeFrom(*source); + } +} + +void PresentImageResponse::MergeFrom(const PresentImageResponse& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:ascend.presenter.proto.PresentImageResponse) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.error_message().size() > 0) { + + error_message_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.error_message_); + } + if (from.error_code() != 0) { + set_error_code(from.error_code()); + } +} + +void PresentImageResponse::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { +// @@protoc_insertion_point(generalized_copy_from_start:ascend.presenter.proto.PresentImageResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void PresentImageResponse::CopyFrom(const PresentImageResponse& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:ascend.presenter.proto.PresentImageResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool PresentImageResponse::IsInitialized() const { + return true; +} + +void PresentImageResponse::Swap(PresentImageResponse* other) { + if (other == this) return; + InternalSwap(other); +} +void PresentImageResponse::InternalSwap(PresentImageResponse* other) { + using std::swap; + _internal_metadata_.Swap(&other->_internal_metadata_); + error_message_.Swap(&other->error_message_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(error_code_, other->error_code_); +} + +::PROTOBUF_NAMESPACE_ID::Metadata PresentImageResponse::GetMetadata() const { + return GetMetadataStatic(); +} + + +// @@protoc_insertion_point(namespace_scope) +} // namespace proto +} // namespace presenter +} // namespace ascend +PROTOBUF_NAMESPACE_OPEN +template<> PROTOBUF_NOINLINE ::ascend::presenter::proto::OpenChannelRequest* Arena::CreateMaybeMessage< ::ascend::presenter::proto::OpenChannelRequest >(Arena* arena) { + return Arena::CreateInternal< ::ascend::presenter::proto::OpenChannelRequest >(arena); +} +template<> PROTOBUF_NOINLINE ::ascend::presenter::proto::OpenChannelResponse* Arena::CreateMaybeMessage< ::ascend::presenter::proto::OpenChannelResponse >(Arena* arena) { + return Arena::CreateInternal< ::ascend::presenter::proto::OpenChannelResponse >(arena); +} +template<> PROTOBUF_NOINLINE ::ascend::presenter::proto::HeartbeatMessage* Arena::CreateMaybeMessage< ::ascend::presenter::proto::HeartbeatMessage >(Arena* arena) { + return Arena::CreateInternal< ::ascend::presenter::proto::HeartbeatMessage >(arena); +} +template<> PROTOBUF_NOINLINE ::ascend::presenter::proto::Coordinate* Arena::CreateMaybeMessage< ::ascend::presenter::proto::Coordinate >(Arena* arena) { + return Arena::CreateInternal< ::ascend::presenter::proto::Coordinate >(arena); +} +template<> PROTOBUF_NOINLINE ::ascend::presenter::proto::Rectangle_Attr* Arena::CreateMaybeMessage< ::ascend::presenter::proto::Rectangle_Attr >(Arena* arena) { + return Arena::CreateInternal< ::ascend::presenter::proto::Rectangle_Attr >(arena); +} +template<> PROTOBUF_NOINLINE ::ascend::presenter::proto::PresentImageRequest* Arena::CreateMaybeMessage< ::ascend::presenter::proto::PresentImageRequest >(Arena* arena) { + return Arena::CreateInternal< ::ascend::presenter::proto::PresentImageRequest >(arena); +} +template<> PROTOBUF_NOINLINE ::ascend::presenter::proto::PresentImageResponse* Arena::CreateMaybeMessage< ::ascend::presenter::proto::PresentImageResponse >(Arena* arena) { + return Arena::CreateInternal< ::ascend::presenter::proto::PresentImageResponse >(arena); +} +PROTOBUF_NAMESPACE_CLOSE + +// @@protoc_insertion_point(global_scope) +#include diff --git a/cplusplus/common/presenteragent/proto/presenter_message.pb.h b/cplusplus/common/presenteragent/proto/presenter_message.pb.h new file mode 100644 index 0000000..4da3151 --- /dev/null +++ b/cplusplus/common/presenteragent/proto/presenter_message.pb.h @@ -0,0 +1,1772 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: presenter_message.proto + +#ifndef GOOGLE_PROTOBUF_INCLUDED_presenter_5fmessage_2eproto +#define GOOGLE_PROTOBUF_INCLUDED_presenter_5fmessage_2eproto + +#include +#include + +#include +#if PROTOBUF_VERSION < 3008000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 3008000 < PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // IWYU pragma: export +#include // IWYU pragma: export +#include +#include +// @@protoc_insertion_point(includes) +#include +#define PROTOBUF_INTERNAL_EXPORT_presenter_5fmessage_2eproto +PROTOBUF_NAMESPACE_OPEN +namespace internal { +class AnyMetadata; +} // namespace internal +PROTOBUF_NAMESPACE_CLOSE + +// Internal implementation detail -- do not use these members. +struct TableStruct_presenter_5fmessage_2eproto { + static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTableField entries[] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::AuxillaryParseTableField aux[] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTable schema[7] + PROTOBUF_SECTION_VARIABLE(protodesc_cold); + static const ::PROTOBUF_NAMESPACE_ID::internal::FieldMetadata field_metadata[]; + static const ::PROTOBUF_NAMESPACE_ID::internal::SerializationTable serialization_table[]; + static const ::PROTOBUF_NAMESPACE_ID::uint32 offsets[]; +}; +extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_presenter_5fmessage_2eproto; +namespace ascend { +namespace presenter { +namespace proto { +class Coordinate; +class CoordinateDefaultTypeInternal; +extern CoordinateDefaultTypeInternal _Coordinate_default_instance_; +class HeartbeatMessage; +class HeartbeatMessageDefaultTypeInternal; +extern HeartbeatMessageDefaultTypeInternal _HeartbeatMessage_default_instance_; +class OpenChannelRequest; +class OpenChannelRequestDefaultTypeInternal; +extern OpenChannelRequestDefaultTypeInternal _OpenChannelRequest_default_instance_; +class OpenChannelResponse; +class OpenChannelResponseDefaultTypeInternal; +extern OpenChannelResponseDefaultTypeInternal _OpenChannelResponse_default_instance_; +class PresentImageRequest; +class PresentImageRequestDefaultTypeInternal; +extern PresentImageRequestDefaultTypeInternal _PresentImageRequest_default_instance_; +class PresentImageResponse; +class PresentImageResponseDefaultTypeInternal; +extern PresentImageResponseDefaultTypeInternal _PresentImageResponse_default_instance_; +class Rectangle_Attr; +class Rectangle_AttrDefaultTypeInternal; +extern Rectangle_AttrDefaultTypeInternal _Rectangle_Attr_default_instance_; +} // namespace proto +} // namespace presenter +} // namespace ascend +PROTOBUF_NAMESPACE_OPEN +template<> ::ascend::presenter::proto::Coordinate* Arena::CreateMaybeMessage<::ascend::presenter::proto::Coordinate>(Arena*); +template<> ::ascend::presenter::proto::HeartbeatMessage* Arena::CreateMaybeMessage<::ascend::presenter::proto::HeartbeatMessage>(Arena*); +template<> ::ascend::presenter::proto::OpenChannelRequest* Arena::CreateMaybeMessage<::ascend::presenter::proto::OpenChannelRequest>(Arena*); +template<> ::ascend::presenter::proto::OpenChannelResponse* Arena::CreateMaybeMessage<::ascend::presenter::proto::OpenChannelResponse>(Arena*); +template<> ::ascend::presenter::proto::PresentImageRequest* Arena::CreateMaybeMessage<::ascend::presenter::proto::PresentImageRequest>(Arena*); +template<> ::ascend::presenter::proto::PresentImageResponse* Arena::CreateMaybeMessage<::ascend::presenter::proto::PresentImageResponse>(Arena*); +template<> ::ascend::presenter::proto::Rectangle_Attr* Arena::CreateMaybeMessage<::ascend::presenter::proto::Rectangle_Attr>(Arena*); +PROTOBUF_NAMESPACE_CLOSE +namespace ascend { +namespace presenter { +namespace proto { + +enum OpenChannelErrorCode : int { + kOpenChannelErrorNone = 0, + kOpenChannelErrorNoSuchChannel = 1, + kOpenChannelErrorChannelAlreadyOpened = 2, + kOpenChannelErrorOther = -1, + OpenChannelErrorCode_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), + OpenChannelErrorCode_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() +}; +bool OpenChannelErrorCode_IsValid(int value); +constexpr OpenChannelErrorCode OpenChannelErrorCode_MIN = kOpenChannelErrorOther; +constexpr OpenChannelErrorCode OpenChannelErrorCode_MAX = kOpenChannelErrorChannelAlreadyOpened; +constexpr int OpenChannelErrorCode_ARRAYSIZE = OpenChannelErrorCode_MAX + 1; + +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* OpenChannelErrorCode_descriptor(); +template +inline const std::string& OpenChannelErrorCode_Name(T enum_t_value) { + static_assert(::std::is_same::value || + ::std::is_integral::value, + "Incorrect type passed to function OpenChannelErrorCode_Name."); + return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( + OpenChannelErrorCode_descriptor(), enum_t_value); +} +inline bool OpenChannelErrorCode_Parse( + const std::string& name, OpenChannelErrorCode* value) { + return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( + OpenChannelErrorCode_descriptor(), name, value); +} +enum ChannelContentType : int { + kChannelContentTypeImage = 0, + kChannelContentTypeVideo = 1, + ChannelContentType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), + ChannelContentType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() +}; +bool ChannelContentType_IsValid(int value); +constexpr ChannelContentType ChannelContentType_MIN = kChannelContentTypeImage; +constexpr ChannelContentType ChannelContentType_MAX = kChannelContentTypeVideo; +constexpr int ChannelContentType_ARRAYSIZE = ChannelContentType_MAX + 1; + +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ChannelContentType_descriptor(); +template +inline const std::string& ChannelContentType_Name(T enum_t_value) { + static_assert(::std::is_same::value || + ::std::is_integral::value, + "Incorrect type passed to function ChannelContentType_Name."); + return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( + ChannelContentType_descriptor(), enum_t_value); +} +inline bool ChannelContentType_Parse( + const std::string& name, ChannelContentType* value) { + return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( + ChannelContentType_descriptor(), name, value); +} +enum ImageFormat : int { + kImageFormatJpeg = 0, + ImageFormat_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), + ImageFormat_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() +}; +bool ImageFormat_IsValid(int value); +constexpr ImageFormat ImageFormat_MIN = kImageFormatJpeg; +constexpr ImageFormat ImageFormat_MAX = kImageFormatJpeg; +constexpr int ImageFormat_ARRAYSIZE = ImageFormat_MAX + 1; + +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ImageFormat_descriptor(); +template +inline const std::string& ImageFormat_Name(T enum_t_value) { + static_assert(::std::is_same::value || + ::std::is_integral::value, + "Incorrect type passed to function ImageFormat_Name."); + return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( + ImageFormat_descriptor(), enum_t_value); +} +inline bool ImageFormat_Parse( + const std::string& name, ImageFormat* value) { + return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( + ImageFormat_descriptor(), name, value); +} +enum PresentDataErrorCode : int { + kPresentDataErrorNone = 0, + kPresentDataErrorUnsupportedType = 1, + kPresentDataErrorUnsupportedFormat = 2, + kPresentDataErrorOther = -1, + PresentDataErrorCode_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), + PresentDataErrorCode_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() +}; +bool PresentDataErrorCode_IsValid(int value); +constexpr PresentDataErrorCode PresentDataErrorCode_MIN = kPresentDataErrorOther; +constexpr PresentDataErrorCode PresentDataErrorCode_MAX = kPresentDataErrorUnsupportedFormat; +constexpr int PresentDataErrorCode_ARRAYSIZE = PresentDataErrorCode_MAX + 1; + +const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* PresentDataErrorCode_descriptor(); +template +inline const std::string& PresentDataErrorCode_Name(T enum_t_value) { + static_assert(::std::is_same::value || + ::std::is_integral::value, + "Incorrect type passed to function PresentDataErrorCode_Name."); + return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( + PresentDataErrorCode_descriptor(), enum_t_value); +} +inline bool PresentDataErrorCode_Parse( + const std::string& name, PresentDataErrorCode* value) { + return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( + PresentDataErrorCode_descriptor(), name, value); +} +// =================================================================== + +class OpenChannelRequest : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.proto.OpenChannelRequest) */ { + public: + OpenChannelRequest(); + virtual ~OpenChannelRequest(); + + OpenChannelRequest(const OpenChannelRequest& from); + OpenChannelRequest(OpenChannelRequest&& from) noexcept + : OpenChannelRequest() { + *this = ::std::move(from); + } + + inline OpenChannelRequest& operator=(const OpenChannelRequest& from) { + CopyFrom(from); + return *this; + } + inline OpenChannelRequest& operator=(OpenChannelRequest&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const OpenChannelRequest& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const OpenChannelRequest* internal_default_instance() { + return reinterpret_cast( + &_OpenChannelRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = + 0; + + void Swap(OpenChannelRequest* other); + friend void swap(OpenChannelRequest& a, OpenChannelRequest& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline OpenChannelRequest* New() const final { + return CreateMaybeMessage(nullptr); + } + + OpenChannelRequest* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const OpenChannelRequest& from); + void MergeFrom(const OpenChannelRequest& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(OpenChannelRequest* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.proto.OpenChannelRequest"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_presenter_5fmessage_2eproto); + return ::descriptor_table_presenter_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // string channel_name = 1; + void clear_channel_name(); + static const int kChannelNameFieldNumber = 1; + const std::string& channel_name() const; + void set_channel_name(const std::string& value); + void set_channel_name(std::string&& value); + void set_channel_name(const char* value); + void set_channel_name(const char* value, size_t size); + std::string* mutable_channel_name(); + std::string* release_channel_name(); + void set_allocated_channel_name(std::string* channel_name); + + // .ascend.presenter.proto.ChannelContentType content_type = 2; + void clear_content_type(); + static const int kContentTypeFieldNumber = 2; + ::ascend::presenter::proto::ChannelContentType content_type() const; + void set_content_type(::ascend::presenter::proto::ChannelContentType value); + + // @@protoc_insertion_point(class_scope:ascend.presenter.proto.OpenChannelRequest) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr channel_name_; + int content_type_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_presenter_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class OpenChannelResponse : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.proto.OpenChannelResponse) */ { + public: + OpenChannelResponse(); + virtual ~OpenChannelResponse(); + + OpenChannelResponse(const OpenChannelResponse& from); + OpenChannelResponse(OpenChannelResponse&& from) noexcept + : OpenChannelResponse() { + *this = ::std::move(from); + } + + inline OpenChannelResponse& operator=(const OpenChannelResponse& from) { + CopyFrom(from); + return *this; + } + inline OpenChannelResponse& operator=(OpenChannelResponse&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const OpenChannelResponse& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const OpenChannelResponse* internal_default_instance() { + return reinterpret_cast( + &_OpenChannelResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = + 1; + + void Swap(OpenChannelResponse* other); + friend void swap(OpenChannelResponse& a, OpenChannelResponse& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline OpenChannelResponse* New() const final { + return CreateMaybeMessage(nullptr); + } + + OpenChannelResponse* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const OpenChannelResponse& from); + void MergeFrom(const OpenChannelResponse& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(OpenChannelResponse* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.proto.OpenChannelResponse"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_presenter_5fmessage_2eproto); + return ::descriptor_table_presenter_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // string error_message = 2; + void clear_error_message(); + static const int kErrorMessageFieldNumber = 2; + const std::string& error_message() const; + void set_error_message(const std::string& value); + void set_error_message(std::string&& value); + void set_error_message(const char* value); + void set_error_message(const char* value, size_t size); + std::string* mutable_error_message(); + std::string* release_error_message(); + void set_allocated_error_message(std::string* error_message); + + // .ascend.presenter.proto.OpenChannelErrorCode error_code = 1; + void clear_error_code(); + static const int kErrorCodeFieldNumber = 1; + ::ascend::presenter::proto::OpenChannelErrorCode error_code() const; + void set_error_code(::ascend::presenter::proto::OpenChannelErrorCode value); + + // @@protoc_insertion_point(class_scope:ascend.presenter.proto.OpenChannelResponse) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr error_message_; + int error_code_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_presenter_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class HeartbeatMessage : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.proto.HeartbeatMessage) */ { + public: + HeartbeatMessage(); + virtual ~HeartbeatMessage(); + + HeartbeatMessage(const HeartbeatMessage& from); + HeartbeatMessage(HeartbeatMessage&& from) noexcept + : HeartbeatMessage() { + *this = ::std::move(from); + } + + inline HeartbeatMessage& operator=(const HeartbeatMessage& from) { + CopyFrom(from); + return *this; + } + inline HeartbeatMessage& operator=(HeartbeatMessage&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const HeartbeatMessage& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const HeartbeatMessage* internal_default_instance() { + return reinterpret_cast( + &_HeartbeatMessage_default_instance_); + } + static constexpr int kIndexInFileMessages = + 2; + + void Swap(HeartbeatMessage* other); + friend void swap(HeartbeatMessage& a, HeartbeatMessage& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline HeartbeatMessage* New() const final { + return CreateMaybeMessage(nullptr); + } + + HeartbeatMessage* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const HeartbeatMessage& from); + void MergeFrom(const HeartbeatMessage& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(HeartbeatMessage* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.proto.HeartbeatMessage"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_presenter_5fmessage_2eproto); + return ::descriptor_table_presenter_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // @@protoc_insertion_point(class_scope:ascend.presenter.proto.HeartbeatMessage) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_presenter_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class Coordinate : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.proto.Coordinate) */ { + public: + Coordinate(); + virtual ~Coordinate(); + + Coordinate(const Coordinate& from); + Coordinate(Coordinate&& from) noexcept + : Coordinate() { + *this = ::std::move(from); + } + + inline Coordinate& operator=(const Coordinate& from) { + CopyFrom(from); + return *this; + } + inline Coordinate& operator=(Coordinate&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const Coordinate& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const Coordinate* internal_default_instance() { + return reinterpret_cast( + &_Coordinate_default_instance_); + } + static constexpr int kIndexInFileMessages = + 3; + + void Swap(Coordinate* other); + friend void swap(Coordinate& a, Coordinate& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline Coordinate* New() const final { + return CreateMaybeMessage(nullptr); + } + + Coordinate* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const Coordinate& from); + void MergeFrom(const Coordinate& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(Coordinate* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.proto.Coordinate"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_presenter_5fmessage_2eproto); + return ::descriptor_table_presenter_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // uint32 x = 1; + void clear_x(); + static const int kXFieldNumber = 1; + ::PROTOBUF_NAMESPACE_ID::uint32 x() const; + void set_x(::PROTOBUF_NAMESPACE_ID::uint32 value); + + // uint32 y = 2; + void clear_y(); + static const int kYFieldNumber = 2; + ::PROTOBUF_NAMESPACE_ID::uint32 y() const; + void set_y(::PROTOBUF_NAMESPACE_ID::uint32 value); + + // @@protoc_insertion_point(class_scope:ascend.presenter.proto.Coordinate) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::uint32 x_; + ::PROTOBUF_NAMESPACE_ID::uint32 y_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_presenter_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class Rectangle_Attr : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.proto.Rectangle_Attr) */ { + public: + Rectangle_Attr(); + virtual ~Rectangle_Attr(); + + Rectangle_Attr(const Rectangle_Attr& from); + Rectangle_Attr(Rectangle_Attr&& from) noexcept + : Rectangle_Attr() { + *this = ::std::move(from); + } + + inline Rectangle_Attr& operator=(const Rectangle_Attr& from) { + CopyFrom(from); + return *this; + } + inline Rectangle_Attr& operator=(Rectangle_Attr&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const Rectangle_Attr& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const Rectangle_Attr* internal_default_instance() { + return reinterpret_cast( + &_Rectangle_Attr_default_instance_); + } + static constexpr int kIndexInFileMessages = + 4; + + void Swap(Rectangle_Attr* other); + friend void swap(Rectangle_Attr& a, Rectangle_Attr& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline Rectangle_Attr* New() const final { + return CreateMaybeMessage(nullptr); + } + + Rectangle_Attr* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const Rectangle_Attr& from); + void MergeFrom(const Rectangle_Attr& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(Rectangle_Attr* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.proto.Rectangle_Attr"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_presenter_5fmessage_2eproto); + return ::descriptor_table_presenter_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // string label_text = 3; + void clear_label_text(); + static const int kLabelTextFieldNumber = 3; + const std::string& label_text() const; + void set_label_text(const std::string& value); + void set_label_text(std::string&& value); + void set_label_text(const char* value); + void set_label_text(const char* value, size_t size); + std::string* mutable_label_text(); + std::string* release_label_text(); + void set_allocated_label_text(std::string* label_text); + + // .ascend.presenter.proto.Coordinate left_top = 1; + bool has_left_top() const; + void clear_left_top(); + static const int kLeftTopFieldNumber = 1; + const ::ascend::presenter::proto::Coordinate& left_top() const; + ::ascend::presenter::proto::Coordinate* release_left_top(); + ::ascend::presenter::proto::Coordinate* mutable_left_top(); + void set_allocated_left_top(::ascend::presenter::proto::Coordinate* left_top); + + // .ascend.presenter.proto.Coordinate right_bottom = 2; + bool has_right_bottom() const; + void clear_right_bottom(); + static const int kRightBottomFieldNumber = 2; + const ::ascend::presenter::proto::Coordinate& right_bottom() const; + ::ascend::presenter::proto::Coordinate* release_right_bottom(); + ::ascend::presenter::proto::Coordinate* mutable_right_bottom(); + void set_allocated_right_bottom(::ascend::presenter::proto::Coordinate* right_bottom); + + // @@protoc_insertion_point(class_scope:ascend.presenter.proto.Rectangle_Attr) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr label_text_; + ::ascend::presenter::proto::Coordinate* left_top_; + ::ascend::presenter::proto::Coordinate* right_bottom_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_presenter_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class PresentImageRequest : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.proto.PresentImageRequest) */ { + public: + PresentImageRequest(); + virtual ~PresentImageRequest(); + + PresentImageRequest(const PresentImageRequest& from); + PresentImageRequest(PresentImageRequest&& from) noexcept + : PresentImageRequest() { + *this = ::std::move(from); + } + + inline PresentImageRequest& operator=(const PresentImageRequest& from) { + CopyFrom(from); + return *this; + } + inline PresentImageRequest& operator=(PresentImageRequest&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const PresentImageRequest& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const PresentImageRequest* internal_default_instance() { + return reinterpret_cast( + &_PresentImageRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = + 5; + + void Swap(PresentImageRequest* other); + friend void swap(PresentImageRequest& a, PresentImageRequest& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline PresentImageRequest* New() const final { + return CreateMaybeMessage(nullptr); + } + + PresentImageRequest* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const PresentImageRequest& from); + void MergeFrom(const PresentImageRequest& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(PresentImageRequest* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.proto.PresentImageRequest"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_presenter_5fmessage_2eproto); + return ::descriptor_table_presenter_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .ascend.presenter.proto.Rectangle_Attr rectangle_list = 5; + int rectangle_list_size() const; + void clear_rectangle_list(); + static const int kRectangleListFieldNumber = 5; + ::ascend::presenter::proto::Rectangle_Attr* mutable_rectangle_list(int index); + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::proto::Rectangle_Attr >* + mutable_rectangle_list(); + const ::ascend::presenter::proto::Rectangle_Attr& rectangle_list(int index) const; + ::ascend::presenter::proto::Rectangle_Attr* add_rectangle_list(); + const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::proto::Rectangle_Attr >& + rectangle_list() const; + + // bytes data = 4; + void clear_data(); + static const int kDataFieldNumber = 4; + const std::string& data() const; + void set_data(const std::string& value); + void set_data(std::string&& value); + void set_data(const char* value); + void set_data(const void* value, size_t size); + std::string* mutable_data(); + std::string* release_data(); + void set_allocated_data(std::string* data); + + // .ascend.presenter.proto.ImageFormat format = 1; + void clear_format(); + static const int kFormatFieldNumber = 1; + ::ascend::presenter::proto::ImageFormat format() const; + void set_format(::ascend::presenter::proto::ImageFormat value); + + // uint32 width = 2; + void clear_width(); + static const int kWidthFieldNumber = 2; + ::PROTOBUF_NAMESPACE_ID::uint32 width() const; + void set_width(::PROTOBUF_NAMESPACE_ID::uint32 value); + + // uint32 height = 3; + void clear_height(); + static const int kHeightFieldNumber = 3; + ::PROTOBUF_NAMESPACE_ID::uint32 height() const; + void set_height(::PROTOBUF_NAMESPACE_ID::uint32 value); + + // @@protoc_insertion_point(class_scope:ascend.presenter.proto.PresentImageRequest) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::proto::Rectangle_Attr > rectangle_list_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr data_; + int format_; + ::PROTOBUF_NAMESPACE_ID::uint32 width_; + ::PROTOBUF_NAMESPACE_ID::uint32 height_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_presenter_5fmessage_2eproto; +}; +// ------------------------------------------------------------------- + +class PresentImageResponse : + public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:ascend.presenter.proto.PresentImageResponse) */ { + public: + PresentImageResponse(); + virtual ~PresentImageResponse(); + + PresentImageResponse(const PresentImageResponse& from); + PresentImageResponse(PresentImageResponse&& from) noexcept + : PresentImageResponse() { + *this = ::std::move(from); + } + + inline PresentImageResponse& operator=(const PresentImageResponse& from) { + CopyFrom(from); + return *this; + } + inline PresentImageResponse& operator=(PresentImageResponse&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { + return GetDescriptor(); + } + static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { + return GetMetadataStatic().descriptor; + } + static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { + return GetMetadataStatic().reflection; + } + static const PresentImageResponse& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const PresentImageResponse* internal_default_instance() { + return reinterpret_cast( + &_PresentImageResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = + 6; + + void Swap(PresentImageResponse* other); + friend void swap(PresentImageResponse& a, PresentImageResponse& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline PresentImageResponse* New() const final { + return CreateMaybeMessage(nullptr); + } + + PresentImageResponse* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final; + void CopyFrom(const PresentImageResponse& from); + void MergeFrom(const PresentImageResponse& from); + PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; + #else + bool MergePartialFromCodedStream( + ::PROTOBUF_NAMESPACE_ID::io::CodedInputStream* input) final; + #endif // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER + void SerializeWithCachedSizes( + ::PROTOBUF_NAMESPACE_ID::io::CodedOutputStream* output) const final; + ::PROTOBUF_NAMESPACE_ID::uint8* InternalSerializeWithCachedSizesToArray( + ::PROTOBUF_NAMESPACE_ID::uint8* target) const final; + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + inline void SharedCtor(); + inline void SharedDtor(); + void SetCachedSize(int size) const final; + void InternalSwap(PresentImageResponse* other); + friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; + static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { + return "ascend.presenter.proto.PresentImageResponse"; + } + private: + inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const { + return nullptr; + } + inline void* MaybeArenaPtr() const { + return nullptr; + } + public: + + ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; + private: + static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() { + ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_presenter_5fmessage_2eproto); + return ::descriptor_table_presenter_5fmessage_2eproto.file_level_metadata[kIndexInFileMessages]; + } + + public: + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // string error_message = 2; + void clear_error_message(); + static const int kErrorMessageFieldNumber = 2; + const std::string& error_message() const; + void set_error_message(const std::string& value); + void set_error_message(std::string&& value); + void set_error_message(const char* value); + void set_error_message(const char* value, size_t size); + std::string* mutable_error_message(); + std::string* release_error_message(); + void set_allocated_error_message(std::string* error_message); + + // .ascend.presenter.proto.PresentDataErrorCode error_code = 1; + void clear_error_code(); + static const int kErrorCodeFieldNumber = 1; + ::ascend::presenter::proto::PresentDataErrorCode error_code() const; + void set_error_code(::ascend::presenter::proto::PresentDataErrorCode value); + + // @@protoc_insertion_point(class_scope:ascend.presenter.proto.PresentImageResponse) + private: + class HasBitSetters; + + ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr error_message_; + int error_code_; + mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; + friend struct ::TableStruct_presenter_5fmessage_2eproto; +}; +// =================================================================== + + +// =================================================================== + +#ifdef __GNUC__ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif // __GNUC__ +// OpenChannelRequest + +// string channel_name = 1; +inline void OpenChannelRequest::clear_channel_name() { + channel_name_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& OpenChannelRequest::channel_name() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.OpenChannelRequest.channel_name) + return channel_name_.GetNoArena(); +} +inline void OpenChannelRequest::set_channel_name(const std::string& value) { + + channel_name_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.proto.OpenChannelRequest.channel_name) +} +inline void OpenChannelRequest::set_channel_name(std::string&& value) { + + channel_name_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.proto.OpenChannelRequest.channel_name) +} +inline void OpenChannelRequest::set_channel_name(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + channel_name_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.proto.OpenChannelRequest.channel_name) +} +inline void OpenChannelRequest::set_channel_name(const char* value, size_t size) { + + channel_name_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.proto.OpenChannelRequest.channel_name) +} +inline std::string* OpenChannelRequest::mutable_channel_name() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.proto.OpenChannelRequest.channel_name) + return channel_name_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* OpenChannelRequest::release_channel_name() { + // @@protoc_insertion_point(field_release:ascend.presenter.proto.OpenChannelRequest.channel_name) + + return channel_name_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void OpenChannelRequest::set_allocated_channel_name(std::string* channel_name) { + if (channel_name != nullptr) { + + } else { + + } + channel_name_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), channel_name); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.proto.OpenChannelRequest.channel_name) +} + +// .ascend.presenter.proto.ChannelContentType content_type = 2; +inline void OpenChannelRequest::clear_content_type() { + content_type_ = 0; +} +inline ::ascend::presenter::proto::ChannelContentType OpenChannelRequest::content_type() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.OpenChannelRequest.content_type) + return static_cast< ::ascend::presenter::proto::ChannelContentType >(content_type_); +} +inline void OpenChannelRequest::set_content_type(::ascend::presenter::proto::ChannelContentType value) { + + content_type_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.proto.OpenChannelRequest.content_type) +} + +// ------------------------------------------------------------------- + +// OpenChannelResponse + +// .ascend.presenter.proto.OpenChannelErrorCode error_code = 1; +inline void OpenChannelResponse::clear_error_code() { + error_code_ = 0; +} +inline ::ascend::presenter::proto::OpenChannelErrorCode OpenChannelResponse::error_code() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.OpenChannelResponse.error_code) + return static_cast< ::ascend::presenter::proto::OpenChannelErrorCode >(error_code_); +} +inline void OpenChannelResponse::set_error_code(::ascend::presenter::proto::OpenChannelErrorCode value) { + + error_code_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.proto.OpenChannelResponse.error_code) +} + +// string error_message = 2; +inline void OpenChannelResponse::clear_error_message() { + error_message_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& OpenChannelResponse::error_message() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.OpenChannelResponse.error_message) + return error_message_.GetNoArena(); +} +inline void OpenChannelResponse::set_error_message(const std::string& value) { + + error_message_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.proto.OpenChannelResponse.error_message) +} +inline void OpenChannelResponse::set_error_message(std::string&& value) { + + error_message_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.proto.OpenChannelResponse.error_message) +} +inline void OpenChannelResponse::set_error_message(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + error_message_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.proto.OpenChannelResponse.error_message) +} +inline void OpenChannelResponse::set_error_message(const char* value, size_t size) { + + error_message_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.proto.OpenChannelResponse.error_message) +} +inline std::string* OpenChannelResponse::mutable_error_message() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.proto.OpenChannelResponse.error_message) + return error_message_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* OpenChannelResponse::release_error_message() { + // @@protoc_insertion_point(field_release:ascend.presenter.proto.OpenChannelResponse.error_message) + + return error_message_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void OpenChannelResponse::set_allocated_error_message(std::string* error_message) { + if (error_message != nullptr) { + + } else { + + } + error_message_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), error_message); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.proto.OpenChannelResponse.error_message) +} + +// ------------------------------------------------------------------- + +// HeartbeatMessage + +// ------------------------------------------------------------------- + +// Coordinate + +// uint32 x = 1; +inline void Coordinate::clear_x() { + x_ = 0u; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 Coordinate::x() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.Coordinate.x) + return x_; +} +inline void Coordinate::set_x(::PROTOBUF_NAMESPACE_ID::uint32 value) { + + x_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.proto.Coordinate.x) +} + +// uint32 y = 2; +inline void Coordinate::clear_y() { + y_ = 0u; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 Coordinate::y() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.Coordinate.y) + return y_; +} +inline void Coordinate::set_y(::PROTOBUF_NAMESPACE_ID::uint32 value) { + + y_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.proto.Coordinate.y) +} + +// ------------------------------------------------------------------- + +// Rectangle_Attr + +// .ascend.presenter.proto.Coordinate left_top = 1; +inline bool Rectangle_Attr::has_left_top() const { + return this != internal_default_instance() && left_top_ != nullptr; +} +inline void Rectangle_Attr::clear_left_top() { + if (GetArenaNoVirtual() == nullptr && left_top_ != nullptr) { + delete left_top_; + } + left_top_ = nullptr; +} +inline const ::ascend::presenter::proto::Coordinate& Rectangle_Attr::left_top() const { + const ::ascend::presenter::proto::Coordinate* p = left_top_; + // @@protoc_insertion_point(field_get:ascend.presenter.proto.Rectangle_Attr.left_top) + return p != nullptr ? *p : *reinterpret_cast( + &::ascend::presenter::proto::_Coordinate_default_instance_); +} +inline ::ascend::presenter::proto::Coordinate* Rectangle_Attr::release_left_top() { + // @@protoc_insertion_point(field_release:ascend.presenter.proto.Rectangle_Attr.left_top) + + ::ascend::presenter::proto::Coordinate* temp = left_top_; + left_top_ = nullptr; + return temp; +} +inline ::ascend::presenter::proto::Coordinate* Rectangle_Attr::mutable_left_top() { + + if (left_top_ == nullptr) { + auto* p = CreateMaybeMessage<::ascend::presenter::proto::Coordinate>(GetArenaNoVirtual()); + left_top_ = p; + } + // @@protoc_insertion_point(field_mutable:ascend.presenter.proto.Rectangle_Attr.left_top) + return left_top_; +} +inline void Rectangle_Attr::set_allocated_left_top(::ascend::presenter::proto::Coordinate* left_top) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == nullptr) { + delete left_top_; + } + if (left_top) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + left_top = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, left_top, submessage_arena); + } + + } else { + + } + left_top_ = left_top; + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.proto.Rectangle_Attr.left_top) +} + +// .ascend.presenter.proto.Coordinate right_bottom = 2; +inline bool Rectangle_Attr::has_right_bottom() const { + return this != internal_default_instance() && right_bottom_ != nullptr; +} +inline void Rectangle_Attr::clear_right_bottom() { + if (GetArenaNoVirtual() == nullptr && right_bottom_ != nullptr) { + delete right_bottom_; + } + right_bottom_ = nullptr; +} +inline const ::ascend::presenter::proto::Coordinate& Rectangle_Attr::right_bottom() const { + const ::ascend::presenter::proto::Coordinate* p = right_bottom_; + // @@protoc_insertion_point(field_get:ascend.presenter.proto.Rectangle_Attr.right_bottom) + return p != nullptr ? *p : *reinterpret_cast( + &::ascend::presenter::proto::_Coordinate_default_instance_); +} +inline ::ascend::presenter::proto::Coordinate* Rectangle_Attr::release_right_bottom() { + // @@protoc_insertion_point(field_release:ascend.presenter.proto.Rectangle_Attr.right_bottom) + + ::ascend::presenter::proto::Coordinate* temp = right_bottom_; + right_bottom_ = nullptr; + return temp; +} +inline ::ascend::presenter::proto::Coordinate* Rectangle_Attr::mutable_right_bottom() { + + if (right_bottom_ == nullptr) { + auto* p = CreateMaybeMessage<::ascend::presenter::proto::Coordinate>(GetArenaNoVirtual()); + right_bottom_ = p; + } + // @@protoc_insertion_point(field_mutable:ascend.presenter.proto.Rectangle_Attr.right_bottom) + return right_bottom_; +} +inline void Rectangle_Attr::set_allocated_right_bottom(::ascend::presenter::proto::Coordinate* right_bottom) { + ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == nullptr) { + delete right_bottom_; + } + if (right_bottom) { + ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = nullptr; + if (message_arena != submessage_arena) { + right_bottom = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( + message_arena, right_bottom, submessage_arena); + } + + } else { + + } + right_bottom_ = right_bottom; + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.proto.Rectangle_Attr.right_bottom) +} + +// string label_text = 3; +inline void Rectangle_Attr::clear_label_text() { + label_text_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& Rectangle_Attr::label_text() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.Rectangle_Attr.label_text) + return label_text_.GetNoArena(); +} +inline void Rectangle_Attr::set_label_text(const std::string& value) { + + label_text_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.proto.Rectangle_Attr.label_text) +} +inline void Rectangle_Attr::set_label_text(std::string&& value) { + + label_text_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.proto.Rectangle_Attr.label_text) +} +inline void Rectangle_Attr::set_label_text(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + label_text_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.proto.Rectangle_Attr.label_text) +} +inline void Rectangle_Attr::set_label_text(const char* value, size_t size) { + + label_text_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.proto.Rectangle_Attr.label_text) +} +inline std::string* Rectangle_Attr::mutable_label_text() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.proto.Rectangle_Attr.label_text) + return label_text_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* Rectangle_Attr::release_label_text() { + // @@protoc_insertion_point(field_release:ascend.presenter.proto.Rectangle_Attr.label_text) + + return label_text_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void Rectangle_Attr::set_allocated_label_text(std::string* label_text) { + if (label_text != nullptr) { + + } else { + + } + label_text_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), label_text); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.proto.Rectangle_Attr.label_text) +} + +// ------------------------------------------------------------------- + +// PresentImageRequest + +// .ascend.presenter.proto.ImageFormat format = 1; +inline void PresentImageRequest::clear_format() { + format_ = 0; +} +inline ::ascend::presenter::proto::ImageFormat PresentImageRequest::format() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.PresentImageRequest.format) + return static_cast< ::ascend::presenter::proto::ImageFormat >(format_); +} +inline void PresentImageRequest::set_format(::ascend::presenter::proto::ImageFormat value) { + + format_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.proto.PresentImageRequest.format) +} + +// uint32 width = 2; +inline void PresentImageRequest::clear_width() { + width_ = 0u; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 PresentImageRequest::width() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.PresentImageRequest.width) + return width_; +} +inline void PresentImageRequest::set_width(::PROTOBUF_NAMESPACE_ID::uint32 value) { + + width_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.proto.PresentImageRequest.width) +} + +// uint32 height = 3; +inline void PresentImageRequest::clear_height() { + height_ = 0u; +} +inline ::PROTOBUF_NAMESPACE_ID::uint32 PresentImageRequest::height() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.PresentImageRequest.height) + return height_; +} +inline void PresentImageRequest::set_height(::PROTOBUF_NAMESPACE_ID::uint32 value) { + + height_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.proto.PresentImageRequest.height) +} + +// bytes data = 4; +inline void PresentImageRequest::clear_data() { + data_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& PresentImageRequest::data() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.PresentImageRequest.data) + return data_.GetNoArena(); +} +inline void PresentImageRequest::set_data(const std::string& value) { + + data_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.proto.PresentImageRequest.data) +} +inline void PresentImageRequest::set_data(std::string&& value) { + + data_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.proto.PresentImageRequest.data) +} +inline void PresentImageRequest::set_data(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + data_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.proto.PresentImageRequest.data) +} +inline void PresentImageRequest::set_data(const void* value, size_t size) { + + data_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.proto.PresentImageRequest.data) +} +inline std::string* PresentImageRequest::mutable_data() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.proto.PresentImageRequest.data) + return data_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* PresentImageRequest::release_data() { + // @@protoc_insertion_point(field_release:ascend.presenter.proto.PresentImageRequest.data) + + return data_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void PresentImageRequest::set_allocated_data(std::string* data) { + if (data != nullptr) { + + } else { + + } + data_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), data); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.proto.PresentImageRequest.data) +} + +// repeated .ascend.presenter.proto.Rectangle_Attr rectangle_list = 5; +inline int PresentImageRequest::rectangle_list_size() const { + return rectangle_list_.size(); +} +inline void PresentImageRequest::clear_rectangle_list() { + rectangle_list_.Clear(); +} +inline ::ascend::presenter::proto::Rectangle_Attr* PresentImageRequest::mutable_rectangle_list(int index) { + // @@protoc_insertion_point(field_mutable:ascend.presenter.proto.PresentImageRequest.rectangle_list) + return rectangle_list_.Mutable(index); +} +inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::proto::Rectangle_Attr >* +PresentImageRequest::mutable_rectangle_list() { + // @@protoc_insertion_point(field_mutable_list:ascend.presenter.proto.PresentImageRequest.rectangle_list) + return &rectangle_list_; +} +inline const ::ascend::presenter::proto::Rectangle_Attr& PresentImageRequest::rectangle_list(int index) const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.PresentImageRequest.rectangle_list) + return rectangle_list_.Get(index); +} +inline ::ascend::presenter::proto::Rectangle_Attr* PresentImageRequest::add_rectangle_list() { + // @@protoc_insertion_point(field_add:ascend.presenter.proto.PresentImageRequest.rectangle_list) + return rectangle_list_.Add(); +} +inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::ascend::presenter::proto::Rectangle_Attr >& +PresentImageRequest::rectangle_list() const { + // @@protoc_insertion_point(field_list:ascend.presenter.proto.PresentImageRequest.rectangle_list) + return rectangle_list_; +} + +// ------------------------------------------------------------------- + +// PresentImageResponse + +// .ascend.presenter.proto.PresentDataErrorCode error_code = 1; +inline void PresentImageResponse::clear_error_code() { + error_code_ = 0; +} +inline ::ascend::presenter::proto::PresentDataErrorCode PresentImageResponse::error_code() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.PresentImageResponse.error_code) + return static_cast< ::ascend::presenter::proto::PresentDataErrorCode >(error_code_); +} +inline void PresentImageResponse::set_error_code(::ascend::presenter::proto::PresentDataErrorCode value) { + + error_code_ = value; + // @@protoc_insertion_point(field_set:ascend.presenter.proto.PresentImageResponse.error_code) +} + +// string error_message = 2; +inline void PresentImageResponse::clear_error_message() { + error_message_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline const std::string& PresentImageResponse::error_message() const { + // @@protoc_insertion_point(field_get:ascend.presenter.proto.PresentImageResponse.error_message) + return error_message_.GetNoArena(); +} +inline void PresentImageResponse::set_error_message(const std::string& value) { + + error_message_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:ascend.presenter.proto.PresentImageResponse.error_message) +} +inline void PresentImageResponse::set_error_message(std::string&& value) { + + error_message_.SetNoArena( + &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:ascend.presenter.proto.PresentImageResponse.error_message) +} +inline void PresentImageResponse::set_error_message(const char* value) { + GOOGLE_DCHECK(value != nullptr); + + error_message_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:ascend.presenter.proto.PresentImageResponse.error_message) +} +inline void PresentImageResponse::set_error_message(const char* value, size_t size) { + + error_message_.SetNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:ascend.presenter.proto.PresentImageResponse.error_message) +} +inline std::string* PresentImageResponse::mutable_error_message() { + + // @@protoc_insertion_point(field_mutable:ascend.presenter.proto.PresentImageResponse.error_message) + return error_message_.MutableNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline std::string* PresentImageResponse::release_error_message() { + // @@protoc_insertion_point(field_release:ascend.presenter.proto.PresentImageResponse.error_message) + + return error_message_.ReleaseNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited()); +} +inline void PresentImageResponse::set_allocated_error_message(std::string* error_message) { + if (error_message != nullptr) { + + } else { + + } + error_message_.SetAllocatedNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), error_message); + // @@protoc_insertion_point(field_set_allocated:ascend.presenter.proto.PresentImageResponse.error_message) +} + +#ifdef __GNUC__ + #pragma GCC diagnostic pop +#endif // __GNUC__ +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace proto +} // namespace presenter +} // namespace ascend + +PROTOBUF_NAMESPACE_OPEN + +template <> struct is_proto_enum< ::ascend::presenter::proto::OpenChannelErrorCode> : ::std::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::ascend::presenter::proto::OpenChannelErrorCode>() { + return ::ascend::presenter::proto::OpenChannelErrorCode_descriptor(); +} +template <> struct is_proto_enum< ::ascend::presenter::proto::ChannelContentType> : ::std::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::ascend::presenter::proto::ChannelContentType>() { + return ::ascend::presenter::proto::ChannelContentType_descriptor(); +} +template <> struct is_proto_enum< ::ascend::presenter::proto::ImageFormat> : ::std::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::ascend::presenter::proto::ImageFormat>() { + return ::ascend::presenter::proto::ImageFormat_descriptor(); +} +template <> struct is_proto_enum< ::ascend::presenter::proto::PresentDataErrorCode> : ::std::true_type {}; +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::ascend::presenter::proto::PresentDataErrorCode>() { + return ::ascend::presenter::proto::PresentDataErrorCode_descriptor(); +} + +PROTOBUF_NAMESPACE_CLOSE + +// @@protoc_insertion_point(global_scope) + +#include +#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_presenter_5fmessage_2eproto diff --git a/cplusplus/common/presenteragent/proto/presenter_message.proto b/cplusplus/common/presenteragent/proto/presenter_message.proto new file mode 100644 index 0000000..879d557 --- /dev/null +++ b/cplusplus/common/presenteragent/proto/presenter_message.proto @@ -0,0 +1,67 @@ +syntax = "proto3"; + +package ascend.presenter.proto; + +enum OpenChannelErrorCode { + kOpenChannelErrorNone = 0; + kOpenChannelErrorNoSuchChannel = 1; + kOpenChannelErrorChannelAlreadyOpened = 2; + kOpenChannelErrorOther = -1; +} + +enum ChannelContentType { + kChannelContentTypeImage = 0; + kChannelContentTypeVideo = 1; +} + +// By Protocol Buffer Style Guide, need to use underscore_separated_names +// for field names +message OpenChannelRequest { + string channel_name = 1; + ChannelContentType content_type = 2; +} + +message OpenChannelResponse { + OpenChannelErrorCode error_code = 1; + string error_message = 2; +} + +message HeartbeatMessage { + +} + +enum ImageFormat { + kImageFormatJpeg = 0; +} + +message Coordinate { + uint32 x = 1; + uint32 y = 2; +} + +message Rectangle_Attr { + Coordinate left_top = 1; + Coordinate right_bottom = 2; + string label_text = 3; +} + +message PresentImageRequest { + ImageFormat format = 1; + uint32 width = 2; + uint32 height = 3; + bytes data = 4; + repeated Rectangle_Attr rectangle_list = 5; +} + +enum PresentDataErrorCode { + kPresentDataErrorNone = 0; + kPresentDataErrorUnsupportedType = 1; + kPresentDataErrorUnsupportedFormat = 2; + kPresentDataErrorOther = -1; +} + +message PresentImageResponse { + PresentDataErrorCode error_code = 1; + string error_message = 2; +} + diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/channel.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/channel.cpp new file mode 100644 index 0000000..5b95b5f --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/channel.cpp @@ -0,0 +1,50 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/channel/default_channel.h" + +namespace ascend { +namespace presenter { + +Channel* ChannelFactory::NewChannel(const std::string& host_ip, uint16_t port) { + return DefaultChannel::NewChannel(host_ip, port, nullptr); +} + +Channel* ChannelFactory::NewChannel( + const std::string& host_ip, uint16_t port, + std::shared_ptr handler) { + return DefaultChannel::NewChannel(host_ip, port, handler); +} + +} /* namespace presenter */ +} /* namespace ascend */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/default_channel.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/default_channel.cpp new file mode 100644 index 0000000..3f56f47 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/default_channel.cpp @@ -0,0 +1,291 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include +#include +#include +#include +#include +#include + +#include "proto/presenter_message.pb.h" + +#include "ascenddk/presenter/agent/channel/default_channel.h" +#include "ascenddk/presenter/agent/net/raw_socket_factory.h" +#include "ascenddk/presenter/agent/util/logging.h" + +using namespace std; +using namespace google::protobuf; + +namespace { +const int HEARTBEAT_INTERVAL = 1500; // 1.5s +} + +namespace ascend { +namespace presenter { + +DefaultChannel* DefaultChannel::NewChannel( + const std::string& host_ip, uint16_t port, + std::shared_ptr handler) { + DefaultChannel *channel = nullptr; + std::shared_ptr fac( + new (std::nothrow) RawSocketFactory(host_ip, port)); + if (fac != nullptr) { + channel = new (std::nothrow) DefaultChannel(fac); + if (channel != nullptr && handler != nullptr) { + channel->SetInitChannelHandler(handler); + } + } + + return channel; +} + +DefaultChannel::DefaultChannel(std::shared_ptr socket_factory) + : socket_factory_(socket_factory), + open_(false), + disposed_(false) { +} + +DefaultChannel::~DefaultChannel() { + disposed_ = true; + if (heartbeat_thread_ != nullptr) { + heartbeat_thread_->join(); + } +} + +void DefaultChannel::SetInitChannelHandler( + std::shared_ptr handler) { + init_channel_handler_ = handler; +} + +shared_ptr DefaultChannel::GetInitChannelHandler() { + return init_channel_handler_; +} + +PresenterErrorCode DefaultChannel::HandleInitialization( + const Message& message) { + // send init request + PresenterErrorCode error_code = conn_->SendMessage(message); + if (error_code != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("Failed to send init request, %d", error_code); + return error_code; + } + + // receive init response + unique_ptr resp; + error_code = conn_->ReceiveMessage(resp); + if (error_code != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("Failed to send init response, %d", error_code); + return error_code; + } + + // check response + if (!init_channel_handler_->CheckInitResponse(*resp)) { + AGENT_LOG_ERROR("App check response failed"); + return PresenterErrorCode::kAppDefinedError; + } + + return PresenterErrorCode::kNone; +} + +PresenterErrorCode DefaultChannel::Open() { + //check request generation before connection + unique_ptr message; + if (init_channel_handler_ != nullptr) { + message.reset(init_channel_handler_->CreateInitRequest()); + if (message == nullptr) { + AGENT_LOG_ERROR("App create init request failed"); + return PresenterErrorCode::kAppDefinedError; + } + } + + Socket* sock = socket_factory_->Create(); + PresenterErrorCode error_code = socket_factory_->GetErrorCode(); + if (error_code != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("Failed to create socket, %d", error_code); + return error_code; + } + + Connection* conn = Connection::New(sock); + if (conn == nullptr) { + delete sock; + return PresenterErrorCode::kBadAlloc; + } + this->conn_.reset(conn); + + //perform init process + if (message != nullptr) { + error_code = HandleInitialization(*message); + if (error_code != PresenterErrorCode::kNone) { + conn_.reset(nullptr); + return error_code; + } + } + + open_ = true; + // prevent from starting multiple thread + if (heartbeat_thread_ == nullptr) { + StartHeartbeatThread(); + } + + return PresenterErrorCode::kNone; +} + +void DefaultChannel::StartHeartbeatThread() { + this->heartbeat_thread_.reset( + new (nothrow) thread(bind(&DefaultChannel::KeepAlive, this))); + + if (heartbeat_thread_ != nullptr) { + AGENT_LOG_INFO("heartbeat thread started"); + } +} + +void DefaultChannel::KeepAlive() { + chrono::milliseconds heartbeatInterval(HEARTBEAT_INTERVAL); + while (!disposed_) { + SendHeartbeat(); + + // interruptable wait + unique_lock lock(mtx_); + cv_shutdown_.wait_for(lock, heartbeatInterval, + [this]() {return disposed_.load();}); + } + + AGENT_LOG_DEBUG("heartbeat thread ended"); +} + +void DefaultChannel::SendHeartbeat() { + // reopen channel if disconnected + if (!open_) { + if (Open() != PresenterErrorCode::kNone) { + return; + } + } + + // construct a heartbeat message then send it + proto::HeartbeatMessage heartbeat_msg; + SendMessage(heartbeat_msg); +} + +PresenterErrorCode DefaultChannel::SendMessage(const Message& message) { + PartialMessageWithTlvs msg; + string msg_name = message.GetDescriptor()->full_name(); + AGENT_LOG_DEBUG("To send message: %s", msg_name.c_str()); + msg.message = &message; + return SendMessage(msg); +} + +PresenterErrorCode DefaultChannel::SendMessage( + const PartialMessageWithTlvs& message) { + if (!open_) { + AGENT_LOG_ERROR("Channel is not open, send message failed"); + return PresenterErrorCode::kConnection; + } + + PresenterErrorCode errorCode = PresenterErrorCode::kOther; + try { + errorCode = conn_->SendMessage(message); + //connect error, set is_open to false, enable retry + if (errorCode == PresenterErrorCode::kConnection) { + open_ = false; + } + } catch (std::exception &e) { // protobuf may throw FatalException + AGENT_LOG_ERROR("Protobuf error: %s", e.what()); + open_ = false; + } + + return errorCode; +} + +PresenterErrorCode DefaultChannel::ReceiveMessage( + unique_ptr& message) { + AGENT_LOG_DEBUG("To receive message"); + if (!open_) { + AGENT_LOG_ERROR("Channel is not open, receive message failed"); + return PresenterErrorCode::kConnection; + } + + PresenterErrorCode error_code = PresenterErrorCode::kOther; + try { + error_code = conn_->ReceiveMessage(message); + // connect error and codec error, set is_open to false, enable retry + if (error_code == PresenterErrorCode::kConnection + || error_code == PresenterErrorCode::kCodec) { + open_ = false; + } + + } catch (std::exception &e) { // protobuf may throw FatalException + AGENT_LOG_ERROR("Protobuf error: %s", e.what()); + open_ = false; + } + + return error_code; +} + +PresenterErrorCode DefaultChannel::SendMessage( + const google::protobuf::Message& message, + std::unique_ptr &response) { + string msg_name = message.GetDescriptor()->full_name(); + AGENT_LOG_DEBUG("To send message: %s", msg_name.c_str()); + PresenterErrorCode error_code = SendMessage(message); + if (error_code == PresenterErrorCode::kNone) { + error_code = ReceiveMessage(response); + } + + return error_code; +} + +PresenterErrorCode DefaultChannel::SendMessage( + const PartialMessageWithTlvs& message, + std::unique_ptr &response) { + string msg_name = message.message->GetDescriptor()->full_name(); + AGENT_LOG_DEBUG("To send message: %s", msg_name.c_str()); + PresenterErrorCode error_code = SendMessage(message); + if (error_code == PresenterErrorCode::kNone) { + error_code = ReceiveMessage(response); + } + + return error_code; +} + +const std::string& DefaultChannel::GetDescription() const { + return this->description_; +} + +void DefaultChannel::SetDescription(const std::string& desc) { + this->description_ = desc; +} + +} +/* namespace presenter */ +} /* namespace ascend */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/default_channel.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/default_channel.h new file mode 100644 index 0000000..88348b0 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/channel/default_channel.h @@ -0,0 +1,192 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_CHANNEL_DEFAULT_CHANNEL_H_ +#define ASCENDDK_PRESENTER_AGENT_CHANNEL_DEFAULT_CHANNEL_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include "ascenddk/presenter/agent/connection/connection.h" +#include "ascenddk/presenter/agent/channel.h" + +namespace ascend { +namespace presenter { + +/** + * Default channel implementation + */ +class DefaultChannel : public Channel { + public: + + /** + * @brief create a channel + * @param [in] host_ip host IP of server + * @param [in] port port of server + * @param [in] handler init handler + * @return pointer to channel + */ + static DefaultChannel* NewChannel( + const std::string& host_ip, uint16_t port, + std::shared_ptr handler); + + virtual ~DefaultChannel(); + + /** + * @brief Open channel + * @return PresenterErrorCode + */ + virtual PresenterErrorCode Open() override; + + /** + * @brief send message to server + * @param [in] message message + * @return PresenterErrorCode + */ + virtual PresenterErrorCode SendMessage( + const google::protobuf::Message& message) override; + + /** + * @brief send message to server + * @param [in] message message + * @return PresenterErrorCode + */ + virtual PresenterErrorCode SendMessage(const PartialMessageWithTlvs& message) + override; + + /** + * @brief send message to server and read the response + * @param [in] message message + * @pararm [out] response response + * @return PresenterErrorCode + */ + virtual PresenterErrorCode SendMessage( + const google::protobuf::Message& message, + std::unique_ptr& response) override; + + /** + * @brief send message to server and read the response + * @param [in] message message + * @pararm [out] response response + * @return PresenterErrorCode + */ + virtual PresenterErrorCode SendMessage( + const PartialMessageWithTlvs& message, + std::unique_ptr& response) override; + + /** + * @brief recevice a response + * @param [out] response response + * @return PresenterErrorCode + */ + virtual PresenterErrorCode ReceiveMessage( + std::unique_ptr& response) override; + + /** + * @brief set InitChannelHandler + * @param [in] handler handler + */ + void SetInitChannelHandler(std::shared_ptr handler); + + /** + * @brief get InitChannelHandler + * @return InitChannelHandler + */ + std::shared_ptr GetInitChannelHandler(); + + /** + * @brief set description + * @param [in] desc description + */ + void SetDescription(const std::string& desc); + + /** + * @brief Get the description of the channel, can be used for logging + * @return description + */ + const std::string& GetDescription() const override; + + private: + /** + * @brief constructor + * @param [in] socket_factory socket factory + */ + DefaultChannel(std::shared_ptr socket_factory); + + /** + * @brief handle channel initialization process + */ + PresenterErrorCode HandleInitialization( + const google::protobuf::Message& message); + + /** + * @brief Start heartbeat thread + */ + void StartHeartbeatThread(); + + /** + * @brief Task to keep the channel alive + */ + void KeepAlive(); + + /** + * @brief Send heartbeat message to server + */ + void SendHeartbeat(); + + private: + std::shared_ptr socket_factory_; + std::shared_ptr init_channel_handler_; + std::unique_ptr conn_; + + // indicating whether the socket is valid + std::atomic_bool open_; + // indicating whether channel is valid + std::atomic_bool disposed_; + + std::mutex mtx_; + std::condition_variable cv_shutdown_; + std::unique_ptr heartbeat_thread_; + + std::string description_; +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_CHANNEL_DEFAULT_CHANNEL_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/codec/message_codec.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/codec/message_codec.cpp new file mode 100644 index 0000000..c895905 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/codec/message_codec.cpp @@ -0,0 +1,214 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/codec/message_codec.h" + +#include +#include +#include + +#include "ascenddk/presenter/agent/util/logging.h" + +using namespace google::protobuf; +using namespace google::protobuf::io; +using namespace std; + +namespace { +const int kMessageNameLengthSize = sizeof(uint8_t); + +// protobuf tag size +const int kTagSize = 1; + +// protobuf string/bytes wire type +const int kProtoStringWireType = 0x2; + +// max buffer size for varint32 +static const int kMaxVarint32Bytes = 5; + +// for calc tag +const int kTagShift = 3; + +// empty string +const string kEmptyStr = ""; +} + +namespace ascend { +namespace presenter { + +// make protobuf tag, tag should less than 15 +static uint8_t MakeTag(int tag) { + return static_cast(tag) << kTagShift | kProtoStringWireType; +} + +static string ConvertToVarint32(uint32_t value) { + // Zero-length field should not be serialized + if (value == 0) { + return kEmptyStr; + } + + char buf[kMaxVarint32Bytes]; + ArrayOutputStream arr(buf, kMaxVarint32Bytes); + CodedOutputStream os(&arr); + os.WriteVarint32(value); + // os.ByteCount() <= kMaxVarint32Bytes + return string(buf, os.ByteCount()); +} + +SharedByteBuffer MessageCodec::EncodeTagAndLength(const Tlv& tlv) { + string varlen = ConvertToVarint32(tlv.length); + if (varlen.empty()) { + AGENT_LOG_ERROR("length is 0"); + return SharedByteBuffer(); + } + + uint32_t size = kTagSize + varlen.size(); + SharedByteBuffer result = SharedByteBuffer::Make(size); + if (result.IsEmpty()) { + return result; + } + + ByteBufferWriter buffer(result.GetMutable(), size); + // put tag + buffer.PutUInt8(MakeTag(tlv.tag)); + // put var length + buffer.PutString(string(varlen.c_str(), varlen.size())); + return result; +} + +SharedByteBuffer MessageCodec::EncodeMessage( + const google::protobuf::Message& message) { + PartialMessageWithTlvs msg; + msg.message = &message; + return EncodeMessage(msg); +} + +SharedByteBuffer MessageCodec::EncodeMessage( + const PartialMessageWithTlvs& msg) { + if (msg.message == nullptr) { + return SharedByteBuffer(); + } + + const Message& message = *(msg.message); + vector tlv_list = msg.tlv_list; + + string name = message.GetDescriptor()->full_name(); + uint32_t msg_size = static_cast(message.ByteSize()); + uint8_t msg_name_size = static_cast(name.size()); + + // calc total size + uint32_t encode_size = kPacketLengthSize + kMessageNameLengthSize; + encode_size += msg_name_size + msg_size; + + uint32_t total_size = encode_size; + // if has additional field + if (!tlv_list.empty()) { + for (auto it = tlv_list.begin(); it != tlv_list.end(); ++it) { + string varlen = ConvertToVarint32(it->length); + total_size = total_size + kTagSize + varlen.size() + it->length; + } + } + + SharedByteBuffer encode_buffer = SharedByteBuffer::Make(encode_size); + if (encode_buffer.IsEmpty()) { + return encode_buffer; + } + + // serialize message + ByteBufferWriter buffer(encode_buffer.GetMutable(), encode_size); + buffer.PutUInt32(total_size); + buffer.PutUInt8(msg_name_size); + buffer.PutString(name); + // serialization may fail if any of the required field is not set, + // in which case, a empty buffer is returned + if (!buffer.PutMessage(message)) { + return SharedByteBuffer(); + } + + return encode_buffer; +} + +// Generate message prototype by name for parsing +static Message* NewMessageByName(const string& name) { + const Descriptor* descriptor = DescriptorPool::generated_pool() + ->FindMessageTypeByName(name); + if (descriptor != nullptr) { + const Message* prototype = + MessageFactory::generated_factory()->GetPrototype(descriptor); + if (descriptor != nullptr) { + return prototype->New(); + } + } + + return nullptr; +} + +Message* MessageCodec::DecodeMessage(const char* data, int size) { + if (size < kMessageNameLengthSize) { + AGENT_LOG_ERROR("Insufficient data for message name length field"); + return nullptr; + } + + // wrap message data with Reader + ByteBufferReader buffer(data, size); + + // read message name length + uint8_t msg_name_length = buffer.ReadUInt8(); + if (buffer.RemainingBytes() < msg_name_length) { + AGENT_LOG_ERROR( + "Insufficient data for name field, expect %d, but remain %d", + msg_name_length, buffer.RemainingBytes()); + return nullptr; + } + + // read message name + string name = buffer.ReadString(msg_name_length); + // get message prototype by name + Message* message = NewMessageByName(name); + if (message == nullptr) { + AGENT_LOG_ERROR("Unsupported message, name = %s", name.c_str()); + return nullptr; + } + + // parse message + if (!buffer.ReadMessage(buffer.RemainingBytes(), *message)) { + AGENT_LOG_ERROR("Failed to parse message, name = %s", name.c_str()); + delete message; + return nullptr; + } + + return message; +} + +} /* namespace presenter */ +} /* namespace ascend */ + diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/codec/message_codec.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/codec/message_codec.h new file mode 100644 index 0000000..fa712cf --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/codec/message_codec.h @@ -0,0 +1,101 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_CODEC_MESSAGE_CODEC_H_ +#define ASCENDDK_PRESENTER_AGENT_CODEC_MESSAGE_CODEC_H_ + +#include +#include + +#include "ascenddk/presenter/agent/channel.h" +#include "ascenddk/presenter/agent/util/byte_buffer.h" + +namespace ascend { +namespace presenter { + +/** + * MessageCodec for encoding and decoding message + * + * A message has the following structure + * -------------------------------------------------------------------- + * |Field Name | Size(bytes) | Type | + * -------------------------------------------------------------------- + * |total message len | 4 | uint32 | + * |------------------------------------------------------------------- + * |message name len | 1 | uint8 | + * |------------------------------------------------------------------- + * |message name | Var. max 255 | String, NO terminated '\0' | + * |------------------------------------------------------------------- + * |message body | Var. | Bytes. Encoded by protobuf | + * -------------------------------------------------------------------- + */ +class MessageCodec { + public: + // size of channel message total length + static const int kPacketLengthSize = sizeof(uint32_t); + + /** + * @brief Encode the message to a ByteBuffer + * @param [in] message message + * @return ByteBuffer. Empty if encode failed + */ + SharedByteBuffer EncodeMessage(const google::protobuf::Message& message); + + /** + * @brief Encode the message to a ByteBuffer + * @param [in] message message + * @return ByteBuffer. Empty if encode failed + */ + SharedByteBuffer EncodeMessage(const PartialMessageWithTlvs& message); + + /** + * @brief Encode the tag and length to a ByteBuffer + * @param [in] Tlv Tlv + * @return ByteBuffer. Empty if encode failed + */ + SharedByteBuffer EncodeTagAndLength(const Tlv& tlv); + + /** + * @brief Decode the message from buffer + * @param [in] data data buffer + * @param [in] size data size + * @return Message. NULL if decode failed + */ + google::protobuf::Message* DecodeMessage(const char* data, int size); + +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_CODEC_MESSAGE_CODEC_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/connection/connection.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/connection/connection.cpp new file mode 100644 index 0000000..5515a37 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/connection/connection.cpp @@ -0,0 +1,192 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/connection/connection.h" + +#include +#include + +#include "ascenddk/presenter/agent/codec/message_codec.h" +#include "ascenddk/presenter/agent/net/raw_socket_factory.h" +#include "ascenddk/presenter/agent/util/byte_buffer.h" +#include "ascenddk/presenter/agent/util/logging.h" +#include "ascenddk/presenter/agent/util/mem_utils.h" + + +namespace { + const uint32_t kMaxPacketSize = 1024 * 1024 * 10; //10MB +} + +namespace ascend { +namespace presenter { + +using google::protobuf::Message; +using namespace std; + +Connection::Connection(Socket* socket) + : socket_(socket) { +} + +Connection* Connection::New(Socket* socket) { + if (socket == nullptr) { + AGENT_LOG_ERROR("socket is null"); + return nullptr; + } + + return new (nothrow) Connection(socket); +} + +PresenterErrorCode Connection::SendTlvList(const std::vector& tlv_list) { + if (tlv_list.empty()) { + return PresenterErrorCode::kNone; + } + + for (auto it = tlv_list.begin(); it != tlv_list.end(); ++it) { + SharedByteBuffer tlv_buf = codec_.EncodeTagAndLength(*it); + if (tlv_buf.IsEmpty()) { + AGENT_LOG_ERROR("Failed to encode TLV"); + return PresenterErrorCode::kCodec; + } + + //send tag and length + PresenterErrorCode error_code = socket_->Send(tlv_buf.Get(), + tlv_buf.Size()); + if (error_code != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("Failed to send TLV tag and length"); + return error_code; + } + + //send value + error_code = socket_->Send(it->value, it->length); + if (error_code != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("Failed to send TLV value"); + return error_code; + } + } + + return PresenterErrorCode::kNone; +} + +PresenterErrorCode Connection::SendMessage( + const PartialMessageWithTlvs& proto_message) { + if (proto_message.message == nullptr) { + AGENT_LOG_ERROR("message is null"); + return PresenterErrorCode::kInvalidParam; + } + // lock for encoding and sending + unique_lock lock(mtx_); + + const char* msg_name = proto_message.message->GetDescriptor()->name().c_str(); + SharedByteBuffer buffer = codec_.EncodeMessage(proto_message); + if (buffer.IsEmpty()) { + AGENT_LOG_ERROR("Failed to encode message: %s", msg_name); + return PresenterErrorCode::kCodec; + } + + // send message + PresenterErrorCode error_code = socket_->Send(buffer.Get(), buffer.Size()); + // if send success and has more to send.. + if (error_code != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("Failed to send message: %s", msg_name); + return error_code; + } + + return SendTlvList(proto_message.tlv_list); +} + +PresenterErrorCode Connection::SendMessage(const Message& message) { + PartialMessageWithTlvs msg; + msg.message = &message; + return SendMessage(msg); +} + +PresenterErrorCode Connection::ReceiveMessage( + unique_ptr<::google::protobuf::Message>& message) { + // read 4 bytes header + char *buf = recv_buf_; + PresenterErrorCode error_code = socket_->Recv( + buf, MessageCodec::kPacketLengthSize); + + if (error_code == PresenterErrorCode::kSocketTimeout) { + AGENT_LOG_INFO("Read message header timeout"); + return PresenterErrorCode::kSocketTimeout; + } + + if (error_code != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("Failed to read message header"); + return error_code; + } + + // parse length + uint32_t total_size = ntohl(*((uint32_t*) buf)); + + // read the remaining data + uint32_t remaining_size = total_size - MessageCodec::kPacketLengthSize; + if (remaining_size == 0 || remaining_size > kMaxPacketSize) { + AGENT_LOG_ERROR("received malformed message, size field = %u", total_size); + return PresenterErrorCode::kCodec; + } + + int pack_size = static_cast(remaining_size); + unique_ptr unique_buf; // ensure release allocated buffer + if (remaining_size > kBufferSize) { + buf = memutils::NewArray(remaining_size); + if (buf == nullptr) { + return PresenterErrorCode::kBadAlloc; + } + + unique_buf.reset(memutils::NewArray(remaining_size)); + } + + // packSize must be within [1, MAX_PACKET_SIZE], + // Recv() can not cause buffer overflow + error_code = socket_->Recv(buf, pack_size); + if (error_code != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("Failed to read whole message"); + return PresenterErrorCode::kConnection; + } + + // Decode message + Message* msg = codec_.DecodeMessage(buf, pack_size); + if (msg == nullptr) { + return PresenterErrorCode::kCodec; + } + + message.reset(msg); + string name = message->GetDescriptor()->name(); + AGENT_LOG_DEBUG("Message received, name = %s", name.c_str()); + return PresenterErrorCode::kNone; +} + +} /* namespace presenter */ +} /* namespace ascend */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/connection/connection.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/connection/connection.h new file mode 100644 index 0000000..7f4a1c7 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/connection/connection.h @@ -0,0 +1,112 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_CONNECTION_CONNECTION_H_ +#define ASCENDDK_PRESENTER_AGENT_CONNECTION_CONNECTION_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include "ascenddk/presenter/agent/codec/message_codec.h" +#include "ascenddk/presenter/agent/errors.h" +#include "ascenddk/presenter/agent/net/socket_factory.h" + +namespace ascend { +namespace presenter { + +/** + * Connection between agent and server + * provide protobuf based interface + */ +class Connection { + public: + static Connection* New(Socket* socket); + ~Connection() = default; + + /** + * @brief Send a protobuf Message to presenter server + * @param [in] message protobuf message + * @return PresenterErrorCode + */ + PresenterErrorCode SendMessage(const ::google::protobuf::Message& message); + + /** + * @brief Send a Message to presenter server + * @param [in] message PartialMessageWithTlvs + * @return PresenterErrorCode + */ + PresenterErrorCode SendMessage(const PartialMessageWithTlvs& message); + + /** + * @brief Receive a message from presenter server + * @param [out] message response message + * @return PresenterErrorCode + */ + PresenterErrorCode ReceiveMessage( + std::unique_ptr<::google::protobuf::Message>& message); + + private: + PresenterErrorCode DoSendMessage(const ::google::protobuf::Message& message, + const std::vector& tlv_list); + + private: + Connection(Socket* socket); + + /** + * @brief Send tlv in protobuf format to server + * @param [out] message response message + * @return PresenterErrorCode + */ + PresenterErrorCode SendTlvList(const std::vector& tlv_list); + + // max size of received message + static const int kBufferSize = 1024; + + std::unique_ptr socket_; + + char recv_buf_[kBufferSize] = { 0 }; + + std::mutex mtx_; + + MessageCodec codec_; +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_CONNECTION_CONNECTION_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket.cpp new file mode 100644 index 0000000..16f84c7 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket.cpp @@ -0,0 +1,63 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/net/raw_socket.h" + +#include "ascenddk/presenter/agent/util/logging.h" +#include "ascenddk/presenter/agent/util/socket_utils.h" + +namespace ascend { +namespace presenter { + +RawSocket* RawSocket::New(int socket) { + return new (std::nothrow) RawSocket(socket); +} + +RawSocket::RawSocket(int socket) + : socket_(socket) { +} + +RawSocket::~RawSocket() { + socketutils::CloseSocket(socket_); +} + +int RawSocket::DoSend(const char* data, int size) { + return socketutils::WriteN(socket_, data, size); +} + +int RawSocket::DoRecv(char* buf, int size) { + return socketutils::ReadN(socket_, buf, size); +} + +} /* namespace presenter */ +} /* namespace ascend */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket.h new file mode 100644 index 0000000..af96248 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket.h @@ -0,0 +1,94 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_NET_RAW_SOCKET_H_ +#define ASCENDDK_PRESENTER_AGENT_NET_RAW_SOCKET_H_ + +#include "ascenddk/presenter/agent/errors.h" +#include "ascenddk/presenter/agent/net/socket.h" + +namespace ascend { +namespace presenter { + +/** + * RawSocket, the data is not encrypted + */ +class RawSocket : public Socket { + public: + /** + * @brief Factory method + * @param [in] socket socket file descriptor + */ + static RawSocket* New(int socket); + + /** + * @brief Constructor + * @param [in] socket socket file descriptor + */ + explicit RawSocket(int socket); + + // Disable copy constructor and assignment operator + RawSocket(const RawSocket& other) = delete; + RawSocket& operator=(const RawSocket& other) = delete; + + /** + * @brief Destructor + */ + virtual ~RawSocket(); + + protected: + + /** + * @brief Read bytes from socket + * @param [in] buffer receive buffer + * @param [in] size expected bytes + * @return bytes received. -1 of read failed + */ + virtual int DoRecv(char *buffer, int size) override; + + /** + * @brief Write bytes to socket + * @param [in] data bytes to send + * @param [in] size size of data + * @return bytes sent. -1 if send failed + */ + virtual int DoSend(const char *data, int size) override; + + private: + int socket_; +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_NET_RAW_SOCKET_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket_factory.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket_factory.cpp new file mode 100644 index 0000000..e2848ca --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket_factory.cpp @@ -0,0 +1,72 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/net/raw_socket_factory.h" + +#include +#include +#include + +#include "ascenddk/presenter/agent/util/logging.h" +#include "ascenddk/presenter/agent/util/socket_utils.h" + +using std::string; + +namespace ascend { +namespace presenter { + +RawSocketFactory::RawSocketFactory(const string& host_ip, uint16_t port) + : host_ip_(host_ip), + port_(port) { +} + +// overrided method of Create() +RawSocket* RawSocketFactory::Create() { + // create a socket and connect to server + int sock = CreateSocket(host_ip_, port_); + if (sock == socketutils::kSocketError) { + return nullptr; + } + + // No error, create RawSocket and return + RawSocket *ret = RawSocket::New(sock); + if (ret == nullptr) { + (void) close(sock); + SetErrorCode(PresenterErrorCode::kBadAlloc); + } + + return ret; +} + +} /* namespace presenter */ +} /* namespace ascend */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket_factory.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket_factory.h new file mode 100644 index 0000000..5c58f21 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/raw_socket_factory.h @@ -0,0 +1,72 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ +#ifndef ASCENDDK_PRESENTER_AGENT_NET_RAW_SOCKET_FACTORY_H_ +#define ASCENDDK_PRESENTER_AGENT_NET_RAW_SOCKET_FACTORY_H_ + +#include +#include + +#include "ascenddk/presenter/agent/net/raw_socket.h" +#include "ascenddk/presenter/agent/net/socket_factory.h" + +namespace ascend { +namespace presenter { + +/** + * Factory of RawSocket + */ +class RawSocketFactory : public SocketFactory { + public: + /** + * @brief Constructor + * @param hostIp host IP + * @param port port + */ + RawSocketFactory(const std::string& host_ip, uint16_t port); + + /** + * @brief Create instance of RawSocket, If NULL is returned, + * Invoke GetErrorCode() for error code + * @return pointer of RawSocket + */ + virtual RawSocket* Create() override; + + private: + std::string host_ip_; + uint16_t port_; +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_NET_RAW_SOCKET_FACTORY_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket.cpp new file mode 100644 index 0000000..a97bfcb --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket.cpp @@ -0,0 +1,80 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/net/socket.h" + +#include "ascenddk/presenter/agent/util/logging.h" +#include "ascenddk/presenter/agent/util/socket_utils.h" + +namespace ascend { +namespace presenter { + +PresenterErrorCode Socket::Send(const char *data, int size) { + int ret = DoSend(data, size); + if (ret == socketutils::kSocketError) { + return PresenterErrorCode::kConnection; + } + + // check size of sent data + if (ret < size) { + AGENT_LOG_ERROR("Socket::Send() error, expect %d bytes, but sent %d", size, + ret); + return PresenterErrorCode::kConnection; + } + + AGENT_LOG_DEBUG("Socket::Send() succeeded, size = %d", size); + return PresenterErrorCode::kNone; +} + +PresenterErrorCode Socket::Recv(char *buffer, int size) { + int ret = DoRecv(buffer, size); + if (ret == socketutils::kSocketError) { + return PresenterErrorCode::kConnection; + } else if (ret == socketutils::kSocketTimeout) { + return PresenterErrorCode::kSocketTimeout; + } + + // check size of received data + if (ret < size) { + AGENT_LOG_ERROR("Socket::Recv() error, expect %d bytes, but received %d", + size, ret); + return PresenterErrorCode::kConnection; + } + + AGENT_LOG_DEBUG("Socket::Recv() succeeded, size = %d", size); + return PresenterErrorCode::kNone; +} + +} /* namespace presenter */ +} /* namespace ascend */ + diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket.h new file mode 100644 index 0000000..6818697 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket.h @@ -0,0 +1,97 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_NET_SOCKET_H_ +#define ASCENDDK_PRESENTER_AGENT_NET_SOCKET_H_ + +#include +#include + +#include "ascenddk/presenter/agent/errors.h" + +namespace ascend { +namespace presenter { + +/** + * Abstract Socket Class + * Subclasses can override protected method to implement socket with SSL + */ +class Socket { + public: + Socket() = default; + virtual ~Socket() = default; + + // Disable copy constructor and assignment operator + Socket(const Socket& other) = delete; + Socket& operator=(const Socket& other) = delete; + + /** + * @brief Read bytes from socket + * @param [in] buffer receive buffer + * @param [in] size expected bytes + * @return PresenterErrorCode + */ + PresenterErrorCode Send(const char *data, int size); + + /** + * @brief Write bytes to socket + * @param [in] data bytes to send + * @param [in] size size of data + * @return PresenterErrorCode + */ + PresenterErrorCode Recv(char *buf, int size); + + protected: + + /** + * @brief Read bytes from socket + * @param [in] buffer receive buffer + * @param [in] size expected bytes + * @return bytes received + */ + virtual int DoRecv(char *buffer, int size) = 0; + + /** + * @brief Write bytes to socket + * @param [in] data bytes to send + * @param [in] size size of data + * @return bytes sent + */ + virtual int DoSend(const char *data, int size) = 0; + +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_NET_SOCKET_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket_factory.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket_factory.cpp new file mode 100644 index 0000000..4426779 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket_factory.cpp @@ -0,0 +1,114 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/net/socket_factory.h" + +#include +#include +#include +#include +#include + +#include "ascenddk/presenter/agent/errors.h" +#include "ascenddk/presenter/agent/util/logging.h" +#include "ascenddk/presenter/agent/util/socket_utils.h" + +using namespace std; + +namespace ascend { +namespace presenter { + +// anonymous namespace for constants +namespace { + +// Default Socket Timeout +const int kDefaultTimeoutInSec = 3; + +} /* anonymous namespace */ + +PresenterErrorCode SocketFactory::GetErrorCode() const { + return error_code_; +} + +void SocketFactory::SetErrorCode(PresenterErrorCode error_code) { + this->error_code_ = error_code; +} + +// common function for creating a socket with given hostIp and port +int SocketFactory::CreateSocket(const string& host_ip, uint16_t port) { + // parse address + sockaddr_in addr; + if (!socketutils::SetSockAddr(host_ip.c_str(), port, addr)) { + AGENT_LOG_ERROR("Invalid address: %s:%d", host_ip.c_str(), port); + SetErrorCode(PresenterErrorCode::kInvalidParam); + return socketutils::kSocketError; + } + + // create socket file descriptor + int sock = socketutils::CreateSocket(); + if (sock == socketutils::kSocketError) { + AGENT_LOG_ERROR("socket() error: %s", strerror(errno)); + SetErrorCode(PresenterErrorCode::kConnection); + return socketutils::kSocketError; + } + + // reuse address + socketutils::SetSocketReuseAddr(sock); + + // set timeout + socketutils::SetSocketTimeout(sock, kDefaultTimeoutInSec); + + // do connect + if (socketutils::Connect(sock, addr) == socketutils::kSocketError) { + if (errno == EINVAL) { + SetErrorCode(PresenterErrorCode::kInvalidParam); + } else { + SetErrorCode(PresenterErrorCode::kConnection); + } + + AGENT_LOG_ERROR("Failed to connect to server: %s:%u", host_ip.c_str(), port); + + // connect failed, close socket + (void) close(sock); + return socketutils::kSocketError; + } + + // connect successfully + SetErrorCode(PresenterErrorCode::kNone); + AGENT_LOG_INFO("Connected to server %s:%d, socket file descriptor = %d", + host_ip.c_str(), port, sock); + return sock; +} + +} /* namespace presenter */ +} /* namespace ascend */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket_factory.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket_factory.h new file mode 100644 index 0000000..100cde9 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/net/socket_factory.h @@ -0,0 +1,94 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_NET_SOCKET_FACTORY_H_ +#define ASCENDDK_PRESENTER_AGENT_NET_SOCKET_FACTORY_H_ + +#include "ascenddk/presenter/agent/net/socket.h" + +#include +#include + + +namespace ascend { +namespace presenter { + +/** + * Abstract SocketFactory for creating Socket + * Subclasses implement Create() to return concrete instance + */ +class SocketFactory { + public: + + /** + * Destructor + */ + virtual ~SocketFactory() = default; + + /** + * @brief Create instance of Socket, If NULL is returned, + * invoke GetErrorCode() for error code + * @return pointer of Socket + */ + virtual Socket* Create() = 0; + + /** + * @brief Get error code + */ + PresenterErrorCode GetErrorCode() const; + + protected: + + /** + * @brief create a socket and connect to server + * @param [in] host_ip host IP + * @param [in] port port + * @return socket file descriptor, if SOCKET_ERROR(-1) is returned, + * invoke GetErrorCode() for error code + */ + int CreateSocket(const std::string& host_ip, std::uint16_t port); + + /** + * @brief Set error code + * @param[in] error_code error code + */ + void SetErrorCode(PresenterErrorCode error_code); + + private: + PresenterErrorCode error_code_ = PresenterErrorCode::kNone; +}; + +} +} + +#endif /* ASCENDDK_PRESENTER_AGENT_NET_SOCKET_FACTORY_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel.cpp new file mode 100644 index 0000000..2056a18 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel.cpp @@ -0,0 +1,197 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/presenter_channel.h" + +#include +#include + +#include "ascenddk/presenter/agent/channel/default_channel.h" +#include "ascenddk/presenter/agent/net/raw_socket_factory.h" +#include "ascenddk/presenter/agent/presenter/presenter_channel_init_handler.h" +#include "ascenddk/presenter/agent/presenter/presenter_message_helper.h" +#include "ascenddk/presenter/agent/util/logging.h" +#include "ascenddk/presenter/agent/util/parse_config.h" + +using namespace std; +using namespace google::protobuf; + +namespace ascend { +namespace presenter { + +PresenterErrorCode CreateChannel(Channel *&channel, + const OpenChannelParam ¶m) { + std::shared_ptr handler = make_shared< + PresentChannelInitHandler>(param); + + DefaultChannel *ch = DefaultChannel::NewChannel(param.host_ip, param.port, handler); + if (ch == nullptr) { + AGENT_LOG_ERROR("Channel new() error"); + return PresenterErrorCode::kBadAlloc; + } + + // OpenChannelParam to string + std::stringstream ss; + ss << "PresenterChannelImpl: {"; + ss << "server: " << param.host_ip << ":" << param.port; + ss << ", channel: " << param.channel_name; + ss << ", content_type: " << static_cast(param.content_type); + ss << "}"; + ch->SetDescription(ss.str()); + channel = ch; + return PresenterErrorCode::kNone; +} + +PresenterErrorCode OpenChannel(Channel *&channel, + const OpenChannelParam ¶m) { + + // If the channel is not NULL, we cannot know whether it is actually + // point to something. We cannot be sure whether it is safe to simply + // delete that, so a kPresenterErrorInvalidParams will be returned + if (channel != nullptr) { + AGENT_LOG_ERROR("channel is not NULL"); + return PresenterErrorCode::kInvalidParam; + } + + // allocate channel object + PresenterErrorCode error_code = CreateChannel(channel, param); + if (error_code != PresenterErrorCode::kNone) { + return error_code; + } + + string channelDesc = channel->GetDescription(); + + // Try Open Channel + AGENT_LOG_INFO("To Open channel: %s", channelDesc.c_str()); + + error_code = channel->Open(); + + // If failed, the channel object need to be released + if (error_code != PresenterErrorCode::kNone) { + if (error_code == PresenterErrorCode::kAppDefinedError) { + DefaultChannel *ch = dynamic_cast(channel); + error_code = dynamic_pointer_cast( + ch->GetInitChannelHandler())->GetErrorCode(); + } + + AGENT_LOG_ERROR("OpenChannel Failed, channel = %s, error_code = %d", + channelDesc.c_str(), error_code); + delete channel; + channel = nullptr; + return error_code; + } + + AGENT_LOG_INFO("Channel opened, channel = %s", channelDesc.c_str()); + return PresenterErrorCode::kNone; +} + +PresenterErrorCode OpenChannelByConfig(Channel*& channel, + const char* configFile) { + map config; + ReadConfig(config, configFile); + + OpenChannelParam param; + map::const_iterator mIter = config.begin(); + for (; mIter != config.end(); ++mIter) { + if (mIter->first == "presenter_server_ip") { + param.host_ip = mIter->second; + AGENT_LOG_INFO("presenter_server_ip config string:%s", mIter->second.c_str()); + } + else if (mIter->first == "presenter_server_port") { + param.port = std::stoi(mIter->second); + AGENT_LOG_INFO("presenter_server_port config string:%s", mIter->second.c_str()); + } + else if (mIter->first == "channel_name") { + param.channel_name = mIter->second; + AGENT_LOG_INFO("channel_name config string:%s", mIter->second.c_str()); + } + else if (mIter->first == "content_type") { + param.content_type = static_cast(std::stoi(mIter->second)); + AGENT_LOG_INFO("content_type config string:%s", mIter->second.c_str()); + printf("content_type config string:%s\n", mIter->second.c_str()); + } + } + + return OpenChannel(channel, param); +} + +PresenterErrorCode PresentImage(Channel *channel, const ImageFrame &image) { + if (channel == nullptr) { + AGENT_LOG_ERROR("channel is NULL"); + return PresenterErrorCode::kInvalidParam; + } + + proto::PresentImageRequest req; + if (!PresenterMessageHelper::InitPresentImageRequest(req, image)) { + return PresenterErrorCode::kInvalidParam; + } + + Tlv tlv; + tlv.tag = proto::PresentImageRequest::kDataFieldNumber; + tlv.length = image.size; + tlv.value = reinterpret_cast(image.data); + + PartialMessageWithTlvs message; + message.message = &req; + message.tlv_list.push_back(tlv); + + std::unique_ptr recv_message; + PresenterErrorCode error_code = channel->SendMessage(message, recv_message); + if (error_code != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("Failed to present image, error = %d", error_code); + return error_code; + } + + return PresenterMessageHelper::CheckPresentImageResponse(*recv_message); +} + +PresenterErrorCode SendMessage( + Channel *channel, const google::protobuf::Message& message) { + if (channel == nullptr) { + AGENT_LOG_ERROR("channel is NULL"); + return PresenterErrorCode::kInvalidParam; + } + + unique_ptr resp; + PresenterErrorCode error_code = channel->SendMessage(message, resp); + if (error_code != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("Failed to present image, error = %d", error_code); + return error_code; + } + + return PresenterMessageHelper::CheckPresentImageResponse(*resp); +} + +} +} + diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel_init_handler.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel_init_handler.cpp new file mode 100644 index 0000000..5f45a60 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel_init_handler.cpp @@ -0,0 +1,78 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/presenter/presenter_channel_init_handler.h" + +#include "ascenddk/presenter/agent/presenter/presenter_message_helper.h" +#include "ascenddk/presenter/agent/util/logging.h" + +using google::protobuf::Message; + +namespace ascend { +namespace presenter { + +PresentChannelInitHandler::PresentChannelInitHandler( + const OpenChannelParam& param) + : param_(param) { +} + +google::protobuf::Message* PresentChannelInitHandler::CreateInitRequest() { + proto::OpenChannelRequest *req = + new (std::nothrow) proto::OpenChannelRequest(); + if (req != nullptr) { + error_code_ = PresenterMessageHelper::CreateOpenChannelRequest( + *req, param_.channel_name, param_.content_type); + + if (error_code_ != PresenterErrorCode::kNone) { + delete req; + return nullptr; + } + } + + return req; +} + +bool PresentChannelInitHandler::CheckInitResponse(const Message& response) { + error_code_ = PresenterMessageHelper::CheckOpenChannelResponse(response); + if (error_code_ != PresenterErrorCode::kNone) { + AGENT_LOG_ERROR("OpenChannel failed, error = %d", error_code_); + } + return error_code_ == PresenterErrorCode::kNone; +} + +PresenterErrorCode PresentChannelInitHandler::GetErrorCode() const { + return error_code_; +} + +} /* namespace presenter */ +} /* namespace ascend */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel_init_handler.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel_init_handler.h new file mode 100644 index 0000000..f9472cc --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_channel_init_handler.h @@ -0,0 +1,84 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_PRESENTER_PRESENTER_CHANNEL_INIT_HANDLER_H_ +#define ASCENDDK_PRESENTER_AGENT_PRESENTER_PRESENTER_CHANNEL_INIT_HANDLER_H_ + +#include + +#include "ascenddk/presenter/agent/channel.h" +#include "ascenddk/presenter/agent/errors.h" +#include "ascenddk/presenter/agent/presenter_types.h" + +namespace ascend { +namespace presenter { + +/** + * Presenter Channel Init Handler + */ +class PresentChannelInitHandler : public InitChannelHandler { + public: + /** + * @brief Constructor + * @param [in] param Open channel parameter + */ + PresentChannelInitHandler(const OpenChannelParam& param); + + /** + * @brief Create OpenChannelRequest + * @return OpenChannelRequest + */ + google::protobuf::Message* CreateInitRequest() override; + + /** + * @brief Check OpenChannelResponse + * @param [in] response response + * @return check result + */ + bool CheckInitResponse(const google::protobuf::Message& response) override; + + /** + * @brief Get ErrorCode + * @return PresenterErrorCode + */ + PresenterErrorCode GetErrorCode() const; + + private: + OpenChannelParam param_; + PresenterErrorCode error_code_ = PresenterErrorCode::kOther; +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_PRESENTER_PRESENTER_CHANNEL_INIT_HANDLER_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_message_helper.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_message_helper.cpp new file mode 100644 index 0000000..10173ab --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_message_helper.cpp @@ -0,0 +1,170 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/presenter/presenter_message_helper.h" + +#include "ascenddk/presenter/agent/util/logging.h" + +using std::string; + +namespace ascend { +namespace presenter { + +PresenterErrorCode PresenterMessageHelper::CreateOpenChannelRequest( + proto::OpenChannelRequest& request, const string& channel_name, + ContentType content_type) { + // check channel name + if (channel_name.empty()) { + AGENT_LOG_ERROR("channel name is empty"); + return PresenterErrorCode::kInvalidParam; + } + + request.set_channel_name(channel_name); + + // set content type + if (content_type == ContentType::kImage) { + request.set_content_type(proto::kChannelContentTypeImage); + } else if (content_type == ContentType::kVideo) { + request.set_content_type(proto::kChannelContentTypeVideo); + } else { + AGENT_LOG_ERROR("Unsupported content type: %d", content_type); + return PresenterErrorCode::kInvalidParam; + } + + return PresenterErrorCode::kNone; +} + +bool PresenterMessageHelper::InitPresentImageRequest( + proto::PresentImageRequest& request, const ImageFrame& image) { + if (image.format == ImageFormat::kJpeg) { + request.set_format(proto::kImageFormatJpeg); + } else { // other formats is not supported + AGENT_LOG_ERROR("Unsupported image format: %d", image.format); + return false; + } + + // data can not be NULL + if (image.data == nullptr) { + AGENT_LOG_ERROR("Image data is NULL"); + return false; + } + + // size should greater than 0 + if (image.size == 0) { + AGENT_LOG_ERROR("Image data size is 0"); + return false; + } + + request.set_width(image.width); + request.set_height(image.height); + + // set the rectangle attr + proto::Rectangle_Attr *rectangle_attr = nullptr; + for (uint32_t i = 0; i < image.detection_results.size(); i++) + { + rectangle_attr = request.add_rectangle_list(); + rectangle_attr->mutable_left_top()-> set_x(image.detection_results[i].lt.x); + rectangle_attr->mutable_left_top()-> set_y(image.detection_results[i].lt.y); + rectangle_attr->mutable_right_bottom()->set_x(image.detection_results[i].rb.x); + rectangle_attr->mutable_right_bottom()->set_y(image.detection_results[i].rb.y); + rectangle_attr->set_label_text(image.detection_results[i].result_text); + } + // image.data may be too large to affect performance, so it is not set here + return true; +} + +PresenterErrorCode PresenterMessageHelper::TranslateErrorCode( + proto::OpenChannelErrorCode error_code) { + switch (error_code) { + case proto::kOpenChannelErrorNone: + return PresenterErrorCode::kNone; + case proto::kOpenChannelErrorChannelAlreadyOpened: + return PresenterErrorCode::kChannelAlreadyOpened; + case proto::kOpenChannelErrorNoSuchChannel: + return PresenterErrorCode::kNoSuchChannel; + default: + return PresenterErrorCode::kServerReturnedUnknownError; + } +} + +PresenterErrorCode PresenterMessageHelper::CheckOpenChannelResponse( + const ::google::protobuf::Message& msg) { + + string msg_name = msg.GetDescriptor()->full_name(); + // check response + if (msg_name != proto::OpenChannelResponse::descriptor()->full_name()) { + AGENT_LOG_ERROR("expecting OpenChannelResponse, but received %s", + msg_name.c_str()); + return PresenterErrorCode::kOther; + } + + const proto::OpenChannelResponse& resp = + static_cast(msg); + return TranslateErrorCode(resp.error_code()); +} + +PresenterErrorCode PresenterMessageHelper::TranslateErrorCode( + proto::PresentDataErrorCode error_code) { + if (error_code == proto::kPresentDataErrorNone) { + return PresenterErrorCode::kNone; + } + + AGENT_LOG_ERROR("Present Image failed. error code = %d", error_code); + + if (error_code == proto::kPresentDataErrorUnsupportedFormat || + error_code == proto::kPresentDataErrorUnsupportedType) { + return PresenterErrorCode::kInvalidParam; + } + + return PresenterErrorCode::kServerReturnedUnknownError; +} + +PresenterErrorCode PresenterMessageHelper::CheckPresentImageResponse( + const ::google::protobuf::Message& msg) { + // check response + string msg_name = msg.GetDescriptor()->full_name(); + + // if the received message is not of the desired type + if (msg_name != proto::PresentImageResponse::descriptor()->full_name()) { + AGENT_LOG_ERROR("expecting PresentImageResponse, but received %s", + msg_name.c_str()); + return PresenterErrorCode::kOther; + } + + const proto::PresentImageResponse& resp = + static_cast(msg); + return TranslateErrorCode(resp.error_code()); +} + +} /* namespace presenter */ +} /* namespace ascend */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_message_helper.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_message_helper.h new file mode 100644 index 0000000..fab2144 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/presenter/presenter_message_helper.h @@ -0,0 +1,113 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef SRC_CHANNEL_PRESENTERMESSAGEHELPER_H_ +#define SRC_CHANNEL_PRESENTERMESSAGEHELPER_H_ + +#include + +#include "ascenddk/presenter/agent/errors.h" +#include "ascenddk/presenter/agent/presenter_types.h" +#include "proto/presenter_message.pb.h" + +namespace ascend { +namespace presenter { + +/** + * Helper class for Presenter Messages + */ +class PresenterMessageHelper { + public: + // helper class, constructor/destructor is not needed + PresenterMessageHelper() = delete; + ~PresenterMessageHelper() = delete; + + /** + * @brief create OpenChannelRequest + * @param [out] request request to set the properties + * @param [in] channelName channel name + * @param [in] contentType content type + * @return Shared pointer of OpenChannelRequest. nullptr is returned if + * any of the parameters is invalid + */ + static PresenterErrorCode CreateOpenChannelRequest( + proto::OpenChannelRequest& request, const std::string& channel_name, + ContentType content_type); + + /** + * @brief create PresentImageRequest + * @param [out] request request to set the properties + * @param [in] image image + * @return true: success, false: failure + */ + static bool InitPresentImageRequest(proto::PresentImageRequest& request, + const ImageFrame& image); + + /** + * @brief Check OpenChannelResponse + * @param [in] msg Open Channel Response + * @return PresenterErrorCode + */ + static PresenterErrorCode CheckOpenChannelResponse( + const ::google::protobuf::Message& msg); + + /** + * @brief Check PresentImageResponse + * @param [in] msg Present Image Response + * @return PresenterErrorCode + */ + static PresenterErrorCode CheckPresentImageResponse( + const ::google::protobuf::Message& msg); + + private: + /** + * @brief Translate OpenChannelErrorCode + * @param [in] errorCode Error code + * @return PresenterErrorCode + */ + static PresenterErrorCode TranslateErrorCode( + proto::OpenChannelErrorCode error_code); + + /** + * @brief Translate PresentDataErrorCode + * @param [in] errorCode Error code + * @return PresenterErrorCode + */ + static PresenterErrorCode TranslateErrorCode( + proto::PresentDataErrorCode error_code); +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* SRC_CHANNEL_PRESENTERMESSAGEHELPER_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/byte_buffer.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/byte_buffer.cpp new file mode 100644 index 0000000..3965a3f --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/byte_buffer.cpp @@ -0,0 +1,209 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/util/byte_buffer.h" + +#include + +#include "ascenddk/presenter/agent/util/logging.h" +#include "ascenddk/presenter/agent/util/mem_utils.h" + +using namespace google::protobuf; +using namespace google::protobuf::io; + +using std::string; + +namespace ascend { +namespace presenter { + +SharedByteBuffer SharedByteBuffer::Make(std::uint32_t size) { + char *buffer = memutils::NewArray(size); + if (buffer == nullptr) { + AGENT_LOG_ERROR("buffer new() failed"); + return SharedByteBuffer(); + } + + return SharedByteBuffer(buffer, size); +} + +SharedByteBuffer::SharedByteBuffer() + : buf_(nullptr), + size_(0) { +} + +SharedByteBuffer::SharedByteBuffer(char* buf, std::uint32_t size) + : buf_(buf, std::default_delete()), + size_(size) { +} + +const char* SharedByteBuffer::Get() const { + return buf_.get(); +} + +char* SharedByteBuffer::GetMutable() const { + return buf_.get(); +} + +uint32_t SharedByteBuffer::Size() const { + return size_; +} + +bool SharedByteBuffer::IsEmpty() const { + return size_ == 0; +} + +ByteBuffer::ByteBuffer(const char* buf, uint32_t size) + : buf(buf), + size(size) { +} + +ByteBuffer::ByteBuffer() + : buf(nullptr), + size(0) { +} + +const char* ByteBuffer::Get() const { + return buf; +} + +uint32_t ByteBuffer::Size() const { + return size; +} + +bool ByteBuffer::IsEmpty() const { + return size == 0; +} + +ByteBufferWriter::ByteBufferWriter(char* buf, int size) + : buf_(buf), + w_ptr_(buf), + end_(buf + size) { +} + +ByteBufferWriter::~ByteBufferWriter() { +} + +void ByteBufferWriter::PutUInt8(uint8_t value) { + PutBytes(&value, sizeof(value)); +} + +void ByteBufferWriter::PutUInt32(uint32_t value) { + // host byte order to network byte order + uint32_t converted = htonl(value); + PutBytes(&converted, sizeof(converted)); +} + +void ByteBufferWriter::PutString(const string& value) { + PutBytes(value.c_str(), value.size()); +} + +bool ByteBufferWriter::PutMessage(const ::google::protobuf::Message& msg) { + bool result = msg.SerializePartialToArray(w_ptr_, end_ - w_ptr_); + w_ptr_ += msg.ByteSize(); + return result; +} + +void ByteBufferWriter::PutBytes(const void *data, size_t size) { + ptrdiff_t remaining_bytes = end_ - w_ptr_; + // validate buffer state + if (remaining_bytes <= 0) { + return; + } + + if (size <= (size_t)remaining_bytes) { + memcpy(w_ptr_, data, size); + w_ptr_ += size; + return; + } + + AGENT_LOG_ERROR("memcpy error, buffer remains: %d, and requiring: %u", + remaining_bytes, size); + // memcpy failed, any following write will be meaningless, + // So set wPtr after end, to set the buffer to a faulty state + w_ptr_ += remaining_bytes + 1; +} + +ByteBuffer ByteBufferWriter::GetBuffer() { + if (buf_ == nullptr) { + return ByteBuffer(); + } + + if (w_ptr_ > end_) { + AGENT_LOG_ERROR("Buffer overflow"); + return ByteBuffer(); + } + + ptrdiff_t size = w_ptr_ - buf_; + return ByteBuffer(buf_, size); +} + +ByteBufferReader::ByteBufferReader(const char* buf, int size) + : r_ptr_(buf), + end_(buf + size) { +} + +uint8_t ByteBufferReader::ReadUInt8() { + uint8_t value = *((uint8_t*) r_ptr_); + r_ptr_ += sizeof(value); + return value; +} + +uint32_t ByteBufferReader::ReadUInt32() { + // network byte order to host byte order + uint32_t value = ntohl(*((uint32_t*) r_ptr_)); + r_ptr_ += sizeof(value); + return value; +} + +string ByteBufferReader::ReadString(int size) { + string value(r_ptr_, size); + r_ptr_ += size; + return std::move(value); +} + +bool ByteBufferReader::ReadMessage(int size, Message &message) { + // parse protobuf message + if (!message.ParseFromArray(r_ptr_, size)) { + return false; + } + + r_ptr_ += size; + return true; +} + +int ByteBufferReader::RemainingBytes() { + return end_ - r_ptr_; +} + +} /* namespace presenter */ +} /* namespace ascend */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/byte_buffer.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/byte_buffer.h new file mode 100644 index 0000000..47ab750 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/byte_buffer.h @@ -0,0 +1,258 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_UTIL_BYTE_BUFFER_H_ +#define ASCENDDK_PRESENTER_AGENT_UTIL_BYTE_BUFFER_H_ + +#include +#include +#include + +#include + +namespace ascend { +namespace presenter { + +class SharedByteBuffer { + public: + static SharedByteBuffer Make(std::uint32_t size); + + /** + * @brief constructor + * @param [in] buf buffer + * @param [in] size size of buffer + */ + SharedByteBuffer(char* buf, std::uint32_t size); + + /** + * @brief constructor + */ + SharedByteBuffer(); + ~SharedByteBuffer() = default; + + /** + * @brief Get buffer + * @return buffer + */ + const char* Get() const; + + /** + * @brief Get buffer + * @return buffer + */ + char* GetMutable() const; + + /** + * @brief Get size of buffer + * @return size of buffer + */ + std::uint32_t Size() const; + + /** + * @brief Check whether the buffer is empty + * @return true: empty, false: non-empty + */ + bool IsEmpty() const; + + private: + std::shared_ptr buf_; + std::uint32_t size_; +}; + +/** + * a helper data structure that holds a byte array and byte array size + * Note: ByteBuffer does NOT own the underlying data + */ +class ByteBuffer { + public: + /** + * @brief constructor + * @param [in] buf buffer + * @param [in] size size of buffer + */ + ByteBuffer(const char* buf, std::uint32_t size); + + /** + * @brief constructor + */ + ByteBuffer(); + ~ByteBuffer() = default; + + /** + * @brief Get buffer + * @return buffer + */ + const char* Get() const; + + /** + * @brief Get size of buffer + * @return size of buffer + */ + std::uint32_t Size() const; + + /** + * @brief Check whether the buffer is empty + * @return true: empty, false: non-empty + */ + bool IsEmpty() const; + + private: + const char *buf; + std::uint32_t size; +}; + +/** + * help to write kinds of data to a buffer + * after all write operation is finished, call GetBuffer to get the buffer + */ +class ByteBufferWriter { + public: + /** + * @brief constructor + * @param [out] buf output buffer + * @param [in] size size of buffer + */ + ByteBufferWriter(char* buf, int size); + ~ByteBufferWriter(); + + // Disable copy constructor and assignment operator + ByteBufferWriter(const ByteBufferWriter&) = delete; + ByteBufferWriter& operator=(const ByteBufferWriter&) = delete; + + // Write methods + // caller must make sure that there is sufficient memory is buffer + + /** + * @brief write an uint8 integer to buffer + * @param [in] value value + */ + void PutUInt8(std::uint8_t value); + + /** + * @brief write an uint32 integer to buffer + * @param [in] value value + */ + void PutUInt32(std::uint32_t value); + + /** + * @brief write an String value to buffer, '\0' is excluded + * @param [in] value string + */ + void PutString(const std::string& value); + + /** + * @brief write an protobuf message to buffer + * @param [in] msg protobuf message + * @return true: success; false: serialization failure + */ + bool PutMessage(const ::google::protobuf::Message& msg); + + /** + * @brief Finish writing and wrap the data to ByteBuffer + * @return ByteBuffer + */ + ByteBuffer GetBuffer(); + + private: + /** + * @brief put bytes to buffer + * @param [in] data buffer of data + * @param [in] size size of buffer + */ + void PutBytes(const void* data, size_t size); + + char *buf_; + char *w_ptr_; + const char* const end_; +}; + +/** + * help to read kinds of data from a buffer + * ByteBufferReader will NOT take the ownership of the buffer, + * so it is the caller's responsibility to free the memory of the buffer + */ +class ByteBufferReader { + public: + /** + * @brief constructor + * @param [in] buf buffer + * @param [in] size size of buffer + */ + ByteBufferReader(const char* buf, int size); + ~ByteBufferReader() = default; + + // Disable copy constructor and assignment operator + ByteBufferReader(const ByteBufferReader&) = delete; + ByteBufferReader& operator=(ByteBufferReader) = delete; + + /** + * @brief read an uint8 integer from buffer + * @return uint8 integer + */ + std::uint8_t ReadUInt8(); + + /** + * @brief read an uint32 integer from buffer + * @return uint32 integer + */ + std::uint32_t ReadUInt32(); + + /** + * @brief read an string from buffer + * @return string + */ + std::string ReadString(int size); + + /** + * @brief read an protobuf message from buffer + * @param [in] size size of the message + * @param [out] message + * @return true: success, false: parse message failed + */ + bool ReadMessage(int size, ::google::protobuf::Message &message); + + /** + * @brief get the size of buffer available for reading + * @return remaining bytes for reading + */ + int RemainingBytes(); + + private: + const char* r_ptr_; + const char* const end_; +}; + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_UTIL_BYTE_BUFFER_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/logging.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/logging.h new file mode 100644 index 0000000..f80e83e --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/logging.h @@ -0,0 +1,57 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_UTIL_LOGGING_H_ +#define ASCENDDK_PRESENTER_AGENT_UTIL_LOGGING_H_ + +#include "acl/acl_base.h" +#include "cerrno" + + +// debug level logging +#define AGENT_LOG_DEBUG(fmt, ...) \ + aclAppLog(ACL_DEBUG, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__) + +// info level logging +#define AGENT_LOG_INFO(fmt, ...) \ + aclAppLog(ACL_INFO, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__) + +// warn level logging +#define AGENT_LOG_WARN(fmt, ...) \ + aclAppLog(ACL_WARNING, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__) + +// error level logging +#define AGENT_LOG_ERROR(fmt, ...) \ + aclAppLog(ACL_ERROR, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__) + +#endif /* ASCENDDK_PRESENTER_AGENT_UTIL_LOGGING_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/mem_utils.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/mem_utils.h new file mode 100644 index 0000000..44dfd4d --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/mem_utils.h @@ -0,0 +1,69 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_UTIL_MEM_UTILS_H_ +#define ASCENDDK_PRESENTER_AGENT_UTIL_MEM_UTILS_H_ + +#include +#include + +#include "ascenddk/presenter/agent/util/logging.h" + +namespace ascend { +namespace presenter { + +namespace memutils { + +/** + * @brief util for creating array, no throw + * @param [in] T type of the array + * @param [in] size size of the array + * @return array of type T + */ +template +T* NewArray(size_t size) { + if (size == 0) { + AGENT_LOG_ERROR("New array with size = 0"); + return nullptr; + } + + T* arr = new (std::nothrow) T[size]; + return arr; +} + +} /* namespace memutils */ + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_UTIL_MEM_UTILS_H_ */ diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/parse_config.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/parse_config.cpp new file mode 100644 index 0000000..cbda100 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/parse_config.cpp @@ -0,0 +1,97 @@ +#include "parse_config.h" + +#include +#include +using namespace std; + +#define COMMENT_CHAR '#' +#define EQUALS_CHAR '=' +#define BLANK_SPACE_CHAR ' ' +#define TABLE_CHAR '\t' + +bool IsSpace(char c) +{ + return (BLANK_SPACE_CHAR == c || TABLE_CHAR == c); +} + +void Trim(string& str) +{ + if (str.empty()) { + return; + } + uint32_t i, start_pos, end_pos; + for (i = 0; i < str.size(); ++i) { + if (!IsSpace(str[i])) { + break; + } + } + if (i == str.size()) { // is all blank space + str = ""; + return; + } + + start_pos = i; + + for (i = str.size() - 1; i >= 0; --i) { + if (!IsSpace(str[i])) { + break; + } + } + end_pos = i; + + str = str.substr(start_pos, end_pos - start_pos + 1); +} + +bool AnalyseLine(const string & line, string & key, string & value) +{ + if (line.empty()) + return false; + int start_pos = 0, end_pos = line.size() - 1, pos; + if ((pos = line.find(COMMENT_CHAR)) != -1) { + if (0 == pos) { //the first charactor is # + return false; + } + end_pos = pos - 1; + } + string new_line = line.substr(start_pos, start_pos + 1 - end_pos); // delete comment + + if ((pos = new_line.find(EQUALS_CHAR)) == -1) + return false; // has no = + + key = new_line.substr(0, pos); + value = new_line.substr(pos + 1, end_pos + 1- (pos + 1)); + + Trim(key); + if (key.empty()) { + return false; + } + Trim(value); + return true; +} + +bool ReadConfig(map& config, const char* configFile) +{ + config.clear(); + ifstream infile(configFile); + if (!infile) { + cout << "file open error" << endl; + return false; + } + string line, key, value; + while (getline(infile, line)) { + if (AnalyseLine(line, key, value)) { + config[key] = value; + } + } + + infile.close(); + return true; +} + +void PrintConfig(const map& config) +{ + map::const_iterator mIter = config.begin(); + for (; mIter != config.end(); ++mIter) { + cout << mIter->first << "=" << mIter->second << endl; + } +} diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/parse_config.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/parse_config.h new file mode 100644 index 0000000..1a0d404 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/parse_config.h @@ -0,0 +1,10 @@ +#ifndef _GET_CONFIG_H_ +#define _GET_CONFIG_H_ + +#include +#include +using namespace std; + +bool ReadConfig(map& config, const char* configFile); +void PrintConfig(const map & m); +#endif diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/socket_utils.cpp b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/socket_utils.cpp new file mode 100644 index 0000000..d36a828 --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/socket_utils.cpp @@ -0,0 +1,238 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#include "ascenddk/presenter/agent/util/socket_utils.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "ascenddk/presenter/agent/util/logging.h" + +namespace { + +// no flag is need for now +const int kSocketFlagNone = 0; + +// socket closed +const int kSocketClosed = 0; + +// connect timeout +const int kDefaultTimeoutInSec = 3; + +const int kSocketSuccess = 0; + +// indicating invalid socket file descriptor +const int kSocketFdNull = -1; + +const int kReuseAddress = 1; + +} + +namespace ascend { +namespace presenter { +namespace socketutils { + +// set blocking mode +void SetNonBlocking(int socket, bool nonblocking) { + // get original mask + long mask = fcntl(socket, F_GETFL, NULL); + if (nonblocking) { + mask |= O_NONBLOCK; // set nonblocking + } else { + mask &= ~O_NONBLOCK; // unset nonblocking + } + (void) fcntl(socket, F_SETFL, mask); +} + +bool SetSockAddr(const char *host_ip, uint16_t port, sockaddr_in &addr) { + // valid port is 1~65535 + if (port == 0) { + AGENT_LOG_ERROR("Invalid port: %d", port); + return false; + } + + // convert host and port to sockaddr + memset(&addr, 0, sizeof(addr)); + + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + if (inet_pton(AF_INET, host_ip, &addr.sin_addr) <= 0) { + AGENT_LOG_ERROR("Invalid host IP: %s", host_ip); + return false; + } + + return true; +} + +void SetSocketReuseAddr(int socket) { + // set reuse address + int so_reuse = kReuseAddress; + int ret = setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, &so_reuse, + sizeof(so_reuse)); + if (ret != kSocketSuccess) { + AGENT_LOG_WARN("set socket opt SO_REUSEADDR failed"); + } +} + +void SetSocketTimeout(int socket, int timeout_in_sec) { + // initialize timeout + timeval timeout = { timeout_in_sec, 0 }; + + // set write timeout + int ret = setsockopt(socket, SOL_SOCKET, SO_SNDTIMEO, &timeout, + sizeof(timeout)); + if (ret != kSocketSuccess) { + AGENT_LOG_WARN("set socket opt SO_SNDTIMEO failed"); + } + + // set read timeout + ret = setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); + if (ret != kSocketSuccess) { + AGENT_LOG_WARN("set socket opt SO_RCVTIMEO failed"); + } +} + +int CreateSocket() { + return ::socket(AF_INET, SOCK_STREAM, 0); +} + +int Connect(int socket, const sockaddr_in& addr) { + // Ignore SIGPIPE signals + signal(SIGPIPE, SIG_IGN); + + // set nonblocking and connect with timeout + SetNonBlocking(socket, true); + + // do connect + int ret = ::connect(socket, (sockaddr*) &addr, sizeof(addr)); + if (ret < 0) { + if (errno != EINPROGRESS) { + AGENT_LOG_ERROR("connect() error: %s", strerror(errno)); + return kSocketError; + } + + fd_set fdset; + FD_ZERO(&fdset); + FD_SET(socket, &fdset); + // connect timeout = 3 seconds + timeval tv = { kDefaultTimeoutInSec, 0 }; + int select_ret = select(socket + 1, NULL, &fdset, NULL, &tv); + if (select_ret < 0) { // error + AGENT_LOG_ERROR("select() error: %s", strerror(errno)); + return kSocketError; + } + + if (select_ret == 0) { // no FD is ready + AGENT_LOG_ERROR("select() timeout"); + return kSocketError; + } + + int so_error = kSocketError; + socklen_t len = sizeof(so_error); + getsockopt(socket, SOL_SOCKET, SO_ERROR, &so_error, &len); + if (so_error != kSocketSuccess) { + AGENT_LOG_ERROR("getsockopt() error: %d", so_error); + return kSocketError; + } + } + + // reset to blocking mode + SetNonBlocking(socket, false); + return kSocketSuccess; +} + +int ReadN(int socket, char *buffer, int size) { + int received_cnt = 0; + // keep reading until nReceived == size + while (received_cnt < size) { + char *write_ptr = buffer + received_cnt; + int ret = ::recv(socket, write_ptr, size - received_cnt, kSocketFlagNone); // [false alarm]: will never write over size + if (ret == kSocketError) { + if (errno == EAGAIN || errno == EINTR) { + AGENT_LOG_INFO("recv() timeout. error = %s", strerror(errno)); + return kSocketTimeout; + } + + AGENT_LOG_ERROR("recv() error. error = %s", strerror(errno)); + return kSocketError; + } + + if (ret == kSocketClosed) { + AGENT_LOG_ERROR("socket closed"); + return kSocketError; + } + + received_cnt += ret; + } + + return received_cnt; +} + +int WriteN(int socket, const char *data, int size) { + int sent_cnt = 0; + // keep reading until nReceived == size + while (sent_cnt < size) { + const char *read_ptr = data + sent_cnt; + int ret = ::send(socket, read_ptr, size - sent_cnt, kSocketFlagNone); + if (ret == kSocketError) { + AGENT_LOG_ERROR("send() error. errno = %s", strerror(errno)); + return kSocketError; + } + + if (ret == kSocketClosed) { + AGENT_LOG_ERROR("socket closed"); + return kSocketError; + } + + sent_cnt += ret; + } + + return sent_cnt; +} + +void CloseSocket(int &socket) { + if (socket >= 0) { + (void) close(socket); + socket = kSocketFdNull; + } +} + +} /* namespace sockutil */ +} /* namespace presenter */ +} /* namespace ascend */ + diff --git a/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/socket_utils.h b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/socket_utils.h new file mode 100644 index 0000000..843841c --- /dev/null +++ b/cplusplus/common/presenteragent/src/ascenddk/presenter/agent/util/socket_utils.h @@ -0,0 +1,117 @@ +/** + * ============================================================================ + * + * Copyright (C) 2018, Hisilicon Technologies Co., Ltd. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1 Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2 Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3 Neither the names of the copyright holders nor the names of the + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * ============================================================================ + */ + +#ifndef ASCENDDK_PRESENTER_AGENT_UTIL_SOCKET_UTILS_H_ +#define ASCENDDK_PRESENTER_AGENT_UTIL_SOCKET_UTILS_H_ + +#include +#include +#include + +namespace ascend { +namespace presenter { + +namespace socketutils { + +// indicating socket error +const int kSocketError = -1; + +// indicating socket timeout +const int kSocketTimeout = -11; + +/** + * @brief SetSockAddr + * @param [in] host_ip host IP + * @param [in] port port + * @param [out] addr address + * @return true: success, false: failure + */ +bool SetSockAddr(const char *host_ip, uint16_t port, sockaddr_in &addr); + +/** + * @brief set reuse address option + * @param [in] socket file descriptor of the socket + */ +void SetSocketReuseAddr(int socket); + +/** + * @brief set read timeout and write timeout to a socket + * @param [in] socket file descriptor of the socket + * @param [in] timeout_in_sec timeout in second + */ +void SetSocketTimeout(int socket, int timeout_in_sec); + +/** + * @brief Create a new socket + * @return a file descriptor for the new socket, or SOCKET_ERROR(-1) for errors + */ +int CreateSocket(); + +/** + * @brief Open a connection on socket FD to peer at ADDR + * @param [in] socket file descriptor of the socket + * @param [in] addr peer address + * @return 0 on success, -1 for errors. + */ +int Connect(int socket, const sockaddr_in &addr); + +/** + * @brief Read N bytes into BUF from socket FD. + * @param [in] socket file descriptor of the socket + * @param [out] buffer buffer to write data to + * @param [in] size size of data to read + * @return the number read or -1 for errors. + */ +int ReadN(int socket, char *buffer, int size); + +/** + * @brief Write N bytes into BUF to socket FD. + * @param [in] socket file descriptor of the socket + * @param [in] data buffer of data to write to socket + * @param [in] size size of data to write + * @return the number wrote or -1 for errors. + */ +int WriteN(int socket, const char *data, int size); + +/** + * @brief close the socket + * @param [in|out] socket file descriptor of the socket + */ +void CloseSocket(int &socket); + +} /* namespace socketutils */ + +} /* namespace presenter */ +} /* namespace ascend */ + +#endif /* ASCENDDK_PRESENTER_AGENT_UTIL_SOCKET_UTILS_H_ */ diff --git a/cplusplus/environment/README_CN.md b/cplusplus/environment/README_CN.md new file mode 100644 index 0000000..d85db9d --- /dev/null +++ b/cplusplus/environment/README_CN.md @@ -0,0 +1,27 @@ +中文|[English](README_EN.md) + +# c++环境准备和依赖安装 + +### 介绍 +运行samples仓中的c++样例之前,请根据本文指导安装第三方依赖并配置好环境。 + + +### 步骤 +请依次执行以下三步,请根据设备形态,点击对应的链接进行安装。 + +1.基础环境配置 +- [for_atlas200dk](./prepare_ENV/README_200DK_CN.md) +- [for_atlas300](./prepare_ENV/README_300_CN.md) + +2.安装ffmpeg和opencv +- [for_atlas200dk](./opencv_install/README_200DK_CN.md) +- [for_atlas300](./opencv_install/README_300_CN.md) + +3.安装atlasutil库 +- [for_atlas200dk](./atlasutil_install/README_200DK_CN.md) +- [for_atlas300](./atlasutil_install/README_300_CN.md) + +4.安装Presenter Agent +- [for_atlas200dk](./presenteragent_install/README_200DK_CN.md) +- [for_atlas300](./presenteragent_install/README_300_CN.md) + diff --git a/cplusplus/environment/README_EN.md b/cplusplus/environment/README_EN.md new file mode 100644 index 0000000..1dd5364 --- /dev/null +++ b/cplusplus/environment/README_EN.md @@ -0,0 +1,26 @@ +English|[中文](README_CN.md) + +# C++ environment preparation and dependency installation + +### Introduction +Introduction + + +### Step +Please perform the following three steps in sequence, please click the corresponding link to install according to the device type. + +1.Basic environment configuration +- [for_atlas200dk](./prepare_ENV/README_200DK_EN.md) +- [for_atlas300](./prepare_ENV/README_300_EN.md) + +2.Install ffmpeg and opencv +- [for_atlas200dk](./opencv_install/README_200DK_EN.md) +- [for_atlas300](./opencv_install/README_300_EN.md) + +3.Install atlasutil +- [for_atlas200dk](./atlasutil_install/README_200DK_EN.md) +- [for_atlas300](./atlasutil_install/README_300_EN.md) + +4.Install Presenter Agent +- [for_atlas200dk](./presenteragent_install/README_200DK_EN.md) +- [for_atlas300](./presenteragent_install/README_300_EN.md) diff --git a/cplusplus/environment/atlasutil_install/README_200DK_CN.md b/cplusplus/environment/atlasutil_install/README_200DK_CN.md new file mode 100644 index 0000000..9b6346a --- /dev/null +++ b/cplusplus/environment/atlasutil_install/README_200DK_CN.md @@ -0,0 +1,44 @@ +中文|[English](README_300_EN.md) +# atlasutil库使用说明 +1. atlasutil库对当前开源社区样例中 + + - Atlas200DK板载摄像头 + + - acl dvpp图像和视频处理 + + - acl模型推理等进行封装 + + 等重复代码进行封装,提供一组公共接口。 + + +2. 本库仅供当前社区开源样例使用,不覆盖ascend平台应用开发的所有场景,不作为用户应用开发的标准库;仅支持Atlas200DK和Atlas300样例。 + +# 部署方法 + +$\color{red}{以下命令在开发环境上用安装开发套件包的用户执行}$ +1. 下载源码 + **cd $HOME** + **git clone https://gitee.com/ascend/samples.git** + +2. 设置环境变量,在命令行内执行 + + export DDK_PATH=\$HOME/Ascend/ascend-toolkit/latest/**_ARCH_** + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + >- 请将\$HOME/Ascend/ascend-toolkit/latest替换为ACLlib安装包的实际安装路径。 + >- 若版本为20.0,请将 **ARCH** 替换为arm64-linux_gcc7.3.0;若版本为20.1,请将 **ARCH** 替换为arm64-linux。 + +3. 编译并安装atlasutil + **cd $HOME/samples/cplusplus/common/atlasutil/** + **make** + **make install** + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + > **生成的libatalsutil.so在\\$HOME/ascend_ddk/arm/lib/下;头文件在\\$HOME/ascend_ddk/arm/include/atlasutil下。** + +4. 将编译好的so传到运行环境 (如开发环境和运行环境安装在同一服务器,请忽略此步) + **scp \$HOME/ascend_ddk/arm/lib/libatlasutil.so HwHiAiUser@192.168.1.2:/home/HwHiAiUser/ascend_ddk/arm/lib/** + + + + + + diff --git a/cplusplus/environment/atlasutil_install/README_300_CN.md b/cplusplus/environment/atlasutil_install/README_300_CN.md new file mode 100644 index 0000000..af46356 --- /dev/null +++ b/cplusplus/environment/atlasutil_install/README_300_CN.md @@ -0,0 +1,46 @@ +中文|[English](README_300_EN.md) +# atlasutil库使用说明 +1. atlasutil库对当前开源社区样例中 + + - Atlas200DK板载摄像头 + + - acl dvpp图像和视频处理 + + - acl模型推理等进行封装 + + 等重复代码进行封装,提供一组公共接口。 + + +2. 本库仅供当前社区开源样例使用,不覆盖ascend平台应用开发的所有场景,不作为用户应用开发的标准库;仅支持Atlas200DK和Atlas300样例。 + +# 部署方法 + +$\color{red}{以下命令在开发环境上用安装开发套件包的用户执行}$ +1. 下载源码 + **cd $HOME** + **git clone https://gitee.com/ascend/samples.git** + +2. 设置环境变量 + export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/**_ARCH_** + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + 请将$HOME/Ascend/ascend-toolkit/latest替换为ACLlib安装包的实际安装路径。 + 若版本为20.0,请将 **ARCH** 替换为x86_64-linux_gcc7.3.0;若版本为20.1,请将 **ARCH** 替换为x86_64-linux。 + +3. 编译并安装atlasutil + **cd $HOME/samples/cplusplus/common/atlasutil/** + **make mode=ASIC** + **make mode=ASIC install** + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + > **生成的libatalsutil.so在\\$HOME/ascend_ddk/x86/lib/下;头文件在\\$HOME/ascend_ddk/x86/include/atlasutil下。** + +4. 将编译好的so传到运行环境 (如开发环境和运行环境安装在同一服务器,请忽略此步) + **scp \$HOME/ascend_ddk/x86/lib/libatlasutil.so HwHiAiUser@_IP_:/home/HwHiAiUser/ascend_ddk/x86/lib/** + + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + 请将IP替换为ai1s云端推理环境的公网ip地址,HwHiAiUser替换为实际的运行用户。 + + + + + + diff --git a/cplusplus/environment/opencv_install/README_200DK_CN.md b/cplusplus/environment/opencv_install/README_200DK_CN.md new file mode 100644 index 0000000..748a29b --- /dev/null +++ b/cplusplus/environment/opencv_install/README_200DK_CN.md @@ -0,0 +1,78 @@ +中文|[English](README_200DK_EN.md) + +# 安装ffmpeg+opencv + +安装ffmpeg和opencv的原因是适配多样性的数据预处理和后处理,昇腾社区的部分样例也是基于ffmpeg和opencv做的处理。 + +$\color{red}{以下操作在运行环境(Atlas200DK)上操作}$ + + +1. 安装相关依赖 + **sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff5-dev git cmake libswscale-dev pkg-config -y** + + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + > **若apt-get安装依赖出现类似报错(dpkg: error processing package *** (--configure)) ,请参考[FAQ](https://bbs.huaweicloud.com/forum/thread-74123-1-1.html)来解决。** + + +2. 安装ffmpeg + + 创建文件夹,用于存放编译后的文件 + **mkdir -p /home/HwHiAiUser/ascend_ddk/arm --no-check-certificate** + + 下载ffmpeg + **cd $HOME** + **wget http://www.ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz** + **tar -zxvf ffmpeg-4.1.3.tar.gz** + **cd ffmpeg-4.1.3** + + 安装ffmpeg + **./configure --enable-shared --enable-pic --enable-static --disable-x86asm --prefix=/home/HwHiAiUser/ascend_ddk/arm** + **make -j8** + **make install** + + 将ffmpeg添加到系统环境变量中,使得其他程序能够找到ffmpeg环境 + **su root** + **vim /etc/ld.so.conf.d/ffmpeg.conf** + 在末尾添加一行 + **/home/HwHiAiUser/ascend_ddk/arm/lib** + 使配置生效 + **ldconfig** + + 配置profile系统文件 + **vim /etc/profile** + 在末尾添加一行 + **export PATH=$PATH:/home/HwHiAiUser/ascend_ddk/arm/bin** + 使配置文件生效 + **source /etc/profile** + 使opencv能找到ffmpeg + **cp /home/HwHiAiUser/ascend_ddk/arm/lib/pkgconfig/\* /usr/share/pkgconfig** + 退出root用户 + **exit** + +3. 安装opencv + 下载opencv + **cd $HOME** + **git clone -b 4.3.0 https://gitee.com/mirrors/opencv.git** + **git clone -b 4.3.0 https://gitee.com/mirrors/opencv_contrib.git** + **cd opencv** + **mkdir build** + **cd build** + + 编译并安装opencv + ``` + cmake -D BUILD_SHARED_LIBS=ON -D BUILD_TESTS=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/home/HwHiAiUser/ascend_ddk/arm -D WITH_LIBV4L=ON -D OPENCV_EXTRA_MODULES=../../opencv_contrib/modules .. + ``` + + **make -j8** + **make install** + + +4. 将开发板上安装的ffmpeg和opencv库导入开发环境中,以提供编译使用。 (如开发环境与运行环境都在Atlas200DK上,请忽略此步) + + $\color{red}{以下操作在开发环境执行}$ + 使用普通用户执行 + **mkdir $HOME/ascend_ddk** + **scp -r HwHiAiUser@192.168.1.2:/home/HwHiAiUser/ascend_ddk/arm $HOME/ascend_ddk** + **sudo cd /usr/lib/aarch64-linux-gnu** + **sudo scp -r HwHiAiUser@192.168.1.2:/lib/aarch64-linux-gnu/\* ./** + **sudo scp -r HwHiAiUser@192.168.1.2:/usr/lib/aarch64-linux-gnu/\* ./** \ No newline at end of file diff --git a/cplusplus/environment/opencv_install/README_200DK_EN.md b/cplusplus/environment/opencv_install/README_200DK_EN.md new file mode 100644 index 0000000..286cfc5 --- /dev/null +++ b/cplusplus/environment/opencv_install/README_200DK_EN.md @@ -0,0 +1,77 @@ +English|[中文](README_200DK_CN.md) + +# Installing FFmpeg and OpenCV + +FFmpeg and OpenCV are installed to implement diversified data preprocessings and postprocessings. Most of the samples provided by the Ascend Developer Zone utilize the data processing capabilities backed by FFmpeg and OpenCV. + + **Perform the following operations in the operating environment (Atlas 200 DK).** + + +1. Install dependencies. + **sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff5-dev git cmake libswscale-dev pkg-config -y** + + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + > **If an error similar to "dpkg: error processing package *** (--configure)" is displayed during the apt-get installation, rectify the fault by referring to [FAQ](https://bbs.huaweicloud.com/forum/thread-74123-1-1.html).** + + +2. Install FFmpeg. + + Create a folder for storing build output files. + **mkdir -p /home/HwHiAiUser/ascend_ddk/arm** + + Download FFmpeg. + **cd $HOME** + **wget http://www.ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz --no-check-certificate** + **tar -zxvf ffmpeg-4.1.3.tar.gz** + **cd ffmpeg-4.1.3** + + Install FFmpeg. + **./configure --enable-shared --enable-pic --enable-static --disable-x86asm --prefix=/home/HwHiAiUser/ascend_ddk/arm** + **make -j8** + **make install** + + Add FFmpeg to the path of the system using environment variables so that other programs can find the FFmpeg program. + **su root** + **vim /etc/ld.so.conf.d/ffmpeg.conf** + Append the following line to the file. + **/home/HwHiAiUser/ascend_ddk/arm/lib** + Make the configuration take effect. + **ldconfig** + + Configure the profile system file. + **vim /etc/profile** + Append the following line to the file. + **export PATH=$PATH:/home/HwHiAiUser/ascend_ddk/arm/bin** + Make the configuration file take effect. + **source /etc/profile** + Make OpenCV find FFmpeg. + **cp /home/HwHiAiUser/ascend_ddk/arm/lib/pkgconfig/\* /usr/share/pkgconfig** + Exit the **root** user. + **exit** + +3. Install OpenCV. + Download OpenCV. + **cd $HOME** + **git clone -b 4.3.0 https://gitee.com/mirrors/opencv.git** + **git clone -b 4.3.0 https://gitee.com/mirrors/opencv_contrib.git** + **cd opencv** + **mkdir build** + **cd build** + + Build and install OpenCV. + ``` + cmake -D BUILD_SHARED_LIBS=ON -D BUILD_TESTS=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/home/HwHiAiUser/ascend_ddk/arm -D WITH_LIBV4L=ON -D OPENCV_EXTRA_MODULES=../../opencv_contrib/modules .. + ``` + + **make -j8** + **make install** + +4. Import the FFmpeg and OpenCV libraries installed on the Atlas 200 DK to the development environment for building. (Skip this step if both the development environment and operating environment are set up on the Atlas 200 DK.) + + **Perform the following operations in the development environment.** + Run the following commands as a common user: + **mkdir $HOME/ascend_ddk** + **scp -r HwHiAiUser@192.168.1.2:/home/HwHiAiUser/ascend_ddk/arm \$HOME/ascend_ddk** + **sudo cd /usr/lib/aarch64-linux-gnu** + **sudo scp -r HwHiAiUser@192.168.1.2:/lib/aarch64-linux-gnu/\* ./** + **sudo scp -r HwHiAiUser@192.168.1.2:/usr/lib/aarch64-linux-gnu/\* ./** \ No newline at end of file diff --git a/cplusplus/environment/opencv_install/README_300_CN.md b/cplusplus/environment/opencv_install/README_300_CN.md new file mode 100644 index 0000000..f7e6a4b --- /dev/null +++ b/cplusplus/environment/opencv_install/README_300_CN.md @@ -0,0 +1,84 @@ +中文|[English](README_300_EN.md) + +# 安装ffmpeg+opencv + +安装ffmpeg和opencv的原因是适配多样性的数据预处理和后处理,昇腾社区的部分样例也是基于ffmpeg和opencv做的处理。 + +$\color{red}{以下命令在开发环境上执行,以普通用户为HwHiAiUser为例,请根据实际情况进行修改。}$ + + +1. 安装相关依赖 + **sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff5-dev git cmake libswscale-dev pkg-config -y** + + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + > **若apt-get安装依赖出现类似报错(dpkg: error processing package *** (--configure)) ,请参考[FAQ](https://bbs.huaweicloud.com/forum/thread-74123-1-1.html)来解决。** + +2. 安装ffmpeg + 1. 创建文件夹,用于存放编译后的文件 + **mkdir -p $HOME/ascend_ddk/x86** + + 2. 下载ffmpeg + **cd $HOME** + **wget http://www.ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz --no-check-certificate** + **tar -zxvf ffmpeg-4.1.3.tar.gz** + **cd ffmpeg-4.1.3** + + 3. 安装ffmpeg + **./configure --enable-shared --enable-pic --enable-static --disable-x86asm --prefix=\$HOME/ascend_ddk/x86** + **make -j8** + **make install** + + 4. 将ffmpeg添加到系统环境变量中,使得其他程序能够找到ffmpeg环境 + 切换为root用户 + **su root** + 打开conf配置文件 + **vim /etc/ld.so.conf.d/ffmpeg.conf** + 在末尾添加一行。 + **/home/HwHiAiUser/ascend_ddk/x86/lib** + 使配置生效 + **ldconfig** + + 5. 配置profile系统文件 + **vim /etc/profile** + 在末尾添加一行 + **export PATH=$PATH:/home/HwHiAiUser/ascend_ddk/x86/bin** + 使配置文件生效 + **source /etc/profile** + + 6. 使opencv能找到ffmpeg。 + **cp /home/HwHiAiUser/ascend_ddk/x86/lib/pkgconfig/\* /usr/share/pkgconfig** + 切换回普通用户 + **exit** + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明: + 4、5、6三步中的HwHiAiUser请根据实际情况替换。** + +3. 安装opencv + 1. 下载opencv + **cd \$HOME** + **git clone -b 4.3.0 https://gitee.com/mirrors/opencv.git** + **git clone -b 4.3.0 https://gitee.com/mirrors/opencv_contrib.git** + **cd opencv** + **mkdir build** + **cd build** + + 2. 安装opencv + ``` + cmake -D BUILD_SHARED_LIBS=ON -D BUILD_TESTS=OFF -D CMAKE_BUILD_TYPE=RELEASE -D WITH_LIBV4L=ON -D OPENCV_EXTRA_MODULES=../../opencv_contrib/modules -D CMAKE_INSTALL_PREFIX=$HOME/ascend_ddk/x86 .. + ``` + **make -j8** + **make install** + + +4. 将开发环境安装的ffmpeg、opencv库导入运行环境中,以提供运行使用 **(如开发环境和运行环境在同一服务器上,请忽略此步)** + + $\color{red}{注意:以下操作在运行环境执行}$ + + 普通用户登录运行环境 + + **mkdir \$HOME/ascend_ddk** + **scp -r HwHiAiUser@X.X.X.X:/home/HwHiAiUser/ascend_ddk/x86 \$HOME/ascend_ddk** + **scp -r HwHiAiUser@X.X.X.X:/usr/lib/x86_64-linux-gnu/lib\* \$HOME/ascend_ddk/x86/lib** +

+ + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明: + X.X.X.X请替换为开发环境的ip,HwHiAiUser请根据实际情况替换。** \ No newline at end of file diff --git a/cplusplus/environment/opencv_install/README_300_EN.md b/cplusplus/environment/opencv_install/README_300_EN.md new file mode 100644 index 0000000..7cc0ac2 --- /dev/null +++ b/cplusplus/environment/opencv_install/README_300_EN.md @@ -0,0 +1,86 @@ +English|[中文](README_300_CN.md) + +# Installing FFmpeg and OpenCV + +FFmpeg and OpenCV are installed to implement diversified data preprocessings and postprocessings. Most of the samples provided by the Ascend Developer Zone utilize the data processing capabilities backed by FFmpeg and OpenCV. + + **Run the following commands in the development environment as a common user. The following takes **HwHiAiUser**as an example. Replace it with the actual running user.** + + +1. Install dependencies. + **sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff5-dev git cmake libswscale-dev pkg-config -y** + + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + > **If an error similar to "dpkg: error processing package *** (--configure)" is displayed during the apt-get installation, rectify the fault by referring to [FAQ](https://bbs.huaweicloud.com/forum/thread-74123-1-1.html).** + +2. Install FFmpeg. + 1. Create a folder for storing build output files. + **mkdir -p $HOME/ascend_ddk/x86** + + 2. Download FFmpeg. + **cd $HOME** + **wget http://www.ffmpeg.org/releases/ffmpeg-4.1.3.tar.gz --no-check-certificate** + **tar -zxvf ffmpeg-4.1.3.tar.gz** + **cd ffmpeg-4.1.3** + + 3. Install FFmpeg. + **./configure --enable-shared --enable-pic --enable-static --disable-x86asm --prefix=$HOME/ascend_ddk/x86** + **make -j8** + **make install** + + 4. Add FFmpeg to the path pf the system using environment variables so that other programs can find the FFmpeg program. + Switch to the **root** user. + **su root** + Open the CONF configuration file. + **vim /etc/ld.so.conf.d/ffmpeg.conf** + Append the following line to the file. + **/home/HwHiAiUser/ascend_ddk/x86/lib** + Make the configuration take effect. + **ldconfig** + + 5. Configure the profile system file. + **vim /etc/profile** + Append the following line to the file. + **export PATH=$PATH:/home/HwHiAiUser/ascend_ddk/x86/bin** + Make the configuration file take effect. + **source /etc/profile** + + 6. Make OpenCV find FFmpeg. + **cp /home/HwHiAiUser/ascend_ddk/x86/lib/pkgconfig/\* /usr/share/pkgconfig** + Switch to the common user. + **exit** + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + >Replace **HwHiAiUser** in steps 4, 5, and 6 based on the site requirements.** + +3. Install OpenCV. + 1. Download OpenCV. + **cd $HOME** + **git clone -b 4.3.0 https://gitee.com/mirrors/opencv.git** + **git clone -b 4.3.0 https://gitee.com/mirrors/opencv_contrib.git** + **cd opencv** + **mkdir build** + **cd build** + + 2. Install OpenCV. + ``` + cmake -D BUILD_SHARED_LIBS=ON -D BUILD_TESTS=OFF -D CMAKE_BUILD_TYPE=RELEASE -D WITH_LIBV4L=ON -D OPENCV_EXTRA_MODULES=../../opencv_contrib/modules -D CMAKE_INSTALL_PREFIX=$HOME/ascend_ddk/x86 .. + ``` + + **make -j8** + **make install** + + +4. Import the FFmpeg and OpenCV libraries installed in the development environment to the operating environment for execution. **(Skip this step if both the development environment and operating environment are on the same server.)** + + **Note: Perform the following operation in the operating environment.** + + Log in to the operating environment as a common user. + + **mkdir $HOME/ascend_ddk** + **scp -r HwHiAiUser@X.X.X.X:/home/HwHiAiUser/ascend_ddk/x86 $HOME/ascend_ddk** + **scp -r HwHiAiUser@X.X.X.X:/usr/lib/x86_64-linux-gnu/lib\* $HOME/ascend_ddk/x86/lib** + + + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE: Replace *X.X.X.X* with the IP address of the development environment and HwHiAiUser with the actual running user.** + + diff --git a/cplusplus/environment/prepare_ENV/README_200DK_CN.md b/cplusplus/environment/prepare_ENV/README_200DK_CN.md new file mode 100644 index 0000000..b07141b --- /dev/null +++ b/cplusplus/environment/prepare_ENV/README_200DK_CN.md @@ -0,0 +1,197 @@ +中文|[English](README_200DK_EN.md) + +# 基础环境配置 +本文的目的是进行基础环境配置,包含sudo权限配置、apt源配置、开发者板联网、环境变量配置。如已配置,均可跳过。 + +$\color{red}{以下操作在开发环境上操作,以普通用户为HwHiAiUser为例,请根据实际情况进行修改。}$ + + +1. 给HwHiAiUser用户配置sudo权限 + + + 切换为root用户 + **su root** + + 给sudoer文件配置写权限,并打开该文件 + **chmod u+w /etc/sudoers** + **vi /etc/sudoers** + + 在该文件 `# User privilege specification` 下面增加如下内容: + **HwHiAiUser ALL=(ALL:ALL) ALL** + + ![输入图片说明](https://images.gitee.com/uploads/images/2020/1128/144046_7c02d0d0_7401379.png "屏幕截图.png") + + 完成后,执行以下命令取消`/etc/sudoers`文件的写权限 + **chmod u-w /etc/sudoers** + 切换回普通用户 + **exit** + +2. apt源配置 + + 配置ubuntu18.04-x86的apt清华源 + + **sudo vi /etc/apt/sources.list** + + 将源文件内容替换为以下ubuntu18.04-x86的apt清华源 + + ``` + # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse + ``` + 执行以下命令更新源 + **sudo apt-get update** +

+ >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + > **如果sudo apt-get update失败,可以试用其他的国内源 https://www.cnblogs.com/dream4567/p/9690850.html** + + +3. 在开发环境安装编译工具 + + **sudo apt-get install -y g++\-aarch64-linux-gnu g++\-5-aarch64-linux-gnu** + +4. 在开发环境中添加以下环境变量,用于atc模型转换 + + 1. 打开.bashrc文件 + **vim ~/.bashrc** + + 在文件中添加以下环境变量 + **export install_path=\\$HOME/Ascend/ascend-toolkit/latest** + + **export PATH=/usr/local/python3.7.5/bin:\\${install_path}/atc/ccec_compiler/bin:\\${install_path}/atc/bin:\\$PATH** + + **export ASCEND_OPP_PATH=\\${install_path}/opp** + + **export LD_LIBRARY_PATH=\\${install_path}/atc/lib64** + + 其中,PYTHONPATH环境变量在20.0和20.1版本不兼容。请按照CANN版本选择对应方式执行命令添加PYTHONPATH环境变量。 + + - 20.0版本 + + **export PYTHONPATH=\\${install_path}/atc/python/site-packages/te:\\${install_path}/atc/python/site-packages/topi:\\$PYTHONPATH** + + - 20.1版本 + + **export PYTHONPATH=\\${install_path}/atc/python/site-packages:\\${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:\\${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH** + + 保存退出 + **wq!** + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + >**- install_path 请根据实际情况修改。** + >**- 若开发环境与运行环境部署在一台服务器上时,请勿配置LD_LIBRARY_PATH,在运行样例时,会跟运行环境的LD_LIBRARY_PATH有冲突。** + + 2. 执行如下命令使环境变量生效 + **source ~/.bashrc** + +5. 在开发环境部署Media模块 + 1. 将[A200dk-npu-driver-{software version}-ubuntu18.04-aarch64-minirc.tar.gz](https://www.huaweicloud.com/ascend/resource/Software)以开发环境安装用户上传到\$HOME/Ascend目录下。 + 2. 解压driver包 + **cd \$HOME/Ascend** + **tar zxvf A200dk-npu-driver-{software version}-ubuntu18.04-aarch64-minirc.tar.gz** + + +$\color{red}{以下操作在运行环境(Atlas200DK)上操作}$ +1. 登录运行环境 + ssh HwHiAiUser@X.X.X.X + +2. 给HwHiAiUser用户配置sudo权限 + + + 切换为root用户 (root用户默认密码:Mind@123) + **su root** + + 给sudoer文件配置写权限,并打开该文件 + **chmod u+w /etc/sudoers** + **vi /etc/sudoers** + + 在该文件 `# User privilege specification` 下面增加如下内容: + **HwHiAiUser ALL=(ALL:ALL) ALL** + + ![输入图片说明](https://images.gitee.com/uploads/images/2020/1128/121157_37d3b82d_7401379.png "屏幕截图.png") + 完成后,执行以下命令取消`/etc/sudoers`文件的写权限,并切换回普通用户 + **chmod u-w /etc/sudoers** + **exit** + +3. 开发者板设置联网 + + **sudo vi /etc/netplan/01-netcfg.yaml** + 填写以下配置 + **注:需要注意这里的缩进格式,netplan配置时和python类似,对缩进有强限制** + + ``` + network: + version: 2 + # renderer: NetworkManager + renderer: networkd + ethernets: + eth0: + dhcp4: yes + + usb0: + dhcp4: no + addresses: [192.168.1.2/24] + gateway4: 192.168.0.1 + ``` + + + 将开发板网口接上可正常联网的网线,执行以下命令使配置生效 + **sudo netplan apply** + +4. 开发者板apt换源配置 + + **以下给出两种源,选择其中一种使用,如更新源失败,请自行更换可用Ubuntu 18.04 arm源** + - ubuntu18.04-arm华为源 + + 执行以下换源操作 + **sudo wget -O /etc/apt/sources.list https://repo.huaweicloud.com/repository/conf/Ubuntu-Ports-bionic.list --no-check-certificate** + + 更新源 + **sudo apt-get update** + + - ubuntu18.04-arm官方源 + + 修改源文件 + **sudo vi /etc/apt/sources.list** + + 将源文件内容替换为以下ubuntu-arm官方源。 + ``` + deb http://ports.ubuntu.com/ bionic main restricted universe multiverse + deb-src http://ports.ubuntu.com/ bionic main restricted universe multiverse + deb http://ports.ubuntu.com/ bionic-updates main restricted universe multiverse + deb-src http://ports.ubuntu.com/ bionic-updates main restricted universe multiverse + deb http://ports.ubuntu.com/ bionic-security main restricted universe multiverse + deb-src http://ports.ubuntu.com/ bionic-security main restricted universe multiverse + deb http://ports.ubuntu.com/ bionic-backports main restricted universe multiverse + deb-src http://ports.ubuntu.com/ bionic-backports main restricted universe multiverse + deb http://ports.ubuntu.com/ubuntu-ports/ bionic main universe restricted + deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main universe restricted + ``` + + + 更新源。 + **sudo apt-get update** + +5. 在运行环境添加环境变量,用于运行工程。 + 1. 打开.bashrc文件 + **vim ~/.bashrc** + + 在文件中添加以下环境变量 + **export LD_LIBRARY_PATH=/home/HwHiAiUser/ascend_ddk/arm/lib:/home/HwHiAiUser/Ascend/acllib/lib64:$LD_LIBRARY_PATH** + + **export PYTHONPATH=/home/HwHiAiUser/Ascend/pyACL/python/site-packages/acl:$PYTHONPATH** + + 保存退出 + **wq!** + + + 2. 执行如下命令使环境变量生效。 + **source ~/.bashrc** + + + \ No newline at end of file diff --git a/cplusplus/environment/prepare_ENV/README_200DK_EN.md b/cplusplus/environment/prepare_ENV/README_200DK_EN.md new file mode 100644 index 0000000..d0ba7d3 --- /dev/null +++ b/cplusplus/environment/prepare_ENV/README_200DK_EN.md @@ -0,0 +1,190 @@ +English|[中文](README_200DK_CN.md) +# Basic Environment Configuration +This readme file describes how to configure the basic environment, including the sudo permission, apt source, Atlas 200 DK networking, and environment variables. If they have been configured, skip this workflow. + + **Run the following commands as a common user in the development environment. The following takes **HwHiAiUser** as an example. Replace it with the actual running user.** + + +1. Grant the sudo permission to the **HwHiAiUser** user. + + + Switch to the **root** user. + **su root** + + Grant the write permission on the **sudoers** file and open the file. + **chmod u+w /etc/sudoers** + **vi /etc/sudoers** + + Add the following content below **`# User privilege specification`** in the **sudoers** file. + **HwHiAiUser ALL=(ALL:ALL) ALL** + + ![](https://images.gitee.com/uploads/images/2020/1128/144046_7c02d0d0_7401379.png "Screenshot.png") + + Remove the write permission on the **/etc/sudoers** file. + **chmod u-w /etc/sudoers** + Switch to the common user. + **exit** + +2. Configure the apt sources. + + Configure the Tsinghua apt sources of Ubuntu 18.04 (x86). + + **sudo vi /etc/apt/sources.list** + + Replace the source file content with the following Tsinghua apt sources. + + ``` + # By default, the source code images are commented out to speed up the apt update. You can uncomment them as required. + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse + ``` + Update the sources. + **sudo apt-get update** + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + > **If the source fails to be updated, you can try a new source available at https://www.cnblogs.com/dream4567/p/9690850.html**. + + +3. Install a compiler in the development environment. + + **sudo apt-get install -y g++\-aarch64-linux-gnu g++\-5-aarch64-linux-gnu** + +4. Add the following environment variables to the development environment for ATC model conversion. + + 1. Open the **.bashrc** file. + **vim ~/.bashrc** + + Add the following environment variables to the file. + **export install_path=\$HOME/Ascend/ascend-toolkit/latest** + + **export PATH=/usr/local/python3.7.5/bin:\\${install_path}/atc/ccec_compiler/bin:\\${install_path}/atc/bin:\\$PATH** + + **export ASCEND_OPP_PATH=\${install_path}/opp** + + **export LD_LIBRARY_PATH=\${install_path}/atc/lib64** + + The environment variable **PYTHONPATH** is incompatible with CANN 20.0 and 20.1. Run the corresponding command to add **PYTHONPATH** based on the CANN version. + + - For CANN 20.0 + + **export PYTHONPATH=\\${install_path}/atc/python/site-packages/te:\\${install_path}/atc/python/site-packages/topi:\\$PYTHONPATH** + + - For CANN 20.1 + + **export PYTHONPATH=\\${install_path}/atc/python/site-packages:\\${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:\\${install_path}/atc/python/site-packages/schedule_search.egg:\\$PYTHONPATH** + + Save the configuration and exit. + **wq!** + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + >**- Replace install_path with the actual installation path.** + >**- If the development environment and operating environment are set up on the same server, do not configure LD_LIBRARY_PATH, avoiding the conflict with LD_LIBRARY_PATH in the operating environment when running the sample.** + + 2. Make the configuration take effect. + **source ~/.bashrc** + +5. Deploying the Media Module. + 1. Upload [A200dk-npu-driver-{software version}-ubuntu18.04-aarch64-minirc.tar.gz](https://ascend.huawei.com/en/#/hardware/firmware-drivers) to the \$HOME/Ascend directory. + 2. Go to the directory where the Driver package is stored and run the following command as the installation user to extract the Driver package: + **cd \$HOME/Ascend** + **tar zxvf A200dk-npu-driver-{software version}-ubuntu18.04-aarch64-minirc.tar.gz** + + + **Perform the following operations in the operating environment (Atlas 200 DK).** +1. Log in to the operating environment. + ssh HwHiAiUser@X.X.X.X + +2. Grant the sudo permission to the **HwHiAiUser** user. + + + Switch to the **root** user. The default password of the **root** user is Mind@123. + **su root** + + Grant the write permission on the **sudoers** file and open the file. + **chmod u+w /etc/sudoers** + **vi /etc/sudoers** + + Add the following content below **`# User privilege specification`** in the **sudoers** file. + **HwHiAiUser ALL=(ALL:ALL) ALL** + + ![](https://images.gitee.com/uploads/images/2020/1128/121157_37d3b82d_7401379.png "Screenshot.png") + Run the following commands to remove the write permission on the **/etc/sudoers** file and switch to the common user: + **chmod u-w /etc/sudoers** + **exit** + +3. Connect the Atlas 200 DK to the Internet. + + **sudo vi /etc/netplan/01-netcfg.yaml** + Set the following parameters. + **Note: The configuration of both Netplan and Python is indentation-sensitive.** + + ``` + network: + version: 2 + # renderer: NetworkManager + renderer: networkd + ethernets: + eth0: + dhcp4: yes + + usb0: + dhcp4: no + addresses: [192.168.1.2/24] + gateway4: 192.168.0.1 + ``` + Connect the Atlas 200 DK to the Internet with a network cable, and run the following command for the configuration to take effect: + **sudo netplan apply** + +4. Update the apt source for the Atlas 200 DK. + + **Select either of the following two sources. If the source fails to be updated, replace it with the Ubuntu 18.04 (ARM) source.** + +- Huawei Ubuntu 18.04 (ARM) source + + Run the following command to change the source. + **sudo wget -O /etc/apt/sources.list https://repo.huaweicloud.com/repository/conf/Ubuntu-Ports-bionic.list --no-check-certificate** + + Update the sources. + **sudo apt-get update** + +- Ubuntu 18.04 (ARM) source + + Modify the source file. + **sudo vi /etc/apt/sources.list** + + Replace the source file content with the following Ubuntu (ARM) sources: + ``` + deb http://ports.ubuntu.com/ bionic main restricted universe multiverse + deb-src http://ports.ubuntu.com/ bionic main restricted universe multiverse + deb http://ports.ubuntu.com/ bionic-updates main restricted universe multiverse + deb-src http://ports.ubuntu.com/ bionic-updates main restricted universe multiverse + deb http://ports.ubuntu.com/ bionic-security main restricted universe multiverse + deb-src http://ports.ubuntu.com/ bionic-security main restricted universe multiverse + deb http://ports.ubuntu.com/ bionic-backports main restricted universe multiverse + deb-src http://ports.ubuntu.com/ bionic-backports main restricted universe multiverse + deb http://ports.ubuntu.com/ubuntu-ports/ bionic main universe restricted + deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main universe restricted + ``` + + Update the sources. + **sudo apt-get update** + +5. Add environment variables to the operating environment to run the project. + 1. Open the **.bashrc** file. + **vim ~/.bashrc** + + Add the following environment variables to the file. + **export LD_LIBRARY_PATH=/home/HwHiAiUser/ascend_ddk/arm/lib:/home/HwHiAiUser/Ascend/acllib/lib64:\$LD_LIBRARY_PATH** + + **export PYTHONPATH=/home/HwHiAiUser/Ascend/pyACL/python/site-packages/acl:\$PYTHONPATH** + + Save the configuration and exit. + **wq!** + + 2. Make the configuration take effect. + **source ~/.bashrc** + diff --git a/cplusplus/environment/prepare_ENV/README_300_CN.md b/cplusplus/environment/prepare_ENV/README_300_CN.md new file mode 100644 index 0000000..eada0a8 --- /dev/null +++ b/cplusplus/environment/prepare_ENV/README_300_CN.md @@ -0,0 +1,114 @@ +中文|[English](README_300_EN.md) + +# 基础环境配置 +本文的目的是进行基础环境配置,包含sudo权限配置、apt源配置、环境变量配置。如已配置,均可跳过。 + +$\color{red}{以下命令在开发环境上执行,以普通用户为HwHiAiUser为例,请根据实际情况进行修改。}$ + + +1. 给HwHiAiUser用户配置sudo权限 + + + 切换为root用户 + **su root** + + 给sudoer文件配置写权限,并打开该文件 + **chmod u+w /etc/sudoers** + **vi /etc/sudoers** + + 在该文件 `# User privilege specification` 下面增加如下内容: + **HwHiAiUser ALL=(ALL:ALL) ALL** + + ![输入图片说明](https://images.gitee.com/uploads/images/2020/1128/144046_7c02d0d0_7401379.png "屏幕截图.png") + + 完成后,执行以下命令取消`/etc/sudoers`文件的写权限 + **chmod u-w /etc/sudoers** + 切换回普通用户 + **exit** + +2. apt源配置 + + 配置ubuntu18.04-x86的apt清华源 + + **sudo vi /etc/apt/sources.list** + + 将源文件内容替换为以下ubuntu18.04-x86的apt清华源 + + ``` + # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse + ``` + 执行以下命令更新源 + **sudo apt-get update** +

+ >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + > **如果sudo apt-get update失败,可以试用其他的国内源 https://www.cnblogs.com/dream4567/p/9690850.html** + + +3. 在开发环境中添加以下环境变量,用于atc模型转换 + + 1. 打开.bashrc文件 + **vim ~/.bashrc** + + 在文件中添加以下环境变量 + **export install_path=\\$HOME/Ascend/ascend-toolkit/latest** + + **export PATH=/usr/local/python3.7.5/bin:\\${install_path}/atc/ccec_compiler/bin:\\${install_path}/atc/bin:\\$PATH** + + **export ASCEND_OPP_PATH=\\${install_path}/opp** + + **export LD_LIBRARY_PATH=\\${install_path}/atc/lib64** + + 其中,PYTHONPATH环境变量在20.0和20.1版本不兼容。请按照CANN版本选择对应方式执行命令添加PYTHONPATH环境变量。 + + - 20.0版本 + + **export PYTHONPATH=\\${install_path}/atc/python/site-packages/te:\\${install_path}/atc/python/site-packages/topi:\\$PYTHONPATH** + + - 20.1版本 + + **export PYTHONPATH=\\${install_path}/atc/python/site-packages:\\${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:\\${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH** + + 保存退出 + **wq!** + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + >**- install_path 请根据实际情况修改。** + >**- 若开发环境与运行环境合一部署,请勿配置LD_LIBRARY_PATH,在运行样例时,会跟运行环境的LD_LIBRARY_PATH有冲突。** + + 2. 执行如下命令使环境变量生效 + **source ~/.bashrc** + +$\color{red}{以下命令在运行环境上执行}$ +1. 登录运行环境 + +2. 在运行环境添加环境变量,用于运行工程。 + 1. 打开.bashrc文件 + **vim ~/.bashrc** + + 在文件中添加以下环境变量 + + **export PYTHONPATH=\\$HOME/Ascend/nnrt/latest/pyACL/python/site-packages/acl:$PYTHONPATH** + + 其中,LD_LIBRARY_PATH环境变量在20.0和20.1版本不兼容。请按照CANN版本选择对应方式执行命令添加LD_LIBRARY_PATH环境变量。 + - 20.0版本 + + **export LD_LIBRARY_PATH=\\$HOME/ascend_ddk/x86/lib:\\$HOME/Ascend/nnrt/latest/acllib_linux.x86_64/lib64:$LD_LIBRARY_PATH** + + - 20.1版本 + + **export LD_LIBRARY_PATH=\\$HOME/ascend_ddk/x86/lib:\\$HOME/Ascend/nnrt/latest/acllib/lib64:$LD_LIBRARY_PATH** + + 保存退出 + **wq!** + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + > **此处的环境变量配置是以CANN软件包使用非root用户安装为例。** + + 2. 执行如下命令使环境变量生效。 + **source ~/.bashrc** \ No newline at end of file diff --git a/cplusplus/environment/prepare_ENV/README_300_EN.md b/cplusplus/environment/prepare_ENV/README_300_EN.md new file mode 100644 index 0000000..9b13800 --- /dev/null +++ b/cplusplus/environment/prepare_ENV/README_300_EN.md @@ -0,0 +1,113 @@ +English|[中文](README_300_CN.md) + +# Basic Environment Configuration +This readme file describes how to configure the basic environment, including the sudo permission, apt source, and environment variables. If they have been configured, skip this workflow. + + **Run the following commands as a common user in the development environment. The following takes **HwHiAiUser** as an example. Replace it with the actual running user.** + + +1. Grant the sudo permission to the **HwHiAiUser** user. + + + Switch to the **root** user. + **su root** + + Grant the write permission on the **sudoers** file and open the file. + **chmod u+w /etc/sudoers** + **vi /etc/sudoers** + + Add the following content below **`# User privilege specification`** in the **sudoers** file. + **HwHiAiUser ALL=(ALL:ALL) ALL** + + ![](https://images.gitee.com/uploads/images/2020/1128/144046_7c02d0d0_7401379.png "Screenshot.png") + + Remove the write permission on the **/etc/sudoers** file. + **chmod u-w /etc/sudoers** + Switch to the common user. + **exit** + +2. Configure the apt sources. + + Configure the Tsinghua apt sources of Ubuntu 18.04 (x86). + + **sudo vi /etc/apt/sources.list** + + Replace the source file content with the following Tsinghua apt sources. + + ``` + # By default, the source code images are commented out to speed up the apt update. You can uncomment them as required. + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse + deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse + # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse + ``` + Update the sources. + **sudo apt-get update** + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + > **If the source fails to be updated, you can try a new source available at https://www.cnblogs.com/dream4567/p/9690850.html**. + + +3. Add the following environment variables to the development environment for ATC model conversion. + + 1. Open the **.bashrc** file. + **vim ~/.bashrc** + + Add the following environment variables to the file. + **export install_path=\$HOME/Ascend/ascend-toolkit/latest** + + **export PATH=/usr/local/python3.7.5/bin:\\${install_path}/atc/ccec_compiler/bin:\\${install_path}/atc/bin:\\$PATH** + + **export ASCEND_OPP_PATH=\${install_path}/opp** + + **export LD_LIBRARY_PATH=\${install_path}/atc/lib64** + + The environment variable ***PYTHONPATH*** is incompatible with CANN 20.0 and 20.1. Run the corresponding command to add ***PYTHONPATH*** based on the CANN version. + + - For CANN 20.0 + + **export PYTHONPATH=\\${install_path}/atc/python/site-packages/te:\\${install_path}/atc/python/site-packages/topi:\\$PYTHONPATH** + + - For CANN 20.1 + + **export PYTHONPATH=\\${install_path}/atc/python/site-packages:\\${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:\\${install_path}/atc/python/site-packages/schedule_search.egg:\\$PYTHONPATH** + + Save the configuration and exit. + **wq!** + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + >**- Replace install_path with the actual installation path.** + >**- If the development environment and operating environment are set up on the same server, do not configure LD_LIBRARY_PATH, avoiding the conflict with LD_LIBRARY_PATH in the operating environment when running the sample.** + + 2. Make the configuration take effect. + **source ~/.bashrc** + +Run the following commands in the operating environment. +1. Log in to the operating environment. + +2. Add environment variables to the operating environment to run the project. + 1. Open the **.bashrc** file. + **vim ~/.bashrc** + + Add the following environment variables to the file. + + **export PYTHONPATH=\\$HOME/Ascend/nnrt/latest/pyACL/python/site-packages/acl:\\$PYTHONPATH** + + The environment variable ***LD_LIBRARY_PATH*** is incompatible with CANN 20.0 and 20.1. Run the corresponding command to add the ***LD_LIBRARY_PATH*** environment variable based on the CANN version. + - For CANN 20.0 + + **export LD_LIBRARY_PATH=\\$HOME/ascend_ddk/x86/lib:\\$HOME/Ascend/nnrt/latest/acllib_linux.x86_64/lib64:\\$LD_LIBRARY_PATH** + + - For CANN 20.1 + + **export LD_LIBRARY_PATH=\\$HOME/ascend_ddk/x86/lib:\\$HOME/Ascend/nnrt/latest/acllib/lib64:\\$LD_LIBRARY_PATH** + + Save the configuration and exit. + **wq!** + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + > **In this example, the CANN software package is installed by a non-root user.** + + 2. Make the configuration take effect. + **source ~/.bashrc** \ No newline at end of file diff --git a/cplusplus/environment/presenteragent_install/README_200DK_CN.md b/cplusplus/environment/presenteragent_install/README_200DK_CN.md new file mode 100644 index 0000000..a6c5885 --- /dev/null +++ b/cplusplus/environment/presenteragent_install/README_200DK_CN.md @@ -0,0 +1,61 @@ +中文|[English](README_200DK_EN.md) + +# 安装Presenter Agent +$\color{red}{以下命令在开发环境上用安装开发套件包的用户执行}$ +1. 安装autoconf、automake、libtool依赖 + **sudo apt-get install autoconf automake libtool python3-pip** +2. 安装python库 + + **python3.6 -m pip install --upgrade pip --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + **python3.6 -m pip install tornado==5.1.0 protobuf Cython numpy --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + **python3.7.5 -m pip install tornado==5.1.0 protobuf Cython numpy --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + > **若Python包安装失败,可以试用其他源 https://bbs.huaweicloud.com/forum/thread-97632-1-1.html 或不加-i 参数使用默认pip源** +3. 安装protobuf + - 开发环境未安装在Atlas200DK上,需要交叉编译protobuf + **cd \$HOME** + **git clone -b 3.8.x https://gitee.com/mirrors/protobufsource.git protobuf** + **cp -r protobuf protobuf_arm** + **cd protobuf** + **./autogen.sh** + **bash configure** + **make -j8** + **sudo make install** + **cd \$HOME/protobuf_arm** + **./autogen.sh** + **./configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --with-protoc=protoc --prefix=$HOME/ascend_ddk/arm** + **make -j8** + **make install** + + - 开发环境安装在Atlas200DK上,只需编译一次protobuf + **cd \$HOME** + **git clone -b 3.8.x https://gitee.com/mirrors/protobufsource.git protobuf** + **cd protobuf** + **./autogen.sh** + **./configure --prefix=$HOME/ascend_ddk/arm** + **make -j8** + **sudo make install** + +4. 编译并安装Presenter Agent + + 设置环境变量,在命令行内执行 + export DDK_PATH=\$HOME/Ascend/ascend-toolkit/latest/**_ARCH_** + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + >- 请将\$HOME/Ascend/ascend-toolkit/latest替换为ACLlib安装包的实际安装路径。 + >- 若版本为20.0,请将 **ARCH** 替换为arm64-linux_gcc7.3.0;若版本为20.1,请将 **ARCH** 替换为arm64-linux。 + + 下载Presenter Agent源码 + **cd \$HOME** + **git clone https://gitee.com/ascend/samples.git** + **cd \$HOME/samples/cplusplus/common/presenteragent/** + + 安装Presenter Agent + **make -j8** + **make install** + +5. 将编译好的so传到运行环境 + **scp \$HOME/ascend_ddk/arm/lib/libpr\* HwHiAiUser@192.168.1.2:/home/HwHiAiUser/ascend_ddk/arm/lib/** + + + diff --git a/cplusplus/environment/presenteragent_install/README_200DK_EN.md b/cplusplus/environment/presenteragent_install/README_200DK_EN.md new file mode 100644 index 0000000..2a1e838 --- /dev/null +++ b/cplusplus/environment/presenteragent_install/README_200DK_EN.md @@ -0,0 +1,60 @@ +English|[中文](README_200DK_CN.md) + +# Installing Presenter Agent + **Run the following commands in the development environment as the user who installs Toolkit.** +1. Install the Autoconf, Automake, and Libtool dependencies. + **sudo apt-get install autoconf automake libtool python3-pip** +2. Install Python libraries. + + **python3.6 -m pip install --upgrade pip --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + **python3.6 -m pip install tornado==5.1.0 protobuf Cython numpy --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + **python3.7.5 -m pip install tornado==5.1.0 protobuf Cython numpy --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + >**If Python fails to be installed, click [here](https://bbs.huaweicloud.com/forum/thread-97632-1-1.html) to try a new source. Alternatively, use the default pip source by removing the the -i option from the command.** +3. Install Protobuf. + - if the development environment is set up on the Atlas 200 DK, cross compilation is required, you need to compile Protobuf twice. + **cd $HOME** + **git clone -b 3.8.x https://gitee.com/mirrors/protobufsource.git protobuf** + **cp -r protobuf protobuf_arm** + **cd protobuf** + **./autogen.sh** + **bash configure** + **make -j8** + **sudo make install** + **cd $HOME/protobuf_arm** + **./autogen.sh** + **./configure --build=x86_64-linux-gnu --host=aarch64-linux-gnu --with-protoc=protoc --prefix=\$HOME/ascend_ddk/arm** + **make -j8** + **make install** + - if the development environment is not set up on the Atlas 200 DK,you only need to compile Protobuf once. + **cd \$HOME** + **git clone -b 3.8.x https://gitee.com/mirrors/protobufsource.git protobuf** + **cd protobuf** + **./autogen.sh** + **./configure --prefix=$HOME/ascend_ddk/arm** + **make -j8** + **sudo make install** + +4. Build and install Presenter Agent. + + Set the environment variable and run the following command on the command line. + **export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/_ARCH_** + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + >- Replace ***$HOME/Ascend/ascend-toolkit/latest*** with the actual ACLlib installation path. + >- For CANN 20.0, replace ***ARCH*** with **arm64-linux_gcc7.3.0**. For CANN 20.1, replace ***ARCH*** with **arm64-linux**. + Download the Presenter Agent source code. + + **cd $HOME** + **git clone https://gitee.com/ascend/samples.git** + **cd $HOME/samples/cplusplus/common/presenteragent/** + + Install Presenter Agent. + **make -j8** + **make install** + +5. Upload the built .so file to the operating environment. + **scp $HOME/ascend_ddk/arm/lib/libpr\* HwHiAiUser@192.168.1.2:/home/HwHiAiUser/ascend_ddk/arm/lib/** + + + diff --git a/cplusplus/environment/presenteragent_install/README_300_CN.md b/cplusplus/environment/presenteragent_install/README_300_CN.md new file mode 100644 index 0000000..00f8ccb --- /dev/null +++ b/cplusplus/environment/presenteragent_install/README_300_CN.md @@ -0,0 +1,49 @@ +中文|[English](README_300_EN.md) +# 安装Presenter Agent +$\color{red}{以下命令在开发环境上用安装开发套件包的用户执行}$ + +1. 安装autoconf、automake、libtool依赖 + **sudo apt-get install autoconf automake libtool python3-pip** +2. 安装python库 + + **python3.6 -m pip install --upgrade pip --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + **python3.6 -m pip install tornado==5.1.0 protobuf Cython numpy --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + **python3.7.5 -m pip install tornado==5.1.0 protobuf Cython numpy --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + + >![输入图片说明](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "屏幕截图.png") **说明:** + > **若Python包安装失败,可以试用其他源 https://bbs.huaweicloud.com/forum/thread-97632-1-1.html 或不加-i 参数使用默认pip源** +3. 安装protobuf + **git clone -b 3.8.x https://gitee.com/mirrors/protobufsource.git protobuf** + **cd protobuf** + **./autogen.sh** + **./configure --prefix=\$HOME/ascend_ddk/x86** + **make -j8** + **make install** + +4. 编译并安装Presenter Agent。 + 设置下环境变量,在命令行内执行。 + export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/**_ARCH_** + >![](public_sys-resources/icon-note.gif) **说明:** + 请将$HOME/Ascend/ascend-toolkit/latest替换为ACLlib安装包的实际安装路径。 + 若版本为20.0,请将 **ARCH** 替换为x86_64-linux_gcc7.3.0;若版本为20.1,请将 **ARCH** 替换为x86_64-linux。 + + 下载Presenter Agent源码 + **cd \$HOME** + **git clone https://gitee.com/ascend/samples.git** + **cd \$HOME/samples/cplusplus/common/presenteragent/** + + 安装Presenter Agent。 + **make mode=ASIC -j8** + **make install mode=ASIC** + + 5. 将编译好的so传到运行环境。(如开发环境和运行环境安装在同一服务器,请忽略此步) + **scp $HOME/ascend_ddk/x86/lib/libpr\* HwHiAiUser@_IP_:/home/HwHiAiUser/ascend_ddk/x86/lib** + + + >![](public_sys-resources/icon-note.gif) **说明:** + 请将IP替换为ai1s云端推理环境的公网ip地址,HwHiAiUser替换为实际的运行用户。 + + + + + diff --git a/cplusplus/environment/presenteragent_install/README_300_EN.md b/cplusplus/environment/presenteragent_install/README_300_EN.md new file mode 100644 index 0000000..492e27e --- /dev/null +++ b/cplusplus/environment/presenteragent_install/README_300_EN.md @@ -0,0 +1,48 @@ +English|[中文](README_300_CN.md) +# Installing Presenter Agent + **Run the following commands in the development environment as the user who installs Toolkit.** + +1. Install the Autoconf, Automake, and Libtool dependencies. + **sudo apt-get install autoconf automake libtool python3-pip** +2. Install Python libraries. + + **python3.6 -m pip install --upgrade pip --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + **python3.6 -m pip install tornado==5.1.0 protobuf Cython numpy --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + **python3.7.5 -m pip install tornado==5.1.0 protobuf Cython numpy --user -i https://mirrors.huaweicloud.com/repository/pypi/simple** + + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + >**If Python fails to be installed, click [here](https://bbs.huaweicloud.com/forum/thread-97632-1-1.html) to try a new source. Alternatively, use the default pip source by removing the the -i option from the command.** +3. Install Protobuf. + **git clone -b 3.8.x https://gitee.com/mirrors/protobufsource.git protobuf** + **cd protobuf** + **./autogen.sh** + **./configure --prefix=$HOME/ascend_ddk/x86** + **make -j8** + **make install** + +4. Build and install Presenter Agent. + Set the environment variable and run the following command on the CLI. + **export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/_ARCH_** + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + >- Replace ***$HOME/Ascend/ascend-toolkit/latest*** with the actual ACLlib installation path. + >- For CANN 20.0, replace ***ARCH*** with **x86_64-linux_gcc7.3.0**. For CANN 20.1, replace ***ARCH*** with **x86_64-linux**. + Download the Presenter Agent source code. + + **cd $HOME** + **git clone https://gitee.com/ascend/samples.git** + **cd $HOME/samples/cplusplus/common/presenteragent/** + + Install Presenter Agent. + **make mode=ASIC -j8** + **make install mode=ASIC** + + 5. Upload the built .so file to the operating environment. (If the development environment and operating environment are installed on the same server, skip this step.) + **scp $HOME/ascend_ddk/x86/lib/libpr\* HwHiAiUser@_IP_:/home/HwHiAiUser/ascend_ddk/x86/lib** + ​ + >![](https://images.gitee.com/uploads/images/2020/1130/162342_1d7d35d7_7401379.png "screenshot.png") **NOTE** + >Replace the IP address with the public IP address of the Atlas 300 (AI1s cloud-based inference environment) and replace **HwHiAiUser** with the actual running user. + + + + + diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.build_project b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.build_project new file mode 100644 index 0000000..6a31d7d --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.build_project @@ -0,0 +1 @@ +[{"name":"Build-Configuration","type":"AscendAppBuild","lastBuild":true,"buildProperties":{"HOST_OS":"Linux","HOST_ARCH":"aarch64","TARGET_TYPE":"SOC"}}] \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.project b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.project new file mode 100644 index 0000000..d084459 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.project @@ -0,0 +1,8 @@ +{ + "type": "Ascend ACL App", + "project_type": "Custom", + "project_desc": "", + "target": "", + "target_id": "", + "adk_version": "1.75.22.0.220" +} \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.vscode/settings.json b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.vscode/settings.json new file mode 100644 index 0000000..2c0c448 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/.vscode/settings.json @@ -0,0 +1,57 @@ +{ + "files.associations": { + "regex": "cpp", + "array": "cpp", + "bitset": "cpp", + "string_view": "cpp", + "initializer_list": "cpp", + "utility": "cpp", + "string": "cpp", + "atomic": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "condition_variable": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "iterator": "cpp", + "map": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "optional": "cpp", + "ratio": "cpp", + "set": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "fstream": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp" + } +} \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/CMakeLists.txt b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/CMakeLists.txt new file mode 100644 index 0000000..5866dbe --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved. + +# CMake lowest version requirement +cmake_minimum_required(VERSION 3.5.1) + +# project information +project(sample-facedetection) + +add_subdirectory("./src") diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/README_CN.md b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/README_CN.md new file mode 100644 index 0000000..dab9143 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/README_CN.md @@ -0,0 +1,160 @@ +中文|[English](README_EN.md) + +**本样例为大家学习昇腾软件栈提供参考,非商业目的!** + +**本样例适配20.1及以上版本,支持产品为Atlas200DK。** + +**本README只提供命令行方式运行样例的指导,如需在Mindstudio下运行样例,请参考[Mindstudio运行视频样例wiki](https://gitee.com/ascend/samples/wikis/Mindstudio%E8%BF%90%E8%A1%8C%E8%A7%86%E9%A2%91%E6%A0%B7%E4%BE%8B?sort_id=3170138)。** + +## 人脸识别样例 + +功能:通过摄像头对视频中的人脸信息进行预测,与已注册的人脸进行比对,预测出最可能的用户。 + +样例输入:摄像头。 + +样例输出:presenter界面展现推理结果。 + +### 前提条件 + +部署此Sample前,需要准备好以下环境: + +- 请确认已按照[环境准备和依赖安装](../../../../environment)准备好环境。 + +- 已完成对应产品的开发环境和运行环境安装。 + +### 软件准备 + +1. 获取源码包。 + + 可以使用以下两种方式下载,请选择其中一种进行源码准备。 + + - 命令行方式下载(下载时间较长,但步骤简单)。 + 开发环境,非root用户命令行中执行以下命令下载源码仓。 + **cd $HOME** + **git clone https://gitee.com/ascend/samples.git** + + - 压缩包方式下载(下载时间较短,但步骤稍微复杂)。 + 1. samples仓右上角选择 **克隆/下载** 下拉框并选择 **下载ZIP**。 + 2. 将ZIP包上传到开发环境中的普通用户家目录中,例如 **$HOME/ascend-samples-master.zip**。 + 3. 开发环境中,执行以下命令,解压zip包。 + **cd $HOME** + **unzip ascend-samples-master.zip** + +2. 获取此应用中所需要的原始网络模型。 + + 参考下表获取此应用中所用到的原始网络模型及其对应的权重文件,并将其存放到开发环境普通用户下该样例的model文件夹中,本例为:$HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/model。 + + | **模型名称** | **模型说明** | **模型下载路径** | + |---|---|---| + | face_detection| 人脸检测网络模型。是基于Caffe的Resnet10-SSD300模型转换后的网络模型。 | 请参考[https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/facedetection/ATC_resnet10-SSD_caffe_AE](https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/facedetection/ATC_resnet10-SSD_caffe_AE)目录中README.md下载原始模型章节下载模型和权重文件。 | + | vanillacnn| 人脸特征点标记网络模型。是基于Caffe的VanillaCNN模型转换后的网络模型。 | 请参考[https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/vanillacnn/ATC_vanillacnn_caffe_AE](https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/vanillacnn/ATC_vanillacnn_caffe_AE)目录中README.md下载原始模型章节下载模型和权重文件。 | + | sphereface| 特征向量获取网络模型。是基于Caffe的SphereFace模型转换后的网络模型。| 请参考[https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/sphereface/ATC_sphereface_caffe_AE](https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/sphereface/ATC_sphereface_caffe_AE)目录中README.md下载原始模型章节下载模型和权重文件。 | + + ![](https://images.gitee.com/uploads/images/2020/1106/160652_6146f6a4_5395865.gif "icon-note.gif") **说明:** + > - modelzoo中提供了转换好的om模型,但此模型不匹配当前样例,所以需要下载原始模型和权重文件后重新进行模型转换。 + +3. 将原始模型转换为Davinci模型。 + + **注:请确认环境变量已经在[环境准备和依赖安装](../../../../environment)中配置完成** + + 1. 设置LD_LIBRARY_PATH环境变量。 + + 由于LD_LIBRARY_PATH环境变量在转使用atc工具和运行样例时会产生冲突,所以需要在命令行单独设置此环境变量,方便修改。 + + **export LD_LIBRARY_PATH=\\${install_path}/atc/lib64** + + 2. 执行以下命令下载aipp配置文件并使用atc命令进行模型转换。 + + **cd $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/model** + + **wget https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/face_recognition_camera/face_detection_insert_op.cfg** + + **atc --input_shape="data:1,3,300,300" --weight="./face_detection_fp32.caffemodel" --input_format=NCHW --output="./face_detection" --soc_version=Ascend310 --insert_op_conf=./face_detection_insert_op.cfg --framework=0 --model="./face_detection.prototxt"** + + 按照同样的方式将vanillacnn,sphereface也进行模型转换。 + + **atc --input_shape="data:4,3,40,40" --weight="./vanillacnn.caffemodel" --input_format=NCHW --output="./vanillacnn" --soc_version=Ascend310 --framework=0 --model="./vanilla_deploy.prototxt"** + + **wget https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/face_recognition_camera/sphereface_insert_op.cfg** + + **atc --input_shape="data:8,3,112,96" --weight="./sphereface.caffemodel" --input_format=NCHW --output="./sphereface" --soc_version=Ascend310 --insert_op_conf=./sphereface_insert_op.cfg --framework=0 --model="./sphereface.prototxt"** + +### 样例部署 + +1. 修改present相关配置文件。 + + 将样例目录下**scripts/param.conf**中的 presenter_server_ip、presenter_view_ip 修改为开发环境中可以ping通运行环境的ip地址。 + 1. 开发环境中使用ifconfig查看可用ip。 + 2. 在开发环境中将**scripts/param.conf**中的 presenter_server_ip、presenter_view_ip 修改为该ip地址。 + ![](https://images.gitee.com/uploads/images/2020/1106/160652_6146f6a4_5395865.gif "icon-note.gif") **说明:** + > - 1.开发环境和运行环境分离部署,一般使用配置的虚拟网卡ip,例如192.168.1.223。 + > - 2.开发环境和运行环境合一部署,一般使用200dk固定ip,例如192.168.1.2。 + +2. 开发环境命令行中设置编译依赖的环境变量。 + + **export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/arm64-linux** + + **export NPU_HOST_LIB=$DDK_PATH/acllib/lib64/stub** + +3. 切换到face_recognition_camera目录,创建目录用于存放编译文件,例如,本文中,创建的目录为 **build/intermediates/host**。 + + **cd $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera** + + **mkdir -p build/intermediates/host** + +4. 切换到 **build/intermediates/host** 目录,执行cmake生成编译文件。 + + **cd build/intermediates/host** + **make clean** + **cmake \.\./\.\./\.\./src -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_SKIP_RPATH=TRUE** + +5. 执行make命令,生成的可执行文件main在 **face_recognition_camera/out** 目录下。 + + **make** + + +### 样例运行 + +![](https://images.gitee.com/uploads/images/2020/1106/160652_6146f6a4_5395865.gif "icon-note.gif") **说明:** +> - 以下出现的**xxx.xxx.xxx.xxx**为运行环境ip,200DK在USB连接时一般为192.168.1.2。 + +1. 执行以下命令,将开发环境的 **face_recognition_camera** 目录上传到运行环境中,例如 **/home/HwHiAiUser**。 + + **开发环境与运行环境合一部署,请跳过此步骤!** + + **scp -r $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/ HwHiAiUser@xxx.xxx.xxx.xxx:/home/HwHiAiUser** + +2. 启动presenterserver并登录运行环境。 + + 1. 开发环境中执行以下命令启动presentserver。 + **cd $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/** + **bash scripts/run_presenter_server.sh** + 2. 执行以下命令登录运行环境。 + **开发环境与运行环境合一部署,请跳过此步骤!** + **ssh HwHiAiUser@xxx.xxx.xxx.xxx** + + ![](https://images.gitee.com/uploads/images/2020/1106/160652_6146f6a4_5395865.gif "icon-note.gif") **说明:** + > - 当提示“Please input a absolute path to storage facial recognition data:“时,请输入MindStudio中存储人脸注册数据及解析数据,此路径MindStudio用户需要有读写权限,如果此路径不存在,脚本会自动创建。 + + +3. 运行可执行文件。 + + - 如果是开发环境与运行环境合一部署,执行以下命令,设置运行环境变量,并切换目录。 + **export LD_LIBRARY_PATH=** + **source ~/.bashrc** + **cd $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out** + + - 如果是开发环境与运行环境分离部署,执行以下命令切换目录。 + **cd $HOME/face_recognition_camera/out** + + 切换目录后,执行以下命令运行样例。 + + **./main** + +### 查看结果 + +1. 打开presentserver网页界面,打开启动Presenter Server服务时提示的URL即可。 + +2. 等待Presenter Agent传输数据给服务端,单击“Refresh“刷新,当有数据时相应的Channel 的Status变成绿色。 + +3. 单击右侧对应的View Name链接,查看运行结果。 \ No newline at end of file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/README_EN.md b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/README_EN.md new file mode 100644 index 0000000..c27237b --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/README_EN.md @@ -0,0 +1,175 @@ +English|[中文](README_CN.md) + +**The following sample provides reference for you to learn the Ascend AI Software Stack and cannot be used for commercial purposes.** + +**The sample applies to CANN 20.1 and later versions and supports Atlas 200 DK.** + +**This README provides only guidance for running samples in command line mode. For details about how to run samples in MindStudio, see [Running Video Samples in MindStudio](https://gitee.com/ascend/samples/wikis/Mindstudio%E8%BF%90%E8%A1%8C%E8%A7%86%E9%A2%91%E6%A0%B7%E4%BE%8B?sort_id=3170138).** + +## Facial Recognition Sample + +Function: Predict the face information in a video through the camera and compare it with the registered face to predict the most possible user. + +Input: Camera + +Output: Inference result displayed on Presenter + +### Prerequisites + +Before deploying this sample, ensure that: + +- The environment has been prepared according to [Environment Preparation and Dependency Installation](../../../../environment). + +- The development environment and operating environment of the corresponding product have been installed. + +### Preparing Software + +1. Obtain the source code package. + + You can use either of the following methods to download the source code: + + - Command line (The download takes a long time, but the procedure is simple.) + In the development environment, run the following commands as a non-root user to download the source code repository: + + **cd $HOME** + + **git clone https://gitee.com/ascend/samples.git** + + - Compressed package (The download time is short, but the procedure is complex.) + 1. Click **Clone or download** in the upper right corner of the samples repository and select **Download ZIP**. + 2. Upload the .zip package to the home directory of a common user in the development environment, for example, **$HOME/ascend-samples-master.zip**. + 3. In the development environment, run the following commands to decompress the .zip package: + + **cd $HOME** + **unzip ascend-samples-master.zip** + +2. Obtain the source network model required by the application. + + Obtain the original network model and its weight file used in the application by referring to the following table and store them in any directory of a common user in the development environment, for example, **$HOME/models/face_recognition_camera**. + + | **Model Name** | **Description** | **How to Obtain** | + |---|---|---| + | face_detection| Face detection network model converted from the Caffe-based Resnet10-SSD300 model. | Download the original model and weight file by referring to [https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/facedetection/ATC_resnet10-SSD_caffe_AE](https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/facedetection/ATC_resnet10-SSD_caffe_AE). | + | vanillacnn| Network model for marking facial feature points. It is a network model converted from the VanillaCNN model based on Caffe. | Download the original model and weight file by referring to [https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/vanillacnn/ATC_vanillacnn_caffe_AE](https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/vanillacnn/ATC_vanillacnn_caffe_AE). | + | sphereface| Network model for obtaining feature vectors. It is a network model converted from the SphereFace model based on Caffe. | Download the original model and weight file by referring to [https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/sphereface/ATC_sphereface_caffe_AE](https://gitee.com/ascend/modelzoo/tree/master/contrib/TensorFlow/Research/cv/sphereface/ATC_sphereface_caffe_AE). | + + ![](https://images.gitee.com/uploads/images/2020/1106/160652_6146f6a4_5395865.gif "icon-note.gif") **Note** + + > - The converted OM model provided by ModelZoo does not match the current sample. Therefore, you need to download the original model and weight file to convert the model by yourself. + +3. Convert the original model to a Da Vinci model. + + **Note: Ensure that the environment variables have been configured in [Environment Preparation and Dependency Installation](../../../../environment).** + + 1. Set the **LD_LIBRARY_PATH** environment variable. + + The **LD_LIBRARY_PATH** environment variable conflicts with the sample when the ATC tool is used. Therefore, you need to set this environment variable in the command line to facilitate modification. + + **export LD_LIBRARY_PATH=\\${install_path}/atc/lib64** + + 2. Run the following command to download the AIPP configuration file and run the ATC command to convert the model: + + **cd $HOME/models/face_recognition_camera** + + **wget https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/face_recognition_camera/face_detection_insert_op.cfg** + + **atc --input_shape="data:1,3,300,300" --weight="./face_detection_fp32.caffemodel" --input_format=NCHW --output="./face_detection" --soc_version=Ascend310 --insert_op_conf=./face_detection_insert_op.cfg --framework=0 --model="./face_detection.prototxt"** + + Use the same method to convert the VanillaCNN and SphereFace models. + + **atc --input_shape="data:4,3,40,40" --weight="./vanillacnn.caffemodel" --input_format=NCHW --output="./vanillacnn" --soc_version=Ascend310 --framework=0 --model="./vanilla_deploy.prototxt"** + + **wget https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/face_recognition_camera/sphereface_insert_op.cfg** + + **atc --input_shape="data:8,3,112,96" --weight="./sphereface.caffemodel" --input_format=NCHW --output="./sphereface" --soc_version=Ascend310 --insert_op_conf=./sphereface_insert_op.cfg --framework=0 --model="./sphereface.prototxt"** + + 3. Run the following command to copy the converted model to the **model** folder of the sample. + + **cp ./face_detection.om $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/model/** + + **cp ./vanillacnn.om $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/model/** + + **cp ./sphereface.om $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/model/** + +### Deploying the Sample + +1. Modify Presenter-related configuration files. + + Change **presenter_server_ip** and **presenter_view_ip** in **script/param.conf** in the sample directory to the IP addresses that can ping the operating environment in the development environment. + + 1. In the development environment, run the ifconfig command to view available IP addresses. + 2. In the development environment, change **presenter_server_ip** and **presenter_view_ip** in **script/param.conf** to the available IP addresses. + + ![](https://images.gitee.com/uploads/images/2020/1106/160652_6146f6a4_5395865.gif "icon-note.gif") **Note** + + > - 1. If the development environment and operating environment are deployed on separate servers, the configured virtual NIC IP address is used, for example, 192.168.1.223. + > - 2. If the development environment and operating environment are deployed on the same server, the fixed IP address of Atlas 200 DK is used, for example, 192.168.1.2. + +2. Set the environment variables on which compilation depends in the command line of the development environment. + + **export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/arm64-linux** + + **export NPU_HOST_LIB=$DDK_PATH/acllib/lib64/stub** + +3. Go to the **face_recognition_camera** directory and create a directory for storing build outputs. For example, the directory created in this sample is **build/intermediates/host**. + + **cd $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera** + + **mkdir -p build/intermediates/host** + +4. Go to the **build/intermediates/host** directory and run the cmake command. + + **cd build/intermediates/host** + **make clean** + **cmake \.\./\.\./\.\./src -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_SKIP_RPATH=TRUE** + +5. Run the make command to generate an executable file **main** in the **face_recognition_camera/out** directory. + + **make** + +### Running the Sample + +![](https://images.gitee.com/uploads/images/2020/1106/160652_6146f6a4_5395865.gif "icon-note.gif") **Note** + +> - In the following information, **xxx.xxx.xxx.xxx** indicates the IP address of the operating environment. The IP address of Atlas 200 DK is 192.168.1.2 when the USB is connected. + +1. Run the following command to upload the **face_recognition_camera** directory in the development environment to the operating environment, for example, **/home/HwHiAiUser**: + + **If the development environment and operating environment are deployed on the same server, skip this step.** + + **scp -r $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/ HwHiAiUser@xxx.xxx.xxx.xxx:/home/HwHiAiUser** + +2. Start the Presenter Server and log in to the operating environment. + + 1. Run the following command in the development environment to start the Presenter Server: + **cd $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/** + **bash script/run_presenter_server.sh** + 2. Run the following command to log in to the operating environment: + **If the development environment and operating environment are deployed on the same server, skip this step.** + **ssh HwHiAiUser@xxx.xxx.xxx.xxx** + + ![](https://images.gitee.com/uploads/images/2020/1106/160652_6146f6a4_5395865.gif "icon-note.gif") **Note** + + > - When the message "Please input a absolute path to storage facial recognition data:" is displayed, enter the path for storing face registration data and parsing data in MindStudio. The MindStudio user must have the read and write permissions. If the path does not exist, the script will automatically create it. + +3. Run the executable file. + + - If the development environment and operating environment are deployed on the same server, run the following commands to set the operating environment variables and switch the directory: + **export LD_LIBRARY_PATH=** + **source ~/.bashrc** + **cd $HOME/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out** + + - If the development environment and operating environment are deployed on separate servers, run the following command to switch the directory: + **cd $HOME/face_recognition_camera/out** + + Switch to the directory and run the following command to run the sample: + + **./main** + +### Checking the Result + +1. Open the Presenter Server WebUI. Open the URL that is displayed when the Presenter Server service is started. + +2. Wait for Presenter Agent to transmit data to the server. Click Refresh. When there is data, the icon in the Status column for the corresponding channel changes to green. + +3. Click the View Name link on the right to view the result. diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeCache.txt b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeCache.txt new file mode 100644 index 0000000..6513e6f --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeCache.txt @@ -0,0 +1,330 @@ +# This is the CMakeCache file. +# For build in directory: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING= + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:STRING=/usr/bin/aarch64-linux-gnu-g++ + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-7 + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-7 + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar-7 + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib-7 + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=objectdetection_camera + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=TRUE + +//Flags used by the linker during the creation of static libraries. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +objectdetection_camera_BINARY_DIR:STATIC=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host + +//Value Computed by CMake +objectdetection_camera_SOURCE_DIR:STATIC=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=10 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.10 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 + diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeCCompiler.cmake b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeCCompiler.cmake new file mode 100644 index 0000000..9e0e71d --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeCCompiler.cmake @@ -0,0 +1,73 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "7.5.0") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_SIMULATE_VERSION "") + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_C_COMPILER_AR "/usr/bin/gcc-ar-7") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_C_COMPILER_RANLIB "/usr/bin/gcc-ranlib-7") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;gcc_s;c;gcc;gcc_s") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..183707e --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeCXXCompiler.cmake @@ -0,0 +1,75 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/aarch64-linux-gnu-g++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "7.5.0") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_SIMULATE_VERSION "") + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_CXX_COMPILER_AR "/usr/bin/gcc-ar-7") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/usr/bin/gcc-ranlib-7") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "aarch64-linux-gnu") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "aarch64-linux-gnu") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc_s;gcc;c;gcc_s;gcc") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc-cross/aarch64-linux-gnu/7;/usr/aarch64-linux-gnu/lib;/lib/aarch64-linux-gnu;/lib;/usr/lib/aarch64-linux-gnu;/usr/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_C.bin new file mode 100644 index 0000000000000000000000000000000000000000..11a81f89210470f202bc1fddbbb3d2a45f3d9fd9 GIT binary patch literal 8248 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 literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeDetermineCompilerABI_CXX.bin new file mode 100644 index 0000000000000000000000000000000000000000..57f9777afd3977d6c599e4bf9d91fdd24251c6b1 GIT binary patch literal 9304 zcmeHNYitzP6+XL52*eO<^K5u{AylO(j7<`ZLmye&fI%{bf~iPJJ09<@@rw1XwYzQ& zL@gz>qN-Hc#Z6HEls(hF0)^fe zSWkycCGJkDmAzg4P1Y}iT7OWCLwz#QU7w7tN+wbRgR2}T6YXt$+{&h{)u!EIUu4@l zcDkNqyzh5&hA;IOO!$SD`#QR7zO^WS@xz~QZJg3k{f8?nMHi2%{l_FkRdlSvBni>*t*z+clz z`r0fr4#3A${+bW(SA5Ke&ry7ujwkG({3n$UaD8N+A-(Crv37(v>cPG1XxxKiZHxSI z#e;0bYv+Uq_fEmn9^7mHtOwU7iFvwx;MXT_hiG^u(a7xszd3O}WM2?`jPW6&p_)Io z<*U0tKO7F$U8oC({({Hly}`UghUbm@>^Vf#Z&$pm#>)eVmkQ75`Nwe(W%R! zNdC&hH2evmJd_i1(BCF_~n-py}tBT>(QmRn!n4>(I2z?A=YiV z)s}DJd_;9`ANZBqUmsLa{wVwEYKc4%3D6q0H$>Ol@=VXTwx>k$FL8a};wMZ8w|BMB z6CYGX^0yDX;`Z?<*S+v8{dsg2ox2>Oe4&oc5!(nv!o#Dp4xS75b~Q1+aUA2Jm6D;?%@S7hD z?|e`N?~!{waIXjM^}zpm58%9n^O5YUl0aveV)0z7*Acp*hlWomALlUKn{Z~4bE_nr z#}=6)f&by1LRz3>LBqh=Wk?TCIJ2Bp{sXFiNU5BcCCNT7X|5r~U!1{?;Jl-pE~U87 z;0!ch@g}VZ@J)KyLcPaSZn{$VU!rBm{i|Tw$NlL-{3>$WyF%?1Cit%An3ijmpVu<_ zLCt^c5zf&#H~YnKZfnyRyGJG+UTdwf8dg0v z;DW2azPib3c>L1_^_wXvhj{ij>3s1rLVVW1eYg}4QLdu=l;XTBmA{WLA4~D6gn3(v z-%l9NQhXX=9+cwK3G=NKe}FJAOYzC>oihmIS1LcV7-uQPA1toxQhXLo!-V!QLVW5% zoWKL~y{Cq@Rg|ygI0$x@35^iVF76K#sNA3CaQvf^{9M9%E|o98XA3_>^Qqc*|28;Q z?SvKaHih0VOduvF_iVX$`sa^(uB7t*H1g&BX0w$__F-p}Z=wIv^*WP)W4|);<>PMf z@^Sp_UHw+k&#>{boFv$}!x9$BlgXe0zcAEA^X^pGDQa z_3}H{{sfNq+9kzTs64JSm_Pn~*4VG1n9u(8N$LYT*tgLSlZ`vID~{SGJG!FkVaL>s{VY;@5BI zRaf5QP_tLmzCTX+9^>J1ak|5JO|X2OR`G$WQrvMd<25v~AEG}Waph+c=G#H_RqNKL zy#Ci1mvO;&0#xm@Y^PFt*DLPd|F@}MtQRv6h;}kA?efbzjECXOLmOQ?<@+$z4`efL zuzF84x+Qk zB`dZs#r6!%Wen%5@k}<6PL&jF=4IkZM-(*IpUjcvHp$Ax2RSbjlzC~ltF3siPRZUF z>!M^d%-l2@$g^RmFA-(0X|`o-a1W8ii=&Sxyk}ebud{N0=T|qM*-XMc3KaKyWxKM- z3w@X$d1XQ$=Vj0^^SlY~0bu+YuS6gBGSKA^RO;7X&-hKgGsFKe&44aaJsfv^#}?{f zzQh!ue^xV~Z>qi=TY2j*#xZb{_@d&_$9)j=km`d-UwhM6xF9hB=;Pj4q$-U1Lk@H= z^CiZBGVYh4Vbz!Vi*JAX_cJDa3Vqx|K@sdrd^t|8cE=#C2t_MSZaTB_4{pd-X?E;DC<_zmTn&M1Qw#-2a52QosJc E0f{!vE&u=k literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeSystem.cmake b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeSystem.cmake new file mode 100644 index 0000000..e49bf51 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-5.4.0-65-generic") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "5.4.0-65-generic") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-5.4.0-65-generic") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "5.4.0-65-generic") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdC/CMakeCCompilerId.c b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..722faa8 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,598 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +#if !defined(__STDC__) +# if defined(_MSC_VER) && !defined(__clang__) +# define C_DIALECT "90" +# else +# define C_DIALECT +# endif +#elif __STDC_VERSION__ >= 201000L +# define C_DIALECT "11" +#elif __STDC_VERSION__ >= 199901L +# define C_DIALECT "99" +#else +# define C_DIALECT "90" +#endif +const char* info_language_dialect_default = + "INFO" ":" "dialect_default[" C_DIALECT "]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdC/a.out b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdC/a.out new file mode 100644 index 0000000000000000000000000000000000000000..11b7df452ad29dfd7bf1d9b188856c9e33182403 GIT binary patch literal 8408 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 D$)0nc literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdCXX/CMakeCXXCompilerId.cpp b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..2d66298 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,576 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__COMO__) +# define COMPILER_ID "Comeau" + /* __COMO_VERSION__ = VRR */ +# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) +# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) + +#elif defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +#if defined(_MSC_VER) && defined(_MSVC_LANG) +#define CXX_STD _MSVC_LANG +#else +#define CXX_STD __cplusplus +#endif + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if CXX_STD > 201402L + "17" +#elif CXX_STD >= 201402L + "14" +#elif CXX_STD >= 201103L + "11" +#else + "98" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdCXX/a.out b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdCXX/a.out new file mode 100644 index 0000000000000000000000000000000000000000..764ad62eb6284915a1c822b46cb3dffbd27d5143 GIT binary patch literal 9480 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 LiGM;+X;A;)HVP#n literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeDirectoryInformation.cmake b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..db5b86c --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeOutput.log b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000..f0641cf --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeOutput.log @@ -0,0 +1,628 @@ +The system is: Linux - 5.4.0-65-generic - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /usr/bin/cc +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + +The C compiler identification is GNU, found in "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdC/a.out" + +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: /usr/bin/aarch64-linux-gnu-g++ +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + +The CXX compiler identification is GNU, found in "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/3.10.2/CompilerIdCXX/a.out" + +Determining if the C compiler works passed with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_c0394/fast" +/usr/bin/make -f CMakeFiles/cmTC_c0394.dir/build.make CMakeFiles/cmTC_c0394.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_c0394.dir/testCCompiler.c.o +/usr/bin/cc -o CMakeFiles/cmTC_c0394.dir/testCCompiler.c.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp/testCCompiler.c +Linking C executable cmTC_c0394 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_c0394.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_c0394.dir/testCCompiler.c.o -o cmTC_c0394 +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_55368/fast" +/usr/bin/make -f CMakeFiles/cmTC_55368.dir/build.make CMakeFiles/cmTC_55368.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_55368.dir/CMakeCCompilerABI.c.o +/usr/bin/cc -o CMakeFiles/cmTC_55368.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.10/Modules/CMakeCCompilerABI.c +Linking C executable cmTC_55368 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_55368.dir/link.txt --verbose=1 +/usr/bin/cc -v CMakeFiles/cmTC_55368.dir/CMakeCCompilerABI.c.o -o cmTC_55368 +Using built-in specs. +COLLECT_GCC=/usr/bin/cc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper +OFFLOAD_TARGET_NAMES=nvptx-none +OFFLOAD_TARGET_DEFAULT=1 +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_55368' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccKGDrJp.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_55368 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/cmTC_55368.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_55368' '-mtune=generic' '-march=x86-64' +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_55368/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_55368.dir/build.make CMakeFiles/cmTC_55368.dir/build] + ignore line: [make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp'] + ignore line: [Building C object CMakeFiles/cmTC_55368.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -o CMakeFiles/cmTC_55368.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.10/Modules/CMakeCCompilerABI.c] + ignore line: [Linking C executable cmTC_55368] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_55368.dir/link.txt --verbose=1] + ignore line: [/usr/bin/cc -v CMakeFiles/cmTC_55368.dir/CMakeCCompilerABI.c.o -o cmTC_55368 ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_55368' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccKGDrJp.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o cmTC_55368 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/cmTC_55368.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/7/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccKGDrJp.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-pie] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_55368] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/Scrt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/crtbeginS.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../..] + arg [CMakeFiles/cmTC_55368.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--push-state] ==> ignore + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--pop-state] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--push-state] ==> ignore + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--pop-state] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/crtendS.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o] ==> ignore + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7] ==> [/usr/lib/gcc/x86_64-linux-gnu/7] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../..] ==> [/usr/lib] + implicit libs: [gcc;gcc_s;c;gcc;gcc_s] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + + + +Detecting C [-std=c11] compiler features compiled with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_759e8/fast" +/usr/bin/make -f CMakeFiles/cmTC_759e8.dir/build.make CMakeFiles/cmTC_759e8.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_759e8.dir/feature_tests.c.o +/usr/bin/cc -std=c11 -o CMakeFiles/cmTC_759e8.dir/feature_tests.c.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.c +Linking C executable cmTC_759e8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_759e8.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_759e8.dir/feature_tests.c.o -o cmTC_759e8 +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:1c_restrict + Feature record: C_FEATURE:1c_static_assert + Feature record: C_FEATURE:1c_variadic_macros + + +Detecting C [-std=c99] compiler features compiled with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_10bc8/fast" +/usr/bin/make -f CMakeFiles/cmTC_10bc8.dir/build.make CMakeFiles/cmTC_10bc8.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_10bc8.dir/feature_tests.c.o +/usr/bin/cc -std=c99 -o CMakeFiles/cmTC_10bc8.dir/feature_tests.c.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.c +Linking C executable cmTC_10bc8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_10bc8.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_10bc8.dir/feature_tests.c.o -o cmTC_10bc8 +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:1c_restrict + Feature record: C_FEATURE:0c_static_assert + Feature record: C_FEATURE:1c_variadic_macros + + +Detecting C [-std=c90] compiler features compiled with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_cbe30/fast" +/usr/bin/make -f CMakeFiles/cmTC_cbe30.dir/build.make CMakeFiles/cmTC_cbe30.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_cbe30.dir/feature_tests.c.o +/usr/bin/cc -std=c90 -o CMakeFiles/cmTC_cbe30.dir/feature_tests.c.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.c +Linking C executable cmTC_cbe30 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_cbe30.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_cbe30.dir/feature_tests.c.o -o cmTC_cbe30 +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:0c_restrict + Feature record: C_FEATURE:0c_static_assert + Feature record: C_FEATURE:0c_variadic_macros +Determining if the CXX compiler works passed with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_44a41/fast" +/usr/bin/make -f CMakeFiles/cmTC_44a41.dir/build.make CMakeFiles/cmTC_44a41.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_44a41.dir/testCXXCompiler.cxx.o +/usr/bin/aarch64-linux-gnu-g++ -o CMakeFiles/cmTC_44a41.dir/testCXXCompiler.cxx.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp/testCXXCompiler.cxx +Linking CXX executable cmTC_44a41 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_44a41.dir/link.txt --verbose=1 +/usr/bin/aarch64-linux-gnu-g++ CMakeFiles/cmTC_44a41.dir/testCXXCompiler.cxx.o -o cmTC_44a41 +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_ab0dd/fast" +/usr/bin/make -f CMakeFiles/cmTC_ab0dd.dir/build.make CMakeFiles/cmTC_ab0dd.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_ab0dd.dir/CMakeCXXCompilerABI.cpp.o +/usr/bin/aarch64-linux-gnu-g++ -o CMakeFiles/cmTC_ab0dd.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp +Linking CXX executable cmTC_ab0dd +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ab0dd.dir/link.txt --verbose=1 +/usr/bin/aarch64-linux-gnu-g++ -v CMakeFiles/cmTC_ab0dd.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_ab0dd +Using built-in specs. +COLLECT_GCC=/usr/bin/aarch64-linux-gnu-g++ +COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/7/lto-wrapper +Target: aarch64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include +Thread model: posix +gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) +COMPILER_PATH=/usr/lib/gcc-cross/aarch64-linux-gnu/7/:/usr/lib/gcc-cross/aarch64-linux-gnu/7/:/usr/lib/gcc-cross/aarch64-linux-gnu/:/usr/lib/gcc-cross/aarch64-linux-gnu/7/:/usr/lib/gcc-cross/aarch64-linux-gnu/:/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/bin/ +LIBRARY_PATH=/usr/lib/gcc-cross/aarch64-linux-gnu/7/:/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/:/lib/aarch64-linux-gnu/:/lib/../lib/:/usr/lib/aarch64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ab0dd' '-shared-libgcc' '-mlittle-endian' '-mabi=lp64' + /usr/lib/gcc-cross/aarch64-linux-gnu/7/collect2 -plugin /usr/lib/gcc-cross/aarch64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc-cross/aarch64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccmvvlHG.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr --hash-style=gnu --as-needed -dynamic-linker /lib/ld-linux-aarch64.so.1 -X -EL -maarch64linux --fix-cortex-a53-843419 -pie -z now -z relro -o cmTC_ab0dd /usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/Scrt1.o /usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/crti.o /usr/lib/gcc-cross/aarch64-linux-gnu/7/crtbeginS.o -L/usr/lib/gcc-cross/aarch64-linux-gnu/7 -L/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib -L/lib/aarch64-linux-gnu -L/lib/../lib -L/usr/lib/aarch64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib CMakeFiles/cmTC_ab0dd.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc-cross/aarch64-linux-gnu/7/crtendS.o /usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/crtn.o +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ab0dd' '-shared-libgcc' '-mlittle-endian' '-mabi=lp64' +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + +Parsed CXX implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_ab0dd/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_ab0dd.dir/build.make CMakeFiles/cmTC_ab0dd.dir/build] + ignore line: [make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp'] + ignore line: [Building CXX object CMakeFiles/cmTC_ab0dd.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/aarch64-linux-gnu-g++ -o CMakeFiles/cmTC_ab0dd.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.10/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Linking CXX executable cmTC_ab0dd] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ab0dd.dir/link.txt --verbose=1] + ignore line: [/usr/bin/aarch64-linux-gnu-g++ -v CMakeFiles/cmTC_ab0dd.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_ab0dd ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/aarch64-linux-gnu-g++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/7/lto-wrapper] + ignore line: [Target: aarch64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include] + ignore line: [Thread model: posix] + ignore line: [gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc-cross/aarch64-linux-gnu/7/:/usr/lib/gcc-cross/aarch64-linux-gnu/7/:/usr/lib/gcc-cross/aarch64-linux-gnu/:/usr/lib/gcc-cross/aarch64-linux-gnu/7/:/usr/lib/gcc-cross/aarch64-linux-gnu/:/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/bin/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc-cross/aarch64-linux-gnu/7/:/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/:/lib/aarch64-linux-gnu/:/lib/../lib/:/usr/lib/aarch64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ab0dd' '-shared-libgcc' '-mlittle-endian' '-mabi=lp64'] + link line: [ /usr/lib/gcc-cross/aarch64-linux-gnu/7/collect2 -plugin /usr/lib/gcc-cross/aarch64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc-cross/aarch64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccmvvlHG.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr --hash-style=gnu --as-needed -dynamic-linker /lib/ld-linux-aarch64.so.1 -X -EL -maarch64linux --fix-cortex-a53-843419 -pie -z now -z relro -o cmTC_ab0dd /usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/Scrt1.o /usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/crti.o /usr/lib/gcc-cross/aarch64-linux-gnu/7/crtbeginS.o -L/usr/lib/gcc-cross/aarch64-linux-gnu/7 -L/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib -L/lib/aarch64-linux-gnu -L/lib/../lib -L/usr/lib/aarch64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib CMakeFiles/cmTC_ab0dd.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc-cross/aarch64-linux-gnu/7/crtendS.o /usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/crtn.o] + arg [/usr/lib/gcc-cross/aarch64-linux-gnu/7/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc-cross/aarch64-linux-gnu/7/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc-cross/aarch64-linux-gnu/7/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccmvvlHG.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib/ld-linux-aarch64.so.1] ==> ignore + arg [-X] ==> ignore + arg [-EL] ==> ignore + arg [-maarch64linux] ==> ignore + arg [--fix-cortex-a53-843419] ==> ignore + arg [-pie] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_ab0dd] ==> ignore + arg [/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/Scrt1.o] ==> ignore + arg [/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/crti.o] ==> ignore + arg [/usr/lib/gcc-cross/aarch64-linux-gnu/7/crtbeginS.o] ==> ignore + arg [-L/usr/lib/gcc-cross/aarch64-linux-gnu/7] ==> dir [/usr/lib/gcc-cross/aarch64-linux-gnu/7] + arg [-L/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib] ==> dir [/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib] + arg [-L/lib/aarch64-linux-gnu] ==> dir [/lib/aarch64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/aarch64-linux-gnu] ==> dir [/usr/lib/aarch64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib] ==> dir [/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib] + arg [CMakeFiles/cmTC_ab0dd.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc-cross/aarch64-linux-gnu/7/crtendS.o] ==> ignore + arg [/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib/crtn.o] ==> ignore + collapse library dir [/usr/lib/gcc-cross/aarch64-linux-gnu/7] ==> [/usr/lib/gcc-cross/aarch64-linux-gnu/7] + collapse library dir [/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib/../lib] ==> [/usr/aarch64-linux-gnu/lib] + collapse library dir [/lib/aarch64-linux-gnu] ==> [/lib/aarch64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/aarch64-linux-gnu] ==> [/usr/lib/aarch64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/lib] ==> [/usr/aarch64-linux-gnu/lib] + implicit libs: [stdc++;m;gcc_s;gcc;c;gcc_s;gcc] + implicit dirs: [/usr/lib/gcc-cross/aarch64-linux-gnu/7;/usr/aarch64-linux-gnu/lib;/lib/aarch64-linux-gnu;/lib;/usr/lib/aarch64-linux-gnu;/usr/lib] + implicit fwks: [] + + + + +Detecting CXX [-std=c++1z] compiler features compiled with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_240b2/fast" +/usr/bin/make -f CMakeFiles/cmTC_240b2.dir/build.make CMakeFiles/cmTC_240b2.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_240b2.dir/feature_tests.cxx.o +/usr/bin/aarch64-linux-gnu-g++ -std=c++1z -o CMakeFiles/cmTC_240b2.dir/feature_tests.cxx.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_240b2 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_240b2.dir/link.txt --verbose=1 +/usr/bin/aarch64-linux-gnu-g++ CMakeFiles/cmTC_240b2.dir/feature_tests.cxx.o -o cmTC_240b2 +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:1cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:1cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:1cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:1cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:1cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:1cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:1cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:1cxx_relaxed_constexpr + Feature record: CXX_FEATURE:1cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:1cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++14] compiler features compiled with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_59d7e/fast" +/usr/bin/make -f CMakeFiles/cmTC_59d7e.dir/build.make CMakeFiles/cmTC_59d7e.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_59d7e.dir/feature_tests.cxx.o +/usr/bin/aarch64-linux-gnu-g++ -std=c++14 -o CMakeFiles/cmTC_59d7e.dir/feature_tests.cxx.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_59d7e +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_59d7e.dir/link.txt --verbose=1 +/usr/bin/aarch64-linux-gnu-g++ CMakeFiles/cmTC_59d7e.dir/feature_tests.cxx.o -o cmTC_59d7e +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:1cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:1cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:1cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:1cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:1cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:1cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:1cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:1cxx_relaxed_constexpr + Feature record: CXX_FEATURE:1cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:1cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++11] compiler features compiled with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_cfd38/fast" +/usr/bin/make -f CMakeFiles/cmTC_cfd38.dir/build.make CMakeFiles/cmTC_cfd38.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_cfd38.dir/feature_tests.cxx.o +/usr/bin/aarch64-linux-gnu-g++ -std=c++11 -o CMakeFiles/cmTC_cfd38.dir/feature_tests.cxx.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_cfd38 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_cfd38.dir/link.txt --verbose=1 +/usr/bin/aarch64-linux-gnu-g++ CMakeFiles/cmTC_cfd38.dir/feature_tests.cxx.o -o cmTC_cfd38 +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++98] compiler features compiled with the following output: +Change Dir: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_6f057/fast" +/usr/bin/make -f CMakeFiles/cmTC_6f057.dir/build.make CMakeFiles/cmTC_6f057.dir/build +make[1]: Entering directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_6f057.dir/feature_tests.cxx.o +/usr/bin/aarch64-linux-gnu-g++ -std=c++98 -o CMakeFiles/cmTC_6f057.dir/feature_tests.cxx.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_6f057 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_6f057.dir/link.txt --verbose=1 +/usr/bin/aarch64-linux-gnu-g++ CMakeFiles/cmTC_6f057.dir/feature_tests.cxx.o -o cmTC_6f057 +make[1]: Leaving directory '/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:0cxx_alias_templates + Feature record: CXX_FEATURE:0cxx_alignas + Feature record: CXX_FEATURE:0cxx_alignof + Feature record: CXX_FEATURE:0cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:0cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:0cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:0cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:0cxx_default_function_template_args + Feature record: CXX_FEATURE:0cxx_defaulted_functions + Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:0cxx_delegating_constructors + Feature record: CXX_FEATURE:0cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:0cxx_enum_forward_declarations + Feature record: CXX_FEATURE:0cxx_explicit_conversions + Feature record: CXX_FEATURE:0cxx_extended_friend_declarations + Feature record: CXX_FEATURE:0cxx_extern_templates + Feature record: CXX_FEATURE:0cxx_final + Feature record: CXX_FEATURE:0cxx_func_identifier + Feature record: CXX_FEATURE:0cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:0cxx_inheriting_constructors + Feature record: CXX_FEATURE:0cxx_inline_namespaces + Feature record: CXX_FEATURE:0cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:0cxx_local_type_template_args + Feature record: CXX_FEATURE:0cxx_long_long_type + Feature record: CXX_FEATURE:0cxx_noexcept + Feature record: CXX_FEATURE:0cxx_nonstatic_member_init + Feature record: CXX_FEATURE:0cxx_nullptr + Feature record: CXX_FEATURE:0cxx_override + Feature record: CXX_FEATURE:0cxx_range_for + Feature record: CXX_FEATURE:0cxx_raw_string_literals + Feature record: CXX_FEATURE:0cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:0cxx_right_angle_brackets + Feature record: CXX_FEATURE:0cxx_rvalue_references + Feature record: CXX_FEATURE:0cxx_sizeof_member + Feature record: CXX_FEATURE:0cxx_static_assert + Feature record: CXX_FEATURE:0cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:0cxx_thread_local + Feature record: CXX_FEATURE:0cxx_trailing_return_types + Feature record: CXX_FEATURE:0cxx_unicode_literals + Feature record: CXX_FEATURE:0cxx_uniform_initialization + Feature record: CXX_FEATURE:0cxx_unrestricted_unions + Feature record: CXX_FEATURE:0cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:0cxx_variadic_macros + Feature record: CXX_FEATURE:0cxx_variadic_templates diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/Makefile.cmake b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000..9d96e2d --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/Makefile.cmake @@ -0,0 +1,46 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "CMakeFiles/3.10.2/CMakeCCompiler.cmake" + "CMakeFiles/3.10.2/CMakeCXXCompiler.cmake" + "CMakeFiles/3.10.2/CMakeSystem.cmake" + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/CMakeLists.txt" + "/usr/share/cmake-3.10/Modules/CMakeCInformation.cmake" + "/usr/share/cmake-3.10/Modules/CMakeCXXInformation.cmake" + "/usr/share/cmake-3.10/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/share/cmake-3.10/Modules/CMakeGenericSystem.cmake" + "/usr/share/cmake-3.10/Modules/CMakeLanguageInformation.cmake" + "/usr/share/cmake-3.10/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/share/cmake-3.10/Modules/CMakeSystemSpecificInitialize.cmake" + "/usr/share/cmake-3.10/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + "/usr/share/cmake-3.10/Modules/Compiler/GNU-C.cmake" + "/usr/share/cmake-3.10/Modules/Compiler/GNU-CXX.cmake" + "/usr/share/cmake-3.10/Modules/Compiler/GNU.cmake" + "/usr/share/cmake-3.10/Modules/Platform/Linux-GNU-C.cmake" + "/usr/share/cmake-3.10/Modules/Platform/Linux-GNU-CXX.cmake" + "/usr/share/cmake-3.10/Modules/Platform/Linux-GNU.cmake" + "/usr/share/cmake-3.10/Modules/Platform/Linux.cmake" + "/usr/share/cmake-3.10/Modules/Platform/UnixPaths.cmake" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/main.dir/DependInfo.cmake" + ) diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/Makefile2 b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/Makefile2 new file mode 100644 index 0000000..1ae8b02 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/Makefile2 @@ -0,0 +1,108 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# The main recursive all target +all: + +.PHONY : all + +# The main recursive preinstall target +preinstall: + +.PHONY : preinstall + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host + +#============================================================================= +# Target rules for target CMakeFiles/main.dir + +# All Build rule for target. +CMakeFiles/main.dir/all: + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/depend + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9 "Built target main" +.PHONY : CMakeFiles/main.dir/all + +# Include target in all. +all: CMakeFiles/main.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +CMakeFiles/main.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles 9 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/main.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles 0 +.PHONY : CMakeFiles/main.dir/rule + +# Convenience name for target. +main: CMakeFiles/main.dir/rule + +.PHONY : main + +# clean rule for target. +CMakeFiles/main.dir/clean: + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/clean +.PHONY : CMakeFiles/main.dir/clean + +# clean rule for target. +clean: CMakeFiles/main.dir/clean + +.PHONY : clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/TargetDirectories.txt b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..49cef8e --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,7 @@ +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/install/strip.dir +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/edit_cache.dir +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/rebuild_cache.dir +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/list_install_components.dir +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/install/local.dir +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/install.dir diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/cmake.check_cache b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.bin b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.bin new file mode 100644 index 0000000000000000000000000000000000000000..63acb258faea1dc09cc815d2a13f5d7b7fea1024 GIT binary patch literal 13352 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 304 +"1" +#else +"0" +#endif +"c_function_prototypes\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +"1" +#else +"0" +#endif +"c_restrict\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L +"1" +#else +"0" +#endif +"c_static_assert\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 304 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +"1" +#else +"0" +#endif +"c_variadic_macros\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.cxx b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.cxx new file mode 100644 index 0000000..b93418c --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/feature_tests.cxx @@ -0,0 +1,405 @@ + + const char features[] = {"\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_aggregate_default_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alias_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alignas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alignof\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_attributes\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_attribute_deprecated\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_auto_type\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_binary_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_constexpr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_contextual_conversions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_decltype\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_decltype_auto\n" +"CXX_FEATURE:" +#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_decltype_incomplete_return_types\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_default_function_template_args\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_defaulted_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_defaulted_move_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_delegating_constructors\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_deleted_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_digit_separators\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_enum_forward_declarations\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_explicit_conversions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_extended_friend_declarations\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_extern_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_final\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_func_identifier\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_generalized_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_generic_lambdas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_inheriting_constructors\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_inline_namespaces\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_lambdas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_lambda_init_captures\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_local_type_template_args\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_long_long_type\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_noexcept\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_nonstatic_member_init\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_nullptr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_override\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_range_for\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_raw_string_literals\n" +"CXX_FEATURE:" +#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_reference_qualified_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_relaxed_constexpr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_return_type_deduction\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_right_angle_brackets\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_rvalue_references\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_sizeof_member\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_static_assert\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_strong_enums\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus +"1" +#else +"0" +#endif +"cxx_template_template_parameters\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_thread_local\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_trailing_return_types\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_unicode_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_uniform_initialization\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_unrestricted_unions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_user_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_variable_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_variadic_macros\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_variadic_templates\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/CXX.includecache b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/CXX.includecache new file mode 100644 index 0000000..68040ae --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/CXX.includecache @@ -0,0 +1,2460 @@ +#IncludeRegexLine: ^[ ]*[#%][ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h +acl_rt.h +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h +acl_op.h +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h +acl_mdl.h +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h + +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h +stdint.h +- +stddef.h +- + +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h +stddef.h +- +stdint.h +- +acl_base.h +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h +acl_rt.h +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h + +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h +acl_base.h +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h +acl_rt.h +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h + +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h +stdint.h +- +stddef.h +- +acl_base.h +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h + +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h +stdint.h +- +stddef.h +- +acl/acl.h +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl/acl.h +acl/acl_base.h +/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl/acl_base.h + +/home/ascend/Ascend/driver/peripheral_api.h +stdint.h +- + +/home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/channel.h +string +- +cstdint +- +vector +- +memory +- +ascenddk/presenter/agent/errors.h +/home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/ascenddk/presenter/agent/errors.h + +/home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/errors.h + +/home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_channel.h +ascenddk/presenter/agent/channel.h +/home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/ascenddk/presenter/agent/channel.h +ascenddk/presenter/agent/errors.h +/home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/ascenddk/presenter/agent/errors.h +ascenddk/presenter/agent/presenter_types.h +/home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/ascenddk/presenter/agent/presenter_types.h + +/home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_types.h +string +- +cstdint +- +vector +- + +/home/ascend/ascend_ddk/arm/include/atlasutil/acl_device.h +unistd.h +- +string +- +acl/acl.h +/home/ascend/ascend_ddk/arm/include/atlasutil/acl/acl.h +atlas_error.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h + +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h +acl/acl.h +/home/ascend/ascend_ddk/arm/include/atlasutil/acl/acl.h +atlas_thread_mgr.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h + +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h +unistd.h +- + +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_model.h +iostream +- +atlas_utils.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +acl/acl.h +/home/ascend/ascend_ddk/arm/include/atlasutil/acl/acl.h + +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h +iostream +- +memory +- +thread +- +unistd.h +- +thread_safe_queue.h +/home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h +acl/acl.h +/home/ascend/ascend_ddk/arm/include/atlasutil/acl/acl.h +atlas_error.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h + +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h +iostream +- +memory +- +thread +- +unistd.h +- +atlas_utils.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +thread_safe_queue.h +/home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h +atlas_thread.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h + +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h +unistd.h +- +string +- +acl/acl.h +/home/ascend/ascend_ddk/arm/include/atlasutil/acl/acl.h +acl/ops/acl_dvpp.h +/home/ascend/ascend_ddk/arm/include/atlasutil/acl/ops/acl_dvpp.h + +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +iostream +- +vector +- +memory +- +mutex +- +unistd.h +- +acl/acl.h +/home/ascend/ascend_ddk/arm/include/atlasutil/acl/acl.h +acl/ops/acl_dvpp.h +/home/ascend/ascend_ddk/arm/include/atlasutil/acl/ops/acl_dvpp.h +atlas_error.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h +atlas_type.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h + +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocap_base.h +atlas_error.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h +atlas_type.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h + +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocapture.h +unistd.h +- +atlas_utils.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +atlas_videocap_base.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocap_base.h + +/home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h +cstdint +- +acl/acl.h +/home/ascend/ascend_ddk/arm/include/atlasutil/acl/acl.h +acl/ops/acl_dvpp.h +/home/ascend/ascend_ddk/arm/include/atlasutil/acl/ops/acl_dvpp.h +atlas_utils.h +/home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h + +/home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h +string +- +map +- + +/home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h +mutex +- +queue +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp +opencv2/features2d.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/features2d.hpp +opencv2/core/affine.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/affine.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/cvdef.h +opencv2/core/version.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/version.hpp +opencv2/core/base.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/base.hpp +opencv2/core/cvstd.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/cvstd.hpp +opencv2/core/traits.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/traits.hpp +opencv2/core/matx.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/matx.hpp +opencv2/core/types.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/types.hpp +opencv2/core/mat.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/mat.hpp +opencv2/core/persistence.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/persistence.hpp +opencv2/core/operations.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/operations.hpp +opencv2/core/cvstd.inl.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/cvstd.inl.hpp +opencv2/core/utility.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/utility.hpp +opencv2/core/optim.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/optim.hpp +opencv2/core/ovx.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core/ovx.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp +opencv2/core.hpp +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp +opencv2/core/mat.hpp +- +chrono +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp +opencv2/opencv_modules.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/opencv_modules.hpp +climits +- +algorithm +- +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h +opencv2/core/cvstd.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvstd.hpp +opencv2/core/neon_utils.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/neon_utils.hpp +opencv2/core/vsx_utils.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/vsx_utils.hpp +opencv2/core/check.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/check.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp +opencv2/core/base.hpp +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h +opencv2/core/types_c.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/types_c.h +cxcore.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cxcore.h +cxcore.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cxcore.h +opencv2/core/utility.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/utility.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core.hpp +opencv2/core/cuda_types.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cuda_types.hpp +opencv2/opencv.hpp +- +opencv2/core/cuda.inl.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cuda.inl.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp +opencv2/core/cuda.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cuda.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h +cv_cpu_config.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_config.h +cv_cpu_helper.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h +emmintrin.h +- +pmmintrin.h +- +tmmintrin.h +- +smmintrin.h +- +nmmintrin.h +- +nmmintrin.h +- +popcntintrin.h +- +immintrin.h +- +arm_neon.h +- +immintrin.h +- +immintrin.h +- +immintrin.h +- +Intrin.h +- +arm_neon.h +- +arm_neon.h +- +arm_neon.h +- +altivec.h +- +hal/msa_macros.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h +wasm_simd128.h +- +emmintrin.h +- +Intrin.h +- +arm_neon.h +- +arm_neon.h +- +altivec.h +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h +cvconfig.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvconfig.h +limits +- +limits.h +- +opencv2/core/hal/interface.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/hal/interface.h +cv_cpu_dispatch.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h +intrin.h +- +array +- +cstdint +- +stdint.h +- +stdint.h +- +opencv2/core/fast_math.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/fast_math.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h +cstddef +- +cstring +- +cctype +- +string +- +algorithm +- +utility +- +cstdlib +- +cmath +- +cvstd_wrapper.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp +complex +- +ostream +- +sstream +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h +string +- +memory +- +type_traits +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h +cmath +- +fastmath.h +- +math.h +- +emmintrin.h +- +altivec.h +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h +cstddef +- +stddef.h +- +stdbool.h +- +cstdint +- +stdint.h +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h +msa.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa.h +stdint.h +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp +opencv2/core/matx.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/matx.hpp +opencv2/core/types.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/types.hpp +opencv2/core/bufferpool.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/bufferpool.hpp +type_traits +- +opencv2/core/mat.inl.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/mat.inl.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h +opencv2/core/base.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/base.hpp +opencv2/core/traits.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/traits.hpp +opencv2/core/saturate.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/saturate.hpp +initializer_list +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp +cstdio +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp +cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp +opencv2/core/types.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/types.hpp +opencv2/core/mat.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/mat.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core.hpp +time.h +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h +opencv2/core/fast_math.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/fast_math.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp +climits +- +cfloat +- +vector +- +limits +- +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h +opencv2/core/cvstd.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvstd.hpp +opencv2/core/matx.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/matx.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h +ipl.h +- +ipl/ipl.h +- +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h +assert.h +- +stdlib.h +- +string.h +- +float.h +- +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core.hpp +ostream +- +functional +- +mutex +- +opencv2/core/utils/instrumentation.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/utils/instrumentation.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp +opencv2/core/utility.hpp +- +opencv2/core/utils/tls.hpp +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp +opencv2/core/utility.hpp +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp +opencv2/core/cvdef.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/opencv2/core/cvdef.h +assert.h +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp +opencv2/dnn/dnn.hpp +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp +opencv2/core.hpp +- +map +- +ostream +- +opencv2/dnn/dnn.hpp +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp +vector +- +opencv2/core.hpp +- +opencv2/core/async.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/opencv2/core/async.hpp +../dnn/version.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp +opencv2/dnn/dict.hpp +- +opencv2/dnn/layer.hpp +- +opencv2/dnn/dnn.inl.hpp +- +opencv2/dnn/utils/inference_engine.hpp +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp +opencv2/dnn.hpp +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp +opencv2/dnn.hpp +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp +../dnn.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp +opencv2/opencv_modules.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/opencv_modules.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp +opencv2/flann/miniflann.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/flann/miniflann.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp +opencv2/flann/miniflann.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/flann/miniflann.hpp +opencv2/flann/flann_base.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/flann/flann_base.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +kdtree_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +kdtree_single_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h +kmeans_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h +composite_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h +linear_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h +hierarchical_clustering_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h +lsh_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h +autotuned_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +stdlib.h +- +stdio.h +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h +defines.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h +stdexcept +- +ostream +- +typeinfo +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h +sstream +- +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +ground_truth.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h +index_testing.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h +sampling.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h +kdtree_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +kdtree_single_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h +kmeans_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h +composite_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h +linear_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h +logger.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +kdtree_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +kmeans_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h +config.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +cmath +- +cstdlib +- +string.h +- +stdint.h +- +defines.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h +Intrin.h +- +arm_neon.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/arm_neon.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h +boost/dynamic_bitset.hpp +- +limits.h +- +dist.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp +vector +- +cassert +- +cstdio +- +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +params.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h +saving.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h +all_indices.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/opencv2/core.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h +dist.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +algorithm +- +vector +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h +algorithm +- +map +- +cassert +- +limits +- +cmath +- +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +dist.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +result_set.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +heap.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +allocator.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +random.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +saving.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h +cstring +- +cassert +- +cmath +- +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +result_set.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +logger.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h +timer.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +algorithm +- +map +- +cassert +- +cstring +- +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +dynamic_bitset.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +result_set.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +heap.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +allocator.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +random.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +saving.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h +algorithm +- +map +- +cassert +- +cstring +- +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +result_set.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +heap.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +allocator.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +random.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +saving.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h +algorithm +- +map +- +cassert +- +limits +- +cmath +- +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +dist.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +result_set.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +heap.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +allocator.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +random.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +saving.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h +logger.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h +stdio.h +- +stdarg.h +- +defines.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h +algorithm +- +cassert +- +cstring +- +map +- +vector +- +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +result_set.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +heap.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +lsh_table.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h +allocator.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +random.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +saving.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h +algorithm +- +iostream +- +iomanip +- +limits.h +- +unordered_map +- +map +- +math.h +- +stddef.h +- +dynamic_bitset.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +stdio.h +- +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/opencv2/core.hpp +opencv2/flann/defines.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/opencv2/flann/defines.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +result_set.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +params.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h +any.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +iostream +- +map +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +algorithm +- +cstdlib +- +vector +- +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +algorithm +- +cstring +- +iostream +- +limits +- +set +- +vector +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h +matrix.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +random.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h +cstring +- +vector +- +general.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +nn_index.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h +time.h +- +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/opencv2/core.hpp +opencv2/core/utility.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/opencv2/core/utility.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp +opencv2/imgcodecs.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/imgcodecs.hpp +opencv2/videoio.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/videoio.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h +opencv2/core/core_c.h +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/opencv2/core/core_c.h + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp +float.h +- +map +- +iostream +- +opencv2/ml/ml.inl.hpp +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp +opencv2/objdetect/detection_based_tracker.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/objdetect/detection_based_tracker.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp +opencv2/core.hpp +- +vector +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp +opencv2/opencv_modules.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/opencv_modules.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp +opencv2/calib3d.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/calib3d.hpp +opencv2/features2d.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/features2d.hpp +opencv2/dnn.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/dnn.hpp +opencv2/flann.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/flann.hpp +opencv2/highgui.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/highgui.hpp +opencv2/imgcodecs.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/imgcodecs.hpp +opencv2/imgproc.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/imgproc.hpp +opencv2/ml.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/ml.hpp +opencv2/objdetect.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/objdetect.hpp +opencv2/photo.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/photo.hpp +opencv2/stitching.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/stitching.hpp +opencv2/video.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/video.hpp +opencv2/videoio.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/videoio.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp +opencv2/imgproc.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/imgproc.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp +opencv2/features2d.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/features2d.hpp +opencv2/stitching/warpers.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/stitching/warpers.hpp +opencv2/stitching/detail/matchers.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/stitching/detail/matchers.hpp +opencv2/stitching/detail/motion_estimators.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/stitching/detail/motion_estimators.hpp +opencv2/stitching/detail/exposure_compensate.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/stitching/detail/exposure_compensate.hpp +opencv2/stitching/detail/seam_finders.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/stitching/detail/seam_finders.hpp +opencv2/stitching/detail/blenders.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/stitching/detail/blenders.hpp +opencv2/stitching/detail/camera.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/stitching/detail/camera.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core.hpp +opencv2/core/cuda.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core/cuda.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core.hpp +opencv2/features2d.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/features2d.hpp +opencv2/opencv_modules.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/opencv_modules.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core.hpp +matchers.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp +util.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp +camera.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp +set +- +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core.hpp +opencv2/opencv_modules.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/opencv_modules.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp +list +- +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core.hpp +util_inl.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp +queue +- +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core.hpp +util.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core.hpp +opencv2/core/cuda.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core/cuda.hpp +opencv2/imgproc.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/imgproc.hpp +opencv2/opencv_modules.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/opencv_modules.hpp +warpers_inl.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/opencv2/core.hpp +warpers.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp +limits +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp +opencv2/stitching/detail/warpers.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/opencv2/stitching/detail/warpers.hpp +string +- + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp +opencv2/video/tracking.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/video/tracking.hpp +opencv2/video/background_segm.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/video/background_segm.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/opencv2/core.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/opencv2/core.hpp +opencv2/imgproc.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/opencv2/imgproc.hpp + +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp +opencv2/core.hpp +/home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv2/core.hpp + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_detection.h +atlasutil/atlas_model.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/atlas_model.h +atlasutil/dvpp_process.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/dvpp_process.h +face_recognition_params.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +facial_thread_base.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_mask.h +face_recognition_params.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +iostream +- +string +- +dirent.h +- +memory +- +unistd.h +- +vector +- +stdint.h +- +opencv2/opencv.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/opencv2/opencv.hpp +opencv2/imgproc.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/opencv2/imgproc.hpp +opencv2/core/types_c.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/opencv2/core/types_c.h +atlasutil/atlas_model.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/atlas_model.h +atlasutil/dvpp_process.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/dvpp_process.h +facial_thread_base.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_post_process.h +face_recognition_params.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +vector +- +stdint.h +- +atlasutil/atlas_thread.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/atlas_thread.h +atlasutil/atlas_app.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/atlas_app.h +atlasutil/dvpp_process.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/dvpp_process.h +facial_recognition_message.pb.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h +ascenddk/presenter/agent/presenter_channel.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/ascenddk/presenter/agent/presenter_channel.h +presenter_channels.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/presenter_channels.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition.h +vector +- +atlasutil/atlas_model.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/atlas_model.h +atlasutil/dvpp_process.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/dvpp_process.h +face_recognition_params.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +facial_thread_base.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +iostream +- +mutex +- +unistd.h +- +face_feature_train_mean.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h +face_feature_train_std.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h +atlasutil/atlas_utils.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/atlas_utils.h +opencv2/opencv.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/opencv2/opencv.hpp +opencv2/opencv.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/opencv2/opencv.hpp +opencv2/imgproc.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/opencv2/imgproc.hpp +opencv2/core/types_c.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/opencv2/core/types_c.h +opencv2/imgproc/types_c.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/opencv2/imgproc/types_c.h +opencv2/core/core.hpp +- + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_register.h +iostream +- +string +- +dirent.h +- +memory +- +unistd.h +- +vector +- +stdint.h +- +atlasutil/dvpp_process.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/dvpp_process.h +face_recognition_params.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +facial_thread_base.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h +presenter_channels.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/presenter_channels.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h +limits +- +string +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- +google/protobuf/io/coded_stream.h +- +google/protobuf/arena.h +- +google/protobuf/arenastring.h +- +google/protobuf/generated_message_table_driven.h +- +google/protobuf/generated_message_util.h +- +google/protobuf/inlined_string_field.h +- +google/protobuf/metadata.h +- +google/protobuf/generated_message_reflection.h +- +google/protobuf/message.h +- +google/protobuf/repeated_field.h +- +google/protobuf/extension_set.h +- +google/protobuf/generated_enum_reflection.h +- +google/protobuf/unknown_field_set.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h +iostream +- +string +- +vector +- +stdint.h +- +stdio.h +- +atlasutil/atlas_thread.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/atlas_thread.h +atlasutil/atlas_app.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/atlas_app.h +atlasutil/atlas_utils.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/atlas_utils.h +atlasutil/parse_config.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/parse_config.h +face_recognition_params.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/mind_camera.h +string +- +memory +- +atlasutil/atlas_videocapture.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/atlasutil/atlas_videocapture.h +face_recognition_params.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +facial_thread_base.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/presenter_channels.h +facial_recognition_message.pb.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h +mutex +- +string +- +cstdint +- +fstream +- +iostream +- +ascenddk/presenter/agent/presenter_types.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/ascenddk/presenter/agent/presenter_types.h +ascenddk/presenter/agent/channel.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/ascenddk/presenter/agent/channel.h +ascenddk/presenter/agent/presenter_channel.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/ascenddk/presenter/agent/presenter_channel.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.cpp +vector +- +sstream +- +unistd.h +- +fstream +- +face_detection.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.cpp +memory +- +fstream +- +sstream +- +stdio.h +- +string.h +- +cstring +- +opencv2/opencv.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/opencv.hpp +opencv2/imgproc.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/imgproc.hpp +opencv2/core/types_c.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/core/types_c.h +opencv2/imgproc/types_c.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/imgproc/types_c.h +face_feature_mask.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.h +face_feature_train_mean.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_train_mean.h +face_feature_train_std.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_train_std.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.cpp +face_post_process.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.h +memory +- +fstream +- +sstream +- +cstdio +- +cstring +- +string +- +atlasutil/parse_config.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/atlasutil/parse_config.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.cpp +face_recognition.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.h +cstdint +- +unistd.h +- +memory +- +sstream +- +opencv2/opencv.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/opencv.hpp +opencv2/imgproc.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/imgproc.hpp +opencv2/video.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/video.hpp +opencv2/video/tracking.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/video/tracking.hpp +opencv2/core/types_c.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/core/types_c.h +opencv2/imgproc/types_c.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/imgproc/types_c.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.cpp +face_register.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.h +memory +- +fstream +- +sstream +- +stdio.h +- +string.h +- +cmath +- +regex +- +iostream +- +opencv2/opencv.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/opencv.hpp +opencv2/imgproc.hpp +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/imgproc.hpp +opencv2/core/types_c.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/core/types_c.h +opencv2/imgproc/types_c.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/opencv2/imgproc/types_c.h +opencv2/core/core.hpp +- +face_recognition_params.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition_params.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.pb.cc +facial_recognition_message.pb.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.pb.h +algorithm +- +google/protobuf/stubs/common.h +- +google/protobuf/io/coded_stream.h +- +google/protobuf/extension_set.h +- +google/protobuf/wire_format_lite.h +- +google/protobuf/descriptor.h +- +google/protobuf/generated_message_reflection.h +- +google/protobuf/reflection_ops.h +- +google/protobuf/wire_format.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/main.cpp +iostream +- +stdlib.h +- +dirent.h +- +thread +- +time.h +- +fstream +- +atlasutil/acl_device.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/atlasutil/acl_device.h +atlasutil/atlas_app.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/atlasutil/atlas_app.h +atlasutil/atlas_thread.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/atlasutil/atlas_thread.h +atlasutil/atlas_type.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/atlasutil/atlas_type.h +atlasutil/atlas_error.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/atlasutil/atlas_error.h +face_detection.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.h +face_feature_mask.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.h +face_recognition.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.h +face_post_process.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.h +face_register.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.h +mind_camera.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.h + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.cpp +mind_camera.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.h +memory +- +iostream +- +fstream +- +sstream +- +cstdio +- +stdlib.h +- +string.h +- +time.h +- +cstring +- +chrono +- +atlasutil/parse_config.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/atlasutil/parse_config.h +atlasutil/atlas_app.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/atlasutil/atlas_app.h +driver/peripheral_api.h +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/driver/peripheral_api.h + +/usr/local/include/google/protobuf/arena.h +limits +- +type_traits +- +utility +- +exception +- +typeinfo +- +typeinfo +- +google/protobuf/arena_impl.h +- +google/protobuf/port.h +- +type_traits +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/arena_impl.h +atomic +- +limits +- +google/protobuf/stubs/common.h +- +google/protobuf/stubs/logging.h +- +sanitizer/asan_interface.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/arenastring.h +string +- +google/protobuf/arena.h +- +google/protobuf/stubs/common.h +- +google/protobuf/stubs/fastmem.h +- +google/protobuf/stubs/logging.h +- +google/protobuf/stubs/port.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/descriptor.h +memory +- +set +- +string +- +vector +- +google/protobuf/stubs/common.h +- +google/protobuf/stubs/mutex.h +- +google/protobuf/stubs/once.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/extension_set.h +algorithm +- +cassert +- +map +- +string +- +utility +- +vector +- +google/protobuf/stubs/common.h +- +google/protobuf/stubs/logging.h +- +google/protobuf/parse_context.h +- +google/protobuf/io/coded_stream.h +- +google/protobuf/port.h +- +google/protobuf/repeated_field.h +- +google/protobuf/wire_format_lite.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/generated_enum_reflection.h +string +- +google/protobuf/generated_enum_util.h +- +google/protobuf/port.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/generated_enum_util.h +type_traits +- + +/usr/local/include/google/protobuf/generated_message_reflection.h +string +- +vector +- +google/protobuf/stubs/casts.h +- +google/protobuf/stubs/common.h +- +google/protobuf/generated_enum_reflection.h +- +google/protobuf/message.h +- +google/protobuf/metadata.h +- +google/protobuf/stubs/once.h +- +google/protobuf/port.h +- +google/protobuf/unknown_field_set.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/generated_message_table_driven.h +google/protobuf/map.h +- +google/protobuf/map_entry_lite.h +- +google/protobuf/map_field_lite.h +- +google/protobuf/message_lite.h +- +google/protobuf/wire_format_lite.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/generated_message_util.h +assert.h +- +atomic +- +climits +- +string +- +vector +- +google/protobuf/stubs/common.h +- +google/protobuf/has_bits.h +- +google/protobuf/implicit_weak_message.h +- +google/protobuf/message_lite.h +- +google/protobuf/stubs/once.h +- +google/protobuf/port.h +- +google/protobuf/wire_format_lite.h +- +google/protobuf/stubs/strutil.h +- +google/protobuf/stubs/casts.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/has_bits.h +google/protobuf/stubs/common.h +- +google/protobuf/port.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/implicit_weak_message.h +string +- +google/protobuf/io/coded_stream.h +- +google/protobuf/arena.h +- +google/protobuf/message_lite.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/inlined_string_field.h +string +- +utility +- +google/protobuf/port.h +- +google/protobuf/stubs/stringpiece.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/io/coded_stream.h +assert.h +- +atomic +- +climits +- +string +- +utility +- +sys/param.h +- +google/protobuf/stubs/common.h +- +google/protobuf/port.h +- +google/protobuf/stubs/port.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/io/zero_copy_stream.h +string +- +google/protobuf/stubs/common.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/map.h +initializer_list +- +iterator +- +limits +- +set +- +utility +- +google/protobuf/stubs/common.h +- +google/protobuf/arena.h +- +google/protobuf/generated_enum_util.h +- +google/protobuf/map_type_handler.h +- +google/protobuf/stubs/hash.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/map_entry_lite.h +assert.h +- +string +- +google/protobuf/stubs/casts.h +- +google/protobuf/parse_context.h +- +google/protobuf/io/coded_stream.h +- +google/protobuf/arena.h +- +google/protobuf/arenastring.h +- +google/protobuf/generated_message_util.h +- +google/protobuf/map.h +- +google/protobuf/map_type_handler.h +- +google/protobuf/port.h +- +google/protobuf/wire_format_lite.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/map_field_lite.h +type_traits +- +google/protobuf/parse_context.h +- +google/protobuf/io/coded_stream.h +- +google/protobuf/map.h +- +google/protobuf/map_entry_lite.h +- +google/protobuf/port.h +- +google/protobuf/wire_format_lite.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/map_type_handler.h +google/protobuf/parse_context.h +- +google/protobuf/io/coded_stream.h +- +google/protobuf/arena.h +- +google/protobuf/wire_format_lite.h +- + +/usr/local/include/google/protobuf/message.h +iosfwd +- +string +- +type_traits +- +vector +- +google/protobuf/stubs/casts.h +- +google/protobuf/stubs/common.h +- +google/protobuf/arena.h +- +google/protobuf/descriptor.h +- +google/protobuf/message_lite.h +- +google/protobuf/port.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/message_lite.h +climits +- +string +- +google/protobuf/stubs/common.h +- +google/protobuf/stubs/logging.h +- +google/protobuf/arena.h +- +google/protobuf/stubs/once.h +- +google/protobuf/port.h +- +google/protobuf/stubs/strutil.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/metadata.h +google/protobuf/metadata_lite.h +- +google/protobuf/unknown_field_set.h +- + +/usr/local/include/google/protobuf/metadata_lite.h +string +- +google/protobuf/stubs/common.h +- +google/protobuf/arena.h +- +google/protobuf/generated_message_util.h +- +google/protobuf/message_lite.h +- +google/protobuf/port.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/parse_context.h +cstring +- +string +- +google/protobuf/io/coded_stream.h +- +google/protobuf/io/zero_copy_stream.h +- +google/protobuf/arenastring.h +- +google/protobuf/implicit_weak_message.h +- +google/protobuf/metadata_lite.h +- +google/protobuf/port.h +- +google/protobuf/repeated_field.h +- +google/protobuf/wire_format_lite.h +- +google/protobuf/stubs/strutil.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/port.h +google/protobuf/stubs/port.h +- + +/usr/local/include/google/protobuf/port_def.inc + +/usr/local/include/google/protobuf/port_undef.inc + +/usr/local/include/google/protobuf/reflection_ops.h +google/protobuf/stubs/common.h +- +google/protobuf/message.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/repeated_field.h +utility +- +algorithm +- +iterator +- +limits +- +string +- +type_traits +- +google/protobuf/stubs/logging.h +- +google/protobuf/stubs/common.h +- +google/protobuf/arena.h +- +google/protobuf/implicit_weak_message.h +- +google/protobuf/message_lite.h +- +google/protobuf/port.h +- +google/protobuf/stubs/casts.h +- +type_traits +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/stubs/casts.h +type_traits +- +google/protobuf/stubs/common.h +- + +/usr/local/include/google/protobuf/stubs/common.h +algorithm +- +iostream +- +map +- +memory +- +set +- +string +- +vector +- +google/protobuf/stubs/port.h +- +google/protobuf/stubs/macros.h +- +google/protobuf/stubs/platform_macros.h +- +exception +- +TargetConditionals.h +- +pthread.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/stubs/fastmem.h +stddef.h +- +stdio.h +- +string.h +- +google/protobuf/stubs/common.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/stubs/hash.h +string.h +- +google/protobuf/stubs/common.h +- +unordered_map +- +unordered_set +- + +/usr/local/include/google/protobuf/stubs/logging.h +google/protobuf/stubs/macros.h +- +google/protobuf/stubs/port.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/stubs/macros.h +google/protobuf/stubs/port.h +- + +/usr/local/include/google/protobuf/stubs/mutex.h +mutex +- +windows.h +- +google/protobuf/stubs/macros.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/stubs/once.h +mutex +- +utility +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/stubs/platform_macros.h +Availability.h +- +TargetConditionals.h +- + +/usr/local/include/google/protobuf/stubs/port.h +assert.h +- +stdlib.h +- +cstddef +- +string +- +string.h +- +inttypes.h +- +stdint.h +- +google/protobuf/stubs/platform_macros.h +- +google/protobuf/port_def.inc +- +sys/param.h +- +endian.h +- +stdlib.h +- +intrin.h +- +libkern/OSByteOrder.h +- +byteswap.h +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/stubs/stringpiece.h +assert.h +- +stddef.h +- +string.h +- +iosfwd +- +limits +- +string +- +google/protobuf/stubs/common.h +- +google/protobuf/stubs/hash.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/stubs/strutil.h +stdlib.h +- +vector +- +google/protobuf/stubs/common.h +- +google/protobuf/stubs/stringpiece.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/unknown_field_set.h +assert.h +- +string +- +vector +- +google/protobuf/stubs/common.h +- +google/protobuf/stubs/logging.h +- +google/protobuf/parse_context.h +- +google/protobuf/io/coded_stream.h +- +google/protobuf/message_lite.h +- +google/protobuf/port.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/wire_format.h +string +- +google/protobuf/stubs/common.h +- +google/protobuf/descriptor.h +- +google/protobuf/message.h +- +google/protobuf/wire_format_lite.h +- +google/protobuf/stubs/casts.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + +/usr/local/include/google/protobuf/wire_format_lite.h +string +- +google/protobuf/stubs/common.h +- +google/protobuf/stubs/logging.h +- +google/protobuf/io/coded_stream.h +- +google/protobuf/arenastring.h +- +google/protobuf/message_lite.h +- +google/protobuf/port.h +- +google/protobuf/repeated_field.h +- +google/protobuf/port_def.inc +- +google/protobuf/port_undef.inc +- + diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/DependInfo.cmake b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/DependInfo.cmake new file mode 100644 index 0000000..f28bfab --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/DependInfo.cmake @@ -0,0 +1,41 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.cpp" "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_detection.cpp.o" + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.cpp" "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_feature_mask.cpp.o" + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.cpp" "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_post_process.cpp.o" + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.cpp" "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_recognition.cpp.o" + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.cpp" "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_register.cpp.o" + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.pb.cc" "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/facial_recognition_message.pb.cc.o" + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/main.cpp" "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/main.cpp.o" + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.cpp" "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/mind_camera.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "ENABLE_BOARD_CAMARE" + "ENABLE_DVPP_INTERFACE" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc" + "/home/ascend/ascend_ddk/arm/include/opencv4" + "/home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include" + "/home/ascend/ascend_ddk/arm/include" + "/home/ascend/ascend_ddk/arm/include/ascenddk" + "/home/ascend/Ascend" + "/home/ascend/Ascend/ascenddk" + "/usr/local/include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/build.make b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/build.make new file mode 100644 index 0000000..81ff78a --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/build.make @@ -0,0 +1,302 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host + +# Include any dependencies generated for this target. +include CMakeFiles/main.dir/depend.make + +# Include the progress variables for this target. +include CMakeFiles/main.dir/progress.make + +# Include the compile flags for this target's objects. +include CMakeFiles/main.dir/flags.make + +CMakeFiles/main.dir/mind_camera.cpp.o: CMakeFiles/main.dir/flags.make +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/main.dir/mind_camera.cpp.o" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/main.dir/mind_camera.cpp.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.cpp + +CMakeFiles/main.dir/mind_camera.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/main.dir/mind_camera.cpp.i" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.cpp > CMakeFiles/main.dir/mind_camera.cpp.i + +CMakeFiles/main.dir/mind_camera.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/mind_camera.cpp.s" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.cpp -o CMakeFiles/main.dir/mind_camera.cpp.s + +CMakeFiles/main.dir/mind_camera.cpp.o.requires: + +.PHONY : CMakeFiles/main.dir/mind_camera.cpp.o.requires + +CMakeFiles/main.dir/mind_camera.cpp.o.provides: CMakeFiles/main.dir/mind_camera.cpp.o.requires + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/mind_camera.cpp.o.provides.build +.PHONY : CMakeFiles/main.dir/mind_camera.cpp.o.provides + +CMakeFiles/main.dir/mind_camera.cpp.o.provides.build: CMakeFiles/main.dir/mind_camera.cpp.o + + +CMakeFiles/main.dir/face_register.cpp.o: CMakeFiles/main.dir/flags.make +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/main.dir/face_register.cpp.o" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/main.dir/face_register.cpp.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.cpp + +CMakeFiles/main.dir/face_register.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/main.dir/face_register.cpp.i" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.cpp > CMakeFiles/main.dir/face_register.cpp.i + +CMakeFiles/main.dir/face_register.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/face_register.cpp.s" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.cpp -o CMakeFiles/main.dir/face_register.cpp.s + +CMakeFiles/main.dir/face_register.cpp.o.requires: + +.PHONY : CMakeFiles/main.dir/face_register.cpp.o.requires + +CMakeFiles/main.dir/face_register.cpp.o.provides: CMakeFiles/main.dir/face_register.cpp.o.requires + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/face_register.cpp.o.provides.build +.PHONY : CMakeFiles/main.dir/face_register.cpp.o.provides + +CMakeFiles/main.dir/face_register.cpp.o.provides.build: CMakeFiles/main.dir/face_register.cpp.o + + +CMakeFiles/main.dir/face_detection.cpp.o: CMakeFiles/main.dir/flags.make +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object CMakeFiles/main.dir/face_detection.cpp.o" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/main.dir/face_detection.cpp.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.cpp + +CMakeFiles/main.dir/face_detection.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/main.dir/face_detection.cpp.i" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.cpp > CMakeFiles/main.dir/face_detection.cpp.i + +CMakeFiles/main.dir/face_detection.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/face_detection.cpp.s" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.cpp -o CMakeFiles/main.dir/face_detection.cpp.s + +CMakeFiles/main.dir/face_detection.cpp.o.requires: + +.PHONY : CMakeFiles/main.dir/face_detection.cpp.o.requires + +CMakeFiles/main.dir/face_detection.cpp.o.provides: CMakeFiles/main.dir/face_detection.cpp.o.requires + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/face_detection.cpp.o.provides.build +.PHONY : CMakeFiles/main.dir/face_detection.cpp.o.provides + +CMakeFiles/main.dir/face_detection.cpp.o.provides.build: CMakeFiles/main.dir/face_detection.cpp.o + + +CMakeFiles/main.dir/face_feature_mask.cpp.o: CMakeFiles/main.dir/flags.make +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object CMakeFiles/main.dir/face_feature_mask.cpp.o" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/main.dir/face_feature_mask.cpp.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.cpp + +CMakeFiles/main.dir/face_feature_mask.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/main.dir/face_feature_mask.cpp.i" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.cpp > CMakeFiles/main.dir/face_feature_mask.cpp.i + +CMakeFiles/main.dir/face_feature_mask.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/face_feature_mask.cpp.s" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.cpp -o CMakeFiles/main.dir/face_feature_mask.cpp.s + +CMakeFiles/main.dir/face_feature_mask.cpp.o.requires: + +.PHONY : CMakeFiles/main.dir/face_feature_mask.cpp.o.requires + +CMakeFiles/main.dir/face_feature_mask.cpp.o.provides: CMakeFiles/main.dir/face_feature_mask.cpp.o.requires + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/face_feature_mask.cpp.o.provides.build +.PHONY : CMakeFiles/main.dir/face_feature_mask.cpp.o.provides + +CMakeFiles/main.dir/face_feature_mask.cpp.o.provides.build: CMakeFiles/main.dir/face_feature_mask.cpp.o + + +CMakeFiles/main.dir/face_recognition.cpp.o: CMakeFiles/main.dir/flags.make +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object CMakeFiles/main.dir/face_recognition.cpp.o" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/main.dir/face_recognition.cpp.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.cpp + +CMakeFiles/main.dir/face_recognition.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/main.dir/face_recognition.cpp.i" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.cpp > CMakeFiles/main.dir/face_recognition.cpp.i + +CMakeFiles/main.dir/face_recognition.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/face_recognition.cpp.s" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.cpp -o CMakeFiles/main.dir/face_recognition.cpp.s + +CMakeFiles/main.dir/face_recognition.cpp.o.requires: + +.PHONY : CMakeFiles/main.dir/face_recognition.cpp.o.requires + +CMakeFiles/main.dir/face_recognition.cpp.o.provides: CMakeFiles/main.dir/face_recognition.cpp.o.requires + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/face_recognition.cpp.o.provides.build +.PHONY : CMakeFiles/main.dir/face_recognition.cpp.o.provides + +CMakeFiles/main.dir/face_recognition.cpp.o.provides.build: CMakeFiles/main.dir/face_recognition.cpp.o + + +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: CMakeFiles/main.dir/flags.make +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.pb.cc + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object CMakeFiles/main.dir/facial_recognition_message.pb.cc.o" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/main.dir/facial_recognition_message.pb.cc.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.pb.cc + +CMakeFiles/main.dir/facial_recognition_message.pb.cc.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/main.dir/facial_recognition_message.pb.cc.i" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.pb.cc > CMakeFiles/main.dir/facial_recognition_message.pb.cc.i + +CMakeFiles/main.dir/facial_recognition_message.pb.cc.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/facial_recognition_message.pb.cc.s" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.pb.cc -o CMakeFiles/main.dir/facial_recognition_message.pb.cc.s + +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o.requires: + +.PHONY : CMakeFiles/main.dir/facial_recognition_message.pb.cc.o.requires + +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o.provides: CMakeFiles/main.dir/facial_recognition_message.pb.cc.o.requires + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/facial_recognition_message.pb.cc.o.provides.build +.PHONY : CMakeFiles/main.dir/facial_recognition_message.pb.cc.o.provides + +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o.provides.build: CMakeFiles/main.dir/facial_recognition_message.pb.cc.o + + +CMakeFiles/main.dir/face_post_process.cpp.o: CMakeFiles/main.dir/flags.make +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object CMakeFiles/main.dir/face_post_process.cpp.o" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/main.dir/face_post_process.cpp.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.cpp + +CMakeFiles/main.dir/face_post_process.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/main.dir/face_post_process.cpp.i" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.cpp > CMakeFiles/main.dir/face_post_process.cpp.i + +CMakeFiles/main.dir/face_post_process.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/face_post_process.cpp.s" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.cpp -o CMakeFiles/main.dir/face_post_process.cpp.s + +CMakeFiles/main.dir/face_post_process.cpp.o.requires: + +.PHONY : CMakeFiles/main.dir/face_post_process.cpp.o.requires + +CMakeFiles/main.dir/face_post_process.cpp.o.provides: CMakeFiles/main.dir/face_post_process.cpp.o.requires + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/face_post_process.cpp.o.provides.build +.PHONY : CMakeFiles/main.dir/face_post_process.cpp.o.provides + +CMakeFiles/main.dir/face_post_process.cpp.o.provides.build: CMakeFiles/main.dir/face_post_process.cpp.o + + +CMakeFiles/main.dir/main.cpp.o: CMakeFiles/main.dir/flags.make +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/main.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object CMakeFiles/main.dir/main.cpp.o" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/main.dir/main.cpp.o -c /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/main.cpp + +CMakeFiles/main.dir/main.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/main.dir/main.cpp.i" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/main.cpp > CMakeFiles/main.dir/main.cpp.i + +CMakeFiles/main.dir/main.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/main.dir/main.cpp.s" + /usr/bin/aarch64-linux-gnu-g++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/main.cpp -o CMakeFiles/main.dir/main.cpp.s + +CMakeFiles/main.dir/main.cpp.o.requires: + +.PHONY : CMakeFiles/main.dir/main.cpp.o.requires + +CMakeFiles/main.dir/main.cpp.o.provides: CMakeFiles/main.dir/main.cpp.o.requires + $(MAKE) -f CMakeFiles/main.dir/build.make CMakeFiles/main.dir/main.cpp.o.provides.build +.PHONY : CMakeFiles/main.dir/main.cpp.o.provides + +CMakeFiles/main.dir/main.cpp.o.provides.build: CMakeFiles/main.dir/main.cpp.o + + +# Object files for target main +main_OBJECTS = \ +"CMakeFiles/main.dir/mind_camera.cpp.o" \ +"CMakeFiles/main.dir/face_register.cpp.o" \ +"CMakeFiles/main.dir/face_detection.cpp.o" \ +"CMakeFiles/main.dir/face_feature_mask.cpp.o" \ +"CMakeFiles/main.dir/face_recognition.cpp.o" \ +"CMakeFiles/main.dir/facial_recognition_message.pb.cc.o" \ +"CMakeFiles/main.dir/face_post_process.cpp.o" \ +"CMakeFiles/main.dir/main.cpp.o" + +# External object files for target main +main_EXTERNAL_OBJECTS = + +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main: CMakeFiles/main.dir/mind_camera.cpp.o +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main: CMakeFiles/main.dir/face_register.cpp.o +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main: CMakeFiles/main.dir/face_detection.cpp.o +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main: CMakeFiles/main.dir/face_feature_mask.cpp.o +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main: CMakeFiles/main.dir/face_recognition.cpp.o +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main: CMakeFiles/main.dir/facial_recognition_message.pb.cc.o +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main: CMakeFiles/main.dir/face_post_process.cpp.o +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main: CMakeFiles/main.dir/main.cpp.o +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main: CMakeFiles/main.dir/build.make +/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main: CMakeFiles/main.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Linking CXX executable /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main" + $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/main.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +CMakeFiles/main.dir/build: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main + +.PHONY : CMakeFiles/main.dir/build + +CMakeFiles/main.dir/requires: CMakeFiles/main.dir/mind_camera.cpp.o.requires +CMakeFiles/main.dir/requires: CMakeFiles/main.dir/face_register.cpp.o.requires +CMakeFiles/main.dir/requires: CMakeFiles/main.dir/face_detection.cpp.o.requires +CMakeFiles/main.dir/requires: CMakeFiles/main.dir/face_feature_mask.cpp.o.requires +CMakeFiles/main.dir/requires: CMakeFiles/main.dir/face_recognition.cpp.o.requires +CMakeFiles/main.dir/requires: CMakeFiles/main.dir/facial_recognition_message.pb.cc.o.requires +CMakeFiles/main.dir/requires: CMakeFiles/main.dir/face_post_process.cpp.o.requires +CMakeFiles/main.dir/requires: CMakeFiles/main.dir/main.cpp.o.requires + +.PHONY : CMakeFiles/main.dir/requires + +CMakeFiles/main.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/main.dir/cmake_clean.cmake +.PHONY : CMakeFiles/main.dir/clean + +CMakeFiles/main.dir/depend: + cd /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/main.dir/depend + diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/cmake_clean.cmake b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/cmake_clean.cmake new file mode 100644 index 0000000..6b28e70 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/cmake_clean.cmake @@ -0,0 +1,17 @@ +file(REMOVE_RECURSE + "CMakeFiles/main.dir/mind_camera.cpp.o" + "CMakeFiles/main.dir/face_register.cpp.o" + "CMakeFiles/main.dir/face_detection.cpp.o" + "CMakeFiles/main.dir/face_feature_mask.cpp.o" + "CMakeFiles/main.dir/face_recognition.cpp.o" + "CMakeFiles/main.dir/facial_recognition_message.pb.cc.o" + "CMakeFiles/main.dir/face_post_process.cpp.o" + "CMakeFiles/main.dir/main.cpp.o" + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main.pdb" + "/home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/out/main" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/main.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/depend.internal b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/depend.internal new file mode 100644 index 0000000..55f6c5e --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/depend.internal @@ -0,0 +1,1096 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +CMakeFiles/main.dir/face_detection.cpp.o + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_model.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h + /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h + /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h + /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_detection.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.cpp +CMakeFiles/main.dir/face_feature_mask.cpp.o + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_model.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h + /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h + /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h + /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_mask.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.cpp +CMakeFiles/main.dir/face_post_process.cpp.o + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/channel.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/errors.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_channel.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_types.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h + /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h + /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h + /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_post_process.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/presenter_channels.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.cpp + /usr/local/include/google/protobuf/arena.h + /usr/local/include/google/protobuf/arena_impl.h + /usr/local/include/google/protobuf/arenastring.h + /usr/local/include/google/protobuf/descriptor.h + /usr/local/include/google/protobuf/extension_set.h + /usr/local/include/google/protobuf/generated_enum_reflection.h + /usr/local/include/google/protobuf/generated_enum_util.h + /usr/local/include/google/protobuf/generated_message_reflection.h + /usr/local/include/google/protobuf/generated_message_table_driven.h + /usr/local/include/google/protobuf/generated_message_util.h + /usr/local/include/google/protobuf/has_bits.h + /usr/local/include/google/protobuf/implicit_weak_message.h + /usr/local/include/google/protobuf/inlined_string_field.h + /usr/local/include/google/protobuf/io/coded_stream.h + /usr/local/include/google/protobuf/io/zero_copy_stream.h + /usr/local/include/google/protobuf/map.h + /usr/local/include/google/protobuf/map_entry_lite.h + /usr/local/include/google/protobuf/map_field_lite.h + /usr/local/include/google/protobuf/map_type_handler.h + /usr/local/include/google/protobuf/message.h + /usr/local/include/google/protobuf/message_lite.h + /usr/local/include/google/protobuf/metadata.h + /usr/local/include/google/protobuf/metadata_lite.h + /usr/local/include/google/protobuf/parse_context.h + /usr/local/include/google/protobuf/port.h + /usr/local/include/google/protobuf/port_def.inc + /usr/local/include/google/protobuf/port_undef.inc + /usr/local/include/google/protobuf/repeated_field.h + /usr/local/include/google/protobuf/stubs/casts.h + /usr/local/include/google/protobuf/stubs/common.h + /usr/local/include/google/protobuf/stubs/fastmem.h + /usr/local/include/google/protobuf/stubs/hash.h + /usr/local/include/google/protobuf/stubs/logging.h + /usr/local/include/google/protobuf/stubs/macros.h + /usr/local/include/google/protobuf/stubs/mutex.h + /usr/local/include/google/protobuf/stubs/once.h + /usr/local/include/google/protobuf/stubs/platform_macros.h + /usr/local/include/google/protobuf/stubs/port.h + /usr/local/include/google/protobuf/stubs/stringpiece.h + /usr/local/include/google/protobuf/stubs/strutil.h + /usr/local/include/google/protobuf/unknown_field_set.h + /usr/local/include/google/protobuf/wire_format_lite.h +CMakeFiles/main.dir/face_recognition.cpp.o + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_model.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h + /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h + /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h + /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.cpp +CMakeFiles/main.dir/face_register.cpp.o + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/channel.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/errors.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_channel.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_types.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h + /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h + /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h + /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_register.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/presenter_channels.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.cpp + /usr/local/include/google/protobuf/arena.h + /usr/local/include/google/protobuf/arena_impl.h + /usr/local/include/google/protobuf/arenastring.h + /usr/local/include/google/protobuf/descriptor.h + /usr/local/include/google/protobuf/extension_set.h + /usr/local/include/google/protobuf/generated_enum_reflection.h + /usr/local/include/google/protobuf/generated_enum_util.h + /usr/local/include/google/protobuf/generated_message_reflection.h + /usr/local/include/google/protobuf/generated_message_table_driven.h + /usr/local/include/google/protobuf/generated_message_util.h + /usr/local/include/google/protobuf/has_bits.h + /usr/local/include/google/protobuf/implicit_weak_message.h + /usr/local/include/google/protobuf/inlined_string_field.h + /usr/local/include/google/protobuf/io/coded_stream.h + /usr/local/include/google/protobuf/io/zero_copy_stream.h + /usr/local/include/google/protobuf/map.h + /usr/local/include/google/protobuf/map_entry_lite.h + /usr/local/include/google/protobuf/map_field_lite.h + /usr/local/include/google/protobuf/map_type_handler.h + /usr/local/include/google/protobuf/message.h + /usr/local/include/google/protobuf/message_lite.h + /usr/local/include/google/protobuf/metadata.h + /usr/local/include/google/protobuf/metadata_lite.h + /usr/local/include/google/protobuf/parse_context.h + /usr/local/include/google/protobuf/port.h + /usr/local/include/google/protobuf/port_def.inc + /usr/local/include/google/protobuf/port_undef.inc + /usr/local/include/google/protobuf/repeated_field.h + /usr/local/include/google/protobuf/stubs/casts.h + /usr/local/include/google/protobuf/stubs/common.h + /usr/local/include/google/protobuf/stubs/fastmem.h + /usr/local/include/google/protobuf/stubs/hash.h + /usr/local/include/google/protobuf/stubs/logging.h + /usr/local/include/google/protobuf/stubs/macros.h + /usr/local/include/google/protobuf/stubs/mutex.h + /usr/local/include/google/protobuf/stubs/once.h + /usr/local/include/google/protobuf/stubs/platform_macros.h + /usr/local/include/google/protobuf/stubs/port.h + /usr/local/include/google/protobuf/stubs/stringpiece.h + /usr/local/include/google/protobuf/stubs/strutil.h + /usr/local/include/google/protobuf/unknown_field_set.h + /usr/local/include/google/protobuf/wire_format_lite.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.pb.cc + /usr/local/include/google/protobuf/arena.h + /usr/local/include/google/protobuf/arena_impl.h + /usr/local/include/google/protobuf/arenastring.h + /usr/local/include/google/protobuf/descriptor.h + /usr/local/include/google/protobuf/extension_set.h + /usr/local/include/google/protobuf/generated_enum_reflection.h + /usr/local/include/google/protobuf/generated_enum_util.h + /usr/local/include/google/protobuf/generated_message_reflection.h + /usr/local/include/google/protobuf/generated_message_table_driven.h + /usr/local/include/google/protobuf/generated_message_util.h + /usr/local/include/google/protobuf/has_bits.h + /usr/local/include/google/protobuf/implicit_weak_message.h + /usr/local/include/google/protobuf/inlined_string_field.h + /usr/local/include/google/protobuf/io/coded_stream.h + /usr/local/include/google/protobuf/io/zero_copy_stream.h + /usr/local/include/google/protobuf/map.h + /usr/local/include/google/protobuf/map_entry_lite.h + /usr/local/include/google/protobuf/map_field_lite.h + /usr/local/include/google/protobuf/map_type_handler.h + /usr/local/include/google/protobuf/message.h + /usr/local/include/google/protobuf/message_lite.h + /usr/local/include/google/protobuf/metadata.h + /usr/local/include/google/protobuf/metadata_lite.h + /usr/local/include/google/protobuf/parse_context.h + /usr/local/include/google/protobuf/port.h + /usr/local/include/google/protobuf/port_def.inc + /usr/local/include/google/protobuf/port_undef.inc + /usr/local/include/google/protobuf/reflection_ops.h + /usr/local/include/google/protobuf/repeated_field.h + /usr/local/include/google/protobuf/stubs/casts.h + /usr/local/include/google/protobuf/stubs/common.h + /usr/local/include/google/protobuf/stubs/fastmem.h + /usr/local/include/google/protobuf/stubs/hash.h + /usr/local/include/google/protobuf/stubs/logging.h + /usr/local/include/google/protobuf/stubs/macros.h + /usr/local/include/google/protobuf/stubs/mutex.h + /usr/local/include/google/protobuf/stubs/once.h + /usr/local/include/google/protobuf/stubs/platform_macros.h + /usr/local/include/google/protobuf/stubs/port.h + /usr/local/include/google/protobuf/stubs/stringpiece.h + /usr/local/include/google/protobuf/stubs/strutil.h + /usr/local/include/google/protobuf/unknown_field_set.h + /usr/local/include/google/protobuf/wire_format.h + /usr/local/include/google/protobuf/wire_format_lite.h +CMakeFiles/main.dir/main.cpp.o + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/channel.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/errors.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_channel.h + /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_types.h + /home/ascend/ascend_ddk/arm/include/atlasutil/acl_device.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_model.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocap_base.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocapture.h + /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h + /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h + /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_detection.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_mask.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_post_process.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_register.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/mind_camera.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/presenter_channels.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/main.cpp + /usr/local/include/google/protobuf/arena.h + /usr/local/include/google/protobuf/arena_impl.h + /usr/local/include/google/protobuf/arenastring.h + /usr/local/include/google/protobuf/descriptor.h + /usr/local/include/google/protobuf/extension_set.h + /usr/local/include/google/protobuf/generated_enum_reflection.h + /usr/local/include/google/protobuf/generated_enum_util.h + /usr/local/include/google/protobuf/generated_message_reflection.h + /usr/local/include/google/protobuf/generated_message_table_driven.h + /usr/local/include/google/protobuf/generated_message_util.h + /usr/local/include/google/protobuf/has_bits.h + /usr/local/include/google/protobuf/implicit_weak_message.h + /usr/local/include/google/protobuf/inlined_string_field.h + /usr/local/include/google/protobuf/io/coded_stream.h + /usr/local/include/google/protobuf/io/zero_copy_stream.h + /usr/local/include/google/protobuf/map.h + /usr/local/include/google/protobuf/map_entry_lite.h + /usr/local/include/google/protobuf/map_field_lite.h + /usr/local/include/google/protobuf/map_type_handler.h + /usr/local/include/google/protobuf/message.h + /usr/local/include/google/protobuf/message_lite.h + /usr/local/include/google/protobuf/metadata.h + /usr/local/include/google/protobuf/metadata_lite.h + /usr/local/include/google/protobuf/parse_context.h + /usr/local/include/google/protobuf/port.h + /usr/local/include/google/protobuf/port_def.inc + /usr/local/include/google/protobuf/port_undef.inc + /usr/local/include/google/protobuf/repeated_field.h + /usr/local/include/google/protobuf/stubs/casts.h + /usr/local/include/google/protobuf/stubs/common.h + /usr/local/include/google/protobuf/stubs/fastmem.h + /usr/local/include/google/protobuf/stubs/hash.h + /usr/local/include/google/protobuf/stubs/logging.h + /usr/local/include/google/protobuf/stubs/macros.h + /usr/local/include/google/protobuf/stubs/mutex.h + /usr/local/include/google/protobuf/stubs/once.h + /usr/local/include/google/protobuf/stubs/platform_macros.h + /usr/local/include/google/protobuf/stubs/port.h + /usr/local/include/google/protobuf/stubs/stringpiece.h + /usr/local/include/google/protobuf/stubs/strutil.h + /usr/local/include/google/protobuf/unknown_field_set.h + /usr/local/include/google/protobuf/wire_format_lite.h +CMakeFiles/main.dir/mind_camera.cpp.o + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h + /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h + /home/ascend/Ascend/driver/peripheral_api.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocap_base.h + /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocapture.h + /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h + /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp + /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/mind_camera.h + /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.cpp diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/depend.make b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/depend.make new file mode 100644 index 0000000..aeddc36 --- /dev/null +++ b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/depend.make @@ -0,0 +1,1096 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.10 + +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_model.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_detection.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h +CMakeFiles/main.dir/face_detection.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_detection.cpp + +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_model.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_mask.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h +CMakeFiles/main.dir/face_feature_mask.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_feature_mask.cpp + +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/channel.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/errors.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_channel.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_types.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_post_process.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/presenter_channels.h +CMakeFiles/main.dir/face_post_process.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_post_process.cpp +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/arena.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/arena_impl.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/arenastring.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/descriptor.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/extension_set.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/generated_enum_reflection.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/generated_enum_util.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/generated_message_reflection.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/generated_message_table_driven.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/generated_message_util.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/has_bits.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/implicit_weak_message.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/inlined_string_field.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/io/coded_stream.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/io/zero_copy_stream.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/map.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/map_entry_lite.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/map_field_lite.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/map_type_handler.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/message.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/message_lite.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/metadata.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/metadata_lite.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/parse_context.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/port.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/port_def.inc +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/port_undef.inc +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/repeated_field.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/casts.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/common.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/fastmem.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/hash.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/logging.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/macros.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/mutex.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/once.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/platform_macros.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/port.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/stringpiece.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/stubs/strutil.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/unknown_field_set.h +CMakeFiles/main.dir/face_post_process.cpp.o: /usr/local/include/google/protobuf/wire_format_lite.h + +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_model.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h +CMakeFiles/main.dir/face_recognition.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_recognition.cpp + +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/channel.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/errors.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_channel.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_types.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_register.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/presenter_channels.h +CMakeFiles/main.dir/face_register.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/face_register.cpp +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/arena.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/arena_impl.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/arenastring.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/descriptor.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/extension_set.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/generated_enum_reflection.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/generated_enum_util.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/generated_message_reflection.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/generated_message_table_driven.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/generated_message_util.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/has_bits.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/implicit_weak_message.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/inlined_string_field.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/io/coded_stream.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/io/zero_copy_stream.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/map.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/map_entry_lite.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/map_field_lite.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/map_type_handler.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/message.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/message_lite.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/metadata.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/metadata_lite.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/parse_context.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/port.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/port_def.inc +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/port_undef.inc +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/repeated_field.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/casts.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/common.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/fastmem.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/hash.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/logging.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/macros.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/mutex.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/once.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/platform_macros.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/port.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/stringpiece.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/stubs/strutil.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/unknown_field_set.h +CMakeFiles/main.dir/face_register.cpp.o: /usr/local/include/google/protobuf/wire_format_lite.h + +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/facial_recognition_message.pb.cc +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/arena.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/arena_impl.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/arenastring.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/descriptor.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/extension_set.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/generated_enum_reflection.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/generated_enum_util.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/generated_message_reflection.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/generated_message_table_driven.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/generated_message_util.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/has_bits.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/implicit_weak_message.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/inlined_string_field.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/io/coded_stream.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/io/zero_copy_stream.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/map.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/map_entry_lite.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/map_field_lite.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/map_type_handler.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/message.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/message_lite.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/metadata.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/metadata_lite.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/parse_context.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/port.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/port_def.inc +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/port_undef.inc +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/reflection_ops.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/repeated_field.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/casts.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/common.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/fastmem.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/hash.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/logging.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/macros.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/mutex.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/once.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/platform_macros.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/port.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/stringpiece.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/stubs/strutil.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/unknown_field_set.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/wire_format.h +CMakeFiles/main.dir/facial_recognition_message.pb.cc.o: /usr/local/include/google/protobuf/wire_format_lite.h + +CMakeFiles/main.dir/main.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/channel.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/errors.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_channel.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/ascenddk/presenter/agent/presenter_types.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/acl_device.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_model.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocap_base.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocapture.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/dvpp_process.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_detection.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_mask.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_post_process.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_register.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_recognition_message.pb.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/mind_camera.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/presenter_channels.h +CMakeFiles/main.dir/main.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/main.cpp +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/arena.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/arena_impl.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/arenastring.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/descriptor.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/extension_set.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/generated_enum_reflection.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/generated_enum_util.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/generated_message_reflection.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/generated_message_table_driven.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/generated_message_util.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/has_bits.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/implicit_weak_message.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/inlined_string_field.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/io/coded_stream.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/io/zero_copy_stream.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/map.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/map_entry_lite.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/map_field_lite.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/map_type_handler.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/message.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/message_lite.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/metadata.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/metadata_lite.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/parse_context.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/port.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/port_def.inc +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/port_undef.inc +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/repeated_field.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/casts.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/common.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/fastmem.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/hash.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/logging.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/macros.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/mutex.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/once.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/platform_macros.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/port.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/stringpiece.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/stubs/strutil.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/unknown_field_set.h +CMakeFiles/main.dir/main.cpp.o: /usr/local/include/google/protobuf/wire_format_lite.h + +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_base.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_mdl.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_op.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/acl_rt.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/Ascend/ascend-toolkit/latest/arm64-linux/acllib/include/acl/ops/acl_dvpp.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/Ascend/driver/peripheral_api.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_app.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_error.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_thread_mgr.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_type.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_utils.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocap_base.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/atlas_videocapture.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/parse_config.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/atlasutil/thread_safe_queue.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/calib3d.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/affine.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/async.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/base.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/bufferpool.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/check.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/core_c.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda.inl.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cuda_types.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_dispatch.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cv_cpu_helper.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvdef.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd.inl.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/cvstd_wrapper.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/fast_math.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/interface.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/hal/msa_macros.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/mat.inl.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/matx.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/neon_utils.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/operations.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/optim.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/ovx.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/persistence.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/saturate.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/traits.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/types_c.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utility.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/instrumentation.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/utils/tls.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/version.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/core/vsx_utils.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dict.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/dnn.inl.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/layer.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/utils/inference_engine.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/dnn/version.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/features2d.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/all_indices.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/allocator.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/any.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/autotuned_index.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/composite_index.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/config.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/defines.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dist.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/dynamic_bitset.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/flann_base.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/general.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/ground_truth.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/heap.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/hierarchical_clustering_index.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/index_testing.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_index.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kdtree_single_index.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/kmeans_index.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/linear_index.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/logger.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_index.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/lsh_table.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/matrix.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/miniflann.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/nn_index.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/params.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/random.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/result_set.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/sampling.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/saving.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/flann/timer.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/highgui.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgcodecs.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/imgproc/types_c.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/ml/ml.inl.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/objdetect/detection_based_tracker.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/opencv_modules.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/photo.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/blenders.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/camera.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/exposure_compensate.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/matchers.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/motion_estimators.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/seam_finders.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/util_inl.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/detail/warpers_inl.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/stitching/warpers.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/background_segm.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/video/tracking.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/ascend_ddk/arm/include/opencv4/opencv2/videoio.hpp +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_mean.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_feature_train_std.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/face_recognition_params.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/facial_thread_base.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/../inc/mind_camera.h +CMakeFiles/main.dir/mind_camera.cpp.o: /home/ascend/work/samples/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/src/mind_camera.cpp + diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_detect.cpp.o b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_detect.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..e852b267f2b5c6e8bea25e3154122de4e325cc4b GIT binary patch literal 126912 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 z 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≺tTOD^Q+?MmA!hh=X<8(C=mX^kOf3@%rD*Q1yCN{iy(KGNrd8R~fdWhlq4ceg0~B%j|!{J$vtWFKe$ zUs;TDg7?x3h`&qW@AmoJ4jf;C{QblV(tCx%-|O?^#AtEwH!J)!pU?K}Q@CAEPoIr? z&+z%|hwBt>*SpUtJb3?{?f;&_4_WpfSBmn3_sQA*ixqD3?@;(zzCCRJfWqy1eJ*sw zOXm%`8W<+J^7D*SvO@1vA_IDztm_rsb0sKO`ud~PXDo`d}0eeVS% zr%vGoKEH**m9IJ-RHCYNx-A{ z?GF4SO3qAQ4v#Aa6mHkMxfQ7Q5}!YTjQXs?gZHru2!BK2C;EJDCzoB0axU|6mUF@t zh!9MXw)1+0 zFY$3OTOCg-yw%6o5?)r1a>{(1^ZibR2k-aBiT_)L2k-GR|D^dS$1dj+6>gXF289Rj z_p<#P6kciB^K*rF`#9V4hQiZ6&h}h<720E$^XnCEm-BBbJa}K1?K$RZlv8iXPbmB* zA7^_$qVQXMobCCQ!k7E_Sn}t2P>{xXyqXj2Rn@ET;C)&yKi^mQt-hQhl5@s2C?|M7 zmhCA6d=znH(5U#q`>tJdbEAX*Uk-f2hoa@TJMjN-;D;S}>9x`FKLvPHeR;{j|D)mu z@9T2DlrM~y-{`=X06xz9l<)r)gaUfcPl)2 zpO)<$06eO`97H^qgozkxVX0w{)i(o0E-A>DFbbWY@C9 zlmZ(~cSD3|KHR992{AgBCYySD6(`l()Y90oB$aIJ0Kv`8iJGfgTMgcnY00F?OZK#O zENM$6YHarO2zGO8Pgi5QsfGBER7g*2XKP0*Ca2YQ#YpsH|JMXR8`bh0O3PA;`HENZK5VoQlB&kA~H*!Q&FiS7X*>7 zuC1s~B>g)=tc;bcW4$6O7+Mz{6~!gzRn*m0RLxD6)YsRln8 z0G-a@){Nj*ZK9-1M@r5qsi>S^tNkk&S}VFQlvImhdTXjMfGn@7nO_ejr#?Baq`tIV zxkF^KCRNX`w^&nz<24I~lwDI*GOwc4^hR|}vi_QyL|D%hVJ;9VY)htyyaUEiW&lOy zeke6lL~4M5_vTd3uhJPNG9K<#R)gQs;|Xe~85S+cC8zCgp4--( zCFUAK+|+47i6U{)M5&jH|CRF-^Py~MFNq{lt57$8c3o+0#cWkDr;6HJR}ZGlQ+7K! z_2sI7W7@(Tk-n=-D(aJ^C6$%4OG>Xu)>q6+K;|odi&T*@b1JHW7EIh$3hGPhD@v0k z6*V;~wkS}g)$?j}4X>-8KU>u|MG=kX+}i5-y2#Wew07Z&;ASbLr(V}laUWZdr0?6LodT`RMYwRa9_AMTWc8^J`0usyOw>^ z=73M3j0$;PD)>RZX&M6&v-L~XLNVqS&LOOd*YDyW5! zB;Apso z$b#eFmE|m1U6ZKtBSN<=RH{B*k56=WK}}XD&#S6wxCObSo6V3X0vXDOp`4)-r#1M| zLz#<3X0ZDt0*4jU%|sSzHSCx@f6knQ8u*4em{}ws8E~eAQkhtgD4h?(a%BsqBrF2W zv_(t}d4f5lLv;sA(x5DVm>a=!16$)nl>YnmcFCJh%;Zm%pSh)tr>Ad{#_p)QO_B8j#j z)FueYM78#&Rf#3ZZw0KxbMf?j8LqCV&8M&wJLh~#kbD>fifXUYT~U`zEU2ijhnYR5 z3+6s11Jzw!QC6?#!Xe)%3F@Bg%EP88PI;nYZh5%B57kRWLPeTrdsq>4W)Go?CY@qv z5w0Oh5|6oqRiG$ys$llZ%^^(hO~>dt;hg!EdMFX{9HynVz7D4OwIx-0XcsCBs>w~v ztD$BzbT3pbpqBkORSDHV`EtWa!<*rx z!E8lH=30Y1Y?J+#)Gnn;k>b=-MGrNj+79p()t9gU|8B(`k&sXcHce6GCX^4_0yQ7i zLS&n6r@Jl@%JYyie{K%z3b^tC%Bl*dBJ`RmUIN6vamoiY8oR2z;xn<($0>>txM*#!iuS_p>jq~PjhACqEuVd&BCG^ zX3y^IEo)3S&R)8>qB)Xt(G5VUTG~D+Yvv6V=~R1N>&?mtNN2$uSc)!FE73(2uoRnE zmH^)*=ghAvt*@xAN+!Y9Fl~BGcV|l!QS3X_S!B^SZmuqWM^Zf#29+Hq@RTkFm6tFuF`UpJ@p ziaGu+z=dhf=ANaCk`+nJT9M?^DT!s68Fgt)bWclTcd9wrmF})+sT9*uxK}AAp;Hox zvT1(20vSu*2n$>`EP=~>fq}0}Nq2y-H5WDZG^IM4XLfa`dQu(fRCnPtowMMK+Efor zraA7=OqN-fhP8ZnQUG;i%A&>|a60%G*8MA*z-NW<;GjF1?rv;N_f#|`Ap4pUSQJWd zdY)`)ZBBIuate!l4>xr#?MPQ-=#j<>$ewJCNF+F^VAQbU2ZnQT9gY|*(bJ$rgEio< zi~ItMYZI+KX?3&qin@!int}YIp~^NqvYr)atEl+1Vkgy>S~YYb!V*z8B~no~u>;-N z7K74h6*W!E63|oCO;3WKrz$@O&%X+%cBF1f`m0I9D=A#kj+ekZ(U);c` zp?wwf_--8;iD9*ah#5w4CpS+w^U~;mY%g$Ww(ewLXEt7g3Nf|46W%Gwu1u+sjqX;5 z)&^;*h5fssK#oE_PW{0 zn?nXIZftGS12v(~c|$#fAR7BRhpbJY&8RSYq4=VuUpfHIWGfW*0BeCk=rK zP$1B_ficRip46RMJPBTC>g`Q-rMi1MJ77MTUY=Z5fEiO*P?BzI>`{~Z(n4tGhEpt* zpu)0cU0pQu1xaeyETxwzY<|a0t?&{RPPW=p+JInw9YhN-PMw^T;;aoyap!Un)48-8 z=FD1~G(oEiPiCVqn$vrYO>HGzU6q|nyquVvQ_V5f9Plx-KL#JKdm0A*77}EVnXfB~Sz#!Rl`*^l5jtA@6QnHl7NYj2_*-E8Oo5Z!E${}7cIZ-&#k zVU5G$PL|ZAyV~4Kdu|2r_C-OmUaj5YxTzXWNY{}|LqRYSqnU+2M9g$8vat>ZoHVrw z+%$9+`U_WuQ&O-_f^TatYHYfp;__P6E+&?hb;0{?lykoOvyfY)x(B;oclG_Ul1C2@ zAS0VZADn$ z4mVj`kg>J3m*R)z>1m5nOIka0AvlU+r@}zys0$Ts&e7>Jp!7z15<8T4W(gQH3c-HE zn|*Jt8hGsY3TI+nR)78yJe;XeT}~pg44xazhDCrW1&ceoZ-T`Ke{m$4Zp8Oaq09tp zfk(c;%?)JGRUJXfU=ox`?i>v#`W5qNdPC(540Dt9UBMF?RVnJyGm<a9v&~6$=7}>#h7Pymga6Q*Qw(n!HN%ca zv)#Z_PE@AzG&M){D~+LVctVC_LXdzXFd;+lXOt@N3uZ{s;2DyUC|U^!l9=rn5IWkP zRChYj&JP*t(nYw=Tv0omnwzM`CikN5lv=8Wr9b^v3H*&sqA0z*D+R-SHS-vTY-lfo zxkA>dZ0zd7KD*|MCN=MwP8|lMGJ{z`0{?g>I$@BBlrrjWF7lsN^NSZa9LhvVVy6H1 zq`17}&t+=iIZzF}G7VFj0$Pe6PAv$=EJ4$kiCtj6np71|SEFi`Jb1GQ3r#TJk_-Ki zH`e1Xkbs^_`17*tTkz5;ku#vI=bVL8AszVVDQ(GSd^Ji<^0GGvni4U0g2GwT1T{!M zX&IKZdBL9(Lqhf7W~j$e!>C3usiE1!(H{Ntq~xd$GW=I7)EffMz9f5(2P4d|ig!L0 z;D0elHoK%FNXa`USXG(k6t!&d7v(TOQ|n^Z$Y?kP5*rvC>eI*!Mvw5P=;=my84^6OG>KlsBUHw{vGw1LSZ4aF}}OdRWM0`=WR z)c3CC$;M$O67vAvhU(LvR{@M|#FNQVhy+sJ2GF=i#c#nF@E+ z(+uNtBWRUiXZ-AA*wqG}TW9CdpiTrcD$7C|-A78!s)rA^gq%Ye4qt*HXiyCFlskjL zk3Yx=o8Zdi;it-(i`j@gDnjhiF~w0jvN0{Hz+@7iCL~yf1{oJ*kdvWN>{J}Zs<)Vy zg+{PKMbv096N7_6EGWR@qhFR%eXD+=AfLQsV7MrPFcfP^!AmV|sg4A^Xo6D)=u(C= z=$7k`L89ARkK~0g=-!er7`F!5>KRW&9|waCSR_k0dbw;oWA$oPR|JWQGU*6jdn>}W zgO-z~!s`X$u2a7WwHSN=U%g4eABjUZno+6IWd#=|bjJzL7N)@;6yZxx@EUz%Qmq#! z;cwTQTBtoef(hMp_16xa%k>0m8BOF!Q+Eo!71VhX{esD<)SB)57M_ua`9rdCX|I?= zs6H;axUmgBS%jmW=#JtD2A)BKkNtjV5qOwSD6|ZItXLSG2g9%!7L?)B1OCXY7T)aV z!7O+Q3bQ|Igd&hy(%HRyn8P#o7<9U&0;dCN5DF&1*P{N_qhA=BUIZ)b&7JM=*(&_Y zp}+~jD*92(ff*t9>%np1jBx$Nq46+1kNGJ_#eQk0C23VTDi;+b5|G_oL5H@^D z>4P;&!~O+d9MUG+zb!vn- zz3%DfiF|24qxPE@qeA0E_7k``6Cs&A*3F<>l&;Q5?NHv&NQjvsur>&bYr(W)&INzpc`ua3VinMF$|=k?bE}x40I{>JN>%7dW3mIBgh%;jlJ;kJ$Szmt2REK zgjb)jug3u;d?7HI>hA9B=B4PVz^-TqKd47Eke5_BqFdady##+UAY0g}s%+Gyr^50> zd*cnMq&0Nn{wSlm16`E)8akM)MpH1t*U5D)bVS6>s6avi!O^`QuuaFZDONg;bh;9Z z(QpER(-iIhtVdu|b~o(9TKCeGQ7;-}TbO-?RI9^KCH2VbD4Q1=deuNS zs#fbLD+$Uz%-m>gA1h$Q_(BZ=U>Z*M)Oy^o2OaoYtS+JOjgr~ACcrWvez3C}##Eh) zhnF2t9&wPWDps(hH>{lHvh8-b-Cv8IHR2{M&txNz`@n4C80DsrTC}itZS$1tRBs_) zNU(WB`z51RO1LUB{*d0wNX*a<%}9*lW9~J=KF&yza=UsCCf%M2nw3j6_B?R#yL-kt7&NX_Fv{QFEyy=zC?yi+!U= zGjx)zJ;{!xZEf%cK=_-lR5yNMV3F=bK_yUW;M2JTK1~oB_lT!FP43yU{lo^IB=Z<4 z+ddi#Mw5C2KT+FGL*{H{;8Sq*+_;981+x{Po((lMb~QG^-$D7WmuD-*H)FVuuVEof zKY+q-MD)PZYv}W-+s}U3pw_Z`;9W31z}2Z5h8TQt7r#T@$uI7TvS!SDht&n@`Gy)G z;a@glX_hOPM?*!>Na(>oE{p0qun4~kj$huu8}J8~s!xXnANcSL{5ctXMSNHzgv-@v zO^;lIS47-?v->}Onql4HCpz|xqtkV<;=!^Ylle~A<=DuZQ0uI9)%ya}qPZDM9tbam0PLh8n& z;t!F78F_b*{DK*@e#;LV)}h@3BWC(@^GwM2`k!9=8FmH+&y=8%n9 z;Lcy)kNLY&c=>dR`xi<4b;5DSI*iM_{es?^iR*G{s@iAQz?y);Bjg_z z_;Uj1JyTfzI+8z{I4qy>F@!Up{WI3!Gafhi?4R)lpYdYCO}~{9Zu+g9aMN!!gtML7 zDP8r1bGjIBCLHztimow-(*pmsz*o{W%O4>5s|aWLjITEM?4Pv;pYe4DpZ#;U!DoCs z;ilhq5^nl!7vZMgxGrIBvAv0`0VEw z3_jxr2sizIkZ{xghY2_RpEp7^2WkgitdF~hmrppSi}5jpoBp36@c$BiD--x11YRld zeFCo+_#XwnP~cKdGvQ`C*+RJ4POfsuxm)1Uo-G2G_Ush6wC6E_%W>Kh0{?+X*I|MG zN#LWYJwrdgCh!S_b2;2c`8APn&M(Fb3_h2)B7@KP41?cAzh@bI#_I_;%i#jT&2qSq zaI+jX6VB-xMSkJ(&go*jSLl`Pz$$^iF8tPS$S)@On+Rw5jBhsh?4K5||1JDB@mSqHnDwiGaI=0@ z5{~i@2st$Z|C_)Y1TOi_0+;+=!a2RGDZMKQ=kzjuyO8sDp|@Y)`vrcGCUhttt5&&A zzIT{#lrM2LDFP0r_a8#eXlzUg|DM1n3jCnJ3kc_Q^;5cv22S-t55J9QX=>zbWLb6!;qg-y-nC0^deBr*|`@cRS&nUdDF{IWiv~Bit;XPY`aF z&)0<<>4(D(eB^OKKFV~B7PxHZ#|T`u^IZaeOZcHz;QuS|&4ioj+CsRQuDyhFxz$#C z-V20txn+ESa4fgqp)n`kdqv3kuE6&RITC+e@Tn_OD)tM$#19aT>H40Ke~@rYm&6Yf zj&}0c8x`aouhgh|_qOocNW!^X=5>k7kG}q zCkXk{Zxe-li5CdI)LSI@5}!dh`cszYS%jlMC0CbY3OMli7&i)?HX&d7txL$4cv|qK-d@3%_zJ>JfA$e>`tx?eO@FQu zxb){*!r7nYL4l7H^2dzS1qS^o%k6l9%knVMffo>tewO8-h;a0?#AgV;w11Z1 zOT1X{c})f_FB5!;mlJN5lLZ2o>1q(T>|fdhF8OJJOMaigrJpwmT>5#Zz@_}%4t$Tm zrQW@SoBh`dgq!`>0U<~Bo4Pc3UJm4!T!-g z{tnT<6cHcgOPuQg=I{3fpZ5Vb?W`AawhMk6;V4J?fzyllLxRtHc_Yqil_(+;{v!@K zzY(~U!*d;!KNkOk1NHt^@QW3y@#h6Db)Jvq0dozAO~D%y*f;G0{$r*U3`pI!54zC;VE)S+3iiDh#g`8OemwIJAI#KW!3jQeqm-XdTfu{vu`ni{I)BY8NoA$32 za%8?p|G!7*mFYcA;4;0^PMKe)3%-;;R^U?p`vflKpDA!DKQ3@7f1JRj{Br~@<&PJ* zlyk1YCkVg2U*J;yc><3M{se(b`BF}S;7d8u&hv$wO2NNC;IjN&C~z((*ltKUD}|hi zf-miyBygGD$pSAEatZ`qFYr8pFBG^e&s-nTPHa9`5l_mIxGWFH3HegaG=a|$dZ!D# zSl~qhmwuQjaOsDO1up$B>rtPOe~I9a75FTH%XEFvffoy0wllK@UL)jRCUB{jpOGO| z>YXF_5-%6H)O)$WrQW#$mwGD&F7r#4Pg(Eg3I0e*m)Y*Ioo2f?QTU-s$l-i6<#0JM z<;Zl&_LJ>5<#2jUIcyJ)-?r0wQ32V><2S~Oh5gmS{z`$@2z;TyuM~Kjz-tA*N#N4| z+XOD#nI{BZC*uziqn${hT9fy?%Poxo+e9U$Dy z$5#k9^HDWYkT$euzDUywr+?2C`aFiqMVZDf7E97%MLVTgXv$db=9m=^* z$YDDX|FFQhzcc;A?V*{j21mMN|B@8)CEg%#>4!#vbGwIjHaYNSflI$F7PyqZMBq|> zs{_AY;8K2@z@_|lfwSMx{!W3%h2LbmB+J`(s0<^uQt-QkoCbk^SMXZ|F6#x`Y38r1 zJ(uODTj=HTkLi-n3#2_gf-min{IsxB;y^m*rpL z#e#p6;7faYBXBdlu5u{L+j1eNjP#mv$_Y39)*$S3`R!&QKQ8zy1kQG%pFbjS>F19M zT>AM|flGd$z`6XO{ErD-+H68K$0z8r_kapqXTm*dRw0+;=%9JjmLlY4|-*&g02@EO{C zW&eEwFB5pbz-2j+?a3^`UoZI00+;@gEU&+URQ{WD77a(!6(LHbAX z9~0vliEk3=%0!N=k5bN89dab@%9k3EE}1W~J>+*;k;?6ZS)SQ`vpg3F`S%Muiv|9G zz`2~5^2>>D%5M;IWVszH@UIK`(jGZ3W%*d|kR!*XvK-2CBK@{S=#}MJ_B&GV zgMwc#^!|syr9Iyec(35gdLhfRT+dl4__AKC7Pzbz>jW;-%lVFe+bZml>5}WElK)M? zpD5(Ze35?pw%|)S+XOyd$dNd~>bV|P$Gj65(IGzXds5WXv2=R`;M7Gagxf2`>6I>p zR|>um<24v~oPPHjIM+k=KgvfrtBAKv@VO2m^n$>5(6tI6J{~CN2l`U|&+R|r4+*?n z@E;cVO#**hBy6R?5#CF2)(HG(Le4gUBcJs>Byi-9qBt)I9QiBgH?QZQ{kw^a!FaL_ z@t+Hv*K-hmM&P_YgZM86e!GyfN8pMWM3zoZw@+IM4VUJm&K_CrS+LjF%DqjF9ttO;!K@M&Ky_ z8ormOFHp_^V-SuP_)7vW7x*gzZxi^d0$(lgeFEPs@IMKh--kzgUKjXp1Rw2hr+fUq zI`aQ4_#>$DBaZy#bZ>&d_X~cZz>)tEx>qCczY6{}0!RMG=-vu}9}xUc2psvJpnIDH z{&&HDP~gb_G~Ihf;0FbNpTPeqaF5;_LO&c9_!xozufPig&TGhco8JRMIk|B1(I@zM z0$(TaV+6iS;Q0dIEAZn4{-VIq4|kB_JgPTn&q%=^EASHqUMz4PlcT5w0zXCYy9CZ- zb>y!V_4zE$7}f%E&lXwO`M^ZT)gR|q^#@7E!Ig}}=MK2PBMz9sUj z1jcj44I(~Y;QYQH;#UiN?8v~+*9e^7uS5Q|0&f=l>jb`1;7Nh6 z5%|wQ6^|jd3%pVApAmSIzz+&MCGfE{Zbdtn2)s<-tpaZm_zeQ@6L`D8Hw(N|;JXEW zqrmqIyhq@pPYnFLRNylN&SOht)(CvL;HL$Ci@?_j{38P2D)3tczDM966Zk=a-zM-; zCk6I@Lf}OL|CGQh1^#J)cM1Hn0$(feI|RN(;GYxtGXm!^Hd?q(;CBlCNE%3EIr)OX z3k3c}ftL&XO9F2b_+0{DE%18;zD?lw34E`>*9-hbfn$9cz(m23cd`!A{*8h^R^VR| zc(K60Ch%r~-!JfXfumj?L#!6~*9Cu@z#kO&Zh?P8;QIysO@WU-B}mt|1wKRI-w}9? zz`rN(w7_==e4W65An=_6e@Nha1pctV4+{JdfsZ;hu>Vnk7YY2w0y z;Q4!(z>)8-t4!)y-kxq;Vf#m1XKFERX{9_o6LMSj`aoiVv-38L3&)1mD}!dn15n;d?fg;;?b*12{u- z$~tU8;S>zvDD|04&N=*67wqjoUQ$~;R}Ajw2s39^v^OqEl|g=M*`dr1ZbrB+qfZn; zISWY~I#Prt@jW*178JW)UG9eU$v61KVtuk^PHPQ(Zx%js3!k;BOM`-Cjmb9HI4jW( zpP#+iFnSo@;tTC>7m=i_vo1=;a6eLvdlQATWw_rv)>dIdgKYzTTIy(TJsr05C~BY` z9mDd)J~i2Ay1ywN)TBsH;NA-G;VSqb@jIb4s)YF4?pR+TwD!W6I{gS(GQ%2&=!{H_Ai&=v=?Kc6 zwo10Sb?L6QiY73x5I_Si=Ud!PoO={#ykI!Pn^NJXnE&E^7(=-TZQs9oKgM@7 zvyClWjkNv?_b4|s2YVY0t4pW;d??r1otJx4#*l$kFx9joI~R22aL9_q%NBMmzp?zYlKiLVAsfh#m?Iyo!EdK!Pb|-c8*vE{Vlgm6crxyxX}QHa9kq8KE6yhPTBF=IJzlM3?SvY)$u6z=kY^_O3Iq6At_v zd`Iec(jUQ&Y`E>B)gMRhtyVKEuUPw33!fjoeIqSjO-T;EL-4Rl5l$&#A8bQe)R0Nf zxQAZ1w1!QNAw^_UVMjK1P3CQ^T|T!ZsBI0cPG2?igF4if6g}>M?k$rpLhoJ8X3MdF zx$v7oSDlSdGcwL}GjC4K_JX^@MLQECmFHn&E~9ke8r`6t&&*;hy4K^&VGeoZMr1*f z?G2u-lth-|%^lKrpR_SsPCoJK_`FS|5VZgTEPcSbp}c zqjODX=%w{wNLy%D?(FS=ot@S29yUJ=C+R3_F*cI5`q06$XgH|~%D>w0Ih;21F>mjz zA8$14U7p|3t)D|S$T|FQmg)4Ce8ko8V(hU~jrw4pGwbZv>ubg&8{`17G) zg?o_wIi0(FhKf^YwR#X~_Pk5)s>~LK78;I5-xEDD`j>1SYB(socjqvAoQMr~Gjdxd zL*0;@WI=|WBb%OVxOK?dl9p2j0z>Nn*_W+s=JZEtuU9r6mmh{T>{MH=`ckk>9hMli zZ!C*}62}|nX4Fh(wB2f`jAtMg+Df&VYABw{W3d@^1_jpI*VYhtRJN#P Mlhm`^0 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 CcHM3O literal 0 HcmV?d00001 diff --git a/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_detection.cpp.o b/cplusplus/level2_simple_inference/n_performance/1_multi_process_thread/face_recognition_camera/build/intermediates/host/CMakeFiles/main.dir/face_detection.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..4e9e519587f697c288dae73599c9a6f143a01026 GIT binary patch literal 339544 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