mm_jpeg.h revision 295a0ca3b68291081f46052e545d5b0dec308710
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