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
ExynosJpegEncoder()47 ExynosJpegEncoder::ExynosJpegEncoder()
48 {
49 t_iJpegFd = -1;
50 t_bFlagCreate = false;
51 }
52
~ExynosJpegEncoder()53 ExynosJpegEncoder::~ExynosJpegEncoder()
54 {
55 if (t_bFlagCreate == true) {
56 this->destroy();
57 }
58 }
59
create(void)60 int ExynosJpegEncoder::create(void)
61 {
62 return ExynosJpegBase::create(MODE_ENCODE);
63 }
64
destroy(void)65 int ExynosJpegEncoder::destroy(void)
66 {
67 return ExynosJpegBase::destroy(NUM_JPEG_ENC_IN_BUFS, NUM_JPEG_ENC_OUT_BUFS);
68 }
69
setJpegConfig(void * pConfig)70 int ExynosJpegEncoder::setJpegConfig(void *pConfig)
71 {
72 return ExynosJpegBase::setJpegConfig(MODE_ENCODE, pConfig);
73 }
74
getInBuf(int * piBuf,int * piInputSize,int iSize)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
getOutBuf(int * piBuf,int * piOutputSize)80 int 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
setInBuf(int * piBuf,int * iSize)86 int 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
setOutBuf(int iBuf,int iSize)98 int 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
getSize(int * piW,int * piH)110 int 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
getColorFormat(void)126 int ExynosJpegEncoder::getColorFormat(void)
127 {
128 return t_stJpegConfig.pix.enc_fmt.in_fmt;
129 }
130
setColorFormat(int iV4l2ColorFormat)131 int ExynosJpegEncoder::setColorFormat(int iV4l2ColorFormat)
132 {
133 return ExynosJpegBase::setColorFormat(MODE_ENCODE, iV4l2ColorFormat);
134 }
135
setJpegFormat(int iV4l2JpegFormat)136 int ExynosJpegEncoder::setJpegFormat(int iV4l2JpegFormat)
137 {
138 return ExynosJpegBase::setJpegFormat(MODE_ENCODE, iV4l2JpegFormat);
139 }
140
setColorBufSize(int * piBufSize,int iSize)141 int ExynosJpegEncoder::setColorBufSize(int *piBufSize, int iSize)
142 {
143 return ExynosJpegBase::setColorBufSize(MODE_ENCODE, piBufSize, iSize);
144 }
145
updateConfig(void)146 int 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
setQuality(int iV4l2Quality)153 int 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
getJpegSize(void)171 int 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
encode(void)192 int ExynosJpegEncoder::encode(void)
193 {
194 return ExynosJpegBase::execute(t_iPlaneNum, NUM_JPEG_ENC_OUT_PLANES);
195 }
196
197