| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C)2011-2013 D. R. Commander. All Rights Reserved. | 2 * Copyright (C)2011-2016 D. R. Commander. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are met: | 5 * modification, are permitted provided that the following conditions are met: |
| 6 * | 6 * |
| 7 * - Redistributions of source code must retain the above copyright notice, | 7 * - Redistributions of source code must retain the above copyright notice, |
| 8 * this list of conditions and the following disclaimer. | 8 * this list of conditions and the following disclaimer. |
| 9 * - Redistributions in binary form must reproduce the above copyright notice, | 9 * - Redistributions in binary form must reproduce the above copyright notice, |
| 10 * this list of conditions and the following disclaimer in the documentation | 10 * this list of conditions and the following disclaimer in the documentation |
| 11 * and/or other materials provided with the distribution. | 11 * and/or other materials provided with the distribution. |
| 12 * - Neither the name of the libjpeg-turbo Project nor the names of its | 12 * - Neither the name of the libjpeg-turbo Project nor the names of its |
| (...skipping 17 matching lines...) Expand all Loading... |
| 30 #include <string.h> | 30 #include <string.h> |
| 31 #include "turbojpeg.h" | 31 #include "turbojpeg.h" |
| 32 #ifdef WIN32 | 32 #ifdef WIN32 |
| 33 #include "tjutil.h" | 33 #include "tjutil.h" |
| 34 #endif | 34 #endif |
| 35 #include <jni.h> | 35 #include <jni.h> |
| 36 #include "java/org_libjpegturbo_turbojpeg_TJCompressor.h" | 36 #include "java/org_libjpegturbo_turbojpeg_TJCompressor.h" |
| 37 #include "java/org_libjpegturbo_turbojpeg_TJDecompressor.h" | 37 #include "java/org_libjpegturbo_turbojpeg_TJDecompressor.h" |
| 38 #include "java/org_libjpegturbo_turbojpeg_TJ.h" | 38 #include "java/org_libjpegturbo_turbojpeg_TJ.h" |
| 39 | 39 |
| 40 #define _throw(msg) { \ | 40 #define PAD(v, p) ((v+(p)-1)&(~((p)-1))) |
| 41 » jclass _exccls=(*env)->FindClass(env, "java/lang/Exception"); \ | 41 |
| 42 » if(!_exccls) goto bailout; \ | 42 #define _throw(msg, exceptionClass) { \ |
| 43 » jclass _exccls=(*env)->FindClass(env, exceptionClass); \ |
| 44 » if(!_exccls || (*env)->ExceptionCheck(env)) goto bailout; \ |
| 43 (*env)->ThrowNew(env, _exccls, msg); \ | 45 (*env)->ThrowNew(env, _exccls, msg); \ |
| 44 goto bailout; \ | 46 goto bailout; \ |
| 45 } | 47 } |
| 46 | 48 |
| 47 #define bailif0(f) {if(!(f)) { \ | 49 #define _throwtj() _throw(tjGetErrorStr(), "org/libjpegturbo/turbojpeg/TJExcepti
on") |
| 48 » char temps[80]; \ | 50 |
| 49 » snprintf(temps, 80, "Unexpected NULL condition in line %d", __LINE__);
\ | 51 #define _throwarg(msg) _throw(msg, "java/lang/IllegalArgumentException") |
| 50 » _throw(temps); \ | 52 |
| 53 #define _throwmem() _throw("Memory allocation failure", "java/lang/OutOfMemoryEr
ror"); |
| 54 |
| 55 #define bailif0(f) {if(!(f) || (*env)->ExceptionCheck(env)) { \ |
| 56 » goto bailout; \ |
| 51 }} | 57 }} |
| 52 | 58 |
| 53 #define gethandle() \ | 59 #define gethandle() \ |
| 54 jclass _cls=(*env)->GetObjectClass(env, obj); \ | 60 jclass _cls=(*env)->GetObjectClass(env, obj); \ |
| 55 jfieldID _fid; \ | 61 jfieldID _fid; \ |
| 56 » if(!_cls) goto bailout; \ | 62 » if(!_cls || (*env)->ExceptionCheck(env)) goto bailout; \ |
| 57 bailif0(_fid=(*env)->GetFieldID(env, _cls, "handle", "J")); \ | 63 bailif0(_fid=(*env)->GetFieldID(env, _cls, "handle", "J")); \ |
| 58 » handle=(tjhandle)(jlong)(*env)->GetLongField(env, obj, _fid); \ | 64 » handle=(tjhandle)(size_t)(*env)->GetLongField(env, obj, _fid); \ |
| 59 | 65 |
| 66 #ifdef _WIN32 |
| 67 #define setenv(envvar, value, dummy) _putenv_s(envvar, value) |
| 68 #endif |
| 69 |
| 70 #define prop2env(property, envvar) \ |
| 71 { \ |
| 72 if((jName=(*env)->NewStringUTF(env, property))!=NULL \ |
| 73 && (jValue=(*env)->CallStaticObjectMethod(env, cls, mid, jName))
!=NULL) \ |
| 74 { \ |
| 75 if((value=(*env)->GetStringUTFChars(env, jValue, 0))!=NULL) \ |
| 76 { \ |
| 77 setenv(envvar, value, 1); \ |
| 78 (*env)->ReleaseStringUTFChars(env, jValue, value); \ |
| 79 } \ |
| 80 } \ |
| 81 } |
| 82 |
| 83 int ProcessSystemProperties(JNIEnv *env) |
| 84 { |
| 85 jclass cls; jmethodID mid; |
| 86 jstring jName, jValue; |
| 87 const char *value; |
| 88 |
| 89 bailif0(cls=(*env)->FindClass(env, "java/lang/System")); |
| 90 bailif0(mid=(*env)->GetStaticMethodID(env, cls, "getProperty", |
| 91 "(Ljava/lang/String;)Ljava/lang/String;")); |
| 92 |
| 93 prop2env("turbojpeg.optimize", "TJ_OPTIMIZE"); |
| 94 prop2env("turbojpeg.arithmetic", "TJ_ARITHMETIC"); |
| 95 prop2env("turbojpeg.restart", "TJ_RESTART"); |
| 96 prop2env("turbojpeg.progressive", "TJ_PROGRESSIVE"); |
| 97 return 0; |
| 98 |
| 99 bailout: |
| 100 return -1; |
| 101 } |
| 102 |
| 103 /* TurboJPEG 1.2.x: TJ::bufSize() */ |
| 60 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_bufSize | 104 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_bufSize |
| 61 (JNIEnv *env, jclass cls, jint width, jint height, jint jpegSubsamp) | 105 (JNIEnv *env, jclass cls, jint width, jint height, jint jpegSubsamp) |
| 62 { | 106 { |
| 63 jint retval=(jint)tjBufSize(width, height, jpegSubsamp); | 107 jint retval=(jint)tjBufSize(width, height, jpegSubsamp); |
| 64 » if(retval==-1) _throw(tjGetErrorStr()); | 108 » if(retval==-1) _throwarg(tjGetErrorStr()); |
| 65 | 109 |
| 66 bailout: | 110 bailout: |
| 67 return retval; | 111 return retval; |
| 68 } | 112 } |
| 69 | 113 |
| 70 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_bufSizeYUV | 114 /* TurboJPEG 1.4.x: TJ::bufSizeYUV() */ |
| 71 » (JNIEnv *env, jclass cls, jint width, jint height, jint subsamp) | 115 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_bufSizeYUV__IIII |
| 116 » (JNIEnv *env, jclass cls, jint width, jint pad, jint height, jint subsam
p) |
| 72 { | 117 { |
| 73 » jint retval=(jint)tjBufSizeYUV(width, height, subsamp); | 118 » jint retval=(jint)tjBufSizeYUV2(width, pad, height, subsamp); |
| 74 » if(retval==-1) _throw(tjGetErrorStr()); | 119 » if(retval==-1) _throwarg(tjGetErrorStr()); |
| 75 | 120 |
| 76 bailout: | 121 bailout: |
| 77 return retval; | 122 return retval; |
| 78 } | 123 } |
| 79 | 124 |
| 125 /* TurboJPEG 1.2.x: TJ::bufSizeYUV() */ |
| 126 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_bufSizeYUV__III |
| 127 (JNIEnv *env, jclass cls, jint width, jint height, jint subsamp) |
| 128 { |
| 129 return Java_org_libjpegturbo_turbojpeg_TJ_bufSizeYUV__IIII(env, cls, wid
th, |
| 130 4, height, subsamp); |
| 131 } |
| 132 |
| 133 /* TurboJPEG 1.4.x: TJ::planeSizeYUV() */ |
| 134 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_planeSizeYUV__IIIII |
| 135 (JNIEnv *env, jclass cls, jint componentID, jint width, jint stride, |
| 136 jint height, jint subsamp) |
| 137 { |
| 138 jint retval=(jint)tjPlaneSizeYUV(componentID, width, stride, height, |
| 139 subsamp); |
| 140 if(retval==-1) _throwarg(tjGetErrorStr()); |
| 141 |
| 142 bailout: |
| 143 return retval; |
| 144 } |
| 145 |
| 146 /* TurboJPEG 1.4.x: TJ::planeWidth() */ |
| 147 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_planeWidth__III |
| 148 (JNIEnv *env, jclass cls, jint componentID, jint width, jint subsamp) |
| 149 { |
| 150 jint retval=(jint)tjPlaneWidth(componentID, width, subsamp); |
| 151 if(retval==-1) _throwarg(tjGetErrorStr()); |
| 152 |
| 153 bailout: |
| 154 return retval; |
| 155 } |
| 156 |
| 157 /* TurboJPEG 1.4.x: TJ::planeHeight() */ |
| 158 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJ_planeHeight__III |
| 159 (JNIEnv *env, jclass cls, jint componentID, jint height, jint subsamp) |
| 160 { |
| 161 jint retval=(jint)tjPlaneHeight(componentID, height, subsamp); |
| 162 if(retval==-1) _throwarg(tjGetErrorStr()); |
| 163 |
| 164 bailout: |
| 165 return retval; |
| 166 } |
| 167 |
| 168 /* TurboJPEG 1.2.x: TJCompressor::init() */ |
| 80 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_init | 169 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_init |
| 81 (JNIEnv *env, jobject obj) | 170 (JNIEnv *env, jobject obj) |
| 82 { | 171 { |
| 83 jclass cls; | 172 jclass cls; |
| 84 jfieldID fid; | 173 jfieldID fid; |
| 85 tjhandle handle; | 174 tjhandle handle; |
| 86 | 175 |
| 87 if((handle=tjInitCompress())==NULL) | 176 if((handle=tjInitCompress())==NULL) |
| 88 » » _throw(tjGetErrorStr()); | 177 » » _throwtj(); |
| 89 | 178 |
| 90 bailif0(cls=(*env)->GetObjectClass(env, obj)); | 179 bailif0(cls=(*env)->GetObjectClass(env, obj)); |
| 91 bailif0(fid=(*env)->GetFieldID(env, cls, "handle", "J")); | 180 bailif0(fid=(*env)->GetFieldID(env, cls, "handle", "J")); |
| 92 » (*env)->SetLongField(env, obj, fid, (jlong)handle); | 181 » (*env)->SetLongField(env, obj, fid, (size_t)handle); |
| 93 | 182 |
| 94 bailout: | 183 bailout: |
| 95 return; | 184 return; |
| 96 } | 185 } |
| 97 | 186 |
| 98 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
BIIIIII_3BIII | 187 static jint TJCompressor_compress |
| 99 » (JNIEnv *env, jobject obj, jbyteArray src, jint x, jint y, jint width, | 188 » (JNIEnv *env, jobject obj, jarray src, jint srcElementSize, jint x, jint
y, |
| 100 » » jint pitch, jint height, jint pf, jbyteArray dst, jint jpegSubsa
mp, | 189 » » jint width, jint pitch, jint height, jint pf, jbyteArray dst, |
| 101 » » jint jpegQual, jint flags) | 190 » » jint jpegSubsamp, jint jpegQual, jint flags) |
| 102 { | 191 { |
| 103 tjhandle handle=0; | 192 tjhandle handle=0; |
| 104 unsigned long jpegSize=0; | 193 unsigned long jpegSize=0; |
| 105 jsize arraySize=0, actualPitch; | 194 jsize arraySize=0, actualPitch; |
| 106 unsigned char *srcBuf=NULL, *jpegBuf=NULL; | 195 unsigned char *srcBuf=NULL, *jpegBuf=NULL; |
| 107 | 196 |
| 108 gethandle(); | 197 gethandle(); |
| 109 | 198 |
| 110 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF || width<1 || height<
1 | 199 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF || width<1 || height<
1 |
| 111 || pitch<0) | 200 || pitch<0) |
| 112 » » _throw("Invalid argument in compress()"); | 201 » » _throwarg("Invalid argument in compress()"); |
| 113 if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) | 202 if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) |
| 114 » » _throw("Mismatch between Java and C API"); | 203 » » _throwarg("Mismatch between Java and C API"); |
| 115 | 204 |
| 116 actualPitch=(pitch==0)? width*tjPixelSize[pf]:pitch; | 205 actualPitch=(pitch==0)? width*tjPixelSize[pf]:pitch; |
| 117 » arraySize=(y+height-1)*actualPitch + x+width; | 206 » arraySize=(y+height-1)*actualPitch + (x+width)*tjPixelSize[pf]; |
| 118 » if((*env)->GetArrayLength(env, src)<arraySize) | 207 » if((*env)->GetArrayLength(env, src)*srcElementSize<arraySize) |
| 119 » » _throw("Source buffer is not large enough"); | 208 » » _throwarg("Source buffer is not large enough"); |
| 120 jpegSize=tjBufSize(width, height, jpegSubsamp); | 209 jpegSize=tjBufSize(width, height, jpegSubsamp); |
| 121 if((*env)->GetArrayLength(env, dst)<(jsize)jpegSize) | 210 if((*env)->GetArrayLength(env, dst)<(jsize)jpegSize) |
| 122 » » _throw("Destination buffer is not large enough"); | 211 » » _throwarg("Destination buffer is not large enough"); |
| 123 | 212 |
| 124 bailif0(srcBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); | 213 bailif0(srcBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); |
| 125 bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); | 214 bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); |
| 126 | 215 |
| 216 if(ProcessSystemProperties(env)<0) goto bailout; |
| 217 |
| 127 if(tjCompress2(handle, &srcBuf[y*actualPitch + x*tjPixelSize[pf]], width
, | 218 if(tjCompress2(handle, &srcBuf[y*actualPitch + x*tjPixelSize[pf]], width
, |
| 128 pitch, height, pf, &jpegBuf, &jpegSize, jpegSubsamp, jpegQual, | 219 pitch, height, pf, &jpegBuf, &jpegSize, jpegSubsamp, jpegQual, |
| 129 flags|TJFLAG_NOREALLOC)==-1) | 220 flags|TJFLAG_NOREALLOC)==-1) |
| 130 » { | 221 » » _throwtj(); |
| 131 » » (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); | |
| 132 » » (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); | |
| 133 » » jpegBuf=srcBuf=NULL; | |
| 134 » » _throw(tjGetErrorStr()); | |
| 135 » } | |
| 136 | 222 |
| 137 bailout: | 223 bailout: |
| 138 if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); | 224 if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); |
| 139 if(srcBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); | 225 if(srcBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); |
| 140 return (jint)jpegSize; | 226 return (jint)jpegSize; |
| 141 } | 227 } |
| 142 | 228 |
| 229 /* TurboJPEG 1.3.x: TJCompressor::compress() byte source */ |
| 230 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
BIIIIII_3BIII |
| 231 (JNIEnv *env, jobject obj, jbyteArray src, jint x, jint y, jint width, |
| 232 jint pitch, jint height, jint pf, jbyteArray dst, jint jpegSubsa
mp, |
| 233 jint jpegQual, jint flags) |
| 234 { |
| 235 return TJCompressor_compress(env, obj, src, 1, x, y, width, pitch, heigh
t, |
| 236 pf, dst, jpegSubsamp, jpegQual, flags); |
| 237 } |
| 238 |
| 239 /* TurboJPEG 1.2.x: TJCompressor::compress() byte source */ |
| 143 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
BIIII_3BIII | 240 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
BIIII_3BIII |
| 144 (JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch, | 241 (JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch, |
| 145 jint height, jint pf, jbyteArray dst, jint jpegSubsamp, jint jpe
gQual, | 242 jint height, jint pf, jbyteArray dst, jint jpegSubsamp, jint jpe
gQual, |
| 146 jint flags) | 243 jint flags) |
| 147 { | 244 { |
| 148 » return Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3BIIIIII_
3BIII( | 245 » return TJCompressor_compress(env, obj, src, 1, 0, 0, width, pitch, heigh
t, |
| 149 » » env, obj, src, 0, 0, width, pitch, height, pf, dst, jpegSubsamp,
jpegQual, | 246 » » pf, dst, jpegSubsamp, jpegQual, flags); |
| 150 » » flags); | 247 } |
| 151 } | 248 |
| 152 | 249 /* TurboJPEG 1.3.x: TJCompressor::compress() int source */ |
| 153 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
IIIIIII_3BIII | 250 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
IIIIIII_3BIII |
| 154 (JNIEnv *env, jobject obj, jintArray src, jint x, jint y, jint width, | 251 (JNIEnv *env, jobject obj, jintArray src, jint x, jint y, jint width, |
| 155 jint stride, jint height, jint pf, jbyteArray dst, jint jpegSubs
amp, | 252 jint stride, jint height, jint pf, jbyteArray dst, jint jpegSubs
amp, |
| 156 jint jpegQual, jint flags) | 253 jint jpegQual, jint flags) |
| 157 { | 254 { |
| 255 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF) |
| 256 _throwarg("Invalid argument in compress()"); |
| 257 if(tjPixelSize[pf]!=sizeof(jint)) |
| 258 _throwarg("Pixel format must be 32-bit when compressing from an
integer buffer."); |
| 259 |
| 260 return TJCompressor_compress(env, obj, src, sizeof(jint), x, y, width, |
| 261 stride*sizeof(jint), height, pf, dst, jpegSubsamp, jpegQual, fla
gs); |
| 262 |
| 263 bailout: |
| 264 return 0; |
| 265 } |
| 266 |
| 267 /* TurboJPEG 1.2.x: TJCompressor::compress() int source */ |
| 268 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
IIIII_3BIII |
| 269 (JNIEnv *env, jobject obj, jintArray src, jint width, jint stride, |
| 270 jint height, jint pf, jbyteArray dst, jint jpegSubsamp, jint jpe
gQual, |
| 271 jint flags) |
| 272 { |
| 273 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF) |
| 274 _throwarg("Invalid argument in compress()"); |
| 275 if(tjPixelSize[pf]!=sizeof(jint)) |
| 276 _throwarg("Pixel format must be 32-bit when compressing from an
integer buffer."); |
| 277 |
| 278 return TJCompressor_compress(env, obj, src, sizeof(jint), 0, 0, width, |
| 279 stride*sizeof(jint), height, pf, dst, jpegSubsamp, jpegQual, fla
gs); |
| 280 |
| 281 bailout: |
| 282 return 0; |
| 283 } |
| 284 |
| 285 /* TurboJPEG 1.4.x: TJCompressor::compressFromYUV() */ |
| 286 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compressFrom
YUV___3_3B_3II_3III_3BII |
| 287 (JNIEnv *env, jobject obj, jobjectArray srcobjs, jintArray jSrcOffsets, |
| 288 jint width, jintArray jSrcStrides, jint height, jint subsamp, |
| 289 jbyteArray dst, jint jpegQual, jint flags) |
| 290 { |
| 158 tjhandle handle=0; | 291 tjhandle handle=0; |
| 159 unsigned long jpegSize=0; | 292 unsigned long jpegSize=0; |
| 160 » jsize arraySize=0, actualStride; | 293 » jbyteArray jSrcPlanes[3]={NULL, NULL, NULL}; |
| 161 » unsigned char *srcBuf=NULL, *jpegBuf=NULL; | 294 » const unsigned char *srcPlanes[3]; |
| 295 » unsigned char *jpegBuf=NULL; |
| 296 » int *srcOffsets=NULL, *srcStrides=NULL; |
| 297 » int nc=(subsamp==org_libjpegturbo_turbojpeg_TJ_SAMP_GRAY? 1:3), i; |
| 162 | 298 |
| 163 gethandle(); | 299 gethandle(); |
| 164 | 300 |
| 301 if(subsamp<0 || subsamp>=org_libjpegturbo_turbojpeg_TJ_NUMSAMP) |
| 302 _throwarg("Invalid argument in compressFromYUV()"); |
| 303 if(org_libjpegturbo_turbojpeg_TJ_NUMSAMP!=TJ_NUMSAMP) |
| 304 _throwarg("Mismatch between Java and C API"); |
| 305 |
| 306 if((*env)->GetArrayLength(env, srcobjs)<nc) |
| 307 _throwarg("Planes array is too small for the subsampling type"); |
| 308 if((*env)->GetArrayLength(env, jSrcOffsets)<nc) |
| 309 _throwarg("Offsets array is too small for the subsampling type")
; |
| 310 if((*env)->GetArrayLength(env, jSrcStrides)<nc) |
| 311 _throwarg("Strides array is too small for the subsampling type")
; |
| 312 |
| 313 jpegSize=tjBufSize(width, height, subsamp); |
| 314 if((*env)->GetArrayLength(env, dst)<(jsize)jpegSize) |
| 315 _throwarg("Destination buffer is not large enough"); |
| 316 |
| 317 bailif0(srcOffsets=(*env)->GetPrimitiveArrayCritical(env, jSrcOffsets, 0
)); |
| 318 bailif0(srcStrides=(*env)->GetPrimitiveArrayCritical(env, jSrcStrides, 0
)); |
| 319 for(i=0; i<nc; i++) |
| 320 { |
| 321 int planeSize=tjPlaneSizeYUV(i, width, srcStrides[i], height, su
bsamp); |
| 322 int pw=tjPlaneWidth(i, width, subsamp); |
| 323 |
| 324 if(planeSize<0 || pw<0) |
| 325 _throwarg(tjGetErrorStr()); |
| 326 |
| 327 if(srcOffsets[i]<0) |
| 328 _throwarg("Invalid argument in compressFromYUV()"); |
| 329 if(srcStrides[i]<0 && srcOffsets[i]-planeSize+pw<0) |
| 330 _throwarg("Negative plane stride would cause memory to b
e accessed below plane boundary"); |
| 331 |
| 332 bailif0(jSrcPlanes[i]=(*env)->GetObjectArrayElement(env, srcobjs
, i)); |
| 333 if((*env)->GetArrayLength(env, jSrcPlanes[i])<srcOffsets[i]+plan
eSize) |
| 334 _throwarg("Source plane is not large enough"); |
| 335 |
| 336 bailif0(srcPlanes[i]=(*env)->GetPrimitiveArrayCritical(env, jSrc
Planes[i], |
| 337 0)); |
| 338 srcPlanes[i]=&srcPlanes[i][srcOffsets[i]]; |
| 339 } |
| 340 bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); |
| 341 |
| 342 if(ProcessSystemProperties(env)<0) goto bailout; |
| 343 |
| 344 if(tjCompressFromYUVPlanes(handle, srcPlanes, width, srcStrides, height, |
| 345 subsamp, &jpegBuf, &jpegSize, jpegQual, flags|TJFLAG_NOREALLOC)=
=-1) |
| 346 _throwtj(); |
| 347 |
| 348 bailout: |
| 349 if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); |
| 350 for(i=0; i<nc; i++) |
| 351 { |
| 352 if(srcPlanes[i] && jSrcPlanes[i]) |
| 353 (*env)->ReleasePrimitiveArrayCritical(env, jSrcPlanes[i]
, |
| 354 (unsigned char *)srcPlanes[i], 0); |
| 355 } |
| 356 if(srcStrides) |
| 357 (*env)->ReleasePrimitiveArrayCritical(env, jSrcStrides, srcStrid
es, 0); |
| 358 if(srcOffsets) |
| 359 (*env)->ReleasePrimitiveArrayCritical(env, jSrcOffsets, srcOffse
ts, 0); |
| 360 return (jint)jpegSize; |
| 361 } |
| 362 |
| 363 static void TJCompressor_encodeYUV |
| 364 (JNIEnv *env, jobject obj, jarray src, jint srcElementSize, jint x, jint
y, |
| 365 jint width, jint pitch, jint height, jint pf, jobjectArray dstob
js, |
| 366 jintArray jDstOffsets, jintArray jDstStrides, jint subsamp, jint
flags) |
| 367 { |
| 368 tjhandle handle=0; |
| 369 jsize arraySize=0, actualPitch; |
| 370 jbyteArray jDstPlanes[3]={NULL, NULL, NULL}; |
| 371 unsigned char *srcBuf=NULL, *dstPlanes[3]; |
| 372 int *dstOffsets=NULL, *dstStrides=NULL; |
| 373 int nc=(subsamp==org_libjpegturbo_turbojpeg_TJ_SAMP_GRAY? 1:3), i; |
| 374 |
| 375 gethandle(); |
| 376 |
| 165 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF || width<1 || height<
1 | 377 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF || width<1 || height<
1 |
| 166 » » || stride<0) | 378 » » || pitch<0 || subsamp<0 || subsamp>=org_libjpegturbo_turbojpeg_T
J_NUMSAMP) |
| 167 » » _throw("Invalid argument in compress()"); | 379 » » _throwarg("Invalid argument in encodeYUV()"); |
| 168 » if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) | 380 » if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF |
| 169 » » _throw("Mismatch between Java and C API"); | 381 » » || org_libjpegturbo_turbojpeg_TJ_NUMSAMP!=TJ_NUMSAMP) |
| 382 » » _throwarg("Mismatch between Java and C API"); |
| 383 |
| 384 » if((*env)->GetArrayLength(env, dstobjs)<nc) |
| 385 » » _throwarg("Planes array is too small for the subsampling type"); |
| 386 » if((*env)->GetArrayLength(env, jDstOffsets)<nc) |
| 387 » » _throwarg("Offsets array is too small for the subsampling type")
; |
| 388 » if((*env)->GetArrayLength(env, jDstStrides)<nc) |
| 389 » » _throwarg("Strides array is too small for the subsampling type")
; |
| 390 |
| 391 » actualPitch=(pitch==0)? width*tjPixelSize[pf]:pitch; |
| 392 » arraySize=(y+height-1)*actualPitch + (x+width)*tjPixelSize[pf]; |
| 393 » if((*env)->GetArrayLength(env, src)*srcElementSize<arraySize) |
| 394 » » _throwarg("Source buffer is not large enough"); |
| 395 |
| 396 » bailif0(dstOffsets=(*env)->GetPrimitiveArrayCritical(env, jDstOffsets, 0
)); |
| 397 » bailif0(dstStrides=(*env)->GetPrimitiveArrayCritical(env, jDstStrides, 0
)); |
| 398 » for(i=0; i<nc; i++) |
| 399 » { |
| 400 » » int planeSize=tjPlaneSizeYUV(i, width, dstStrides[i], height, su
bsamp); |
| 401 » » int pw=tjPlaneWidth(i, width, subsamp); |
| 402 |
| 403 » » if(planeSize<0 || pw<0) |
| 404 » » » _throwarg(tjGetErrorStr()); |
| 405 |
| 406 » » if(dstOffsets[i]<0) |
| 407 » » » _throwarg("Invalid argument in encodeYUV()"); |
| 408 » » if(dstStrides[i]<0 && dstOffsets[i]-planeSize+pw<0) |
| 409 » » » _throwarg("Negative plane stride would cause memory to b
e accessed below plane boundary"); |
| 410 |
| 411 » » bailif0(jDstPlanes[i]=(*env)->GetObjectArrayElement(env, dstobjs
, i)); |
| 412 » » if((*env)->GetArrayLength(env, jDstPlanes[i])<dstOffsets[i]+plan
eSize) |
| 413 » » » _throwarg("Destination plane is not large enough"); |
| 414 |
| 415 » » bailif0(dstPlanes[i]=(*env)->GetPrimitiveArrayCritical(env, jDst
Planes[i], |
| 416 » » » 0)); |
| 417 » » dstPlanes[i]=&dstPlanes[i][dstOffsets[i]]; |
| 418 » } |
| 419 » bailif0(srcBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); |
| 420 |
| 421 » if(tjEncodeYUVPlanes(handle, &srcBuf[y*actualPitch + x*tjPixelSize[pf]], |
| 422 » » width, pitch, height, pf, dstPlanes, dstStrides, subsamp, flags)
==-1) |
| 423 » » _throwtj(); |
| 424 |
| 425 » bailout: |
| 426 » if(srcBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); |
| 427 » for(i=0; i<nc; i++) |
| 428 » { |
| 429 » » if(dstPlanes[i] && jDstPlanes[i]) |
| 430 » » » (*env)->ReleasePrimitiveArrayCritical(env, jDstPlanes[i]
, dstPlanes[i], |
| 431 » » » » 0); |
| 432 » } |
| 433 » if(dstStrides) |
| 434 » » (*env)->ReleasePrimitiveArrayCritical(env, jDstStrides, dstStrid
es, 0); |
| 435 » if(dstOffsets) |
| 436 » » (*env)->ReleasePrimitiveArrayCritical(env, jDstOffsets, dstOffse
ts, 0); |
| 437 » return; |
| 438 } |
| 439 |
| 440 /* TurboJPEG 1.4.x: TJCompressor::encodeYUV() byte source */ |
| 441 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___
3BIIIIII_3_3B_3I_3III |
| 442 » (JNIEnv *env, jobject obj, jbyteArray src, jint x, jint y, jint width, |
| 443 » » jint pitch, jint height, jint pf, jobjectArray dstobjs, |
| 444 » » jintArray jDstOffsets, jintArray jDstStrides, jint subsamp, jint
flags) |
| 445 { |
| 446 » TJCompressor_encodeYUV(env, obj, src, 1, x, y, width, pitch, height, pf, |
| 447 » » dstobjs, jDstOffsets, jDstStrides, subsamp, flags); |
| 448 } |
| 449 |
| 450 /* TurboJPEG 1.4.x: TJCompressor::encodeYUV() int source */ |
| 451 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___
3IIIIIII_3_3B_3I_3III |
| 452 » (JNIEnv *env, jobject obj, jintArray src, jint x, jint y, jint width, |
| 453 » » jint stride, jint height, jint pf, jobjectArray dstobjs, |
| 454 » » jintArray jDstOffsets, jintArray jDstStrides, jint subsamp, jint
flags) |
| 455 { |
| 456 » if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF) |
| 457 » » _throwarg("Invalid argument in encodeYUV()"); |
| 170 if(tjPixelSize[pf]!=sizeof(jint)) | 458 if(tjPixelSize[pf]!=sizeof(jint)) |
| 171 » » _throw("Pixel format must be 32-bit when compressing from an int
eger buffer."); | 459 » » _throwarg("Pixel format must be 32-bit when encoding from an int
eger buffer."); |
| 172 | 460 |
| 173 » actualStride=(stride==0)? width:stride; | 461 » TJCompressor_encodeYUV(env, obj, src, sizeof(jint), x, y, width, |
| 174 » arraySize=(y+height-1)*actualStride + x+width; | 462 » » stride*sizeof(jint), height, pf, dstobjs, jDstOffsets, jDstStrid
es, |
| 175 » if((*env)->GetArrayLength(env, src)<arraySize) | 463 » » subsamp, flags); |
| 176 » » _throw("Source buffer is not large enough"); | 464 |
| 177 » jpegSize=tjBufSize(width, height, jpegSubsamp); | 465 » bailout: |
| 178 » if((*env)->GetArrayLength(env, dst)<(jsize)jpegSize) | 466 » return; |
| 179 » » _throw("Destination buffer is not large enough"); | 467 } |
| 180 | 468 |
| 181 » bailif0(srcBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); | 469 JNIEXPORT void JNICALL TJCompressor_encodeYUV_12 |
| 182 » bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); | 470 » (JNIEnv *env, jobject obj, jarray src, jint srcElementSize, jint width, |
| 183 | 471 » » jint pitch, jint height, jint pf, jbyteArray dst, jint subsamp,
jint flags) |
| 184 » if(tjCompress2(handle, &srcBuf[(y*actualStride + x)*sizeof(int)], width, | |
| 185 » » stride*sizeof(jint), height, pf, &jpegBuf, &jpegSize, jpegSubsam
p, | |
| 186 » » jpegQual, flags|TJFLAG_NOREALLOC)==-1) | |
| 187 » { | |
| 188 » » (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); | |
| 189 » » (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); | |
| 190 » » jpegBuf=srcBuf=NULL; | |
| 191 » » _throw(tjGetErrorStr()); | |
| 192 » } | |
| 193 | |
| 194 » bailout: | |
| 195 » if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, jpegBuf, 0); | |
| 196 » if(srcBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); | |
| 197 » return (jint)jpegSize; | |
| 198 } | |
| 199 | |
| 200 JNIEXPORT jint JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3
IIIII_3BIII | |
| 201 » (JNIEnv *env, jobject obj, jintArray src, jint width, jint pitch, | |
| 202 » » jint height, jint pf, jbyteArray dst, jint jpegSubsamp, jint jpe
gQual, | |
| 203 » » jint flags) | |
| 204 { | |
| 205 » return Java_org_libjpegturbo_turbojpeg_TJCompressor_compress___3IIIIIII_
3BIII( | |
| 206 » » env, obj, src, 0, 0, width, pitch, height, pf, dst, jpegSubsamp,
jpegQual, | |
| 207 » » flags); | |
| 208 } | |
| 209 | |
| 210 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___
3BIIII_3BII | |
| 211 » (JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch, | |
| 212 » » jint height, jint pf, jbyteArray dst, jint subsamp, jint flags) | |
| 213 { | 472 { |
| 214 tjhandle handle=0; | 473 tjhandle handle=0; |
| 215 jsize arraySize=0; | 474 jsize arraySize=0; |
| 216 unsigned char *srcBuf=NULL, *dstBuf=NULL; | 475 unsigned char *srcBuf=NULL, *dstBuf=NULL; |
| 217 | 476 |
| 218 gethandle(); | 477 gethandle(); |
| 219 | 478 |
| 220 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF || width<1 || height<
1 | 479 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF || width<1 || height<
1 |
| 221 || pitch<0) | 480 || pitch<0) |
| 222 » » _throw("Invalid argument in encodeYUV()"); | 481 » » _throwarg("Invalid argument in encodeYUV()"); |
| 223 if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) | 482 if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) |
| 224 » » _throw("Mismatch between Java and C API"); | 483 » » _throwarg("Mismatch between Java and C API"); |
| 225 | 484 |
| 226 arraySize=(pitch==0)? width*tjPixelSize[pf]*height:pitch*height; | 485 arraySize=(pitch==0)? width*tjPixelSize[pf]*height:pitch*height; |
| 227 » if((*env)->GetArrayLength(env, src)<arraySize) | 486 » if((*env)->GetArrayLength(env, src)*srcElementSize<arraySize) |
| 228 » » _throw("Source buffer is not large enough"); | 487 » » _throwarg("Source buffer is not large enough"); |
| 229 if((*env)->GetArrayLength(env, dst) | 488 if((*env)->GetArrayLength(env, dst) |
| 230 <(jsize)tjBufSizeYUV(width, height, subsamp)) | 489 <(jsize)tjBufSizeYUV(width, height, subsamp)) |
| 231 » » _throw("Destination buffer is not large enough"); | 490 » » _throwarg("Destination buffer is not large enough"); |
| 232 | 491 |
| 233 bailif0(srcBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); | 492 bailif0(srcBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); |
| 234 bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); | 493 bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); |
| 235 | 494 |
| 236 if(tjEncodeYUV2(handle, srcBuf, width, pitch, height, pf, dstBuf, subsam
p, | 495 if(tjEncodeYUV2(handle, srcBuf, width, pitch, height, pf, dstBuf, subsam
p, |
| 237 flags)==-1) | 496 flags)==-1) |
| 238 » { | 497 » » _throwtj(); |
| 239 » » (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); | |
| 240 » » (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); | |
| 241 » » dstBuf=srcBuf=NULL; | |
| 242 » » _throw(tjGetErrorStr()); | |
| 243 » } | |
| 244 | 498 |
| 245 bailout: | 499 bailout: |
| 246 if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); | 500 if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); |
| 247 if(srcBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); | 501 if(srcBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); |
| 248 return; | 502 return; |
| 249 } | 503 } |
| 250 | 504 |
| 505 /* TurboJPEG 1.2.x: TJCompressor::encodeYUV() byte source */ |
| 506 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___
3BIIII_3BII |
| 507 (JNIEnv *env, jobject obj, jbyteArray src, jint width, jint pitch, |
| 508 jint height, jint pf, jbyteArray dst, jint subsamp, jint flags) |
| 509 { |
| 510 TJCompressor_encodeYUV_12(env, obj, src, 1, width, pitch, height, pf, ds
t, |
| 511 subsamp, flags); |
| 512 } |
| 513 |
| 514 /* TurboJPEG 1.2.x: TJCompressor::encodeYUV() int source */ |
| 251 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___
3IIIII_3BII | 515 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_encodeYUV___
3IIIII_3BII |
| 252 (JNIEnv *env, jobject obj, jintArray src, jint width, jint stride, | 516 (JNIEnv *env, jobject obj, jintArray src, jint width, jint stride, |
| 253 jint height, jint pf, jbyteArray dst, jint subsamp, jint flags) | 517 jint height, jint pf, jbyteArray dst, jint subsamp, jint flags) |
| 254 { | 518 { |
| 255 » tjhandle handle=0; | 519 » if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF) |
| 256 » jsize arraySize=0; | 520 » » _throwarg("Invalid argument in encodeYUV()"); |
| 257 » unsigned char *srcBuf=NULL, *dstBuf=NULL; | 521 » if(tjPixelSize[pf]!=sizeof(jint)) |
| 522 » » _throwarg("Pixel format must be 32-bit when encoding from an int
eger buffer."); |
| 258 | 523 |
| 259 » gethandle(); | 524 » TJCompressor_encodeYUV_12(env, obj, src, sizeof(jint), width, |
| 260 | 525 » » stride*sizeof(jint), height, pf, dst, subsamp, flags); |
| 261 » if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF || width<1 || height<
1 | |
| 262 » » || stride<0) | |
| 263 » » _throw("Invalid argument in encodeYUV()"); | |
| 264 » if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) | |
| 265 » » _throw("Mismatch between Java and C API"); | |
| 266 » if(tjPixelSize[pf]!=sizeof(jint)) | |
| 267 » » _throw("Pixel format must be 32-bit when encoding from an intege
r buffer."); | |
| 268 | |
| 269 » arraySize=(stride==0)? width*height:stride*height; | |
| 270 » if((*env)->GetArrayLength(env, src)<arraySize) | |
| 271 » » _throw("Source buffer is not large enough"); | |
| 272 » if((*env)->GetArrayLength(env, dst) | |
| 273 » » <(jsize)tjBufSizeYUV(width, height, subsamp)) | |
| 274 » » _throw("Destination buffer is not large enough"); | |
| 275 | |
| 276 » bailif0(srcBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); | |
| 277 » bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); | |
| 278 | |
| 279 » if(tjEncodeYUV2(handle, srcBuf, width, stride*sizeof(jint), height, pf, | |
| 280 » » dstBuf, subsamp, flags)==-1) | |
| 281 » { | |
| 282 » » (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); | |
| 283 » » (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); | |
| 284 » » dstBuf=srcBuf=NULL; | |
| 285 » » _throw(tjGetErrorStr()); | |
| 286 » } | |
| 287 | 526 |
| 288 bailout: | 527 bailout: |
| 289 if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); | |
| 290 if(srcBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, srcBuf, 0); | |
| 291 return; | 528 return; |
| 292 } | 529 } |
| 293 | 530 |
| 531 /* TurboJPEG 1.2.x: TJCompressor::destroy() */ |
| 294 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_destroy | 532 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJCompressor_destroy |
| 295 (JNIEnv *env, jobject obj) | 533 (JNIEnv *env, jobject obj) |
| 296 { | 534 { |
| 297 tjhandle handle=0; | 535 tjhandle handle=0; |
| 298 | 536 |
| 299 gethandle(); | 537 gethandle(); |
| 300 | 538 |
| 301 » if(tjDestroy(handle)==-1) _throw(tjGetErrorStr()); | 539 » if(tjDestroy(handle)==-1) _throwtj(); |
| 302 (*env)->SetLongField(env, obj, _fid, 0); | 540 (*env)->SetLongField(env, obj, _fid, 0); |
| 303 | 541 |
| 304 bailout: | 542 bailout: |
| 305 return; | 543 return; |
| 306 } | 544 } |
| 307 | 545 |
| 546 /* TurboJPEG 1.2.x: TJDecompressor::init() */ |
| 308 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_init | 547 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_init |
| 309 (JNIEnv *env, jobject obj) | 548 (JNIEnv *env, jobject obj) |
| 310 { | 549 { |
| 311 jclass cls; | 550 jclass cls; |
| 312 jfieldID fid; | 551 jfieldID fid; |
| 313 tjhandle handle; | 552 tjhandle handle; |
| 314 | 553 |
| 315 » if((handle=tjInitDecompress())==NULL) _throw(tjGetErrorStr()); | 554 » if((handle=tjInitDecompress())==NULL) _throwtj(); |
| 316 | 555 |
| 317 bailif0(cls=(*env)->GetObjectClass(env, obj)); | 556 bailif0(cls=(*env)->GetObjectClass(env, obj)); |
| 318 bailif0(fid=(*env)->GetFieldID(env, cls, "handle", "J")); | 557 bailif0(fid=(*env)->GetFieldID(env, cls, "handle", "J")); |
| 319 » (*env)->SetLongField(env, obj, fid, (jlong)handle); | 558 » (*env)->SetLongField(env, obj, fid, (size_t)handle); |
| 320 | 559 |
| 321 bailout: | 560 bailout: |
| 322 return; | 561 return; |
| 323 } | 562 } |
| 324 | 563 |
| 564 /* TurboJPEG 1.2.x: TJDecompressor::getScalingFactors() */ |
| 325 JNIEXPORT jobjectArray JNICALL Java_org_libjpegturbo_turbojpeg_TJ_getScalingFact
ors | 565 JNIEXPORT jobjectArray JNICALL Java_org_libjpegturbo_turbojpeg_TJ_getScalingFact
ors |
| 326 (JNIEnv *env, jclass cls) | 566 (JNIEnv *env, jclass cls) |
| 327 { | 567 { |
| 328 jclass sfcls=NULL; jfieldID fid=0; | 568 » jclass sfcls=NULL; jfieldID fid=0; |
| 329 tjscalingfactor *sf=NULL; int n=0, i; | 569 tjscalingfactor *sf=NULL; int n=0, i; |
| 330 jobject sfobj=NULL; | 570 jobject sfobj=NULL; |
| 331 jobjectArray sfjava=NULL; | 571 jobjectArray sfjava=NULL; |
| 332 | 572 |
| 333 if((sf=tjGetScalingFactors(&n))==NULL || n==0) | 573 if((sf=tjGetScalingFactors(&n))==NULL || n==0) |
| 334 » » _throw(tjGetErrorStr()); | 574 » » _throwarg(tjGetErrorStr()); |
| 335 | 575 |
| 336 bailif0(sfcls=(*env)->FindClass(env, "org/libjpegturbo/turbojpeg/TJScali
ngFactor")); | 576 bailif0(sfcls=(*env)->FindClass(env, "org/libjpegturbo/turbojpeg/TJScali
ngFactor")); |
| 337 bailif0(sfjava=(jobjectArray)(*env)->NewObjectArray(env, n, sfcls, 0)); | 577 bailif0(sfjava=(jobjectArray)(*env)->NewObjectArray(env, n, sfcls, 0)); |
| 338 | 578 |
| 339 for(i=0; i<n; i++) | 579 for(i=0; i<n; i++) |
| 340 { | 580 { |
| 341 bailif0(sfobj=(*env)->AllocObject(env, sfcls)); | 581 bailif0(sfobj=(*env)->AllocObject(env, sfcls)); |
| 342 bailif0(fid=(*env)->GetFieldID(env, sfcls, "num", "I")); | 582 bailif0(fid=(*env)->GetFieldID(env, sfcls, "num", "I")); |
| 343 (*env)->SetIntField(env, sfobj, fid, sf[i].num); | 583 (*env)->SetIntField(env, sfobj, fid, sf[i].num); |
| 344 bailif0(fid=(*env)->GetFieldID(env, sfcls, "denom", "I")); | 584 bailif0(fid=(*env)->GetFieldID(env, sfcls, "denom", "I")); |
| 345 (*env)->SetIntField(env, sfobj, fid, sf[i].denom); | 585 (*env)->SetIntField(env, sfobj, fid, sf[i].denom); |
| 346 (*env)->SetObjectArrayElement(env, sfjava, i, sfobj); | 586 (*env)->SetObjectArrayElement(env, sfjava, i, sfobj); |
| 347 } | 587 } |
| 348 | 588 |
| 349 bailout: | 589 bailout: |
| 350 return sfjava; | 590 return sfjava; |
| 351 } | 591 } |
| 352 | 592 |
| 593 /* TurboJPEG 1.2.x: TJDecompressor::decompressHeader() */ |
| 353 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
Header | 594 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
Header |
| 354 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize) | 595 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize) |
| 355 { | 596 { |
| 356 tjhandle handle=0; | 597 tjhandle handle=0; |
| 357 unsigned char *jpegBuf=NULL; | 598 unsigned char *jpegBuf=NULL; |
| 358 » int width=0, height=0, jpegSubsamp=-1; | 599 » int width=0, height=0, jpegSubsamp=-1, jpegColorspace=-1; |
| 359 | 600 |
| 360 gethandle(); | 601 gethandle(); |
| 361 | 602 |
| 362 if((*env)->GetArrayLength(env, src)<jpegSize) | 603 if((*env)->GetArrayLength(env, src)<jpegSize) |
| 363 » » _throw("Source buffer is not large enough"); | 604 » » _throwarg("Source buffer is not large enough"); |
| 364 | 605 |
| 365 bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); | 606 bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); |
| 366 | 607 |
| 367 » if(tjDecompressHeader2(handle, jpegBuf, (unsigned long)jpegSize, | 608 » if(tjDecompressHeader3(handle, jpegBuf, (unsigned long)jpegSize, |
| 368 » » &width, &height, &jpegSubsamp)==-1) | 609 » » &width, &height, &jpegSubsamp, &jpegColorspace)==-1) |
| 369 » { | 610 » » _throwtj(); |
| 370 » » (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); | 611 |
| 371 » » _throw(tjGetErrorStr()); | |
| 372 » } | |
| 373 (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); jpegBuf=NU
LL; | 612 (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); jpegBuf=NU
LL; |
| 374 | 613 |
| 375 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegSubsamp", "I")); | 614 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegSubsamp", "I")); |
| 376 (*env)->SetIntField(env, obj, _fid, jpegSubsamp); | 615 (*env)->SetIntField(env, obj, _fid, jpegSubsamp); |
| 616 if((_fid=(*env)->GetFieldID(env, _cls, "jpegColorspace", "I"))==0) |
| 617 (*env)->ExceptionClear(env); |
| 618 else |
| 619 (*env)->SetIntField(env, obj, _fid, jpegColorspace); |
| 377 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegWidth", "I")); | 620 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegWidth", "I")); |
| 378 (*env)->SetIntField(env, obj, _fid, width); | 621 (*env)->SetIntField(env, obj, _fid, width); |
| 379 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegHeight", "I")); | 622 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegHeight", "I")); |
| 380 (*env)->SetIntField(env, obj, _fid, height); | 623 (*env)->SetIntField(env, obj, _fid, height); |
| 381 | 624 |
| 382 bailout: | 625 bailout: |
| 626 if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); |
| 383 return; | 627 return; |
| 384 } | 628 } |
| 385 | 629 |
| 386 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
___3BI_3BIIIIIII | 630 static void TJDecompressor_decompress |
| 387 » (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jbyteArray dst
, | 631 » (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jarray dst, |
| 388 » » jint x, jint y, jint width, jint pitch, jint height, jint pf, ji
nt flags) | 632 » » jint dstElementSize, jint x, jint y, jint width, jint pitch, jin
t height, |
| 633 » » jint pf, jint flags) |
| 389 { | 634 { |
| 390 tjhandle handle=0; | 635 tjhandle handle=0; |
| 391 jsize arraySize=0, actualPitch; | 636 jsize arraySize=0, actualPitch; |
| 392 unsigned char *jpegBuf=NULL, *dstBuf=NULL; | 637 unsigned char *jpegBuf=NULL, *dstBuf=NULL; |
| 393 | 638 |
| 394 gethandle(); | 639 gethandle(); |
| 395 | 640 |
| 396 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF) | 641 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF) |
| 397 » » _throw("Invalid argument in decompress()"); | 642 » » _throwarg("Invalid argument in decompress()"); |
| 398 if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) | 643 if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) |
| 399 » » _throw("Mismatch between Java and C API"); | 644 » » _throwarg("Mismatch between Java and C API"); |
| 400 | 645 |
| 401 if((*env)->GetArrayLength(env, src)<jpegSize) | 646 if((*env)->GetArrayLength(env, src)<jpegSize) |
| 402 » » _throw("Source buffer is not large enough"); | 647 » » _throwarg("Source buffer is not large enough"); |
| 403 actualPitch=(pitch==0)? width*tjPixelSize[pf]:pitch; | 648 actualPitch=(pitch==0)? width*tjPixelSize[pf]:pitch; |
| 404 arraySize=(y+height-1)*actualPitch + (x+width)*tjPixelSize[pf]; | 649 arraySize=(y+height-1)*actualPitch + (x+width)*tjPixelSize[pf]; |
| 405 » if((*env)->GetArrayLength(env, dst)<arraySize) | 650 » if((*env)->GetArrayLength(env, dst)*dstElementSize<arraySize) |
| 406 » » _throw("Destination buffer is not large enough"); | 651 » » _throwarg("Destination buffer is not large enough"); |
| 407 | 652 |
| 408 bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); | 653 bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); |
| 409 bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); | 654 bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); |
| 410 | 655 |
| 411 if(tjDecompress2(handle, jpegBuf, (unsigned long)jpegSize, | 656 if(tjDecompress2(handle, jpegBuf, (unsigned long)jpegSize, |
| 412 &dstBuf[y*actualPitch + x*tjPixelSize[pf]], width, pitch, height
, pf, | 657 &dstBuf[y*actualPitch + x*tjPixelSize[pf]], width, pitch, height
, pf, |
| 413 flags)==-1) | 658 flags)==-1) |
| 414 » { | 659 » » _throwtj(); |
| 415 » » (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); | |
| 416 » » (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); | |
| 417 » » dstBuf=jpegBuf=NULL; | |
| 418 » » _throw(tjGetErrorStr()); | |
| 419 » } | |
| 420 | 660 |
| 421 bailout: | 661 bailout: |
| 422 if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); | 662 if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); |
| 423 if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); | 663 if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); |
| 424 return; | 664 return; |
| 425 } | 665 } |
| 426 | 666 |
| 667 /* TurboJPEG 1.3.x: TJDecompressor::decompress() byte destination */ |
| 668 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
___3BI_3BIIIIIII |
| 669 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jbyteArray dst
, |
| 670 jint x, jint y, jint width, jint pitch, jint height, jint pf, ji
nt flags) |
| 671 { |
| 672 TJDecompressor_decompress(env, obj, src, jpegSize, dst, 1, x, y, width, |
| 673 pitch, height, pf, flags); |
| 674 } |
| 675 |
| 676 /* TurboJPEG 1.2.x: TJDecompressor::decompress() byte destination */ |
| 427 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
___3BI_3BIIIII | 677 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
___3BI_3BIIIII |
| 428 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jbyteArray dst
, | 678 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jbyteArray dst
, |
| 429 jint width, jint pitch, jint height, jint pf, jint flags) | 679 jint width, jint pitch, jint height, jint pf, jint flags) |
| 430 { | 680 { |
| 431 » Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3BIIIIII
I | 681 » TJDecompressor_decompress(env, obj, src, jpegSize, dst, 1, 0, 0, width, |
| 432 » » (env, obj, src, jpegSize, dst, 0, 0, width, pitch, height, pf, f
lags); | 682 » » pitch, height, pf, flags); |
| 433 } | 683 } |
| 434 | 684 |
| 685 /* TurboJPEG 1.3.x: TJDecompressor::decompress() int destination */ |
| 435 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
___3BI_3IIIIIIII | 686 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
___3BI_3IIIIIIII |
| 436 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jintArray dst, | 687 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jintArray dst, |
| 437 jint x, jint y, jint width, jint stride, jint height, jint pf, j
int flags) | 688 jint x, jint y, jint width, jint stride, jint height, jint pf, j
int flags) |
| 438 { | 689 { |
| 439 » tjhandle handle=0; | 690 » if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF) |
| 440 » jsize arraySize=0, actualStride; | 691 » » _throwarg("Invalid argument in decompress()"); |
| 441 » unsigned char *jpegBuf=NULL, *dstBuf=NULL; | 692 » if(tjPixelSize[pf]!=sizeof(jint)) |
| 693 » » _throwarg("Pixel format must be 32-bit when decompressing to an
integer buffer."); |
| 442 | 694 |
| 443 » gethandle(); | 695 » TJDecompressor_decompress(env, obj, src, jpegSize, dst, sizeof(jint), x,
y, |
| 444 | 696 » » width, stride*sizeof(jint), height, pf, flags); |
| 445 » if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF) | |
| 446 » » _throw("Invalid argument in decompress()"); | |
| 447 » if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF) | |
| 448 » » _throw("Mismatch between Java and C API"); | |
| 449 » if(tjPixelSize[pf]!=sizeof(jint)) | |
| 450 » » _throw("Pixel format must be 32-bit when decompressing to an int
eger buffer."); | |
| 451 | |
| 452 » if((*env)->GetArrayLength(env, src)<jpegSize) | |
| 453 » » _throw("Source buffer is not large enough"); | |
| 454 » actualStride=(stride==0)? width:stride; | |
| 455 » arraySize=(y+height-1)*actualStride + x+width; | |
| 456 » if((*env)->GetArrayLength(env, dst)<arraySize) | |
| 457 » » _throw("Destination buffer is not large enough"); | |
| 458 | |
| 459 » bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); | |
| 460 » bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); | |
| 461 | |
| 462 » if(tjDecompress2(handle, jpegBuf, (unsigned long)jpegSize, | |
| 463 » » &dstBuf[(y*actualStride + x)*sizeof(int)], width, stride*sizeof(
jint), | |
| 464 » » height, pf, flags)==-1) | |
| 465 » { | |
| 466 » » (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); | |
| 467 » » (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); | |
| 468 » » dstBuf=jpegBuf=NULL; | |
| 469 » » _throw(tjGetErrorStr()); | |
| 470 » } | |
| 471 | 697 |
| 472 bailout: | 698 bailout: |
| 473 if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); | |
| 474 if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); | |
| 475 return; | 699 return; |
| 476 } | 700 } |
| 477 | 701 |
| 702 /* TurboJPEG 1.2.x: TJDecompressor::decompress() int destination */ |
| 478 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
___3BI_3IIIIII | 703 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
___3BI_3IIIIII |
| 479 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jintArray dst, | 704 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jintArray dst, |
| 480 jint width, jint stride, jint height, jint pf, jint flags) | 705 jint width, jint stride, jint height, jint pf, jint flags) |
| 481 { | 706 { |
| 482 » Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress___3BI_3IIIIIII
I | 707 » if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF) |
| 483 » » (env, obj, src, jpegSize, dst, 0, 0, width, stride, height, pf,
flags); | 708 » » _throwarg("Invalid argument in decompress()"); |
| 484 » | 709 » if(tjPixelSize[pf]!=sizeof(jint)) |
| 710 » » _throwarg("Pixel format must be 32-bit when decompressing to an
integer buffer."); |
| 711 |
| 712 » TJDecompressor_decompress(env, obj, src, jpegSize, dst, sizeof(jint), 0,
0, |
| 713 » » width, stride*sizeof(jint), height, pf, flags); |
| 714 |
| 715 » bailout: |
| 716 » return; |
| 717 |
| 485 } | 718 } |
| 486 | 719 |
| 487 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
ToYUV | 720 /* TurboJPEG 1.4.x: TJDecompressor::decompressToYUV() */ |
| 721 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
ToYUV___3BI_3_3B_3II_3III |
| 722 » (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, |
| 723 » » jobjectArray dstobjs, jintArray jDstOffsets, jint desiredWidth, |
| 724 » » jintArray jDstStrides, jint desiredHeight, jint flags) |
| 725 { |
| 726 » tjhandle handle=0; |
| 727 » jbyteArray jDstPlanes[3]={NULL, NULL, NULL}; |
| 728 » unsigned char *jpegBuf=NULL, *dstPlanes[3]; |
| 729 » int *dstOffsets=NULL, *dstStrides=NULL; |
| 730 » int jpegSubsamp=-1, jpegWidth=0, jpegHeight=0; |
| 731 » int nc=0, i, width, height, scaledWidth, scaledHeight, nsf=0; |
| 732 » tjscalingfactor *sf; |
| 733 |
| 734 |
| 735 » gethandle(); |
| 736 |
| 737 » if((*env)->GetArrayLength(env, src)<jpegSize) |
| 738 » » _throwarg("Source buffer is not large enough"); |
| 739 » bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegSubsamp", "I")); |
| 740 » jpegSubsamp=(int)(*env)->GetIntField(env, obj, _fid); |
| 741 » bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegWidth", "I")); |
| 742 » jpegWidth=(int)(*env)->GetIntField(env, obj, _fid); |
| 743 » bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegHeight", "I")); |
| 744 » jpegHeight=(int)(*env)->GetIntField(env, obj, _fid); |
| 745 |
| 746 » nc=(jpegSubsamp==org_libjpegturbo_turbojpeg_TJ_SAMP_GRAY? 1:3); |
| 747 |
| 748 » width=desiredWidth; height=desiredHeight; |
| 749 » if(width==0) width=jpegWidth; |
| 750 » if(height==0) height=jpegHeight; |
| 751 » sf=tjGetScalingFactors(&nsf); |
| 752 » if(!sf || nsf<1) |
| 753 » » _throwarg(tjGetErrorStr()); |
| 754 » for(i=0; i<nsf; i++) |
| 755 » { |
| 756 » » scaledWidth=TJSCALED(jpegWidth, sf[i]); |
| 757 » » scaledHeight=TJSCALED(jpegHeight, sf[i]); |
| 758 » » if(scaledWidth<=width && scaledHeight<=height) |
| 759 » » » break; |
| 760 » } |
| 761 » if(i>=nsf) |
| 762 » » _throwarg("Could not scale down to desired image dimensions"); |
| 763 |
| 764 » bailif0(dstOffsets=(*env)->GetPrimitiveArrayCritical(env, jDstOffsets, 0
)); |
| 765 » bailif0(dstStrides=(*env)->GetPrimitiveArrayCritical(env, jDstStrides, 0
)); |
| 766 » for(i=0; i<nc; i++) |
| 767 » { |
| 768 » » int planeSize=tjPlaneSizeYUV(i, scaledWidth, dstStrides[i], scal
edHeight, |
| 769 » » » jpegSubsamp); |
| 770 » » int pw=tjPlaneWidth(i, scaledWidth, jpegSubsamp); |
| 771 |
| 772 » » if(planeSize<0 || pw<0) |
| 773 » » » _throwarg(tjGetErrorStr()); |
| 774 |
| 775 » » if(dstOffsets[i]<0) |
| 776 » » » _throwarg("Invalid argument in decompressToYUV()"); |
| 777 » » if(dstStrides[i]<0 && dstOffsets[i]-planeSize+pw<0) |
| 778 » » » _throwarg("Negative plane stride would cause memory to b
e accessed below plane boundary"); |
| 779 |
| 780 » » bailif0(jDstPlanes[i]=(*env)->GetObjectArrayElement(env, dstobjs
, i)); |
| 781 » » if((*env)->GetArrayLength(env, jDstPlanes[i])<dstOffsets[i]+plan
eSize) |
| 782 » » » _throwarg("Destination plane is not large enough"); |
| 783 |
| 784 » » bailif0(dstPlanes[i]=(*env)->GetPrimitiveArrayCritical(env, jDst
Planes[i], |
| 785 » » » 0)); |
| 786 » » dstPlanes[i]=&dstPlanes[i][dstOffsets[i]]; |
| 787 » } |
| 788 » bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); |
| 789 |
| 790 » if(tjDecompressToYUVPlanes(handle, jpegBuf, (unsigned long)jpegSize, |
| 791 » » dstPlanes, desiredWidth, dstStrides, desiredHeight, flags)==-1) |
| 792 » » _throwtj(); |
| 793 |
| 794 » bailout: |
| 795 » if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); |
| 796 » for(i=0; i<nc; i++) |
| 797 » { |
| 798 » » if(dstPlanes[i] && jDstPlanes[i]) |
| 799 » » » (*env)->ReleasePrimitiveArrayCritical(env, jDstPlanes[i]
, dstPlanes[i], |
| 800 » » » » 0); |
| 801 » } |
| 802 » if(dstStrides) |
| 803 » » (*env)->ReleasePrimitiveArrayCritical(env, jDstStrides, dstStrid
es, 0); |
| 804 » if(dstOffsets) |
| 805 » » (*env)->ReleasePrimitiveArrayCritical(env, jDstOffsets, dstOffse
ts, 0); |
| 806 » return; |
| 807 } |
| 808 |
| 809 /* TurboJPEG 1.2.x: TJDecompressor::decompressToYUV() */ |
| 810 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decompress
ToYUV___3BI_3BI |
| 488 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jbyteArray dst
, | 811 (JNIEnv *env, jobject obj, jbyteArray src, jint jpegSize, jbyteArray dst
, |
| 489 jint flags) | 812 jint flags) |
| 490 { | 813 { |
| 491 tjhandle handle=0; | 814 tjhandle handle=0; |
| 492 unsigned char *jpegBuf=NULL, *dstBuf=NULL; | 815 unsigned char *jpegBuf=NULL, *dstBuf=NULL; |
| 493 int jpegSubsamp=-1, jpegWidth=0, jpegHeight=0; | 816 int jpegSubsamp=-1, jpegWidth=0, jpegHeight=0; |
| 494 | 817 |
| 495 gethandle(); | 818 gethandle(); |
| 496 | 819 |
| 497 if((*env)->GetArrayLength(env, src)<jpegSize) | 820 if((*env)->GetArrayLength(env, src)<jpegSize) |
| 498 » » _throw("Source buffer is not large enough"); | 821 » » _throwarg("Source buffer is not large enough"); |
| 499 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegSubsamp", "I")); | 822 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegSubsamp", "I")); |
| 500 jpegSubsamp=(int)(*env)->GetIntField(env, obj, _fid); | 823 jpegSubsamp=(int)(*env)->GetIntField(env, obj, _fid); |
| 501 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegWidth", "I")); | 824 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegWidth", "I")); |
| 502 jpegWidth=(int)(*env)->GetIntField(env, obj, _fid); | 825 jpegWidth=(int)(*env)->GetIntField(env, obj, _fid); |
| 503 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegHeight", "I")); | 826 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegHeight", "I")); |
| 504 jpegHeight=(int)(*env)->GetIntField(env, obj, _fid); | 827 jpegHeight=(int)(*env)->GetIntField(env, obj, _fid); |
| 505 if((*env)->GetArrayLength(env, dst) | 828 if((*env)->GetArrayLength(env, dst) |
| 506 <(jsize)tjBufSizeYUV(jpegWidth, jpegHeight, jpegSubsamp)) | 829 <(jsize)tjBufSizeYUV(jpegWidth, jpegHeight, jpegSubsamp)) |
| 507 » » _throw("Destination buffer is not large enough"); | 830 » » _throwarg("Destination buffer is not large enough"); |
| 508 | 831 |
| 509 bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); | 832 bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, src, 0)); |
| 510 bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); | 833 bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); |
| 511 | 834 |
| 512 if(tjDecompressToYUV(handle, jpegBuf, (unsigned long)jpegSize, dstBuf, | 835 if(tjDecompressToYUV(handle, jpegBuf, (unsigned long)jpegSize, dstBuf, |
| 513 flags)==-1) | 836 flags)==-1) |
| 514 » { | 837 » » _throwtj(); |
| 515 » » (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); | |
| 516 » » (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); | |
| 517 » » dstBuf=jpegBuf=NULL; | |
| 518 » » _throw(tjGetErrorStr()); | |
| 519 » } | |
| 520 | 838 |
| 521 bailout: | 839 bailout: |
| 522 if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); | 840 if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); |
| 523 if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); | 841 if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, src, jpegBuf, 0); |
| 524 return; | 842 return; |
| 525 } | 843 } |
| 526 | 844 |
| 845 static void TJDecompressor_decodeYUV |
| 846 (JNIEnv *env, jobject obj, jobjectArray srcobjs, jintArray jSrcOffsets, |
| 847 jintArray jSrcStrides, jint subsamp, jarray dst, jint dstElement
Size, |
| 848 jint x, jint y, jint width, jint pitch, jint height, jint pf, ji
nt flags) |
| 849 { |
| 850 tjhandle handle=0; |
| 851 jsize arraySize=0, actualPitch; |
| 852 jbyteArray jSrcPlanes[3]={NULL, NULL, NULL}; |
| 853 const unsigned char *srcPlanes[3]; |
| 854 unsigned char *dstBuf=NULL; |
| 855 int *srcOffsets=NULL, *srcStrides=NULL; |
| 856 int nc=(subsamp==org_libjpegturbo_turbojpeg_TJ_SAMP_GRAY? 1:3), i; |
| 857 |
| 858 gethandle(); |
| 859 |
| 860 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF || subsamp<0 |
| 861 || subsamp>=org_libjpegturbo_turbojpeg_TJ_NUMSAMP) |
| 862 _throwarg("Invalid argument in decodeYUV()"); |
| 863 if(org_libjpegturbo_turbojpeg_TJ_NUMPF!=TJ_NUMPF |
| 864 || org_libjpegturbo_turbojpeg_TJ_NUMSAMP!=TJ_NUMSAMP) |
| 865 _throwarg("Mismatch between Java and C API"); |
| 866 |
| 867 if((*env)->GetArrayLength(env, srcobjs)<nc) |
| 868 _throwarg("Planes array is too small for the subsampling type"); |
| 869 if((*env)->GetArrayLength(env, jSrcOffsets)<nc) |
| 870 _throwarg("Offsets array is too small for the subsampling type")
; |
| 871 if((*env)->GetArrayLength(env, jSrcStrides)<nc) |
| 872 _throwarg("Strides array is too small for the subsampling type")
; |
| 873 |
| 874 actualPitch=(pitch==0)? width*tjPixelSize[pf]:pitch; |
| 875 arraySize=(y+height-1)*actualPitch + (x+width)*tjPixelSize[pf]; |
| 876 if((*env)->GetArrayLength(env, dst)*dstElementSize<arraySize) |
| 877 _throwarg("Destination buffer is not large enough"); |
| 878 |
| 879 bailif0(srcOffsets=(*env)->GetPrimitiveArrayCritical(env, jSrcOffsets, 0
)); |
| 880 bailif0(srcStrides=(*env)->GetPrimitiveArrayCritical(env, jSrcStrides, 0
)); |
| 881 for(i=0; i<nc; i++) |
| 882 { |
| 883 int planeSize=tjPlaneSizeYUV(i, width, srcStrides[i], height, su
bsamp); |
| 884 int pw=tjPlaneWidth(i, width, subsamp); |
| 885 |
| 886 if(planeSize<0 || pw<0) |
| 887 _throwarg(tjGetErrorStr()); |
| 888 |
| 889 if(srcOffsets[i]<0) |
| 890 _throwarg("Invalid argument in decodeYUV()"); |
| 891 if(srcStrides[i]<0 && srcOffsets[i]-planeSize+pw<0) |
| 892 _throwarg("Negative plane stride would cause memory to b
e accessed below plane boundary"); |
| 893 |
| 894 bailif0(jSrcPlanes[i]=(*env)->GetObjectArrayElement(env, srcobjs
, i)); |
| 895 if((*env)->GetArrayLength(env, jSrcPlanes[i])<srcOffsets[i]+plan
eSize) |
| 896 _throwarg("Source plane is not large enough"); |
| 897 |
| 898 bailif0(srcPlanes[i]=(*env)->GetPrimitiveArrayCritical(env, jSrc
Planes[i], |
| 899 0)); |
| 900 srcPlanes[i]=&srcPlanes[i][srcOffsets[i]]; |
| 901 } |
| 902 bailif0(dstBuf=(*env)->GetPrimitiveArrayCritical(env, dst, 0)); |
| 903 |
| 904 if(tjDecodeYUVPlanes(handle, srcPlanes, srcStrides, subsamp, |
| 905 &dstBuf[y*actualPitch + x*tjPixelSize[pf]], width, pitch, height
, pf, |
| 906 flags)==-1) |
| 907 _throwtj(); |
| 908 |
| 909 bailout: |
| 910 if(dstBuf) (*env)->ReleasePrimitiveArrayCritical(env, dst, dstBuf, 0); |
| 911 for(i=0; i<nc; i++) |
| 912 { |
| 913 if(srcPlanes[i] && jSrcPlanes[i]) |
| 914 (*env)->ReleasePrimitiveArrayCritical(env, jSrcPlanes[i]
, |
| 915 (unsigned char *)srcPlanes[i], 0); |
| 916 } |
| 917 if(srcStrides) |
| 918 (*env)->ReleasePrimitiveArrayCritical(env, jSrcStrides, srcStrid
es, 0); |
| 919 if(srcOffsets) |
| 920 (*env)->ReleasePrimitiveArrayCritical(env, jSrcOffsets, srcOffse
ts, 0); |
| 921 return; |
| 922 } |
| 923 |
| 924 /* TurboJPEG 1.4.x: TJDecompressor::decodeYUV() byte destination */ |
| 925 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decodeYUV_
__3_3B_3I_3II_3BIIIIIII |
| 926 (JNIEnv *env, jobject obj, jobjectArray srcobjs, jintArray jSrcOffsets, |
| 927 jintArray jSrcStrides, jint subsamp, jbyteArray dst, jint x, jin
t y, |
| 928 jint width, jint pitch, jint height, jint pf, jint flags) |
| 929 { |
| 930 TJDecompressor_decodeYUV(env, obj, srcobjs, jSrcOffsets, jSrcStrides, |
| 931 subsamp, dst, 1, x, y, width, pitch, height, pf, flags); |
| 932 } |
| 933 |
| 934 /* TurboJPEG 1.4.x: TJDecompressor::decodeYUV() int destination */ |
| 935 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_decodeYUV_
__3_3B_3I_3II_3IIIIIIII |
| 936 (JNIEnv *env, jobject obj, jobjectArray srcobjs, jintArray jSrcOffsets, |
| 937 jintArray jSrcStrides, jint subsamp, jintArray dst, jint x, jint
y, |
| 938 jint width, jint stride, jint height, jint pf, jint flags) |
| 939 { |
| 940 if(pf<0 || pf>=org_libjpegturbo_turbojpeg_TJ_NUMPF) |
| 941 _throwarg("Invalid argument in decodeYUV()"); |
| 942 if(tjPixelSize[pf]!=sizeof(jint)) |
| 943 _throwarg("Pixel format must be 32-bit when decoding to an integ
er buffer."); |
| 944 |
| 945 TJDecompressor_decodeYUV(env, obj, srcobjs, jSrcOffsets, jSrcStrides, |
| 946 subsamp, dst, sizeof(jint), x, y, width, stride*sizeof(jint), he
ight, pf, |
| 947 flags); |
| 948 |
| 949 bailout: |
| 950 return; |
| 951 } |
| 952 |
| 953 /* TurboJPEG 1.2.x: TJTransformer::init() */ |
| 527 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJTransformer_init | 954 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJTransformer_init |
| 528 (JNIEnv *env, jobject obj) | 955 (JNIEnv *env, jobject obj) |
| 529 { | 956 { |
| 530 jclass cls; | 957 jclass cls; |
| 531 jfieldID fid; | 958 jfieldID fid; |
| 532 tjhandle handle; | 959 tjhandle handle; |
| 533 | 960 |
| 534 » if((handle=tjInitTransform())==NULL) _throw(tjGetErrorStr()); | 961 » if((handle=tjInitTransform())==NULL) _throwtj(); |
| 535 | 962 |
| 536 bailif0(cls=(*env)->GetObjectClass(env, obj)); | 963 bailif0(cls=(*env)->GetObjectClass(env, obj)); |
| 537 bailif0(fid=(*env)->GetFieldID(env, cls, "handle", "J")); | 964 bailif0(fid=(*env)->GetFieldID(env, cls, "handle", "J")); |
| 538 » (*env)->SetLongField(env, obj, fid, (jlong)handle); | 965 » (*env)->SetLongField(env, obj, fid, (size_t)handle); |
| 539 | 966 |
| 540 bailout: | 967 bailout: |
| 541 return; | 968 return; |
| 542 } | 969 } |
| 543 | 970 |
| 544 typedef struct _JNICustomFilterParams | 971 typedef struct _JNICustomFilterParams |
| 545 { | 972 { |
| 546 JNIEnv *env; | 973 JNIEnv *env; |
| 547 jobject tobj; | 974 jobject tobj; |
| 548 jobject cfobj; | 975 jobject cfobj; |
| 549 } JNICustomFilterParams; | 976 } JNICustomFilterParams; |
| 550 | 977 |
| 551 static int JNICustomFilter(short *coeffs, tjregion arrayRegion, | 978 static int JNICustomFilter(short *coeffs, tjregion arrayRegion, |
| 552 tjregion planeRegion, int componentIndex, int transformIndex, | 979 tjregion planeRegion, int componentIndex, int transformIndex, |
| 553 tjtransform *transform) | 980 tjtransform *transform) |
| 554 { | 981 { |
| 555 JNICustomFilterParams *params=(JNICustomFilterParams *)transform->data; | 982 JNICustomFilterParams *params=(JNICustomFilterParams *)transform->data; |
| 556 JNIEnv *env=params->env; | 983 JNIEnv *env=params->env; |
| 557 jobject tobj=params->tobj, cfobj=params->cfobj; | 984 jobject tobj=params->tobj, cfobj=params->cfobj; |
| 558 jobject arrayRegionObj, planeRegionObj, bufobj, borobj; | 985 » jobject arrayRegionObj, planeRegionObj, bufobj, borobj; |
| 559 jclass cls; jmethodID mid; jfieldID fid; | 986 jclass cls; jmethodID mid; jfieldID fid; |
| 560 | 987 |
| 561 bailif0(bufobj=(*env)->NewDirectByteBuffer(env, coeffs, | 988 bailif0(bufobj=(*env)->NewDirectByteBuffer(env, coeffs, |
| 562 sizeof(short)*arrayRegion.w*arrayRegion.h)); | 989 sizeof(short)*arrayRegion.w*arrayRegion.h)); |
| 563 bailif0(cls=(*env)->FindClass(env, "java/nio/ByteOrder")); | 990 bailif0(cls=(*env)->FindClass(env, "java/nio/ByteOrder")); |
| 564 bailif0(mid=(*env)->GetStaticMethodID(env, cls, "nativeOrder", | 991 » bailif0(mid=(*env)->GetStaticMethodID(env, cls, "nativeOrder", |
| 565 "()Ljava/nio/ByteOrder;")); | 992 "()Ljava/nio/ByteOrder;")); |
| 566 bailif0(borobj=(*env)->CallStaticObjectMethod(env, cls, mid)); | 993 bailif0(borobj=(*env)->CallStaticObjectMethod(env, cls, mid)); |
| 567 bailif0(cls=(*env)->GetObjectClass(env, bufobj)); | 994 bailif0(cls=(*env)->GetObjectClass(env, bufobj)); |
| 568 bailif0(mid=(*env)->GetMethodID(env, cls, "order", | 995 bailif0(mid=(*env)->GetMethodID(env, cls, "order", |
| 569 "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;")); | 996 "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;")); |
| 570 (*env)->CallObjectMethod(env, bufobj, mid, borobj); | 997 (*env)->CallObjectMethod(env, bufobj, mid, borobj); |
| 571 bailif0(mid=(*env)->GetMethodID(env, cls, "asShortBuffer", | 998 » bailif0(mid=(*env)->GetMethodID(env, cls, "asShortBuffer", |
| 572 "()Ljava/nio/ShortBuffer;")); | 999 "()Ljava/nio/ShortBuffer;")); |
| 573 bailif0(bufobj=(*env)->CallObjectMethod(env, bufobj, mid)); | 1000 bailif0(bufobj=(*env)->CallObjectMethod(env, bufobj, mid)); |
| 574 | 1001 |
| 575 bailif0(cls=(*env)->FindClass(env, "java/awt/Rectangle")); | 1002 bailif0(cls=(*env)->FindClass(env, "java/awt/Rectangle")); |
| 576 bailif0(arrayRegionObj=(*env)->AllocObject(env, cls)); | 1003 bailif0(arrayRegionObj=(*env)->AllocObject(env, cls)); |
| 577 bailif0(fid=(*env)->GetFieldID(env, cls, "x", "I")); | 1004 bailif0(fid=(*env)->GetFieldID(env, cls, "x", "I")); |
| 578 (*env)->SetIntField(env, arrayRegionObj, fid, arrayRegion.x); | 1005 (*env)->SetIntField(env, arrayRegionObj, fid, arrayRegion.x); |
| 579 bailif0(fid=(*env)->GetFieldID(env, cls, "y", "I")); | 1006 bailif0(fid=(*env)->GetFieldID(env, cls, "y", "I")); |
| 580 (*env)->SetIntField(env, arrayRegionObj, fid, arrayRegion.y); | 1007 (*env)->SetIntField(env, arrayRegionObj, fid, arrayRegion.y); |
| 581 bailif0(fid=(*env)->GetFieldID(env, cls, "width", "I")); | 1008 bailif0(fid=(*env)->GetFieldID(env, cls, "width", "I")); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 598 "(Ljava/nio/ShortBuffer;Ljava/awt/Rectangle;Ljava/awt/Rectangle;
IILorg/libjpegturbo/turbojpeg/TJTransform;)V")); | 1025 "(Ljava/nio/ShortBuffer;Ljava/awt/Rectangle;Ljava/awt/Rectangle;
IILorg/libjpegturbo/turbojpeg/TJTransform;)V")); |
| 599 (*env)->CallVoidMethod(env, cfobj, mid, bufobj, arrayRegionObj, | 1026 (*env)->CallVoidMethod(env, cfobj, mid, bufobj, arrayRegionObj, |
| 600 planeRegionObj, componentIndex, transformIndex, tobj); | 1027 planeRegionObj, componentIndex, transformIndex, tobj); |
| 601 | 1028 |
| 602 return 0; | 1029 return 0; |
| 603 | 1030 |
| 604 bailout: | 1031 bailout: |
| 605 return -1; | 1032 return -1; |
| 606 } | 1033 } |
| 607 | 1034 |
| 1035 /* TurboJPEG 1.2.x: TJTransformer::transform() */ |
| 608 JNIEXPORT jintArray JNICALL Java_org_libjpegturbo_turbojpeg_TJTransformer_transf
orm | 1036 JNIEXPORT jintArray JNICALL Java_org_libjpegturbo_turbojpeg_TJTransformer_transf
orm |
| 609 (JNIEnv *env, jobject obj, jbyteArray jsrcBuf, jint jpegSize, | 1037 (JNIEnv *env, jobject obj, jbyteArray jsrcBuf, jint jpegSize, |
| 610 jobjectArray dstobjs, jobjectArray tobjs, jint flags) | 1038 jobjectArray dstobjs, jobjectArray tobjs, jint flags) |
| 611 { | 1039 { |
| 612 tjhandle handle=0; int i; | 1040 tjhandle handle=0; int i; |
| 613 unsigned char *jpegBuf=NULL, **dstBufs=NULL; jsize n=0; | 1041 unsigned char *jpegBuf=NULL, **dstBufs=NULL; jsize n=0; |
| 614 unsigned long *dstSizes=NULL; tjtransform *t=NULL; | 1042 unsigned long *dstSizes=NULL; tjtransform *t=NULL; |
| 615 jbyteArray *jdstBufs=NULL; | 1043 jbyteArray *jdstBufs=NULL; |
| 616 int jpegWidth=0, jpegHeight=0, jpegSubsamp; | 1044 int jpegWidth=0, jpegHeight=0, jpegSubsamp; |
| 617 jintArray jdstSizes=0; jint *dstSizesi=NULL; | 1045 jintArray jdstSizes=0; jint *dstSizesi=NULL; |
| 618 JNICustomFilterParams *params=NULL; | 1046 JNICustomFilterParams *params=NULL; |
| 619 | 1047 |
| 620 gethandle(); | 1048 gethandle(); |
| 621 | 1049 |
| 622 if((*env)->GetArrayLength(env, jsrcBuf)<jpegSize) | 1050 if((*env)->GetArrayLength(env, jsrcBuf)<jpegSize) |
| 623 » » _throw("Source buffer is not large enough"); | 1051 » » _throwarg("Source buffer is not large enough"); |
| 624 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegWidth", "I")); | 1052 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegWidth", "I")); |
| 625 jpegWidth=(int)(*env)->GetIntField(env, obj, _fid); | 1053 jpegWidth=(int)(*env)->GetIntField(env, obj, _fid); |
| 626 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegHeight", "I")); | 1054 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegHeight", "I")); |
| 627 jpegHeight=(int)(*env)->GetIntField(env, obj, _fid); | 1055 jpegHeight=(int)(*env)->GetIntField(env, obj, _fid); |
| 628 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegSubsamp", "I")); | 1056 bailif0(_fid=(*env)->GetFieldID(env, _cls, "jpegSubsamp", "I")); |
| 629 jpegSubsamp=(int)(*env)->GetIntField(env, obj, _fid); | 1057 jpegSubsamp=(int)(*env)->GetIntField(env, obj, _fid); |
| 630 | 1058 |
| 631 n=(*env)->GetArrayLength(env, dstobjs); | 1059 n=(*env)->GetArrayLength(env, dstobjs); |
| 632 if(n!=(*env)->GetArrayLength(env, tobjs)) | 1060 if(n!=(*env)->GetArrayLength(env, tobjs)) |
| 633 » » _throw("Mismatch between size of transforms array and destinatio
n buffers array"); | 1061 » » _throwarg("Mismatch between size of transforms array and destina
tion buffers array"); |
| 634 | 1062 |
| 635 if((dstBufs=(unsigned char **)malloc(sizeof(unsigned char *)*n))==NULL) | 1063 if((dstBufs=(unsigned char **)malloc(sizeof(unsigned char *)*n))==NULL) |
| 636 » » _throw("Memory allocation failure"); | 1064 » » _throwmem(); |
| 637 if((jdstBufs=(jbyteArray *)malloc(sizeof(jbyteArray)*n))==NULL) | 1065 if((jdstBufs=(jbyteArray *)malloc(sizeof(jbyteArray)*n))==NULL) |
| 638 » » _throw("Memory allocation failure"); | 1066 » » _throwmem(); |
| 639 if((dstSizes=(unsigned long *)malloc(sizeof(unsigned long)*n))==NULL) | 1067 if((dstSizes=(unsigned long *)malloc(sizeof(unsigned long)*n))==NULL) |
| 640 » » _throw("Memory allocation failure"); | 1068 » » _throwmem(); |
| 641 if((t=(tjtransform *)malloc(sizeof(tjtransform)*n))==NULL) | 1069 if((t=(tjtransform *)malloc(sizeof(tjtransform)*n))==NULL) |
| 642 » » _throw("Memory allocation failure"); | 1070 » » _throwmem(); |
| 643 if((params=(JNICustomFilterParams *)malloc(sizeof(JNICustomFilterParams)
*n)) | 1071 if((params=(JNICustomFilterParams *)malloc(sizeof(JNICustomFilterParams)
*n)) |
| 644 ==NULL) | 1072 ==NULL) |
| 645 » » _throw("Memory allocation failure"); | 1073 » » _throwmem(); |
| 646 for(i=0; i<n; i++) | 1074 for(i=0; i<n; i++) |
| 647 { | 1075 { |
| 648 dstBufs[i]=NULL; jdstBufs[i]=NULL; dstSizes[i]=0; | 1076 dstBufs[i]=NULL; jdstBufs[i]=NULL; dstSizes[i]=0; |
| 649 memset(&t[i], 0, sizeof(tjtransform)); | 1077 memset(&t[i], 0, sizeof(tjtransform)); |
| 650 memset(¶ms[i], 0, sizeof(JNICustomFilterParams)); | 1078 memset(¶ms[i], 0, sizeof(JNICustomFilterParams)); |
| 651 } | 1079 } |
| 652 | 1080 |
| 653 for(i=0; i<n; i++) | 1081 for(i=0; i<n; i++) |
| 654 { | 1082 { |
| 655 jobject tobj, cfobj; | 1083 jobject tobj, cfobj; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 675 if(cfobj) | 1103 if(cfobj) |
| 676 { | 1104 { |
| 677 params[i].env=env; | 1105 params[i].env=env; |
| 678 params[i].tobj=tobj; | 1106 params[i].tobj=tobj; |
| 679 params[i].cfobj=cfobj; | 1107 params[i].cfobj=cfobj; |
| 680 t[i].customFilter=JNICustomFilter; | 1108 t[i].customFilter=JNICustomFilter; |
| 681 t[i].data=(void *)¶ms[i]; | 1109 t[i].data=(void *)¶ms[i]; |
| 682 } | 1110 } |
| 683 } | 1111 } |
| 684 | 1112 |
| 685 bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, jsrcBuf, 0)); | |
| 686 for(i=0; i<n; i++) | 1113 for(i=0; i<n; i++) |
| 687 { | 1114 { |
| 688 int w=jpegWidth, h=jpegHeight; | 1115 int w=jpegWidth, h=jpegHeight; |
| 689 if(t[i].r.w!=0) w=t[i].r.w; | 1116 if(t[i].r.w!=0) w=t[i].r.w; |
| 690 if(t[i].r.h!=0) h=t[i].r.h; | 1117 if(t[i].r.h!=0) h=t[i].r.h; |
| 691 bailif0(jdstBufs[i]=(*env)->GetObjectArrayElement(env, dstobjs,
i)); | 1118 bailif0(jdstBufs[i]=(*env)->GetObjectArrayElement(env, dstobjs,
i)); |
| 692 if((unsigned long)(*env)->GetArrayLength(env, jdstBufs[i]) | 1119 if((unsigned long)(*env)->GetArrayLength(env, jdstBufs[i]) |
| 693 <tjBufSize(w, h, jpegSubsamp)) | 1120 <tjBufSize(w, h, jpegSubsamp)) |
| 694 » » » _throw("Destination buffer is not large enough"); | 1121 » » » _throwarg("Destination buffer is not large enough"); |
| 1122 » } |
| 1123 » bailif0(jpegBuf=(*env)->GetPrimitiveArrayCritical(env, jsrcBuf, 0)); |
| 1124 » for(i=0; i<n; i++) |
| 695 bailif0(dstBufs[i]=(*env)->GetPrimitiveArrayCritical(env, jdstBu
fs[i], 0)); | 1125 bailif0(dstBufs[i]=(*env)->GetPrimitiveArrayCritical(env, jdstBu
fs[i], 0)); |
| 696 } | |
| 697 | 1126 |
| 698 if(tjTransform(handle, jpegBuf, jpegSize, n, dstBufs, dstSizes, t, | 1127 if(tjTransform(handle, jpegBuf, jpegSize, n, dstBufs, dstSizes, t, |
| 699 flags|TJFLAG_NOREALLOC)==-1) | 1128 flags|TJFLAG_NOREALLOC)==-1) |
| 1129 _throwtj(); |
| 1130 |
| 1131 for(i=0; i<n; i++) |
| 700 { | 1132 { |
| 701 » » (*env)->ReleasePrimitiveArrayCritical(env, jsrcBuf, jpegBuf, 0); | 1133 » » (*env)->ReleasePrimitiveArrayCritical(env, jdstBufs[i], dstBufs[
i], 0); |
| 702 » » jpegBuf=NULL; | 1134 » » dstBufs[i]=NULL; |
| 703 » » for(i=0; i<n; i++) | |
| 704 » » { | |
| 705 » » » (*env)->ReleasePrimitiveArrayCritical(env, jdstBufs[i],
dstBufs[i], 0); | |
| 706 » » » dstBufs[i]=NULL; | |
| 707 » » } | |
| 708 » » _throw(tjGetErrorStr()); | |
| 709 } | 1135 } |
| 1136 (*env)->ReleasePrimitiveArrayCritical(env, jsrcBuf, jpegBuf, 0); |
| 1137 jpegBuf=NULL; |
| 710 | 1138 |
| 711 jdstSizes=(*env)->NewIntArray(env, n); | 1139 jdstSizes=(*env)->NewIntArray(env, n); |
| 712 bailif0(dstSizesi=(*env)->GetIntArrayElements(env, jdstSizes, 0)); | 1140 bailif0(dstSizesi=(*env)->GetIntArrayElements(env, jdstSizes, 0)); |
| 713 for(i=0; i<n; i++) dstSizesi[i]=(int)dstSizes[i]; | 1141 for(i=0; i<n; i++) dstSizesi[i]=(int)dstSizes[i]; |
| 714 | 1142 |
| 715 bailout: | 1143 bailout: |
| 716 » if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, jsrcBuf, jpegBuf,
0); | 1144 » if(dstSizesi) (*env)->ReleaseIntArrayElements(env, jdstSizes, dstSizesi,
0); |
| 717 if(dstBufs) | 1145 if(dstBufs) |
| 718 { | 1146 { |
| 719 for(i=0; i<n; i++) | 1147 for(i=0; i<n; i++) |
| 720 { | 1148 { |
| 721 if(dstBufs[i] && jdstBufs && jdstBufs[i]) | 1149 if(dstBufs[i] && jdstBufs && jdstBufs[i]) |
| 722 (*env)->ReleasePrimitiveArrayCritical(env, jdstB
ufs[i], dstBufs[i], 0); | 1150 (*env)->ReleasePrimitiveArrayCritical(env, jdstB
ufs[i], dstBufs[i], 0); |
| 723 } | 1151 } |
| 724 free(dstBufs); | 1152 free(dstBufs); |
| 725 } | 1153 } |
| 1154 if(jpegBuf) (*env)->ReleasePrimitiveArrayCritical(env, jsrcBuf, jpegBuf,
0); |
| 726 if(jdstBufs) free(jdstBufs); | 1155 if(jdstBufs) free(jdstBufs); |
| 727 if(dstSizes) free(dstSizes); | 1156 if(dstSizes) free(dstSizes); |
| 728 if(dstSizesi) (*env)->ReleaseIntArrayElements(env, jdstSizes, dstSizesi,
0); | |
| 729 if(t) free(t); | 1157 if(t) free(t); |
| 730 return jdstSizes; | 1158 return jdstSizes; |
| 731 } | 1159 } |
| 732 | 1160 |
| 1161 /* TurboJPEG 1.2.x: TJDecompressor::destroy() */ |
| 733 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_destroy | 1162 JNIEXPORT void JNICALL Java_org_libjpegturbo_turbojpeg_TJDecompressor_destroy |
| 734 (JNIEnv *env, jobject obj) | 1163 (JNIEnv *env, jobject obj) |
| 735 { | 1164 { |
| 736 Java_org_libjpegturbo_turbojpeg_TJCompressor_destroy(env, obj); | 1165 Java_org_libjpegturbo_turbojpeg_TJCompressor_destroy(env, obj); |
| 737 } | 1166 } |
| OLD | NEW |