1/* 2 * Copyright Samsung Electronics Co.,LTD. 3 * Copyright (C) 2011 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18#include <stdio.h> 19#include <stdlib.h> 20#include <sys/types.h> 21#include <sys/stat.h> 22#include <sys/ioctl.h> 23#include <fcntl.h> 24#include <ctype.h> 25#include <unistd.h> 26#include <sys/mman.h> 27#include <string.h> 28#include <errno.h> 29#include <signal.h> 30#include <math.h> 31#include <sys/poll.h> 32 33#include <cutils/log.h> 34 35#include <utils/Log.h> 36 37#include "ExynosJpegApi.h" 38 39#define JPEG_ERROR_LOG(fmt,...) 40 41#define NUM_JPEG_ENC_IN_PLANES (1) 42#define NUM_JPEG_ENC_OUT_PLANES (1) 43 44#define NUM_JPEG_ENC_IN_BUFS (1) 45#define NUM_JPEG_ENC_OUT_BUFS (1) 46 47ExynosJpegEncoder::ExynosJpegEncoder() 48{ 49 t_iJpegFd = -1; 50 t_bFlagCreate = false; 51} 52 53ExynosJpegEncoder::~ExynosJpegEncoder() 54{ 55 if (t_bFlagCreate == true) { 56 this->destroy(); 57 } 58} 59 60int ExynosJpegEncoder::create(void) 61{ 62 return ExynosJpegBase::create(MODE_ENCODE); 63} 64 65int ExynosJpegEncoder::destroy(void) 66{ 67 return ExynosJpegBase::destroy(NUM_JPEG_ENC_IN_BUFS, NUM_JPEG_ENC_OUT_BUFS); 68} 69 70int ExynosJpegEncoder::setJpegConfig(void *pConfig) 71{ 72 return ExynosJpegBase::setJpegConfig(MODE_ENCODE, pConfig); 73} 74 75 int ExynosJpegEncoder::getInBuf(int *piBuf, int *piInputSize, int iSize) 76{ 77 return getBuf(t_bFlagCreateInBuf, &t_stJpegInbuf, piBuf, piInputSize, iSize, t_iPlaneNum); 78} 79 80int ExynosJpegEncoder::getOutBuf(int *piBuf, int *piOutputSize) 81{ 82 return getBuf(t_bFlagCreateOutBuf, &t_stJpegOutbuf, piBuf, piOutputSize, \ 83 NUM_JPEG_ENC_OUT_PLANES, NUM_JPEG_ENC_OUT_PLANES); 84} 85 86int ExynosJpegEncoder::setInBuf(int *piBuf, int *iSize) 87{ 88 int iRet = ERROR_NONE; 89 iRet = setBuf(&t_stJpegInbuf, piBuf, iSize, t_iPlaneNum); 90 91 if (iRet == ERROR_NONE) { 92 t_bFlagCreateInBuf = true; 93 } 94 95 return iRet; 96} 97 98int ExynosJpegEncoder::setOutBuf(int iBuf, int iSize) 99{ 100 int iRet = ERROR_NONE; 101 iRet = setBuf(&t_stJpegOutbuf, &iBuf, &iSize, NUM_JPEG_ENC_OUT_PLANES); 102 103 if (iRet == ERROR_NONE) { 104 t_bFlagCreateOutBuf = true; 105 } 106 107 return iRet; 108} 109 110int ExynosJpegEncoder::getSize(int *piW, int *piH) 111{ 112 if (t_bFlagCreate == false) { 113 return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 114 } 115 116 if (t_stJpegConfig.width == 0 && t_stJpegConfig.height == 0) { 117 return ERROR_SIZE_NOT_SET_YET; 118 } 119 120 *piW = t_stJpegConfig.width; 121 *piH = t_stJpegConfig.height; 122 123 return ERROR_NONE; 124} 125 126int ExynosJpegEncoder::getColorFormat(void) 127{ 128 return t_stJpegConfig.pix.enc_fmt.in_fmt; 129} 130 131int ExynosJpegEncoder::setColorFormat(int iV4l2ColorFormat) 132{ 133 return ExynosJpegBase::setColorFormat(MODE_ENCODE, iV4l2ColorFormat); 134} 135 136int ExynosJpegEncoder::setJpegFormat(int iV4l2JpegFormat) 137{ 138 return ExynosJpegBase::setJpegFormat(MODE_ENCODE, iV4l2JpegFormat); 139} 140 141int ExynosJpegEncoder::setColorBufSize(int *piBufSize, int iSize) 142{ 143 return ExynosJpegBase::setColorBufSize(MODE_ENCODE, piBufSize, iSize); 144} 145 146int ExynosJpegEncoder::updateConfig(void) 147{ 148 return ExynosJpegBase::updateConfig(MODE_ENCODE, \ 149 NUM_JPEG_ENC_IN_BUFS, NUM_JPEG_ENC_OUT_BUFS, \ 150 NUM_JPEG_ENC_IN_PLANES, NUM_JPEG_ENC_OUT_PLANES); 151} 152 153int ExynosJpegEncoder::setQuality(int iV4l2Quality) 154{ 155 if (t_bFlagCreate == false) { 156 return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 157 } 158 159 if (iV4l2Quality >= 90) 160 t_stJpegConfig.enc_qual = QUALITY_LEVEL_1; 161 else if (iV4l2Quality >= 80) 162 t_stJpegConfig.enc_qual = QUALITY_LEVEL_2; 163 else if (iV4l2Quality >= 70) 164 t_stJpegConfig.enc_qual = QUALITY_LEVEL_3; 165 else 166 t_stJpegConfig.enc_qual = QUALITY_LEVEL_4; 167 168 return ERROR_NONE; 169} 170 171int ExynosJpegEncoder::getJpegSize(void) 172{ 173 if (t_bFlagCreate == false) { 174 return 0; 175 } 176 177 int iSize = -1; 178#ifdef KERNEL_33_JPEG_API 179 iSize = t_stJpegConfig.sizeJpeg; 180#else 181 iSize = t_v4l2GetCtrl(t_iJpegFd, V4L2_CID_CAM_JPEG_ENCODEDSIZE); 182#endif 183 184 if (iSize < 0) { 185 JPEG_ERROR_LOG("%s::Fail to JPEG output buffer!!\n", __func__); 186 return 0; 187 } 188 189 return iSize; 190} 191 192int ExynosJpegEncoder::encode(void) 193{ 194 return ExynosJpegBase::execute(t_iPlaneNum, NUM_JPEG_ENC_OUT_PLANES); 195} 196 197