16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * Redistribution and use in source and binary forms, with or without
46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * modification, are permitted provided that the following conditions are
56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * met:
66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Redistributions of source code must retain the above copyright
76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       notice, this list of conditions and the following disclaimer.
86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Redistributions in binary form must reproduce the above
96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       copyright notice, this list of conditions and the following
106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       disclaimer in the documentation and/or other materials provided
116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       with the distribution.
126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Neither the name of The Linux Foundation nor the names of its
136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       contributors may be used to endorse or promote products derived
146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       from this software without specific prior written permission.
156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev */
296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "mm_jpeg_interface.h"
316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "mm_jpeg_ionbuf.h"
326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/time.h>
336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/** DUMP_TO_FILE:
356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  @filename: file name
366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  @p_addr: address of the buffer
376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  @len: buffer length
386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  dump the image to the file
406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev **/
416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define DUMP_TO_FILE(filename, p_addr, len) ({ \
426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int rc = 0; \
436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  FILE *fp = fopen(filename, "w+"); \
446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (fp) { \
456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = fwrite(p_addr, 1, len, fp); \
466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    fclose(fp); \
476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  } else { \
486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] cannot dump image", __func__, __LINE__); \
496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  } \
506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev})
516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic int g_count = 1, g_i;
536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct {
556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  char *filename;
566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int width;
576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int height;
586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  char *out_filename;
596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} jpeg_test_input_t;
606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic jpeg_test_input_t jpeg_input[] = {
626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  {"/data/test.yuv", 1280, 720, "/data/test.jpg"}
636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev};
646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct {
666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  char *filename;
676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int width;
686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int height;
696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  char *out_filename;
706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  pthread_mutex_t lock;
716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  pthread_cond_t cond;
726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  buffer_test_t input;
736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  buffer_test_t output;
746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int use_ion;
756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  uint32_t handle;
766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  mm_jpeg_ops_t ops;
776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  uint32_t job_id[5];
786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  mm_jpeg_encode_params_t params;
796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  mm_jpeg_job_t job;
806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  uint32_t session_id;
816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} mm_jpeg_intf_test_t;
826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic void mm_jpeg_encode_callback(jpeg_job_status_t status,
846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  uint32_t client_hdl,
856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  uint32_t jobId,
866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  mm_jpeg_output_t *p_output,
876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  void *userData)
886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  mm_jpeg_intf_test_t *p_obj = (mm_jpeg_intf_test_t *)userData;
906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (status == JPEG_JOB_STATUS_ERROR) {
926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] Encode error", __func__, __LINE__);
936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  } else {
946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] Encode success file%s addr %p len %d",
956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      __func__, __LINE__, p_obj->out_filename,
966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      p_output->buf_vaddr, p_output->buf_filled_len);
976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    DUMP_TO_FILE(p_obj->out_filename, p_output->buf_vaddr, p_output->buf_filled_len);
986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  g_i++;
1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (g_i >= g_count) {
1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] Signal the thread", __func__, __LINE__);
1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_cond_signal(&p_obj->cond);
1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint mm_jpeg_test_alloc(buffer_test_t *p_buffer, int use_pmem)
1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int ret = 0;
1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  /*Allocate buffers*/
1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (use_pmem) {
1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    p_buffer->addr = (uint8_t *)buffer_allocate(p_buffer);
1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == p_buffer->addr) {
1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      CDBG_ERROR("%s:%d] Error",__func__, __LINE__);
1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      return -1;
1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  } else {
1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* Allocate heap memory */
1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    p_buffer->addr = (uint8_t *)malloc(p_buffer->size);
1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == p_buffer->addr) {
1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      CDBG_ERROR("%s:%d] Error",__func__, __LINE__);
1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      return -1;
1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  return ret;
1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid mm_jpeg_test_free(buffer_test_t *p_buffer)
1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (p_buffer->addr == NULL)
1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return;
1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (p_buffer->p_pmem_fd > 0)
1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    buffer_deallocate(p_buffer);
1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  else
1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    free(p_buffer->addr);
1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  memset(p_buffer, 0x0, sizeof(buffer_test_t));
1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint mm_jpeg_test_read(mm_jpeg_intf_test_t *p_obj)
1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int rc = 0;
1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  FILE *fp = NULL;
1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int file_size = 0;
1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  fp = fopen(p_obj->filename, "rb");
1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (!fp) {
1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] error", __func__, __LINE__);
1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return -1;
1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  fseek(fp, 0, SEEK_END);
1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  file_size = ftell(fp);
1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  fseek(fp, 0, SEEK_SET);
1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  CDBG_ERROR("%s:%d] input file size is %d buf_size %ld",
1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    __func__, __LINE__, file_size, p_obj->input.size);
1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (p_obj->input.size > file_size) {
1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] error", __func__, __LINE__);
1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    fclose(fp);
1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return -1;
1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  fread(p_obj->input.addr, 1, p_obj->input.size, fp);
1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  fclose(fp);
1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  return 0;
1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic int encode_init(jpeg_test_input_t *p_input, mm_jpeg_intf_test_t *p_obj)
1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int rc = -1;
1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int size = p_input->width * p_input->height;
1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  mm_jpeg_encode_params_t *p_params = &p_obj->params;
1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  mm_jpeg_encode_job_t *p_job_params = &p_obj->job.encode_job;
1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_obj->filename = p_input->filename;
1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_obj->width = p_input->width;
1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_obj->height = p_input->height;
1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_obj->out_filename = p_input->out_filename;
1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_obj->use_ion = 1;
1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  pthread_mutex_init(&p_obj->lock, NULL);
1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  pthread_cond_init(&p_obj->cond, NULL);
1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  /* allocate buffers */
1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_obj->input.size = size * 3/2;
1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  rc = mm_jpeg_test_alloc(&p_obj->input, p_obj->use_ion);
1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (rc) {
1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] Error",__func__, __LINE__);
1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return -1;
1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_obj->output.size = size * 3/2;
1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  rc = mm_jpeg_test_alloc(&p_obj->output, 0);
1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (rc) {
1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] Error",__func__, __LINE__);
1946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return -1;
1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  rc = mm_jpeg_test_read(p_obj);
1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (rc) {
1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] Error",__func__, __LINE__);
2006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return -1;
2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  /* set encode parameters */
2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->jpeg_cb = mm_jpeg_encode_callback;
2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->userdata = p_obj;
2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->color_format = MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2;
2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  /* dest buffer config */
2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->dest_buf[0].buf_size = p_obj->output.size;
2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->dest_buf[0].buf_vaddr = p_obj->output.addr;
2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->dest_buf[0].fd = p_obj->output.p_pmem_fd;
2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->dest_buf[0].index = 0;
2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->num_dst_bufs = 1;
2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  /* src buffer config*/
2166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->src_main_buf[0].buf_size = p_obj->input.size;
2176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->src_main_buf[0].buf_vaddr = p_obj->input.addr;
2186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->src_main_buf[0].fd = p_obj->input.p_pmem_fd;
2196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->src_main_buf[0].index = 0;
2206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->src_main_buf[0].format = MM_JPEG_FMT_YUV;
2216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->src_main_buf[0].offset.mp[0].len = size;
2226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->src_main_buf[0].offset.mp[1].len = size >> 1;
2236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->num_src_bufs = 1;
2246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->encode_thumbnail = 1;
2266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->exif_info.numOfEntries = 0;
2276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_params->quality = 80;
2286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->dst_index = 0;
2306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->src_index = 0;
2316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->rotation = 0;
2326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  /* main dimension */
2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->main_dim.src_dim.width = p_obj->width;
2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->main_dim.src_dim.height = p_obj->height;
2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->main_dim.dst_dim.width = p_obj->width;
2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->main_dim.dst_dim.height = p_obj->height;
2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->main_dim.crop.top = 0;
2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->main_dim.crop.left = 0;
2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->main_dim.crop.width = p_obj->width;
2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->main_dim.crop.height = p_obj->height;
2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  /* thumb dimension */
2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->thumb_dim.src_dim.width = p_obj->width;
2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->thumb_dim.src_dim.height = p_obj->height;
2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->thumb_dim.dst_dim.width = 512;
2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->thumb_dim.dst_dim.height = 384;
2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->thumb_dim.crop.top = 0;
2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->thumb_dim.crop.left = 0;
2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->thumb_dim.crop.width = p_obj->width;
2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  p_job_params->thumb_dim.crop.height = p_obj->height;
2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  return 0;
2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic int encode_test(jpeg_test_input_t *p_input)
2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int rc = 0;
2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  mm_jpeg_intf_test_t jpeg_obj;
2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  int i = 0;
2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  memset(&jpeg_obj, 0x0, sizeof(jpeg_obj));
2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  rc = encode_init(p_input, &jpeg_obj);
2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (rc) {
2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] Error",__func__, __LINE__);
2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return -1;
2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  jpeg_obj.handle = jpeg_open(&jpeg_obj.ops);
2696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (jpeg_obj.handle == 0) {
2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] Error",__func__, __LINE__);
2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    goto end;
2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  rc = jpeg_obj.ops.create_session(jpeg_obj.handle, &jpeg_obj.params,
2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    &jpeg_obj.job.encode_job.session_id);
2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  if (jpeg_obj.job.encode_job.session_id == 0) {
2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    CDBG_ERROR("%s:%d] Error",__func__, __LINE__);
2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    goto end;
2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  for (i = 0; i < g_count; i++) {
2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    jpeg_obj.job.job_type = JPEG_JOB_TYPE_ENCODE;
2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = jpeg_obj.ops.start_job(&jpeg_obj.job, &jpeg_obj.job_id[i]);
2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc) {
2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      CDBG_ERROR("%s:%d] Error",__func__, __LINE__);
2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      goto end;
2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  }
2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  /*
2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  usleep(5);
2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  jpeg_obj.ops.abort_job(jpeg_obj.job_id[0]);
2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  */
2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  pthread_mutex_lock(&jpeg_obj.lock);
2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  pthread_cond_wait(&jpeg_obj.cond, &jpeg_obj.lock);
2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  pthread_mutex_unlock(&jpeg_obj.lock);
2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  jpeg_obj.ops.destroy_session(jpeg_obj.job.encode_job.session_id);
2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  jpeg_obj.ops.close(jpeg_obj.handle);
3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevend:
3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  mm_jpeg_test_free(&jpeg_obj.input);
3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  mm_jpeg_test_free(&jpeg_obj.output);
3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  return 0;
3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/** main:
3106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  Arguments:
3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *    @argc
3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *    @argv
3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  Return:
3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       0 or -ve values
3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *  Description:
3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       main function
3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev **/
3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint main(int argc, char* argv[])
3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev  return encode_test(&jpeg_input[0]);
3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
328