blob: 6e04a5c0cbd7400faef816fe8003db5646b295f3 [file] [log] [blame]
DRCf8e00552011-02-04 11:06:36 +00001/*
2 * Copyright (C)2011 D. R. Commander. All Rights Reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * - Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 * - Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation
11 * and/or other materials provided with the distribution.
12 * - Neither the name of the libjpeg-turbo Project nor the names of its
13 * contributors may be used to endorse or promote products derived from this
14 * software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include "turbojpeg.h"
30#include <jni.h>
DRCc5a41992011-02-08 06:54:36 +000031#include "java/org_libjpegturbo_turbojpeg_TJCompressor.h"
32#include "java/org_libjpegturbo_turbojpeg_TJDecompressor.h"
33#include "java/org_libjpegturbo_turbojpeg_TJ.h"
DRCf8e00552011-02-04 11:06:36 +000034
DRC4f1580c2011-02-25 06:11:03 +000035static const int _pixelsize[org_libjpegturbo_turbojpeg_TJ_NUMPFOPT]=
36 {3, 3, 4, 4, 4, 4, 1};
37
38static const int _flags[org_libjpegturbo_turbojpeg_TJ_NUMPFOPT]=
39 {0, TJ_BGR, 0, TJ_BGR, TJ_BGR|TJ_ALPHAFIRST, TJ_ALPHAFIRST, 0};
40
DRCf8e00552011-02-04 11:06:36 +000041#define _throw(msg) { \
42 jclass _exccls=(*env)->FindClass(env, "java/lang/Exception"); \
43 if(!_exccls) goto bailout; \
44 (*env)->ThrowNew(env, _exccls, msg); \
45 goto bailout; \
46}
47
48#define bailif0(f) {if(!(f)) goto bailout;}
49
DRC3bad53f2011-02-23 02:20:49 +000050#define gethandle() \
DRCf8e00552011-02-04 11:06:36 +000051 jclass _cls=(*env)->GetObjectClass(env, obj); \
52 jfieldID _fid; \
53 if(!_cls) goto bailout; \
54 bailif0(_fid=(*env)->GetFieldID(env, _cls, "handle", "J")); \
55 handle=(tjhandle)(long)(*env)->GetLongField(env, obj, _fid); \
DRCf8e00552011-02-04 11:06:36 +000056
DRC3bad53f2011-02-23 02:20:49 +000057JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_bufSize
DRC5ccb9822011-02-04 11:22:15 +000058 (JNIEnv *env, jclass cls, jint width, jint height)
DRCf8e00552011-02-04 11:06:36 +000059{
DRC3bad53f2011-02-23 02:20:49 +000060 jint retval=(jint)TJBUFSIZE(width, height);
DRC36336fc2011-02-22 10:27:31 +000061 if(retval==-1) _throw(tjGetErrorStr());
62
63 bailout:
64 return retval;
65}
66
DRC3bad53f2011-02-23 02:20:49 +000067JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_bufSizeYUV
DRC36336fc2011-02-22 10:27:31 +000068 (JNIEnv *env, jclass cls, jint width, jint height, jint subsamp)
69{
DRC3bad53f2011-02-23 02:20:49 +000070 jint retval=(jint)TJBUFSIZEYUV(width, height, subsamp);
DRC36336fc2011-02-22 10:27:31 +000071 if(retval==-1) _throw(tjGetErrorStr());
72
73 bailout:
74 return retval;
DRCf8e00552011-02-04 11:06:36 +000075}
76
DRCc5a41992011-02-08 06:54:36 +000077JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_init
DRCf8e00552011-02-04 11:06:36 +000078 (JNIEnv *env, jobject obj)
79{
80 jclass cls;
81 jfieldID fid;
82 tjhandle handle;
83
84 if((handle=tjInitCompress())==NULL)
85 _throw(tjGetErrorStr());
86
87 bailif0(cls=(*env)->GetObjectClass(env, obj));
88 bailif0(fid=(*env)->GetFieldID(env, cls, "handle", "J"));
89 (*env)->SetLongField(env, obj, fid, (long)handle);
90
91 bailout:
92 return;
93}
94
DRC84a1bcc2011-02-23 12:09:56 +000095JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIII_3BIII
DRCf8e00552011-02-04 11:06:36 +000096 (JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch,
DRC4f1580c2011-02-25 06:11:03 +000097 jint height, jint pf, jbyteArray dst, jint jpegsubsamp, jint jpegqual,
98 jint flags)
DRCf8e00552011-02-04 11:06:36 +000099{
DRC4f1580c2011-02-25 06:11:03 +0000100 tjhandle handle=0; int pixelsize;
DRCf8e00552011-02-04 11:06:36 +0000101 unsigned long size=0;
DRC9af1aed2011-02-04 22:13:14 +0000102 unsigned char *srcbuf=NULL, *dstbuf=NULL;
DRCf8e00552011-02-04 11:06:36 +0000103
104 gethandle();
105
DRC4f1580c2011-02-25 06:11:03 +0000106 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
107 _throw("Invalid argument in compress()");
108 flags|=_flags[pf];
109 pixelsize=_pixelsize[pf];
110
DRCf8e00552011-02-04 11:06:36 +0000111 bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
112 bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
113
114 if(tjCompress(handle, srcbuf, width, pitch, height, pixelsize, dstbuf,
115 &size, jpegsubsamp, jpegqual, flags)==-1)
116 {
117 (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
118 (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
119 _throw(tjGetErrorStr());
120 }
121
122 bailout:
123 if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
124 if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
DRC3bad53f2011-02-23 02:20:49 +0000125 return (jint)size;
DRCf8e00552011-02-04 11:06:36 +0000126}
127
DRC4f1580c2011-02-25 06:11:03 +0000128JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIII_3BIII
DRC84a1bcc2011-02-23 12:09:56 +0000129 (JNIEnv *env, jobject obj, jintArray src, jint width, jint pitch,
DRC4f1580c2011-02-25 06:11:03 +0000130 jint height, jint pf, jbyteArray dst, jint jpegsubsamp, jint jpegqual,
131 jint flags)
DRC84a1bcc2011-02-23 12:09:56 +0000132{
133 tjhandle handle=0;
134 unsigned long size=0;
135 unsigned char *srcbuf=NULL, *dstbuf=NULL;
136
137 gethandle();
138
DRC4f1580c2011-02-25 06:11:03 +0000139 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
140 _throw("Invalid argument in compress()");
141 if(_pixelsize[pf]!=sizeof(jint))
142 _throw("Pixel format must be 32-bit when compressing from an integer buffer.");
143 flags|=_flags[pf];
144
DRC84a1bcc2011-02-23 12:09:56 +0000145 bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
146 bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
147
148 if(tjCompress(handle, srcbuf, width, pitch*sizeof(jint), height,
149 sizeof(jint), dstbuf, &size, jpegsubsamp, jpegqual, flags)==-1)
150 {
151 (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
152 (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
153 _throw(tjGetErrorStr());
154 }
155
156 bailout:
157 if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
158 if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
159 return (jint)size;
160}
161
DRC4f1580c2011-02-25 06:11:03 +0000162JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3BIIII_3BII
163 (JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch,
164 jint height, jint pf, jbyteArray dst, jint jpegsubsamp, jint flags)
165{
166 tjhandle handle=0; int pixelsize;
167 unsigned long size=0;
168 unsigned char *srcbuf=NULL, *dstbuf=NULL;
169
170 gethandle();
171
172 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
173 _throw("Invalid argument in encodeYUV()");
174 flags|=_flags[pf];
175 pixelsize=_pixelsize[pf];
176
177 bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
178 bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
179
180 if(tjEncodeYUV(handle, srcbuf, width, pitch, height, pixelsize, dstbuf,
181 jpegsubsamp, flags)==-1)
182 {
183 (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
184 (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
185 _throw(tjGetErrorStr());
186 }
187
188 bailout:
189 if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
190 if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
191 return;
192}
193
194JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___3IIIII_3BII
195 (JNIEnv *env, jobject obj, jintArray src, jint width, jint pitch,
196 jint height, jint pf, jbyteArray dst, jint jpegsubsamp, jint flags)
197{
198 tjhandle handle=0;
199 unsigned long size=0;
200 unsigned char *srcbuf=NULL, *dstbuf=NULL;
201
202 gethandle();
203
204 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
205 _throw("Invalid argument in compress()");
206 if(_pixelsize[pf]!=sizeof(jint))
207 _throw("Pixel format must be 32-bit when encoding from an integer buffer.");
208 flags|=_flags[pf];
209
210 bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
211 bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
212
213 if(tjEncodeYUV(handle, srcbuf, width, pitch*sizeof(jint), height,
214 sizeof(jint), dstbuf, jpegsubsamp, flags)==-1)
215 {
216 (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
217 (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
218 _throw(tjGetErrorStr());
219 }
220
221 bailout:
222 if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
223 if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
224 return;
225}
226
DRCc5a41992011-02-08 06:54:36 +0000227JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_destroy
DRCf8e00552011-02-04 11:06:36 +0000228 (JNIEnv *env, jobject obj)
229{
230 tjhandle handle=0;
231
232 gethandle();
233
234 if(tjDestroy(handle)==-1) _throw(tjGetErrorStr());
DRC3bad53f2011-02-23 02:20:49 +0000235 (*env)->SetLongField(env, obj, _fid, 0);
DRCf8e00552011-02-04 11:06:36 +0000236
237 bailout:
238 return;
239}
240
DRCc5a41992011-02-08 06:54:36 +0000241JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_init
DRCf8e00552011-02-04 11:06:36 +0000242 (JNIEnv *env, jobject obj)
243{
244 jclass cls;
245 jfieldID fid;
246 tjhandle handle;
247
248 if((handle=tjInitDecompress())==NULL) _throw(tjGetErrorStr());
249
250 bailif0(cls=(*env)->GetObjectClass(env, obj));
251 bailif0(fid=(*env)->GetFieldID(env, cls, "handle", "J"));
252 (*env)->SetLongField(env, obj, fid, (long)handle);
253
254 bailout:
255 return;
256}
257
DRC36336fc2011-02-22 10:27:31 +0000258JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_getScaledWidth
259 (JNIEnv *env, jobject obj, jint input_width, jint input_height,
260 jint output_width, jint output_height)
261{
262 if(tjScaledSize(input_width, input_height, &output_width, &output_height)
263 ==-1)
264 _throw(tjGetErrorStr());
265
266 bailout:
267 return output_width;
268}
269
270JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_getScaledHeight
271 (JNIEnv *env, jobject obj, jint input_width, jint input_height,
272 jint output_width, jint output_height)
273{
274 if(tjScaledSize(input_width, input_height, &output_width, &output_height)
275 ==-1)
276 _throw(tjGetErrorStr());
277
278 bailout:
279 return output_height;
280}
281
DRC3bad53f2011-02-23 02:20:49 +0000282JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompressHeader
283 (JNIEnv *env, jobject obj, jbyteArray src, jint size)
DRCf8e00552011-02-04 11:06:36 +0000284{
DRCf8e00552011-02-04 11:06:36 +0000285 tjhandle handle=0;
DRC9af1aed2011-02-04 22:13:14 +0000286 unsigned char *srcbuf=NULL;
DRCf8e00552011-02-04 11:06:36 +0000287 int width=0, height=0, jpegsubsamp=-1;
DRCf8e00552011-02-04 11:06:36 +0000288
289 gethandle();
290
291 bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
292
293 if(tjDecompressHeader2(handle, srcbuf, (unsigned long)size,
294 &width, &height, &jpegsubsamp)==-1)
295 {
296 (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
297 _throw(tjGetErrorStr());
298 }
299 (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0); srcbuf=NULL;
300
DRC3bad53f2011-02-23 02:20:49 +0000301 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegSubsamp", "I"));
302 (*env)->SetIntField(env, obj, _fid, jpegsubsamp);
303 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegWidth", "I"));
304 (*env)->SetIntField(env, obj, _fid, width);
305 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegHeight", "I"));
306 (*env)->SetIntField(env, obj, _fid, height);
DRCf8e00552011-02-04 11:06:36 +0000307
308 bailout:
DRC3bad53f2011-02-23 02:20:49 +0000309 return;
DRCf8e00552011-02-04 11:06:36 +0000310}
311
DRC84a1bcc2011-02-23 12:09:56 +0000312JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIII
DRC3bad53f2011-02-23 02:20:49 +0000313 (JNIEnv *env, jobject obj, jbyteArray src, jint size, jbyteArray dst,
DRC4f1580c2011-02-25 06:11:03 +0000314 jint width, jint pitch, jint height, jint pf, jint flags)
DRCf8e00552011-02-04 11:06:36 +0000315{
DRC4f1580c2011-02-25 06:11:03 +0000316 tjhandle handle=0; int pixelsize;
DRC9af1aed2011-02-04 22:13:14 +0000317 unsigned char *srcbuf=NULL, *dstbuf=NULL;
DRCf8e00552011-02-04 11:06:36 +0000318
319 gethandle();
320
DRC4f1580c2011-02-25 06:11:03 +0000321 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
322 _throw("Invalid argument in decompress()");
323 flags|=_flags[pf];
324 pixelsize=_pixelsize[pf];
325
DRCf8e00552011-02-04 11:06:36 +0000326 bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
327 bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
328
DRCb28fc572011-02-22 06:41:29 +0000329 if(tjDecompress(handle, srcbuf, (unsigned long)size, dstbuf, width, pitch,
330 height, pixelsize, flags)==-1)
DRCf8e00552011-02-04 11:06:36 +0000331 {
332 (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
333 (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
334 _throw(tjGetErrorStr());
335 }
336
337 bailout:
338 if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
339 if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
340 return;
341}
342
DRC4f1580c2011-02-25 06:11:03 +0000343JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIII
DRC84a1bcc2011-02-23 12:09:56 +0000344 (JNIEnv *env, jobject obj, jbyteArray src, jint size, jintArray dst,
DRC4f1580c2011-02-25 06:11:03 +0000345 jint width, jint pitch, jint height, jint pf, jint flags)
DRC84a1bcc2011-02-23 12:09:56 +0000346{
DRC4f1580c2011-02-25 06:11:03 +0000347 tjhandle handle=0; int ps;
DRC84a1bcc2011-02-23 12:09:56 +0000348 unsigned char *srcbuf=NULL, *dstbuf=NULL;
349
350 gethandle();
351
DRC4f1580c2011-02-25 06:11:03 +0000352 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPFOPT)
353 _throw("Invalid argument in decompress()");
354 if(_pixelsize[pf]!=sizeof(jint))
355 _throw("Pixel format must be 32-bit when decompressing to an integer buffer.");
356 flags|=_flags[pf];
357
DRC84a1bcc2011-02-23 12:09:56 +0000358 bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
359 bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
360
361 if(tjDecompress(handle, srcbuf, (unsigned long)size, dstbuf, width,
362 pitch*sizeof(jint), height, sizeof(jint), flags)==-1)
363 {
364 (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
365 (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
366 _throw(tjGetErrorStr());
367 }
368
369 bailout:
370 if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
371 if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
372 return;
DRC4f1580c2011-02-25 06:11:03 +0000373}
DRC84a1bcc2011-02-23 12:09:56 +0000374
DRC4f1580c2011-02-25 06:11:03 +0000375JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompressToYUV
376 (JNIEnv *env, jobject obj, jbyteArray src, jint size, jbyteArray dst,
377 jint flags)
378{
379 tjhandle handle=0;
380 unsigned char *srcbuf=NULL, *dstbuf=NULL;
381
382 gethandle();
383
384 bailif0(srcbuf=(*env)->GetPrimitiveArrayCritical(env, src, 0));
385 bailif0(dstbuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0));
386
387 if(tjDecompressToYUV(handle, srcbuf, (unsigned long)size, dstbuf, flags)==-1)
388 {
389 (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
390 (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
391 _throw(tjGetErrorStr());
392 }
393
394 bailout:
395 if(dstbuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstbuf, 0);
396 if(srcbuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcbuf, 0);
397 return;
DRC84a1bcc2011-02-23 12:09:56 +0000398}
399
DRCc5a41992011-02-08 06:54:36 +0000400JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_destroy
DRCf8e00552011-02-04 11:06:36 +0000401 (JNIEnv *env, jobject obj)
402{
DRCc5a41992011-02-08 06:54:36 +0000403 Java_org_libjpegturbo_turbojpeg_TJCompressor_destroy(env, obj);
DRCf8e00552011-02-04 11:06:36 +0000404}