120f67cbe646347772cb1da56a58801aa623b24feWind Yuan/* 220f67cbe646347772cb1da56a58801aa623b24feWind Yuan * test_cl_image.cpp - test cl image 320f67cbe646347772cb1da56a58801aa623b24feWind Yuan * 420f67cbe646347772cb1da56a58801aa623b24feWind Yuan * Copyright (c) 2014-2015 Intel Corporation 520f67cbe646347772cb1da56a58801aa623b24feWind Yuan * 620f67cbe646347772cb1da56a58801aa623b24feWind Yuan * Licensed under the Apache License, Version 2.0 (the "License"); 720f67cbe646347772cb1da56a58801aa623b24feWind Yuan * you may not use this file except in compliance with the License. 820f67cbe646347772cb1da56a58801aa623b24feWind Yuan * You may obtain a copy of the License at 920f67cbe646347772cb1da56a58801aa623b24feWind Yuan * 1020f67cbe646347772cb1da56a58801aa623b24feWind Yuan * http://www.apache.org/licenses/LICENSE-2.0 1120f67cbe646347772cb1da56a58801aa623b24feWind Yuan * 1220f67cbe646347772cb1da56a58801aa623b24feWind Yuan * Unless required by applicable law or agreed to in writing, software 1320f67cbe646347772cb1da56a58801aa623b24feWind Yuan * distributed under the License is distributed on an "AS IS" BASIS, 1420f67cbe646347772cb1da56a58801aa623b24feWind Yuan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1520f67cbe646347772cb1da56a58801aa623b24feWind Yuan * See the License for the specific language governing permissions and 1620f67cbe646347772cb1da56a58801aa623b24feWind Yuan * limitations under the License. 1720f67cbe646347772cb1da56a58801aa623b24feWind Yuan * 1820f67cbe646347772cb1da56a58801aa623b24feWind Yuan * Author: Wind Yuan <feng.yuan@intel.com> 19136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan * Author: Yinhang Liu <yinhangx.liu@intel.com> 20136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan * Author: Wei Zong <wei.zong@intel.com> 2120f67cbe646347772cb1da56a58801aa623b24feWind Yuan */ 2220f67cbe646347772cb1da56a58801aa623b24feWind Yuan 2320f67cbe646347772cb1da56a58801aa623b24feWind Yuan#include "test_common.h" 244322c5668e7751452098015067f015a3432aeeddYinhang Liu#include "test_inline.h" 25136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan#include "image_file_handle.h" 267110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_device.h" 277110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_context.h" 287110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_demo_handler.h" 297110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_csc_handler.h" 307110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_bayer_pipe_handler.h" 317110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_yuv_pipe_handler.h" 327110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_tonemapping_handler.h" 337110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_retinex_handler.h" 347110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_gauss_handler.h" 357110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_wavelet_denoise_handler.h" 367110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_newwavelet_denoise_handler.h" 377110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_defog_dcp_handler.h" 387110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_3d_denoise_handler.h" 397110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_image_warp_handler.h" 407110f89ce125e8d4dedcd585fea7b44636403400Yinhang Liu#include "ocl/cl_fisheye_handler.h" 419fbfce6bd98f1d790f75215932de854892a58154Wind Yuan#include "ocl/cl_utils.h" 4220f67cbe646347772cb1da56a58801aa623b24feWind Yuan 4320f67cbe646347772cb1da56a58801aa623b24feWind Yuanusing namespace XCam; 4420f67cbe646347772cb1da56a58801aa623b24feWind Yuan 4520f67cbe646347772cb1da56a58801aa623b24feWind Yuanenum TestHandlerType { 4620f67cbe646347772cb1da56a58801aa623b24feWind Yuan TestHandlerUnknown = 0, 4720f67cbe646347772cb1da56a58801aa623b24feWind Yuan TestHandlerDemo, 4820f67cbe646347772cb1da56a58801aa623b24feWind Yuan TestHandlerColorConversion, 491c90c3e61f731e076d8cdd3d3e6825f93457a60dWind Yuan TestHandlerBayerPipe, 50347f7043d4203022ce1ac8653de70cc40f2f340cWangfei TestHandlerYuvPipe, 518e5e3e4bb0c6f1fd26b577d3cc21020fb2b338c6Wangfei TestHandlerTonemapping, 526523286e77ad1338a3362fe1f6b7a1c115168ecfWangfei TestHandlerRetinex, 53bc1e07124ab6930b3462042eb4977f00b94c5a8dWind Yuan TestHandlerGauss, 54b7140441fcd8da54d05ee5598c720535380d4f16zongwave TestHandlerHatWavelet, 55b7140441fcd8da54d05ee5598c720535380d4f16zongwave TestHandlerHaarWavelet, 56f4e17ab3b9c58451ee7a9e67ead0ad6c5a2c5560Wind Yuan TestHandlerDefogDcp, 57bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave TestHandler3DDenoise, 58233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave TestHandlerImageWarp, 5974f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan TestHandlerFisheye, 6020f67cbe646347772cb1da56a58801aa623b24feWind Yuan}; 6120f67cbe646347772cb1da56a58801aa623b24feWind Yuan 626b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liuenum PsnrType { 636b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu PSNRY = 0, 646b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu PSNRR, 656b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu PSNRG, 666b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu PSNRB, 676b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu}; 686b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 69cf536697155a16e35f17199ca7a31645c61d9802wangfeistatic XCamReturn 706b5f71042b969ae41362e07660181a676685702bYinhang Liucalculate_psnr (SmartPtr<VideoBuffer> &psnr_cur, SmartPtr<VideoBuffer> &psnr_ref, PsnrType psnr_type, float &psnr) 716b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu{ 726b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu const VideoBufferInfo info = psnr_cur->get_video_info (); 736b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu VideoBufferPlanarInfo planar; 746b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu uint8_t *cur_mem = NULL, *ref_mem = NULL; 756b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCamReturn ret = XCAM_RETURN_NO_ERROR; 766b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 776b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu int8_t interval = 1, index = 0; 786b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu if (PSNRY == psnr_type) { 796b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu interval = 1; 806b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu index = 0; 816b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu } else if (PSNRR == psnr_type) { 826b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu interval = 4; 836b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu index = 0; 846b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu } else if (PSNRG == psnr_type) { 856b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu interval = 4; 866b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu index = 1; 876b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu } else if (PSNRB == psnr_type) { 886b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu interval = 4; 896b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu index = 2; 906b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu } 916b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 926b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu cur_mem = psnr_cur->map (); 936b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu ref_mem = psnr_ref->map (); 946b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu if (!cur_mem || !ref_mem) { 956b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_LOG_ERROR ("calculate_psnr map buffer failed"); 966b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu return XCAM_RETURN_ERROR_MEM; 976b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu } 986b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 996b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu uint32_t sum = 0, pos = 0; 1006b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu info.get_planar_info (planar, 0); 1016b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu for (uint32_t i = 0; i < planar.height; i++) { 1026b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu for (uint32_t j = 0; j < planar.width / interval; j++) { 1036b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu pos = i * planar.width + j * interval + index; 1046b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu sum += (cur_mem [pos] - ref_mem [pos]) * (cur_mem [pos] - ref_mem [pos]); 1056b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu } 1066b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu } 1076b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu float mse = (float) sum / (planar.height * planar.width / interval) + 0.000001f; 1086b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu psnr = 10 * log10 (255 * 255 / mse); 1096b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 1106b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu psnr_cur->unmap (); 1116b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu psnr_ref->unmap (); 1126b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 1136b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu return ret; 1146b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu} 1156b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 1166b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liustatic XCamReturn 1176b5f71042b969ae41362e07660181a676685702bYinhang Liukernel_loop(SmartPtr<CLImageHandler> &image_handler, SmartPtr<VideoBuffer> &input_buf, SmartPtr<VideoBuffer> &output_buf, uint32_t kernel_loop_count) 118cf536697155a16e35f17199ca7a31645c61d9802wangfei{ 119cf536697155a16e35f17199ca7a31645c61d9802wangfei XCamReturn ret = XCAM_RETURN_NO_ERROR; 120125221b9727cffe7ad0b230fec257520179ebc1cwangfei for (uint32_t i = 0; i < kernel_loop_count; i++) { 121cf536697155a16e35f17199ca7a31645c61d9802wangfei PROFILING_START(cl_kernel); 122cf536697155a16e35f17199ca7a31645c61d9802wangfei ret = image_handler->execute (input_buf, output_buf); 123cf536697155a16e35f17199ca7a31645c61d9802wangfei PROFILING_END(cl_kernel, kernel_loop_count) 124cf536697155a16e35f17199ca7a31645c61d9802wangfei } 125cf536697155a16e35f17199ca7a31645c61d9802wangfei return ret; 126cf536697155a16e35f17199ca7a31645c61d9802wangfei} 127cf536697155a16e35f17199ca7a31645c61d9802wangfei 12820f67cbe646347772cb1da56a58801aa623b24feWind Yuanstatic void 12920f67cbe646347772cb1da56a58801aa623b24feWind Yuanprint_help (const char *bin_name) 13020f67cbe646347772cb1da56a58801aa623b24feWind Yuan{ 13120f67cbe646347772cb1da56a58801aa623b24feWind Yuan printf ("Usage: %s [-f format] -i input -o output\n" 1324322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -t type specify image handler type\n" 1334322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t select from [demo, blacklevel, defect, demosaic, tonemapping, csc, hdr, wb, denoise," 13474f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan " gamma, snr, bnr, macc, ee, bayerpipe, yuvpipe, retinex, gauss, wavelet-hat, wavelet-haar, dcp, fisheye]\n" 1354322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -f input_format specify a input format\n" 1364322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -W image_width specify input image width\n" 1374322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -H image_height specify input image height\n" 1384322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -g output_format specify a output format\n" 1394322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t select from [NV12, BA10, RGBA, RGBA64]\n" 1404322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -i input specify input file path\n" 1414322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -o output specify output file path\n" 1424322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -r refer specify reference file path\n" 1434322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -k binary_kernel specify binary kernel path\n" 1444322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -p count specify cl kernel loop count\n" 1454322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -c csc_type specify csc type, default:rgba2nv12\n" 1464322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t select from [rgbatonv12, rgbatolab, rgba64torgba, yuyvtorgba, nv12torgba]\n" 1474322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -b enable bayer-nr, default: disable\n" 1484322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -P enable psnr calculation, default: disable\n" 1494322c5668e7751452098015067f015a3432aeeddYinhang Liu "\t -h help\n" 15020f67cbe646347772cb1da56a58801aa623b24feWind Yuan , bin_name); 1514322c5668e7751452098015067f015a3432aeeddYinhang Liu 1524322c5668e7751452098015067f015a3432aeeddYinhang Liu printf ("Note:\n" 1534322c5668e7751452098015067f015a3432aeeddYinhang Liu "Usage of binary kernel:\n" 1544322c5668e7751452098015067f015a3432aeeddYinhang Liu "1. generate binary kernel:\n" 1554322c5668e7751452098015067f015a3432aeeddYinhang Liu " $ test-binary-kernel --src-kernel kernel_demo.cl --bin-kernel kernel_demo.cl.bin" 1564322c5668e7751452098015067f015a3432aeeddYinhang Liu " --kernel-name kernel_demo\n" 1574322c5668e7751452098015067f015a3432aeeddYinhang Liu "2. execute binary kernel:\n" 1584322c5668e7751452098015067f015a3432aeeddYinhang Liu " $ test-cl-image -t demo -f BA10 -i input.raw -o output.raw -k kernel_demo.cl.bin\n"); 15920f67cbe646347772cb1da56a58801aa623b24feWind Yuan} 16020f67cbe646347772cb1da56a58801aa623b24feWind Yuan 16120f67cbe646347772cb1da56a58801aa623b24feWind Yuanint main (int argc, char *argv[]) 16220f67cbe646347772cb1da56a58801aa623b24feWind Yuan{ 163227ba2742550ba2e800ca45ca723bc1f87766425wangfei uint32_t input_format = 0; 164227ba2742550ba2e800ca45ca723bc1f87766425wangfei uint32_t output_format = V4L2_PIX_FMT_RGBA32; 1658b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave uint32_t width = 1920; 1668b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave uint32_t height = 1080; 16720f67cbe646347772cb1da56a58801aa623b24feWind Yuan uint32_t buf_count = 0; 1680ad35acf97e48002078c1cc3100c1169e46d71c4Wind Yuan int32_t kernel_loop_count = 0; 1696b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu const char *input_file = NULL, *output_file = NULL, *refer_file = NULL; 1704322c5668e7751452098015067f015a3432aeeddYinhang Liu const char *bin_kernel_path = NULL; 171136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan ImageFileHandle input_fp, output_fp, refer_fp; 17220f67cbe646347772cb1da56a58801aa623b24feWind Yuan const char *bin_name = argv[0]; 17320f67cbe646347772cb1da56a58801aa623b24feWind Yuan TestHandlerType handler_type = TestHandlerUnknown; 17420f67cbe646347772cb1da56a58801aa623b24feWind Yuan XCamReturn ret = XCAM_RETURN_NO_ERROR; 17520f67cbe646347772cb1da56a58801aa623b24feWind Yuan SmartPtr<CLImageHandler> image_handler; 17620f67cbe646347772cb1da56a58801aa623b24feWind Yuan VideoBufferInfo input_buf_info; 17720f67cbe646347772cb1da56a58801aa623b24feWind Yuan SmartPtr<CLContext> context; 1786b5f71042b969ae41362e07660181a676685702bYinhang Liu SmartPtr<BufferPool> buf_pool; 17920f67cbe646347772cb1da56a58801aa623b24feWind Yuan int opt = 0; 180125221b9727cffe7ad0b230fec257520179ebc1cwangfei CLCscType csc_type = CL_CSC_TYPE_RGBATONV12; 18143135774c9809eef3d6645cbcc008b36d1cf8201Wind Yuan bool enable_bnr = false; 1826b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu bool enable_psnr = false; 18320f67cbe646347772cb1da56a58801aa623b24feWind Yuan 1844322c5668e7751452098015067f015a3432aeeddYinhang Liu while ((opt = getopt(argc, argv, "f:W:H:i:o:r:t:k:p:c:g:bPh")) != -1) { 18520f67cbe646347772cb1da56a58801aa623b24feWind Yuan switch (opt) { 18620f67cbe646347772cb1da56a58801aa623b24feWind Yuan case 'i': 18720f67cbe646347772cb1da56a58801aa623b24feWind Yuan input_file = optarg; 18820f67cbe646347772cb1da56a58801aa623b24feWind Yuan break; 18920f67cbe646347772cb1da56a58801aa623b24feWind Yuan case 'o': 19020f67cbe646347772cb1da56a58801aa623b24feWind Yuan output_file = optarg; 19120f67cbe646347772cb1da56a58801aa623b24feWind Yuan break; 1926b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu case 'r': 1936b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu refer_file = optarg; 1946b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu break; 19520f67cbe646347772cb1da56a58801aa623b24feWind Yuan 19620f67cbe646347772cb1da56a58801aa623b24feWind Yuan case 'f': { 19720f67cbe646347772cb1da56a58801aa623b24feWind Yuan if (!strcasecmp (optarg, "nv12")) 198227ba2742550ba2e800ca45ca723bc1f87766425wangfei input_format = V4L2_PIX_FMT_NV12; 19920f67cbe646347772cb1da56a58801aa623b24feWind Yuan else if (!strcasecmp (optarg, "ba10")) 200227ba2742550ba2e800ca45ca723bc1f87766425wangfei input_format = V4L2_PIX_FMT_SGRBG10; 2016ea2221881fa41cbbe9988dedd4917be5c64cc08wangfei else if (! strcasecmp (optarg, "rgba")) 202227ba2742550ba2e800ca45ca723bc1f87766425wangfei input_format = V4L2_PIX_FMT_RGBA32; 203227ba2742550ba2e800ca45ca723bc1f87766425wangfei else if (! strcasecmp (optarg, "rgba64")) 204227ba2742550ba2e800ca45ca723bc1f87766425wangfei input_format = XCAM_PIX_FMT_RGBA64; 2059845b02a95b2219e684c8b0d5ece06fe4fb7ad84wujunkai else if (!strcasecmp (optarg, "ba12")) 2069845b02a95b2219e684c8b0d5ece06fe4fb7ad84wujunkai input_format = V4L2_PIX_FMT_SGRBG12; 207227ba2742550ba2e800ca45ca723bc1f87766425wangfei else 208227ba2742550ba2e800ca45ca723bc1f87766425wangfei print_help (bin_name); 209227ba2742550ba2e800ca45ca723bc1f87766425wangfei break; 210227ba2742550ba2e800ca45ca723bc1f87766425wangfei } 2118b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave case 'W': { 2128b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave width = atoi (optarg); 2138b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave break; 2148b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave } 2158b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave case 'H': { 2168b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave height = atoi (optarg); 2178b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave break; 2188b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave } 219227ba2742550ba2e800ca45ca723bc1f87766425wangfei case 'g': { 220227ba2742550ba2e800ca45ca723bc1f87766425wangfei if (!strcasecmp (optarg, "nv12")) 221227ba2742550ba2e800ca45ca723bc1f87766425wangfei output_format = V4L2_PIX_FMT_NV12; 222227ba2742550ba2e800ca45ca723bc1f87766425wangfei else if (!strcasecmp (optarg, "ba10")) 223227ba2742550ba2e800ca45ca723bc1f87766425wangfei output_format = V4L2_PIX_FMT_SGRBG10; 224227ba2742550ba2e800ca45ca723bc1f87766425wangfei else if (! strcasecmp (optarg, "rgba")) 225227ba2742550ba2e800ca45ca723bc1f87766425wangfei output_format = V4L2_PIX_FMT_RGBA32; 226227ba2742550ba2e800ca45ca723bc1f87766425wangfei else if (! strcasecmp (optarg, "rgba64")) 227227ba2742550ba2e800ca45ca723bc1f87766425wangfei output_format = XCAM_PIX_FMT_RGBA64; 228125221b9727cffe7ad0b230fec257520179ebc1cwangfei 22920f67cbe646347772cb1da56a58801aa623b24feWind Yuan else 23020f67cbe646347772cb1da56a58801aa623b24feWind Yuan print_help (bin_name); 23120f67cbe646347772cb1da56a58801aa623b24feWind Yuan break; 23220f67cbe646347772cb1da56a58801aa623b24feWind Yuan } 23320f67cbe646347772cb1da56a58801aa623b24feWind Yuan case 't': { 23420f67cbe646347772cb1da56a58801aa623b24feWind Yuan if (!strcasecmp (optarg, "demo")) 23520f67cbe646347772cb1da56a58801aa623b24feWind Yuan handler_type = TestHandlerDemo; 23620f67cbe646347772cb1da56a58801aa623b24feWind Yuan else if (!strcasecmp (optarg, "csc")) 23720f67cbe646347772cb1da56a58801aa623b24feWind Yuan handler_type = TestHandlerColorConversion; 2381c90c3e61f731e076d8cdd3d3e6825f93457a60dWind Yuan else if (!strcasecmp (optarg, "bayerpipe")) 2391c90c3e61f731e076d8cdd3d3e6825f93457a60dWind Yuan handler_type = TestHandlerBayerPipe; 240347f7043d4203022ce1ac8653de70cc40f2f340cWangfei else if (!strcasecmp (optarg, "yuvpipe")) 241347f7043d4203022ce1ac8653de70cc40f2f340cWangfei handler_type = TestHandlerYuvPipe; 2426e05115ccae00564c2fad6e02d16230ca38459d5yaowang else if (!strcasecmp (optarg, "tonemapping")) 2436e05115ccae00564c2fad6e02d16230ca38459d5yaowang handler_type = TestHandlerTonemapping; 2448e5e3e4bb0c6f1fd26b577d3cc21020fb2b338c6Wangfei else if (!strcasecmp (optarg, "retinex")) 2458e5e3e4bb0c6f1fd26b577d3cc21020fb2b338c6Wangfei handler_type = TestHandlerRetinex; 2466523286e77ad1338a3362fe1f6b7a1c115168ecfWangfei else if (!strcasecmp (optarg, "gauss")) 2476523286e77ad1338a3362fe1f6b7a1c115168ecfWangfei handler_type = TestHandlerGauss; 248b7140441fcd8da54d05ee5598c720535380d4f16zongwave else if (!strcasecmp (optarg, "wavelet-hat")) 249b7140441fcd8da54d05ee5598c720535380d4f16zongwave handler_type = TestHandlerHatWavelet; 250b7140441fcd8da54d05ee5598c720535380d4f16zongwave else if (!strcasecmp (optarg, "wavelet-haar")) 251b7140441fcd8da54d05ee5598c720535380d4f16zongwave handler_type = TestHandlerHaarWavelet; 252f4e17ab3b9c58451ee7a9e67ead0ad6c5a2c5560Wind Yuan else if (!strcasecmp (optarg, "dcp")) 253f4e17ab3b9c58451ee7a9e67ead0ad6c5a2c5560Wind Yuan handler_type = TestHandlerDefogDcp; 254bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave else if (!strcasecmp (optarg, "3d-denoise")) 255bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave handler_type = TestHandler3DDenoise; 256233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave else if (!strcasecmp (optarg, "warp")) 257233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave handler_type = TestHandlerImageWarp; 25874f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan else if (!strcasecmp (optarg, "fisheye")) 25974f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan handler_type = TestHandlerFisheye; 26020f67cbe646347772cb1da56a58801aa623b24feWind Yuan else 26120f67cbe646347772cb1da56a58801aa623b24feWind Yuan print_help (bin_name); 26220f67cbe646347772cb1da56a58801aa623b24feWind Yuan break; 26320f67cbe646347772cb1da56a58801aa623b24feWind Yuan } 2644322c5668e7751452098015067f015a3432aeeddYinhang Liu case 'k': 2654322c5668e7751452098015067f015a3432aeeddYinhang Liu bin_kernel_path = optarg; 2664322c5668e7751452098015067f015a3432aeeddYinhang Liu break; 267cf536697155a16e35f17199ca7a31645c61d9802wangfei case 'p': 268cf536697155a16e35f17199ca7a31645c61d9802wangfei kernel_loop_count = atoi (optarg); 2690ad35acf97e48002078c1cc3100c1169e46d71c4Wind Yuan XCAM_ASSERT (kernel_loop_count >= 0 && kernel_loop_count < INT32_MAX); 270cf536697155a16e35f17199ca7a31645c61d9802wangfei break; 2711a7d9f3b0e4151dbeae336ee54d97dad8dfc3873wangfei case 'c': 272227ba2742550ba2e800ca45ca723bc1f87766425wangfei if (!strcasecmp (optarg, "rgbatonv12")) 2731a7d9f3b0e4151dbeae336ee54d97dad8dfc3873wangfei csc_type = CL_CSC_TYPE_RGBATONV12; 274227ba2742550ba2e800ca45ca723bc1f87766425wangfei else if (!strcasecmp (optarg, "rgbatolab")) 2751a7d9f3b0e4151dbeae336ee54d97dad8dfc3873wangfei csc_type = CL_CSC_TYPE_RGBATOLAB; 276227ba2742550ba2e800ca45ca723bc1f87766425wangfei else if (!strcasecmp (optarg, "rgba64torgba")) 277227ba2742550ba2e800ca45ca723bc1f87766425wangfei csc_type = CL_CSC_TYPE_RGBA64TORGBA; 2788df40e3e8d0df4957a611e3a7676ca3a3209d950wangfei else if (!strcasecmp (optarg, "yuyvtorgba")) 2798df40e3e8d0df4957a611e3a7676ca3a3209d950wangfei csc_type = CL_CSC_TYPE_YUYVTORGBA; 2808df40e3e8d0df4957a611e3a7676ca3a3209d950wangfei else if (!strcasecmp (optarg, "nv12torgba")) 2818df40e3e8d0df4957a611e3a7676ca3a3209d950wangfei csc_type = CL_CSC_TYPE_NV12TORGBA; 2821a7d9f3b0e4151dbeae336ee54d97dad8dfc3873wangfei else 2831a7d9f3b0e4151dbeae336ee54d97dad8dfc3873wangfei print_help (bin_name); 2841a7d9f3b0e4151dbeae336ee54d97dad8dfc3873wangfei break; 285125221b9727cffe7ad0b230fec257520179ebc1cwangfei 28643135774c9809eef3d6645cbcc008b36d1cf8201Wind Yuan case 'b': 28743135774c9809eef3d6645cbcc008b36d1cf8201Wind Yuan enable_bnr = true; 28843135774c9809eef3d6645cbcc008b36d1cf8201Wind Yuan break; 28943135774c9809eef3d6645cbcc008b36d1cf8201Wind Yuan 2906b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu case 'P': 2916b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu enable_psnr = true; 2926b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu break; 2936b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 29420f67cbe646347772cb1da56a58801aa623b24feWind Yuan case 'h': 29520f67cbe646347772cb1da56a58801aa623b24feWind Yuan print_help (bin_name); 29620f67cbe646347772cb1da56a58801aa623b24feWind Yuan return 0; 29720f67cbe646347772cb1da56a58801aa623b24feWind Yuan 29820f67cbe646347772cb1da56a58801aa623b24feWind Yuan default: 29920f67cbe646347772cb1da56a58801aa623b24feWind Yuan print_help (bin_name); 30020f67cbe646347772cb1da56a58801aa623b24feWind Yuan return -1; 30120f67cbe646347772cb1da56a58801aa623b24feWind Yuan } 30220f67cbe646347772cb1da56a58801aa623b24feWind Yuan } 30320f67cbe646347772cb1da56a58801aa623b24feWind Yuan 3046b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu if (!input_format || !input_file || !output_file || (enable_psnr && !refer_file) || handler_type == TestHandlerUnknown) { 30520f67cbe646347772cb1da56a58801aa623b24feWind Yuan print_help (bin_name); 30620f67cbe646347772cb1da56a58801aa623b24feWind Yuan return -1; 30720f67cbe646347772cb1da56a58801aa623b24feWind Yuan } 30820f67cbe646347772cb1da56a58801aa623b24feWind Yuan 309136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan ret = input_fp.open (input_file, "rb"); 310136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan CHECK (ret, "open input file(%s) failed", XCAM_STR (input_file)); 311136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan ret = output_fp.open (output_file, "wb"); 312136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan CHECK (ret, "open output file(%s) failed", XCAM_STR (output_file)); 3136b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu if (enable_psnr) { 314136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan refer_fp.open (refer_file, "rb"); 315136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan CHECK (ret, "open reference file(%s) failed", XCAM_STR (refer_file)); 31620f67cbe646347772cb1da56a58801aa623b24feWind Yuan } 31720f67cbe646347772cb1da56a58801aa623b24feWind Yuan 31820f67cbe646347772cb1da56a58801aa623b24feWind Yuan context = CLDevice::instance ()->get_context (); 31920f67cbe646347772cb1da56a58801aa623b24feWind Yuan 32020f67cbe646347772cb1da56a58801aa623b24feWind Yuan switch (handler_type) { 32120f67cbe646347772cb1da56a58801aa623b24feWind Yuan case TestHandlerDemo: 3224322c5668e7751452098015067f015a3432aeeddYinhang Liu if (!bin_kernel_path) 3234322c5668e7751452098015067f015a3432aeeddYinhang Liu image_handler = create_cl_demo_image_handler (context); 3244322c5668e7751452098015067f015a3432aeeddYinhang Liu else { 3254322c5668e7751452098015067f015a3432aeeddYinhang Liu FileHandle file; 3264322c5668e7751452098015067f015a3432aeeddYinhang Liu if (file.open (bin_kernel_path, "r") != XCAM_RETURN_NO_ERROR) { 3274322c5668e7751452098015067f015a3432aeeddYinhang Liu XCAM_LOG_ERROR ("open binary kernel failed"); 3284322c5668e7751452098015067f015a3432aeeddYinhang Liu return -1; 3294322c5668e7751452098015067f015a3432aeeddYinhang Liu } 3304322c5668e7751452098015067f015a3432aeeddYinhang Liu 3314322c5668e7751452098015067f015a3432aeeddYinhang Liu size_t size; 3324322c5668e7751452098015067f015a3432aeeddYinhang Liu if (file.get_file_size (size) != XCAM_RETURN_NO_ERROR) { 3334322c5668e7751452098015067f015a3432aeeddYinhang Liu XCAM_LOG_ERROR ("get binary kernel size failed"); 3344322c5668e7751452098015067f015a3432aeeddYinhang Liu return -1; 3354322c5668e7751452098015067f015a3432aeeddYinhang Liu } 3364322c5668e7751452098015067f015a3432aeeddYinhang Liu 33775f79419d0f76d18c23fc3aeca30ee8286c62682Wind Yuan uint8_t *binary = (uint8_t *) xcam_malloc0 (sizeof (uint8_t) * (size)); 3384322c5668e7751452098015067f015a3432aeeddYinhang Liu XCAM_ASSERT (binary); 3394322c5668e7751452098015067f015a3432aeeddYinhang Liu 3404322c5668e7751452098015067f015a3432aeeddYinhang Liu if (file.read_file (binary, size) != XCAM_RETURN_NO_ERROR) { 3414322c5668e7751452098015067f015a3432aeeddYinhang Liu XCAM_LOG_ERROR ("read binary kernel failed"); 34275f79419d0f76d18c23fc3aeca30ee8286c62682Wind Yuan xcam_free (binary); 3434322c5668e7751452098015067f015a3432aeeddYinhang Liu return -1; 3444322c5668e7751452098015067f015a3432aeeddYinhang Liu } 3454322c5668e7751452098015067f015a3432aeeddYinhang Liu 34675f79419d0f76d18c23fc3aeca30ee8286c62682Wind Yuan image_handler = create_cl_binary_demo_image_handler (context, binary, size); 34775f79419d0f76d18c23fc3aeca30ee8286c62682Wind Yuan xcam_free (binary); 3484322c5668e7751452098015067f015a3432aeeddYinhang Liu } 34920f67cbe646347772cb1da56a58801aa623b24feWind Yuan break; 3506ea2221881fa41cbbe9988dedd4917be5c64cc08wangfei case TestHandlerColorConversion: { 35135601bd44d082de6553d149aaa3f1acc0edec660wangfei SmartPtr<CLCscImageHandler> csc_handler; 35235601bd44d082de6553d149aaa3f1acc0edec660wangfei XCam3aResultColorMatrix color_matrix; 3530ad35acf97e48002078c1cc3100c1169e46d71c4Wind Yuan xcam_mem_clear (color_matrix); 35435601bd44d082de6553d149aaa3f1acc0edec660wangfei double matrix_table[XCAM_COLOR_MATRIX_SIZE] = {0.299, 0.587, 0.114, -0.14713, -0.28886, 0.436, 0.615, -0.51499, -0.10001}; 35535601bd44d082de6553d149aaa3f1acc0edec660wangfei memcpy (color_matrix.matrix, matrix_table, sizeof(double)*XCAM_COLOR_MATRIX_SIZE); 3561a7d9f3b0e4151dbeae336ee54d97dad8dfc3873wangfei image_handler = create_cl_csc_image_handler (context, csc_type); 35735601bd44d082de6553d149aaa3f1acc0edec660wangfei csc_handler = image_handler.dynamic_cast_ptr<CLCscImageHandler> (); 35835601bd44d082de6553d149aaa3f1acc0edec660wangfei XCAM_ASSERT (csc_handler.ptr ()); 359be505049e0d0cd218324c728b840652ac54bd19fWind Yuan csc_handler->set_matrix(color_matrix); 36020f67cbe646347772cb1da56a58801aa623b24feWind Yuan break; 3616ea2221881fa41cbbe9988dedd4917be5c64cc08wangfei } 3621c90c3e61f731e076d8cdd3d3e6825f93457a60dWind Yuan case TestHandlerBayerPipe: { 3631c90c3e61f731e076d8cdd3d3e6825f93457a60dWind Yuan image_handler = create_cl_bayer_pipe_image_handler (context); 3641c90c3e61f731e076d8cdd3d3e6825f93457a60dWind Yuan SmartPtr<CLBayerPipeImageHandler> bayer_pipe = image_handler.dynamic_cast_ptr<CLBayerPipeImageHandler> (); 3651c90c3e61f731e076d8cdd3d3e6825f93457a60dWind Yuan XCAM_ASSERT (bayer_pipe.ptr ()); 36643135774c9809eef3d6645cbcc008b36d1cf8201Wind Yuan bayer_pipe->set_output_format (output_format); 36743135774c9809eef3d6645cbcc008b36d1cf8201Wind Yuan bayer_pipe->enable_denoise (enable_bnr); 3681c90c3e61f731e076d8cdd3d3e6825f93457a60dWind Yuan break; 3691c90c3e61f731e076d8cdd3d3e6825f93457a60dWind Yuan } 370347f7043d4203022ce1ac8653de70cc40f2f340cWangfei case TestHandlerYuvPipe: { 371347f7043d4203022ce1ac8653de70cc40f2f340cWangfei image_handler = create_cl_yuv_pipe_image_handler (context); 372347f7043d4203022ce1ac8653de70cc40f2f340cWangfei SmartPtr<CLYuvPipeImageHandler> yuv_pipe = image_handler.dynamic_cast_ptr<CLYuvPipeImageHandler> (); 373347f7043d4203022ce1ac8653de70cc40f2f340cWangfei XCAM_ASSERT (yuv_pipe.ptr ()); 374347f7043d4203022ce1ac8653de70cc40f2f340cWangfei break; 375347f7043d4203022ce1ac8653de70cc40f2f340cWangfei } 3766e05115ccae00564c2fad6e02d16230ca38459d5yaowang case TestHandlerTonemapping: { 3776e05115ccae00564c2fad6e02d16230ca38459d5yaowang image_handler = create_cl_tonemapping_image_handler (context); 3786e05115ccae00564c2fad6e02d16230ca38459d5yaowang SmartPtr<CLTonemappingImageHandler> tonemapping_pipe = image_handler.dynamic_cast_ptr<CLTonemappingImageHandler> (); 3796e05115ccae00564c2fad6e02d16230ca38459d5yaowang XCAM_ASSERT (tonemapping_pipe.ptr ()); 3806e05115ccae00564c2fad6e02d16230ca38459d5yaowang break; 3816e05115ccae00564c2fad6e02d16230ca38459d5yaowang } 3828e5e3e4bb0c6f1fd26b577d3cc21020fb2b338c6Wangfei case TestHandlerRetinex: { 3838e5e3e4bb0c6f1fd26b577d3cc21020fb2b338c6Wangfei image_handler = create_cl_retinex_image_handler (context); 3848e5e3e4bb0c6f1fd26b577d3cc21020fb2b338c6Wangfei SmartPtr<CLRetinexImageHandler> retinex = image_handler.dynamic_cast_ptr<CLRetinexImageHandler> (); 3858e5e3e4bb0c6f1fd26b577d3cc21020fb2b338c6Wangfei XCAM_ASSERT (retinex.ptr ()); 3868e5e3e4bb0c6f1fd26b577d3cc21020fb2b338c6Wangfei break; 3878e5e3e4bb0c6f1fd26b577d3cc21020fb2b338c6Wangfei } 3886523286e77ad1338a3362fe1f6b7a1c115168ecfWangfei case TestHandlerGauss: { 3896523286e77ad1338a3362fe1f6b7a1c115168ecfWangfei image_handler = create_cl_gauss_image_handler (context); 3906523286e77ad1338a3362fe1f6b7a1c115168ecfWangfei SmartPtr<CLGaussImageHandler> gauss = image_handler.dynamic_cast_ptr<CLGaussImageHandler> (); 3916523286e77ad1338a3362fe1f6b7a1c115168ecfWangfei XCAM_ASSERT (gauss.ptr ()); 3926523286e77ad1338a3362fe1f6b7a1c115168ecfWangfei break; 3936523286e77ad1338a3362fe1f6b7a1c115168ecfWangfei } 394b7140441fcd8da54d05ee5598c720535380d4f16zongwave case TestHandlerHatWavelet: { 39598d23209aed256b292214659d89112dccbe75ebczongwave image_handler = create_cl_wavelet_denoise_image_handler (context, CL_IMAGE_CHANNEL_UV); 396bc1e07124ab6930b3462042eb4977f00b94c5a8dWind Yuan SmartPtr<CLWaveletDenoiseImageHandler> wavelet = image_handler.dynamic_cast_ptr<CLWaveletDenoiseImageHandler> (); 397bc1e07124ab6930b3462042eb4977f00b94c5a8dWind Yuan XCAM_ASSERT (wavelet.ptr ()); 398bc1e07124ab6930b3462042eb4977f00b94c5a8dWind Yuan XCam3aResultWaveletNoiseReduction wavelet_config; 3990ad35acf97e48002078c1cc3100c1169e46d71c4Wind Yuan xcam_mem_clear (wavelet_config); 400fde746ddc36cd76394347aad055f2d0a168379adzongwave wavelet_config.threshold[0] = 0.2; 401fde746ddc36cd76394347aad055f2d0a168379adzongwave wavelet_config.threshold[1] = 0.5; 4020ad35acf97e48002078c1cc3100c1169e46d71c4Wind Yuan wavelet_config.decomposition_levels = 4; 403cc33d31edd6b0b00e785ba97d0b1af7dd28a53bczongwave wavelet_config.analog_gain = 0.001; 404bc1e07124ab6930b3462042eb4977f00b94c5a8dWind Yuan wavelet->set_denoise_config (wavelet_config); 405bc1e07124ab6930b3462042eb4977f00b94c5a8dWind Yuan break; 406bc1e07124ab6930b3462042eb4977f00b94c5a8dWind Yuan } 407b7140441fcd8da54d05ee5598c720535380d4f16zongwave case TestHandlerHaarWavelet: { 40898d23209aed256b292214659d89112dccbe75ebczongwave image_handler = create_cl_newwavelet_denoise_image_handler (context, CL_IMAGE_CHANNEL_UV | CL_IMAGE_CHANNEL_Y, false); 409b7140441fcd8da54d05ee5598c720535380d4f16zongwave SmartPtr<CLNewWaveletDenoiseImageHandler> wavelet = image_handler.dynamic_cast_ptr<CLNewWaveletDenoiseImageHandler> (); 410b7140441fcd8da54d05ee5598c720535380d4f16zongwave XCAM_ASSERT (wavelet.ptr ()); 411b7140441fcd8da54d05ee5598c720535380d4f16zongwave XCam3aResultWaveletNoiseReduction wavelet_config; 412fde746ddc36cd76394347aad055f2d0a168379adzongwave wavelet_config.threshold[0] = 0.2; 413fde746ddc36cd76394347aad055f2d0a168379adzongwave wavelet_config.threshold[1] = 0.5; 414b7140441fcd8da54d05ee5598c720535380d4f16zongwave wavelet_config.decomposition_levels = 4; 415cc33d31edd6b0b00e785ba97d0b1af7dd28a53bczongwave wavelet_config.analog_gain = 0.001; 416b7140441fcd8da54d05ee5598c720535380d4f16zongwave wavelet->set_denoise_config (wavelet_config); 417b7140441fcd8da54d05ee5598c720535380d4f16zongwave break; 418b7140441fcd8da54d05ee5598c720535380d4f16zongwave } 419f4e17ab3b9c58451ee7a9e67ead0ad6c5a2c5560Wind Yuan case TestHandlerDefogDcp: { 420f4e17ab3b9c58451ee7a9e67ead0ad6c5a2c5560Wind Yuan image_handler = create_cl_defog_dcp_image_handler (context); 421f4e17ab3b9c58451ee7a9e67ead0ad6c5a2c5560Wind Yuan XCAM_ASSERT (image_handler.ptr ()); 422f4e17ab3b9c58451ee7a9e67ead0ad6c5a2c5560Wind Yuan break; 423f4e17ab3b9c58451ee7a9e67ead0ad6c5a2c5560Wind Yuan } 424bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave case TestHandler3DDenoise: { 425b43f99c0ca903a62838628dc1c06f3d5fb576746zongwave uint8_t ref_count = 2; 426b43f99c0ca903a62838628dc1c06f3d5fb576746zongwave image_handler = create_cl_3d_denoise_image_handler (context, CL_IMAGE_CHANNEL_Y | CL_IMAGE_CHANNEL_UV, ref_count); 427bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave SmartPtr<CL3DDenoiseImageHandler> denoise = image_handler.dynamic_cast_ptr<CL3DDenoiseImageHandler> (); 428bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave XCAM_ASSERT (denoise.ptr ()); 429bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave XCam3aResultTemporalNoiseReduction denoise_config; 430bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave xcam_mem_clear (denoise_config); 431bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave denoise_config.threshold[0] = 0.05; 432bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave denoise_config.threshold[1] = 0.05; 433bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave denoise_config.gain = 0.6; 434bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave denoise->set_denoise_config (denoise_config); 435233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave break; 436233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave } 437233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave case TestHandlerImageWarp: { 438233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave image_handler = create_cl_image_warp_handler (context); 439233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave SmartPtr<CLImageWarpHandler> warp = image_handler.dynamic_cast_ptr<CLImageWarpHandler> (); 440233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave XCAM_ASSERT (warp.ptr ()); 441233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave XCamDVSResult warp_config; 442233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave xcam_mem_clear (warp_config); 443233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.frame_id = 1; 444233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.frame_width = width; 445233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.frame_height = height; 446233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave 447233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave float theta = -10.0f; 448233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave float phi = 10.0f; 449233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave 450233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave float shift_x = -0.2f * width; 451233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave float shift_y = 0.2f * height; 452233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave float scale_x = 2.0f; 453233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave float scale_y = 0.5f; 454233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave float shear_x = tan(theta * 3.1415926 / 180.0f); 455233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave float shear_y = tan(phi * 3.1415926 / 180.0f); 456233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave float project_x = 2.0f / width; 457233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave float project_y = -1.0f / height; 458233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave 459233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.proj_mat[0] = scale_x; 460233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.proj_mat[1] = shear_x; 461233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.proj_mat[2] = shift_x; 462233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.proj_mat[3] = shear_y; 463233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.proj_mat[4] = scale_y; 464233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.proj_mat[5] = shift_y; 465233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.proj_mat[6] = project_x; 466233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.proj_mat[7] = project_y; 467233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp_config.proj_mat[8] = 1.0f; 468233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave 469233fe1a70a00dd094cfa8fe58d5ebdbe91c2e72azongwave warp->set_warp_config (warp_config); 470bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave break; 471bec89e12eafc649573ed9fa771a2ac1ea4bb54aazongwave } 47274f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan case TestHandlerFisheye: { 47374f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan image_handler = create_fisheye_handler (context); 47474f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan SmartPtr<CLFisheyeHandler> fisheye = image_handler.dynamic_cast_ptr<CLFisheyeHandler> (); 47574f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan XCAM_ASSERT (fisheye.ptr ()); 4760995e53b9064a563b343a9bdcd50ecf88bf84becWind Yuan FisheyeInfo fisheye_info; 47795b94fe4eb62f3945045cf69216631c156b98debWind Yuan //fisheye0 {480.0f, 480.0f, 190.0f, 480.0f, -90.0f}, 47895b94fe4eb62f3945045cf69216631c156b98debWind Yuan //fisheye1 {1440.0f, 480.0f, 190.0f, 480.0f, 90.0f} 47974f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan fisheye_info.center_x = 480.0f; 48074f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan fisheye_info.center_y = 480.0f; 48195b94fe4eb62f3945045cf69216631c156b98debWind Yuan fisheye_info.wide_angle = 190.0f; 48274f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan fisheye_info.radius = 480.0f; 48374f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan fisheye_info.rotate_angle = -90.0f; 48474f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan fisheye->set_fisheye_info (fisheye_info); 48595b94fe4eb62f3945045cf69216631c156b98debWind Yuan fisheye->set_dst_range (210.0f, 180.0f); 48695b94fe4eb62f3945045cf69216631c156b98debWind Yuan fisheye->set_output_size (1120, 960); 48774f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan break; 48874f9fdaec5d67618e5c08a6ed9ce61c9f9a3ad0dWind Yuan } 48920f67cbe646347772cb1da56a58801aa623b24feWind Yuan default: 49020f67cbe646347772cb1da56a58801aa623b24feWind Yuan XCAM_LOG_ERROR ("unsupported image handler type:%d", handler_type); 49120f67cbe646347772cb1da56a58801aa623b24feWind Yuan return -1; 49220f67cbe646347772cb1da56a58801aa623b24feWind Yuan } 49320f67cbe646347772cb1da56a58801aa623b24feWind Yuan if (!image_handler.ptr ()) { 49420f67cbe646347772cb1da56a58801aa623b24feWind Yuan XCAM_LOG_ERROR ("create image_handler failed"); 49520f67cbe646347772cb1da56a58801aa623b24feWind Yuan return -1; 49620f67cbe646347772cb1da56a58801aa623b24feWind Yuan } 49720f67cbe646347772cb1da56a58801aa623b24feWind Yuan 4988b3bf7a898e54a3b7fa4c7825ac99a9d795b83ffzongwave input_buf_info.init (input_format, width, height); 499cff638b59385036cbc91873a9965282c8861a306Yinhang Liu 500cff638b59385036cbc91873a9965282c8861a306Yinhang Liu buf_pool = new CLVideoBufferPool (); 501cff638b59385036cbc91873a9965282c8861a306Yinhang Liu image_handler->set_pool_type (CLImageHandler::CLVideoPoolType); 5024bbe4ecab625be7f5f2e56d1e87f326dd61a2bf1Wind Yuan buf_pool->set_video_info (input_buf_info); 5034bbe4ecab625be7f5f2e56d1e87f326dd61a2bf1Wind Yuan if (!buf_pool->reserve (6)) { 50420f67cbe646347772cb1da56a58801aa623b24feWind Yuan XCAM_LOG_ERROR ("init buffer pool failed"); 50520f67cbe646347772cb1da56a58801aa623b24feWind Yuan return -1; 50620f67cbe646347772cb1da56a58801aa623b24feWind Yuan } 50720f67cbe646347772cb1da56a58801aa623b24feWind Yuan 5086b5f71042b969ae41362e07660181a676685702bYinhang Liu SmartPtr<VideoBuffer> input_buf, output_buf, psnr_cur, psnr_ref; 509e676aec5b2125467eb78e471fc0b3e0389cbf297Yinhang Liu while (true) { 5106b5f71042b969ae41362e07660181a676685702bYinhang Liu input_buf = buf_pool->get_buffer (buf_pool); 51120f67cbe646347772cb1da56a58801aa623b24feWind Yuan XCAM_ASSERT (input_buf.ptr ()); 5126b5f71042b969ae41362e07660181a676685702bYinhang Liu 513136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan ret = input_fp.read_buf (input_buf); 514e676aec5b2125467eb78e471fc0b3e0389cbf297Yinhang Liu if (ret == XCAM_RETURN_BYPASS) 515e676aec5b2125467eb78e471fc0b3e0389cbf297Yinhang Liu break; 516e676aec5b2125467eb78e471fc0b3e0389cbf297Yinhang Liu if (ret == XCAM_RETURN_ERROR_FILE) { 517e676aec5b2125467eb78e471fc0b3e0389cbf297Yinhang Liu XCAM_LOG_ERROR ("read buffer from %s failed", XCAM_STR (input_file)); 518e676aec5b2125467eb78e471fc0b3e0389cbf297Yinhang Liu return -1; 519e676aec5b2125467eb78e471fc0b3e0389cbf297Yinhang Liu } 520cf536697155a16e35f17199ca7a31645c61d9802wangfei 521cf536697155a16e35f17199ca7a31645c61d9802wangfei if (kernel_loop_count != 0) 522cf536697155a16e35f17199ca7a31645c61d9802wangfei { 523cf536697155a16e35f17199ca7a31645c61d9802wangfei kernel_loop (image_handler, input_buf, output_buf, kernel_loop_count); 524cf536697155a16e35f17199ca7a31645c61d9802wangfei CHECK (ret, "execute kernels failed"); 525cf536697155a16e35f17199ca7a31645c61d9802wangfei return 0; 526cf536697155a16e35f17199ca7a31645c61d9802wangfei } 527cf536697155a16e35f17199ca7a31645c61d9802wangfei 52820f67cbe646347772cb1da56a58801aa623b24feWind Yuan ret = image_handler->execute (input_buf, output_buf); 5291f31ef0ea04242f581d1c37f21b47cff931c93b4Wind Yuan CHECK_EXP ((ret == XCAM_RETURN_NO_ERROR || ret == XCAM_RETURN_BYPASS), "execute kernels failed"); 5301f31ef0ea04242f581d1c37f21b47cff931c93b4Wind Yuan if (ret == XCAM_RETURN_BYPASS) 5311f31ef0ea04242f581d1c37f21b47cff931c93b4Wind Yuan continue; 532be505049e0d0cd218324c728b840652ac54bd19fWind Yuan context->finish (); 5331f31ef0ea04242f581d1c37f21b47cff931c93b4Wind Yuan XCAM_ASSERT (output_buf.ptr ()); 534136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan ret = output_fp.write_buf (output_buf); 5351f31ef0ea04242f581d1c37f21b47cff931c93b4Wind Yuan CHECK (ret, "write buffer to %s failed", XCAM_STR (output_file)); 5366b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu psnr_cur = output_buf; 53720f67cbe646347772cb1da56a58801aa623b24feWind Yuan 53820f67cbe646347772cb1da56a58801aa623b24feWind Yuan ++buf_count; 53920f67cbe646347772cb1da56a58801aa623b24feWind Yuan } 5406b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 54120f67cbe646347772cb1da56a58801aa623b24feWind Yuan XCAM_LOG_INFO ("processed %d buffers successfully", buf_count); 5426b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 5436b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu if (enable_psnr) { 544cff638b59385036cbc91873a9965282c8861a306Yinhang Liu buf_pool = new CLVideoBufferPool (); 5456b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_ASSERT (buf_pool.ptr ()); 5466b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu buf_pool->set_video_info (input_buf_info); 5476b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu if (!buf_pool->reserve (6)) { 5486b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_LOG_ERROR ("init buffer pool failed"); 5496b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu return -1; 5506b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu } 5516b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 5526b5f71042b969ae41362e07660181a676685702bYinhang Liu psnr_ref = buf_pool->get_buffer (buf_pool); 5536b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_ASSERT (psnr_ref.ptr ()); 5546b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 555136aa4f5809c82471d07e68270bd3c8aa5c9a533Wind Yuan ret = refer_fp.read_buf (psnr_ref); 5566b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu CHECK (ret, "read buffer from %s failed", refer_file); 5576b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 5586b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu float psnr = 0.0f; 5596b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu ret = calculate_psnr (psnr_cur, psnr_ref, PSNRY, psnr); 5606b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu CHECK (ret, "calculate PSNR_Y failed"); 5616b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_LOG_INFO ("PSNR_Y: %.2f", psnr); 5626b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 5636b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu image_handler = create_cl_csc_image_handler (context, CL_CSC_TYPE_NV12TORGBA); 5646b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_ASSERT (image_handler.ptr ()); 5656b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 5666b5f71042b969ae41362e07660181a676685702bYinhang Liu SmartPtr<VideoBuffer> psnr_cur_output, psnr_ref_output; 5676b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu ret = image_handler->execute (psnr_cur, psnr_cur_output); 5686b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu CHECK (ret, "execute kernels failed"); 5696b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_ASSERT (psnr_cur_output.ptr ()); 5706b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 5716b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu ret = image_handler->execute (psnr_ref, psnr_ref_output); 5726b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu CHECK (ret, "execute kernels failed"); 5736b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_ASSERT (psnr_ref_output.ptr ()); 5746b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 5756b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu ret = calculate_psnr (psnr_cur_output, psnr_ref_output, PSNRR, psnr); 5766b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu CHECK (ret, "calculate PSNR_R failed"); 5776b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_LOG_INFO ("PSNR_R: %.2f", psnr); 5786b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 5796b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu ret = calculate_psnr (psnr_cur_output, psnr_ref_output, PSNRG, psnr); 5806b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu CHECK (ret, "calculate PSNR_G failed"); 5816b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_LOG_INFO ("PSNR_G: %.2f", psnr); 5826b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 5836b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu ret = calculate_psnr (psnr_cur_output, psnr_ref_output, PSNRB, psnr); 5846b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu CHECK (ret, "calculate PSNR_B failed"); 5856b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu XCAM_LOG_INFO ("PSNR_B: %.2f", psnr); 5866b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu } 5876b3e260deeb8ee6f157dd11c38f9e75ab094baefYinhang Liu 58820f67cbe646347772cb1da56a58801aa623b24feWind Yuan return 0; 58920f67cbe646347772cb1da56a58801aa623b24feWind Yuan} 590