13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2012-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#ifndef MM_JPEG_H_
313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_JPEG_H_
323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// OpenMAX dependencies
343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "OMX_Types.h"
353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "OMX_Index.h"
363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "OMX_Core.h"
373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "OMX_Component.h"
383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QOMX_JpegExtensions.h"
393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// JPEG dependencies
413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_jpeg_interface.h"
423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_jpeg_ionbuf.h"
433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies
453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "cam_list.h"
463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "cam_semaphore.h"
473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_JPEG_MAX_THREADS 30
493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_JPEG_CIRQ_SIZE 30
503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_JPEG_MAX_SESSION 10
513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MAX_EXIF_TABLE_ENTRIES 50
523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MAX_JPEG_SIZE 20000000
533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MAX_OMX_HANDLES (5)
543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Thumbnail src and dest aspect ratio diffrence tolerance
553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ASPECT_TOLERANCE 0.001
563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_abort_state_t:
593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @MM_JPEG_ABORT_NONE: Abort is not issued
603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @MM_JPEG_ABORT_INIT: Abort is issued from the client
613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @MM_JPEG_ABORT_DONE: Abort is completed
623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  State representing the abort state
643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_ABORT_NONE,
673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_ABORT_INIT,
683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_ABORT_DONE,
693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_abort_state_t;
703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* define max num of supported concurrent jpeg jobs by OMX engine.
733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Current, only one per time */
743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define NUM_MAX_JPEG_CNCURRENT_JOBS 2
753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define JOB_ID_MAGICVAL 0x1
773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define JOB_HIST_MAX 10000
783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** DUMP_TO_FILE:
803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @filename: file name
813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @p_addr: address of the buffer
823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @len: buffer length
833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  dump the image to the file
853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define DUMP_TO_FILE(filename, p_addr, len) ({ \
873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  size_t rc = 0; \
883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  FILE *fp = fopen(filename, "w+"); \
893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if (fp) { \
903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = fwrite(p_addr, 1, len, fp); \
913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGE("written size %zu", len); \
923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fclose(fp); \
933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } else { \
943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGE("open %s failed", filename); \
953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } \
963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** DUMP_TO_FILE2:
993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @filename: file name
1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @p_addr: address of the buffer
1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @len: buffer length
1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  dump the image to the file if the memory is non-contiguous
1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define DUMP_TO_FILE2(filename, p_addr1, len1, paddr2, len2) ({ \
1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  size_t rc = 0; \
1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  FILE *fp = fopen(filename, "w+"); \
1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if (fp) { \
1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = fwrite(p_addr1, 1, len1, fp); \
1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = fwrite(p_addr2, 1, len2, fp); \
1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGE("written %zu %zu", len1, len2); \
1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    fclose(fp); \
1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } else { \
1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGE("open %s failed", filename); \
1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } \
1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** MM_JPEG_CHK_ABORT:
1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @p: client pointer
1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @ret: return value
1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @label: label to jump to
1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  check the abort failure
1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MM_JPEG_CHK_ABORT(p, ret, label) ({ \
1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if (MM_JPEG_ABORT_INIT == p->abort_state) { \
1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGE("jpeg abort"); \
1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ret = OMX_ErrorNone; \
1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    goto label; \
1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } \
1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define GET_CLIENT_IDX(x) ((x) & 0xff)
1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define GET_SESSION_IDX(x) (((x) >> 8) & 0xff)
1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define GET_JOB_IDX(x) (((x) >> 16) & 0xff)
1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  union {
1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int i_data[MM_JPEG_CIRQ_SIZE];
1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    void *p_data[MM_JPEG_CIRQ_SIZE];
1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  };
1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int front;
1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int rear;
1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int count;
1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_mutex_t lock;
1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_cirq_t;
1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** cirq_reset:
1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Arguments:
1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @q: circular queue
1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Return:
1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       none
1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Description:
1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       Resets the circular queue
1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic inline void cirq_reset(mm_jpeg_cirq_t *q)
1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  q->front = 0;
1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  q->rear = 0;
1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  q->count = 0;
1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_mutex_init(&q->lock, NULL);
1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** cirq_empty:
1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Arguments:
1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @q: circular queue
1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Return:
1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       none
1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Description:
1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       check if the curcular queue is empty
1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define cirq_empty(q) (q->count == 0)
1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** cirq_full:
1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Arguments:
1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @q: circular queue
1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Return:
1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       none
1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Description:
1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       check if the curcular queue is full
1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define cirq_full(q) (q->count == MM_JPEG_CIRQ_SIZE)
1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** cirq_enqueue:
1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Arguments:
1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @q: circular queue
2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @data: data to be inserted
2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Return:
2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       true/false
2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Description:
2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       enqueue an element into circular queue
2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define cirq_enqueue(q, type, data) ({ \
2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int rc = 0; \
2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_mutex_lock(&q->lock); \
2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if (cirq_full(q)) { \
2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = -1; \
2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } else { \
2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    q->type[q->rear] = data; \
2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    q->rear = (q->rear + 1) % MM_JPEG_CIRQ_SIZE; \
2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    q->count++; \
2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } \
2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_mutex_unlock(&q->lock); \
2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  rc; \
2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** cirq_dequeue:
2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Arguments:
2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @q: circular queue
2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @data: data to be popped
2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Return:
2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       true/false
2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  Description:
2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       dequeue an element from the circular queue
2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define cirq_dequeue(q, type, data) ({ \
2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int rc = 0; \
2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_mutex_lock(&q->lock); \
2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if (cirq_empty(q)) { \
2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_unlock(&q->lock); \
2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = -1; \
2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } else { \
2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    data = q->type[q->front]; \
2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    q->count--; \
2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } \
2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_mutex_unlock(&q->lock); \
2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  rc; \
2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel})
2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef union {
2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t u32;
2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  void* p;
2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_q_data_t;
2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  typedef struct {
2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  struct cam_list list;
2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_q_data_t data;
2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_q_node_t;
2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_q_node_t head; /* dummy head */
2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t size;
2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_mutex_t lock;
2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_queue_t;
2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_CMD_TYPE_JOB,          /* job cmd */
2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_CMD_TYPE_EXIT,         /* EXIT cmd for exiting jobMgr thread */
2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_CMD_TYPE_DECODE_JOB,
2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_CMD_TYPE_MAX
2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_cmd_type_t;
2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct mm_jpeg_job_session {
2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t client_hdl;           /* client handler */
2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t jobId;                /* job ID */
2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t sessionId;            /* session ID */
2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_encode_params_t params; /* encode params */
2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_decode_params_t dec_params; /* encode params */
2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_encode_job_t encode_job;             /* job description */
2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_decode_job_t decode_job;
2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_t encode_pid;          /* encode thread handler*/
2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  void *jpeg_obj;                /* ptr to mm_jpeg_obj */
2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  jpeg_job_status_t job_status;  /* job status */
2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int state_change_pending;      /* flag to indicate if state change is pending */
2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_ERRORTYPE error_flag;      /* variable to indicate error during encoding */
2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_abort_state_t abort_state; /* variable to indicate abort during encoding */
2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* OMX related */
2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_HANDLETYPE omx_handle;                      /* handle to omx engine */
2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_CALLBACKTYPE omx_callbacks;                 /* callbacks to omx engine */
2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* buffer headers */
2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_BUFFERHEADERTYPE *p_in_omx_buf[MM_JPEG_MAX_BUF];
2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_BUFFERHEADERTYPE *p_in_omx_thumb_buf[MM_JPEG_MAX_BUF];
2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_BUFFERHEADERTYPE *p_out_omx_buf[MM_JPEG_MAX_BUF];
2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_BUFFERHEADERTYPE *p_in_rot_omx_buf[MM_JPEG_MAX_BUF];
3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_BUFFERHEADERTYPE *p_in_rot_omx_thumb_buf[MM_JPEG_MAX_BUF];
3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_PARAM_PORTDEFINITIONTYPE inputPort;
3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_PARAM_PORTDEFINITIONTYPE outputPort;
3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_PARAM_PORTDEFINITIONTYPE inputTmbPort;
3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* event locks */
3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_mutex_t lock;
3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_cond_t cond;
3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  QEXIF_INFO_DATA exif_info_local[MAX_EXIF_TABLE_ENTRIES];  //all exif tags for JPEG encoder
3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int exif_count_local;
3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_cirq_t cb_q;
3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t ebd_count;
3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t fbd_count;
3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* this flag represents whether the job is active */
3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_BOOL active;
3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* this flag indicates if the configration is complete */
3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_BOOL config;
3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* job history count to generate unique id */
3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  unsigned int job_hist;
3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_BOOL encoding;
3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  buffer_t work_buffer;
3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* src rotate ion bufs */
3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  buffer_t src_rot_ion_buffer[MM_JPEG_MAX_BUF];
3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_EVENTTYPE omxEvent;
3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int event_pending;
3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint8_t *meta_enc_key;
3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  size_t meta_enc_keylen;
3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  struct mm_jpeg_job_session *next_session;
3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t curr_out_buf_idx;
3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t num_omx_sessions;
3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_BOOL auto_out_buf;
3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_queue_t *session_handle_q;
3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_queue_t *out_buf_q;
3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int thumb_from_main;
3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t job_index;
3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* lib2d rotation flag*/
3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t lib2d_rotation_flag;
3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* num of buf for input src rotation */
3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t num_src_rot_bufs;
3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* src rotate img bufs */
3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_buf_t src_rot_main_buf[MM_JPEG_MAX_BUF];
359295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel
360295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel  /* lib2d handle*/
361295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel  void *lib2d_handle;
3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_job_session_t;
3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_encode_job_t encode_job;
3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t job_id;
3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t client_handle;
3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_encode_job_info_t;
3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_decode_job_t decode_job;
3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t job_id;
3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t client_handle;
3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_decode_job_info_t;
3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_cmd_type_t type;
3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  union {
3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_jpeg_encode_job_info_t enc_info;
3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_jpeg_decode_job_info_t dec_info;
3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  };
3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_job_q_node_t;
3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint8_t is_used;                /* flag: if is a valid client */
3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t client_handle;         /* client handle */
3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_job_session_t session[MM_JPEG_MAX_SESSION];
3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_mutex_t lock;           /* job lock */
3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_client_t;
3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_t pid;                  /* job cmd thread ID */
3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  cam_semaphore_t job_sem;        /* semaphore for job cmd thread */
3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_queue_t job_queue;      /* queue for job to do */
3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_job_cmd_thread_t;
3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MAX_JPEG_CLIENT_NUM 8
3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct mm_jpeg_obj_t {
3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* ClientMgr */
4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int num_clients;                                /* num of clients */
4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_client_t clnt_mgr[MAX_JPEG_CLIENT_NUM]; /* client manager */
4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* JobMkr */
4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  pthread_mutex_t job_lock;                       /* job lock */
4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_job_cmd_thread_t job_mgr;               /* job mgr thread including todo_q*/
4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_queue_t ongoing_job_q;                  /* queue for ongoing jobs */
4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  buffer_t ionBuffer[MM_JPEG_CONCURRENT_SESSIONS_COUNT];
4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* Max pic dimension for work buf calc*/
4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t max_pic_w;
4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t max_pic_h;
4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifdef LOAD_ADSP_RPC_LIB
4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  void *adsprpc_lib_handle;
4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t work_buf_cnt;
4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t num_sessions;
4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t reuse_reproc_buffer;
4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  cam_jpeg_metadata_t *jpeg_metadata;
4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  /* Pointer to the session in progress*/
4253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_job_session_t *p_session_inprogress;
4263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  // dummy OMX handle
4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_HANDLETYPE dummy_handle;
4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_obj;
4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_pending_func_t:
4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Intermediate function for transition change
4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef OMX_ERRORTYPE (*mm_jpeg_transition_func_t)(void *);
4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_init(mm_jpeg_obj *my_obj);
4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_deinit(mm_jpeg_obj *my_obj);
4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern uint32_t mm_jpeg_new_client(mm_jpeg_obj *my_obj);
4403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_start_job(mm_jpeg_obj *my_obj,
4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_job_t* job,
4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t* jobId);
4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_abort_job(mm_jpeg_obj *my_obj,
4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t jobId);
4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_close(mm_jpeg_obj *my_obj,
4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t client_hdl);
4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_create_session(mm_jpeg_obj *my_obj,
4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t client_hdl,
4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_encode_params_t *p_params,
4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t* p_session_id);
4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_destroy_session_by_id(mm_jpeg_obj *my_obj,
4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t session_id);
4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpegdec_init(mm_jpeg_obj *my_obj);
4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpegdec_deinit(mm_jpeg_obj *my_obj);
4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_jobmgr_thread_release(mm_jpeg_obj * my_obj);
4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_jobmgr_thread_launch(mm_jpeg_obj *my_obj);
4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpegdec_start_decode_job(mm_jpeg_obj *my_obj,
4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_job_t* job,
4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t* jobId);
4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpegdec_create_session(mm_jpeg_obj *my_obj,
4633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t client_hdl,
4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_decode_params_t *p_params,
4653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t* p_session_id);
4663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpegdec_destroy_session_by_id(mm_jpeg_obj *my_obj,
4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t session_id);
4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpegdec_abort_job(mm_jpeg_obj *my_obj,
4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  uint32_t jobId);
4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t mm_jpegdec_process_decoding_job(mm_jpeg_obj *my_obj,
4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_jpeg_job_q_node_t* job_node);
4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* utiltity fucntion declared in mm-camera-inteface2.c
4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * and need be used by mm-camera and below*/
4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint32_t mm_jpeg_util_generate_handler(uint8_t index);
4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint8_t mm_jpeg_util_get_index_by_handler(uint32_t handler);
4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* basic queue functions */
4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_queue_init(mm_jpeg_queue_t* queue);
4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_queue_enq(mm_jpeg_queue_t* queue,
4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_jpeg_q_data_t data);
4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_queue_enq_head(mm_jpeg_queue_t* queue,
4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_jpeg_q_data_t data);
4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern mm_jpeg_q_data_t mm_jpeg_queue_deq(mm_jpeg_queue_t* queue);
4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_queue_deinit(mm_jpeg_queue_t* queue);
4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t mm_jpeg_queue_flush(mm_jpeg_queue_t* queue);
4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern uint32_t mm_jpeg_queue_get_size(mm_jpeg_queue_t* queue);
4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern mm_jpeg_q_data_t mm_jpeg_queue_peek(mm_jpeg_queue_t* queue);
4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t addExifEntry(QOMX_EXIF_INFO *p_exif_info, exif_tag_id_t tagid,
4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  exif_tag_type_t type, uint32_t count, void *data);
4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int32_t releaseExifEntry(QEXIF_INFO_DATA *p_exif_data);
4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern int process_meta_data(metadata_buffer_t *p_meta,
4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  QOMX_EXIF_INFO *exif_info, mm_jpeg_exif_params_t *p_cam3a_params,
4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  cam_hal_version_t hal_version);
4983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4993d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelOMX_ERRORTYPE mm_jpeg_session_change_state(mm_jpeg_job_session_t* p_session,
5003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  OMX_STATETYPE new_state,
5013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_transition_func_t p_exec);
5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint map_jpeg_format(mm_jpeg_color_format color_fmt);
5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5053d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelOMX_BOOL mm_jpeg_session_abort(mm_jpeg_job_session_t *p_session);
5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/**
5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * special queue functions for job queue
5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_client_id(
5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_queue_t* queue, uint32_t client_hdl);
5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_job_id(
5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_queue_t* queue, uint32_t job_id);
5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_by_session_id(
5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_queue_t* queue, uint32_t session_id);
5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelmm_jpeg_job_q_node_t* mm_jpeg_queue_remove_job_unlk(
5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  mm_jpeg_queue_t* queue, uint32_t job_id);
5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_queue_func_t:
5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Intermediate function for queue operation
5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef void (*mm_jpeg_queue_func_t)(void *);
5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/** mm_jpeg_exif_flash_mode:
5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Exif flash mode values
5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel **/
5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef enum {
5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_EXIF_FLASH_MODE_ON   = 0x1,
5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_EXIF_FLASH_MODE_OFF  = 0x2,
5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_EXIF_FLASH_MODE_AUTO = 0x3,
5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  MM_JPEG_EXIF_FLASH_MODE_MAX
5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} mm_jpeg_exif_flash_mode;
5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif /* MM_JPEG_H_ */
5383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
540