13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Redistribution and use in source and binary forms, with or without
43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * modification, are permitted provided that the following conditions are
53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * met:
63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Redistributions of source code must retain the above copyright
73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       notice, this list of conditions and the following disclaimer.
83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Redistributions in binary form must reproduce the above
93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       copyright notice, this list of conditions and the following
103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       disclaimer in the documentation and/or other materials provided
113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       with the distribution.
123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Neither the name of The Linux Foundation nor the names of its
133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       contributors may be used to endorse or promote products derived
143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       from this software without specific prior written permission.
153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */
293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies
313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <dlfcn.h>
323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdbool.h>
333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdlib.h>
343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <sys/time.h>
353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies
373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "img_buffer.h"
383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_lib2d.h"
393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ENABLE_OUTPUT_DUMP 1
423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ALIGN4K 4032
433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ALIGN(a, b) (((a) + (b)) & ~(b))
443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** DUMP_TO_FILE:
473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @filename: file name
483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @p_addr: address of the buffer
493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @len: buffer length
503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  dump the image to the file
523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define DUMP_TO_FILE(filename, p_addr, len) ({ \
543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  size_t rc = 0; \
553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  FILE *fp = fopen(filename, "w+"); \
563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if (fp) { \
573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = fwrite(p_addr, 1, len, fp); \
583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf(" ] written size %zu \n",  __LINE__, len); \
593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fclose(fp); \
603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } else { \
613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf(" ] open %s failed \n",  __LINE__, filename); \
623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } \
633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** DUMP_TO_FILE2:
663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @filename: file name
673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @p_addr: address of the buffer
683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @len: buffer length
693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  dump the image to the file if the memory is non-contiguous
713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define DUMP_TO_FILE2(filename, p_addr1, len1, p_addr2, len2) ({ \
733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  size_t rc = 0; \
743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  FILE *fp = fopen(filename, "w+"); \
753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if (fp) { \
763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = fwrite(p_addr1, 1, len1, fp); \
773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = fwrite(p_addr2, 1, len2, fp); \
783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf(" ] written %zu %zu \n",  __LINE__, len1, len2); \
793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fclose(fp); \
803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } else { \
813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf(" ] open %s failed \n",  __LINE__, filename); \
823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } \
833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** img_lib_buffert
863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @ptr: handle to the imglib library
873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @img_buffer_get: function pointer to img_buffer_get
883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @img_buffer_release: function pointer to img_buffer_release
893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @img_buffer_cacheops: function pointer to img_buffer_cacheops
903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel**/
913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  void *ptr;
933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int (*img_buffer_get)(img_buf_type_t type, int heapid, int8_t cached, int length,
943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    img_mem_handle_t *p_handle);
953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int (*img_buffer_release)(img_mem_handle_t *p_handle);
963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int (*img_buffer_cacheops)(img_mem_handle_t *p_handle, img_cache_ops_t ops,
973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  img_mem_alloc_type_t mem_alloc_type);
983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} img_lib_buffert;
993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** input_yuv_data
1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @filename: input test filename
1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @format: format of the input yuv frame
1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @wdith: wdith of the input yuv frame
1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @height: height of the input yuv frame
1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stride: stride of the input yuv frame
1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @offset: offset to the yuv data in the input file
1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel**/
1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct input_yuv_data_t {
1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  char filename[512];
1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  cam_format_t format;
1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t wdith;
1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t height;
1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t stride;
1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t offset;
1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} input_yuv_data;
1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelinput_yuv_data input_nv21[] = {
1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample0_768x512.yuv",                             CAM_FORMAT_YUV_420_NV21, 768,  512,  768,  0},
1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample1_3200x2400.yuv",                           CAM_FORMAT_YUV_420_NV21, 3200, 2400, 3200, 0},
1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample2_1920x1080.yuv",                           CAM_FORMAT_YUV_420_NV21, 1920, 1080, 1920, 0},
1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample3_3200x2400.yuv",                           CAM_FORMAT_YUV_420_NV21, 3200, 2400, 3200, 0},
1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample4_4208x3120.yuv",                           CAM_FORMAT_YUV_420_NV21, 4208, 3120, 4208, 0},
1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample5_1984x2592.yuv",                           CAM_FORMAT_YUV_420_NV21, 1984, 2592, 1984, 0},
1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample6_4000_3000.yuv",                           CAM_FORMAT_YUV_420_NV21, 4000, 3000, 4000, 0},
1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample7_3200_2400.yuv",                           CAM_FORMAT_YUV_420_NV21, 3200, 2400, 3200, 0},
1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample8_3008_4000.yuv",                           CAM_FORMAT_YUV_420_NV21, 3008, 4000, 3008, 0},
1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample9_5312x2988.yuv",                           CAM_FORMAT_YUV_420_NV21, 5312, 2988, 5312, 0},
1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample10_4128x3096.yuv",                          CAM_FORMAT_YUV_420_NV21, 4128, 3096, 4128, 0},
1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample11_4208x3120.yuv",                          CAM_FORMAT_YUV_420_NV21, 4208, 3120, 4208, 0},
1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample12_3200x2400.yuv",                          CAM_FORMAT_YUV_420_NV21, 3200, 2400, 3200, 0},
1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample13_width_1080_height_1440_stride_1088.yuv", CAM_FORMAT_YUV_420_NV21, 1080, 1440, 1088, 0},
1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample14_width_1080_height_1920_stride_1088.yuv", CAM_FORMAT_YUV_420_NV21, 1080, 1920, 1088, 0},
1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample15_width_1944_height_2592_stride_1984.yuv", CAM_FORMAT_YUV_420_NV21, 1944, 2592, 1984, 0},
1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample16_width_3000_height_4000_stride_3008.yuv", CAM_FORMAT_YUV_420_NV21, 3000, 4000, 3008, 0},
1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample17_width_3120_height_4208_stride_3136.yuv", CAM_FORMAT_YUV_420_NV21, 3120, 4208, 3136, 0},
1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample18_width_3200_height_2400_stride_3200.yuv", CAM_FORMAT_YUV_420_NV21, 3200, 2400, 3200, 0},
1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {"sample19_width_1944_height_2592_stride_1984.yuv", CAM_FORMAT_YUV_420_NV21, 1944, 2592, 1984, 0},
1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// assuming buffer format is always ARGB
1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid lib2d_dump_tga(void *addr, cam_format_t format, int width,
1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int height, int stride, char *fname)
1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int i, j;
1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  FILE *f;
1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  unsigned char *pb = (unsigned char *)addr;
1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t *pd = (uint32_t *)addr;
1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int bpp = 32;
1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  f = fopen(fname, "wb");
1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if (f) {
1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // header
1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fprintf(f, "%c%c%c%c", 0, 0, 2, 0);
1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fprintf(f, "%c%c%c%c", 0, 0, 0, 0);
1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fprintf(f, "%c%c%c%c", 0, 0, 0, 0);
1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fprintf(f, "%c%c%c%c", width & 0xff, width >> 8, height & 0xff, height >> 8);
1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fprintf(f, "%c%c", bpp, 32);
1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (i = 0; i < height; i++) {
1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      for (j = 0; j < width; j++) {
1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        fprintf(f, "%c%c%c%c",
1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          pd[(i*stride>>2)+j] & 0xff,           // b
1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          (pd[(i*stride>>2)+j] >> 8) & 0xff,    // g
1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          (pd[(i*stride>>2)+j] >> 16) & 0xff,   // r
1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          (pd[(i*stride>>2)+j] >> 24) & 0xff);  // a
1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      }
1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fclose(f);
1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/**
1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: lib2d_test_client_cb
1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: Callback that is called on completion of requested job.
1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   userdata - App userdata
1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   jobid - job id that is finished execution
1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   MM_LIB2D_SUCCESS
1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   MM_LIB2D_ERR_GENERAL
1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudellib2d_error lib2d_test_client_cb(void *userdata, int jobid)
1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  printf("%s %d, jobid=%d \n",  __LINE__, jobid);
1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  return MM_LIB2D_SUCCESS;
1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/**
1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: lib2d_test_load_input_yuv_data
1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: Loads yuv data from input file.
1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   fileName - input yuv filename
2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   offset - offset to the yuv data in the input file
2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   y_size - y plane size in input yuv file
2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   crcb_size - crcb plane size in input yuv file
2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   crcb_offset - crcb offset in the memory at
2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       which crcb data need to be loaded
2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   addr - y plane memory address where y plane
2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       data need to be loaded.
2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   MM_LIB2D_SUCCESS
2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   MM_LIB2D_ERR_GENERAL
2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudellib2d_error lib2d_test_load_input_yuv_data(char *fileName, int offset,
2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t y_size, int32_t crcb_size, int32_t crcb_offset,
2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    void *addr)
2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  size_t i;
2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  FILE  *fp       = 0;
2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  void  *y_ptr    = addr;
2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  void  *crcb_ptr = (uint8_t *)addr + crcb_offset;
2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  printf("y_ptr=%p, crcb_ptr=%p \n", y_ptr, crcb_ptr);
2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  fp = fopen(fileName, "rb");
2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if(fp) {
2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(offset) {
2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      fseek(fp, offset, SEEK_SET);
2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    i = fread(y_ptr, 1, y_size, fp);
2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    i = fread(crcb_ptr, 1, crcb_size, fp);
2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fclose( fp );
2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } else {
2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("failed to open file %s \n", fileName);
2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return MM_LIB2D_ERR_GENERAL;
2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  return MM_LIB2D_SUCCESS;
2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/**
2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: lib2d_test_load_input_yuv_data
2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: Loads yuv data from input file.
2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   fileName - input yuv filename
2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   offset - offset to the yuv data in the input file
2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   input_yuv_stride - y plane stride in input yuv file
2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   y_plane_stride - y plane stride in buffer memory
2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   height - height of yuv image
2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   crcb_offset - crcb offset in the memory at
2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       which crcb data need to be loaded
2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   addr - y plane memory address where y plane
2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       data need to be loaded.
2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   MM_LIB2D_SUCCESS
2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   MM_LIB2D_ERR_GENERAL
2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudellib2d_error lib2d_test_load_input_yuv_data_linebyline(char *fileName,
2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int offset, int32_t input_yuv_stride, int32_t y_plane_stride,
2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t height, int32_t crcb_offset, void *addr)
2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  size_t i;
2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  FILE  *fp       = 0;
2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  void  *y_ptr    = addr;
2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  void  *crcb_ptr = (uint8_t *)addr + crcb_offset;
2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  printf("y_ptr=%p, crcb_ptr=%p \n", y_ptr, crcb_ptr);
2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  fp = fopen(fileName, "rb");
2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if(fp) {
2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(offset) {
2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      fseek(fp, offset, SEEK_SET);
2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (input_yuv_stride == y_plane_stride) {
2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      //load y plane
2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      i = fread(y_ptr, 1, (input_yuv_stride * height), fp);
2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      // load UV plane
2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      i = fread(crcb_ptr, 1, (input_yuv_stride * height / 2), fp);
2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      int line = 0;
2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      // load Y plane
2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      for (line = 0;line < height; line++) {
2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        i = fread(y_ptr, 1, input_yuv_stride, fp);
2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        y_ptr = (void *)((uint8_t *)y_ptr + y_plane_stride);
2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      }
2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      for (line = 0;line < height; line++) {
2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        i = fread(crcb_ptr, 1, input_yuv_stride, fp);
2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        crcb_ptr = (void *)((uint8_t *)crcb_ptr + y_plane_stride);
2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      }
2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fclose( fp );
2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } else {
3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("failed to open file %s \n", fileName);
3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return MM_LIB2D_ERR_GENERAL;
3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  return MM_LIB2D_SUCCESS;
3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/**
3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Function: main
3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Description: main function for execution
3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Input parameters:
3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   argc - no.of input arguments
3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   argv - list of arguments
3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Return values:
3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   0 on success
3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   -1 on failure
3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Notes: none
3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint main(int32_t argc, const char * argv[])
3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  void            *lib2d_handle       = NULL;
3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  lib2d_error      lib2d_err          = MM_LIB2D_SUCCESS;
3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_lib2d_buffer  src_buffer         = {0};
3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_lib2d_buffer  dst_buffer         = {0};
3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int8_t           ret                = IMG_SUCCESS;
3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          width              = 0;
3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          height             = 0;
3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          input_yuv_stride   = 0;
3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          stride             = 0;
3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          y_plane_stride     = 0;
3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          crcb_plane_stride  = 0;
3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          y_plane_size       = 0;
3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          y_plane_size_align = 0;
3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          crcb_plane_size    = 0;
3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          yuv_size           = 0;
3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          rgb_size           = 0;
3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  img_mem_handle_t m_yuv_memHandle    = { 0 };
3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  img_mem_handle_t m_rgb_memHandle    = { 0 };
3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  char             filename_in[512]   = { 0 };
3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  char             filename_out[512]  = { 0 };
3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  char             filename_raw[512]  = { 0 };
3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t          offset             = 0;
3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  unsigned int     total_tests        = 1;
3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  cam_format_t     format             = CAM_FORMAT_YUV_420_NV21;
3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  unsigned int     index;
3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  const char      *filename;
3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  // Open Imglib library and get the function pointers for
3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  // buffer allocation, free, cacheops
3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  img_lib_buffert  img_lib;
3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  img_lib.ptr = dlopen("libmmcamera_imglib.so", RTLD_NOW);
3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if (!img_lib.ptr) {
3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("%s ERROR: couldn't dlopen libmmcamera_imglib.so: %s",
3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       dlerror());
3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return -1;
3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* Get function pointer for functions to allocate ion memory */
3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  *(void **)&img_lib.img_buffer_get =
3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      dlsym(img_lib.ptr, "img_buffer_get");
3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  *(void **)&img_lib.img_buffer_release =
3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      dlsym(img_lib.ptr, "img_buffer_release");
3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  *(void **)&img_lib.img_buffer_cacheops =
3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      dlsym(img_lib.ptr, "img_buffer_cacheops");
3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* Validate function pointers */
3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if ((img_lib.img_buffer_get == NULL) ||
3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    (img_lib.img_buffer_release == NULL) ||
3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    (img_lib.img_buffer_cacheops == NULL)) {
3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf(" ERROR mapping symbols from libmmcamera_imglib.so");
3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dlclose(img_lib.ptr);
3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return -1;
3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  lib2d_err = mm_lib2d_init(MM_LIB2D_SYNC_MODE, CAM_FORMAT_YUV_420_NV21,
3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CAM_FORMAT_8888_ARGB, &lib2d_handle);
3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if ((lib2d_err != MM_LIB2D_SUCCESS) || (lib2d_handle == NULL)) {
3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return -1;
3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  bool run_default = FALSE;
3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if ( argc == 7) {
3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    filename         = argv[1];
3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    width            = (uint32_t)atoi(argv[2]);
3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    height           = (uint32_t)atoi(argv[3]);
3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    input_yuv_stride = (uint32_t)atoi(argv[4]);
3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    offset           = (uint32_t)atoi(argv[5]);
3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    format           = (uint32_t)atoi(argv[6]);
3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    run_default      = TRUE;
3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("Running user provided conversion \n");
3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  else {
3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    total_tests = sizeof(input_nv21)/sizeof(input_yuv_data);
3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("usage: <binary> <filname> <width> <height> "
3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      "<stride> <offset> <format> \n");
4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  for (index = 0; index < total_tests; index++)
4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  {
4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(run_default == FALSE) {
4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      filename         = input_nv21[index].filename;
4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      width            = input_nv21[index].wdith;
4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      height           = input_nv21[index].height;
4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      input_yuv_stride = input_nv21[index].stride;
4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      offset           = input_nv21[index].offset;
4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      format           = input_nv21[index].format;
4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    snprintf(filename_in, 512, "/data/lib2d/input/%s", filename);
4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    snprintf(filename_out, 512, "/data/lib2d/output/%s.tga", filename);
4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    snprintf(filename_raw, 512, "/data/lib2d/output/%s.rgba", filename);
4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("-----------------Running test=%d/%d------------------------- \n",
4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      index+1, total_tests);
4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("filename=%s, full path=%s, width=%d, height=%d, stride=%d \n",
4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      filename, filename_in, width, height, stride);
4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Allocate NV12 buffer
4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    y_plane_stride     = ALIGN(width, 32);
4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    y_plane_size       = y_plane_stride * height;
4253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    y_plane_size_align = ALIGN(y_plane_size, ALIGN4K);
4263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    crcb_plane_stride  = y_plane_stride;
4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    crcb_plane_size    = crcb_plane_stride * height / 2;
4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    yuv_size           = y_plane_size_align + crcb_plane_size;
4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ret = img_lib.img_buffer_get(IMG_BUFFER_ION_IOMMU, -1, TRUE,
4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          yuv_size, &m_yuv_memHandle);
4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (ret != IMG_SUCCESS) {
4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      printf(" ] Error, img buf get failed \n");
4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      goto deinit;
4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("%s %d yuv buffer properties : w=%d, h=%d, y_stride=%d, "
4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      "crcb_stride=%d, y_size=%d, crcb_size=%d, yuv_size=%d, "
4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      "crcb_offset=%d \n",
4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       __LINE__,
4403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      width, height, y_plane_stride, crcb_plane_stride, y_plane_size,
4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      crcb_plane_size, yuv_size, y_plane_size_align);
4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("%s %d yuv buffer properties : fd=%d, ptr=%p, size=%d \n",
4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       __LINE__, m_yuv_memHandle.fd, m_yuv_memHandle.vaddr,
4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_yuv_memHandle.length);
4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Allocate ARGB buffer
4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    stride   = width * 4;
4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    stride   = ALIGN(stride, 32);
4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rgb_size = stride * height;
4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ret = img_lib.img_buffer_get(IMG_BUFFER_ION_IOMMU, -1, TRUE,
4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          rgb_size, &m_rgb_memHandle);
4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (ret != IMG_SUCCESS) {
4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      printf(" ] Error, img buf get failed");
4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      img_lib.img_buffer_release(&m_yuv_memHandle);
4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      goto deinit;
4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("%s %d rgb buffer properties : w=%d, h=%d, stride=%d, size=%d \n",
4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       __LINE__, width, height, stride, rgb_size);
4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("%s %d rgb buffer properties : fd=%d, ptr=%p, size=%d \n",
4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       __LINE__, m_rgb_memHandle.fd, m_rgb_memHandle.vaddr,
4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_rgb_memHandle.length);
4633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#if 0
4653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    lib2d_err = lib2d_test_load_input_yuv_data(filename_in, offset,
4663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      (input_yuv_stride * height), (input_yuv_stride * height / 2), y_plane_size_align,
4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_yuv_memHandle.vaddr);
4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (lib2d_err != MM_LIB2D_SUCCESS) {
4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      printf(" ] Error loading the input buffer \n");
4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      goto release;
4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#else
4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    lib2d_err = lib2d_test_load_input_yuv_data_linebyline(filename_in, offset,
4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      input_yuv_stride, y_plane_stride,height, y_plane_size_align,
4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_yuv_memHandle.vaddr);
4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (lib2d_err != MM_LIB2D_SUCCESS) {
4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      printf(" ] Error loading the input buffer \n");
4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      goto release;
4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Setup source buffer
4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_buffer.buffer_type = MM_LIB2D_BUFFER_TYPE_YUV;
4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_buffer.yuv_buffer.fd      = m_yuv_memHandle.fd;
4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_buffer.yuv_buffer.format  = format;
4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_buffer.yuv_buffer.width   = width;
4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_buffer.yuv_buffer.height  = height;
4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_buffer.yuv_buffer.plane0  = m_yuv_memHandle.vaddr;
4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_buffer.yuv_buffer.stride0 = y_plane_stride;
4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_buffer.yuv_buffer.plane1  = (int8_t *)m_yuv_memHandle.vaddr +
4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    y_plane_size_align;
4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_buffer.yuv_buffer.stride1 = crcb_plane_stride;
4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Setup dst buffer
4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dst_buffer.buffer_type = MM_LIB2D_BUFFER_TYPE_RGB;
4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dst_buffer.rgb_buffer.fd     = m_rgb_memHandle.fd;
4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dst_buffer.rgb_buffer.format = CAM_FORMAT_8888_ARGB;
4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dst_buffer.rgb_buffer.width  = width;
4983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dst_buffer.rgb_buffer.height = height;
4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dst_buffer.rgb_buffer.buffer = m_rgb_memHandle.vaddr;
5003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dst_buffer.rgb_buffer.stride = stride;
5013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    img_lib.img_buffer_cacheops(&m_yuv_memHandle,
5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      IMG_CACHE_CLEAN_INV, IMG_INTERNAL);
5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    lib2d_err = mm_lib2d_start_job(lib2d_handle, &src_buffer, &dst_buffer,
5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      index, NULL, lib2d_test_client_cb, 0);
5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (lib2d_err != MM_LIB2D_SUCCESS) {
5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      printf(" ] Error in mm_lib2d_start_job \n");
5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      goto release;
5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    img_lib.img_buffer_cacheops(&m_rgb_memHandle,
5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      IMG_CACHE_CLEAN_INV, IMG_INTERNAL);
5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifdef ENABLE_OUTPUT_DUMP
5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Dump output files
5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // snprintf(filename_in, 512, "/data/lib2d/output/%s", filename);
5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // DUMP_TO_FILE2(filename_in, src_buffer.yuv_buffer.plane0, y_plane_size, src_buffer.yuv_buffer.plane1, crcb_plane_size);
5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // DUMP_TO_FILE(filename_raw, dst_buffer.rgb_buffer.buffer, rgb_size);
5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    printf("Dumping output file %s \n", filename_out);
5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    lib2d_dump_tga(dst_buffer.rgb_buffer.buffer, 1,
5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      width, height, stride, filename_out);
5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    img_lib.img_buffer_release(&m_rgb_memHandle);
5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    img_lib.img_buffer_release(&m_yuv_memHandle);
5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_lib2d_deinit(lib2d_handle);
5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  return 0;
5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelrelease:
5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  img_lib.img_buffer_release(&m_rgb_memHandle);
5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  img_lib.img_buffer_release(&m_yuv_memHandle);
5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeldeinit:
5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_lib2d_deinit(lib2d_handle);
5383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  printf("%s %d some error happened, tests completed = %d/%d \n",
5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     __LINE__, index - 1, total_tests);
5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  return -1;
5413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
544