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