diff options
| author | Mathieu Malaterre <mathieu.malaterre@gmail.com> | 2012-04-23 13:35:01 +0000 |
|---|---|---|
| committer | Mathieu Malaterre <mathieu.malaterre@gmail.com> | 2012-04-23 13:35:01 +0000 |
| commit | ce9d5083ef778a66a8acad7b8ae8d658a560b0d8 (patch) | |
| tree | ac779ab3df8589bdb8ee58a517002cd2d6a1c259 /applications/JavaOpenJPEG/JavaOpenJPEG.c | |
| parent | baa7e32f9cd4bb8a627278768931dcc01f1518c6 (diff) | |
[1.5] Integrate patch from winfried posted on the mailing list. See here for more info: https://groups.google.com/group/openjpeg/msg/6488859a0dce77
Diffstat (limited to 'applications/JavaOpenJPEG/JavaOpenJPEG.c')
| -rw-r--r-- | applications/JavaOpenJPEG/JavaOpenJPEG.c | 134 |
1 files changed, 81 insertions, 53 deletions
diff --git a/applications/JavaOpenJPEG/JavaOpenJPEG.c b/applications/JavaOpenJPEG/JavaOpenJPEG.c index 3f8e2ee7..182dcb1c 100644 --- a/applications/JavaOpenJPEG/JavaOpenJPEG.c +++ b/applications/JavaOpenJPEG/JavaOpenJPEG.c @@ -57,7 +57,7 @@ extern int get_file_format(char *filename);
extern void error_callback(const char *msg, void *client_data);
-extern warning_callback(const char *msg, void *client_data);
+extern void warning_callback(const char *msg, void *client_data);
extern void info_callback(const char *msg, void *client_data);
typedef struct callback_variables {
@@ -349,10 +349,11 @@ OPJ_PROG_ORDER give_progression(char progression[4]) { return PROG_UNKNOWN;
}
-
-/// <summary>
-/// Get logarithm of an integer and round downwards.
-/// </summary>
+/*
+ * <summary>
+ * Get logarithm of an integer and round downwards.
+ * </summary>
+*/
int int_floorlog2(int a) {
int l;
for (l=0; a>1; l++) {
@@ -494,7 +495,7 @@ void cinema_setup_encoder(opj_cparameters_t *parameters,opj_image_t *image, img_ /* ------------------------------------------------------------------------------------ */
-int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters,
+int parse_cmdline_encoder(int argc, char * const argv[], opj_cparameters_t *parameters,
img_fol_t *img_fol, char *indexfilename) {
int i, j,totlen;
opj_option_t long_option[]={
@@ -628,6 +629,8 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters, numresolution = parameters->numresolution;
matrix_width = numresolution * 3;
parameters->cp_matrice = (int *) malloc(numlayers * matrix_width * sizeof(int));
+ if(parameters->cp_matrice == NULL) return 1;
+
s = s + 2;
for (i = 0; i < numlayers; i++) {
@@ -856,6 +859,9 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters, case 'C': /* add a comment */
{
parameters->cp_comment = (char*)malloc(strlen(opj_optarg) + 1);
+
+ if(parameters->cp_comment == NULL) return 1;
+
if(parameters->cp_comment) {
strcpy(parameters->cp_comment, opj_optarg);
}
@@ -885,6 +891,9 @@ int parse_cmdline_encoder(int argc, char **argv, opj_cparameters_t *parameters, case 'z': /* Image Directory path */
{
img_fol->imgdirpath = (char*)malloc(strlen(opj_optarg) + 1);
+
+ if(img_fol->imgdirpath == NULL) return 1;
+
strcpy(img_fol->imgdirpath,opj_optarg);
img_fol->set_imgdir=1;
}
@@ -1352,7 +1361,7 @@ char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer }
}
- // Compute the size of the index buffer, in number of bytes*/
+/* Compute the size of the index buffer, in number of bytes*/
*buffer_size =
1 /* version */
+ (10 /* image_w until decomposition */
@@ -1361,18 +1370,18 @@ char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer + cstr_info->tw * cstr_info->th * 4 /* tile info, without distorsion info */
+ cstr_info->tw*cstr_info->th * cstr_info->numlayers * (cstr_info->numdecompos[0] + 1) * cstr_info->numcomps * prec_max *8
) * sizeof(int);
- //printf("C: index buffer size = %d bytes\n", *buffer_size);
+/*printf("C: index buffer size = %d bytes\n", *buffer_size); */
buffer = (char*) malloc(*buffer_size);
if (!buffer) {
- //opj_event_msg(j2k->cinfo, EVT_ERROR, "failed to allocate index buffer for writing %d int\n", *buffer_size);
+/* opj_event_msg(j2k->cinfo, EVT_ERROR, "failed to allocate index buffer for writing %d int\n", *buffer_size); */
fprintf(stderr, "failed to allocate index buffer for writing %d int\n", *buffer_size);
return 0;
}
- buffer[0] = 1; // Version stored on a byte
+ buffer[0] = 1; /* Version stored on a byte */
buffer++;
- // Remaining informations are stored on a int.
+/* Remaining informations are stored on a int. */
((int*)buffer)[buffer_pos++] = cstr_info->image_w;
((int*)buffer)[buffer_pos++] = cstr_info->image_h;
((int*)buffer)[buffer_pos++] = cstr_info->prog;
@@ -1597,7 +1606,7 @@ char* create_index_into_byte_array(opj_codestream_info_t *cstr_info, int* buffer } /* tileno */
if (buffer_pos > *buffer_size) {
- //opj_event_msg(j2k->cinfo, EVT_ERROR, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size);
+/* opj_event_msg(j2k->cinfo, EVT_ERROR, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size); */
fprintf(stderr, "index creation: buffer_pos (%d) > buffer_size (%d)!\n", buffer_pos, *buffer_size);
return 0;
}
@@ -1630,7 +1639,7 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, jint *jiBody;
jboolean isCopy;
- // Image width, height and depth
+/* Image width, height and depth */
fid = (*env)->GetFieldID(env, cls,"width", "I");
ji = (*env)->GetIntField(env, obj, fid);
w = ji;
@@ -1643,7 +1652,7 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, ji = (*env)->GetIntField(env, obj, fid);
depth = ji;
- // Read the image
+/* Read the image */
if (depth <=16) {
numcomps = 1;
color_space = CLRSPC_GRAY;
@@ -1658,8 +1667,10 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, cmptparm[0].y0 = parameters->image_offset_y0;
cmptparm[0].w = !cmptparm[0].x0 ? (w - 1) * parameters->subsampling_dx + 1 : cmptparm[0].x0 + (w - 1) * parameters->subsampling_dx + 1;
cmptparm[0].h = !cmptparm[0].y0 ? (h - 1) * parameters->subsampling_dy + 1 : cmptparm[0].y0 + (h - 1) * parameters->subsampling_dy + 1;
- // Java types are always signed but we use them as unsigned types (shift of the negative part of
- // the pixels of the images in Telemis before entering the encoder).
+/* Java types are always signed but we use them as unsigned types
+ * (shift of the negative part of the pixels of the images in
+ * Telemis before entering the encoder).
+*/
cmptparm[0].sgnd = 0;
if (depth<=16)
cmptparm[0].prec=depth;
@@ -1705,12 +1716,12 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, comp = &image->comps[compno];
max = -100000;
if (depth == 8) {
- fid = (*env)->GetFieldID(env, cls,"image8", "[B"); // byteArray []
+ fid = (*env)->GetFieldID(env, cls,"image8", "[B");/* byteArray []*/
jba = (*env)->GetObjectField(env, obj, fid);
len = (*env)->GetArrayLength(env, jba);
jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, &isCopy);
- //printf("C: before transfering 8 bpp image\n");
+/* printf("C: before transfering 8 bpp image\n"); */
if (comp->sgnd) {
for(i=0; i< len;i++) {
comp->data[i] = (char) jbBody[i];
@@ -1724,13 +1735,14 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, }
(*env)->ReleasePrimitiveArrayCritical(env, jba, jbBody, 0);
} else if(depth == 16) {
- fid = (*env)->GetFieldID(env, cls,"image16", "[S"); // shortArray []
+ fid = (*env)->GetFieldID(env, cls,"image16", "[S");/*shortArray []*/
jsa = (*env)->GetObjectField(env, obj, fid);
len = (*env)->GetArrayLength(env, jsa);
jsBody = (*env)->GetPrimitiveArrayCritical(env, jsa, &isCopy);
- //printf("C: before transfering 16 bpp image\n");
- if (comp->sgnd) { // Special behaviour to deal with signed elements ??
+/*printf("C: before transfering 16 bpp image\n"); */
+ if (comp->sgnd) {
+/* Special behaviour to deal with signed elements ?? */
comp->data[i] = (short) jsBody[i];
for(i=0; i< len;i++) {
if (comp->data[i] > max) max = comp->data[i];
@@ -1743,14 +1755,15 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, }
(*env)->ReleasePrimitiveArrayCritical(env, jsa, jsBody, 0);
} else if (depth == 24) {
- fid = (*env)->GetFieldID(env, cls,"image24", "[I"); // intArray []
+ fid = (*env)->GetFieldID(env, cls,"image24", "[I");/* intArray []*/
jia = (*env)->GetObjectField(env, obj, fid);
len = (*env)->GetArrayLength(env, jia);
shift = compno*8;
jiBody = (*env)->GetPrimitiveArrayCritical(env, jia, &isCopy);
- //printf("C: before transfering 24 bpp image (component %d, signed = %d)\n", compno, comp->sgnd);
- if (comp->sgnd) { // Special behaviour to deal with signed elements ?? XXXXX
+/*printf("C: before transfering 24 bpp image (component %d, signed = %d)\n", compno, comp->sgnd);*/
+ if (comp->sgnd) {
+/* Special behaviour to deal with signed elements ?? XXXXX */
for(i=0; i< len;i++) {
comp->data[i] = ( ((int) jiBody[i]) & (0xFF << shift) ) >> shift;
if (comp->data[i] > max) max = comp->data[i];
@@ -1765,7 +1778,7 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, }
comp->bpp = int_floorlog2(max)+1;
comp->prec = comp->bpp;
- //printf("C: component %d: max %d, real bpp = %d\n", compno, max, comp->bpp);
+/*printf("C: component %d: max %d, real bpp = %d\n", compno, max, comp->bpp);*/
}
return image;
}
@@ -1775,7 +1788,7 @@ opj_image_t* loadImage(opj_cparameters_t *parameters, JNIEnv *env, jobject obj, -------------------- MAIN METHOD, CALLED BY JAVA -----------------------*/
JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImageToJ2K(JNIEnv *env, jobject obj, jobjectArray javaParameters) {
int argc; /* To simulate the command line parameters (taken from the javaParameters variable) and be able to re-use the */
- char **argv; /* 'parse_cmdline_decoder' method taken from the j2k_to_image project */
+ const char **argv; /* 'parse_cmdline_decoder' method taken from the j2k_to_image project */
opj_bool bSuccess;
opj_cparameters_t parameters; /* compression parameters */
img_fol_t img_fol;
@@ -1783,12 +1796,12 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag opj_image_t *image = NULL;
int i,j,num_images;
int imageno;
- opj_codestream_info_t cstr_info; /* Codestream information structure */
+ opj_codestream_info_t cstr_info; /* Codestream information structure */
char indexfilename[OPJ_PATH_LEN]; /* index file name */
int* compressed_index = NULL;
int compressed_index_size=-1;
- // ==> Access variables to the Java member variables
+/* ==> Access variables to the Java member variables */
jsize arraySize;
jclass cls;
jobject object;
@@ -1797,18 +1810,20 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag jbyteArray jba;
jbyte *jbBody;
callback_variables_t msgErrorCallback_vars;
- // <== access variable to the Java member variables.
-
- // For the encoding and storage into the file
+/* <== access variable to the Java member variables. */
+ jlong retval = -1;
+/* For the encoding and storage into the file */
opj_cinfo_t* cinfo;
- int codestream_length;
+ int codestream_length = -1;
opj_cio_t *cio = NULL;
FILE *f = NULL;
- // JNI reference to the calling class
+/* JNI reference to the calling class */
cls = (*env)->GetObjectClass(env, obj);
- // Pointers to be able to call a Java method for all the info and error messages
+/* Pointers to be able to call a Java method
+ * for all the info and error messages
+*/
msgErrorCallback_vars.env = env;
msgErrorCallback_vars.jobj = &obj;
msgErrorCallback_vars.message_mid = (*env)->GetMethodID(env, cls, "logMessage", "(Ljava/lang/String;)V");
@@ -1816,8 +1831,11 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag arraySize = (*env)->GetArrayLength(env, javaParameters);
argc = (int) arraySize +1;
- argv = malloc(argc*sizeof(char*));
- argv[0] = "ProgramName.exe"; // The program name: useless
+ argv = (const char **)malloc(argc*sizeof(char*));
+
+ if(argv == NULL) return -1;
+
+ argv[0] = "ProgramName.exe";/* The program name: useless */
j=0;
for (i=1; i<argc; i++) {
object = (*env)->GetObjectArrayElement(env, javaParameters, i-1);
@@ -1841,23 +1859,21 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag /* set encoding parameters to default values */
opj_set_default_encoder_parameters(¶meters);
parameters.cod_format = J2K_CFMT;
- //parameters.index_on = 1;
+/* parameters.index_on = 1; */
/* Initialize indexfilename and img_fol */
*indexfilename = 0;
memset(&img_fol,0,sizeof(img_fol_t));
- /* parse input and get user encoding parameters */
- if (parse_cmdline_encoder(argc, argv, ¶meters,&img_fol, indexfilename) == 1) {
- // Release the Java arguments array
- for (i=1; i<argc; i++)
- (*env)->ReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]);
- return -1;
- }
+/* parse input and get user encoding parameters */
+ j = parse_cmdline_encoder(argc, (char *const*)argv, ¶meters,&img_fol, indexfilename);
- // Release the Java arguments array
+/* Release the Java arguments array */
for (i=1; i<argc; i++)
- (*env)->ReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]);
+ (*env)->ReleaseStringUTFChars(env,
+ (*env)->GetObjectArrayElement(env, javaParameters, i-1), argv[i]);
+
+ if(j == 1) goto fin; /* failure */
if (parameters.cp_cinema){
cinema_parameters(¶meters);
@@ -1872,9 +1888,15 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag /* UniPG>> */
#ifdef USE_JPWL
parameters.cp_comment = (char*)malloc(clen+strlen(version)+11);
+
+ if(parameters.cp_comment == NULL) goto fin;
+
sprintf(parameters.cp_comment,"%s%s with JPWL", comment, version);
#else
parameters.cp_comment = (char*)malloc(clen+strlen(version)+1);
+
+ if(parameters.cp_comment == NULL) goto fin;
+
sprintf(parameters.cp_comment,"%s%s", comment, version);
#endif
/* <<UniPG */
@@ -1891,10 +1913,10 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag fprintf(stderr,"\n");
image = loadImage(¶meters, env, obj, cls);
- //printf("C: after load image: image = %d\n", image);
+/* printf("C: after load image: image = %d\n", image); */
if (!image) {
fprintf(stderr, "Unable to load image\n");
- return -1;
+ goto fin;
}
/* Decide if MCT should be used */
@@ -1928,7 +1950,7 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag if (!bSuccess) {
opj_cio_close(cio);
fprintf(stderr, "failed to encode image\n");
- return -1;
+ goto fin;
}
codestream_length = cio_tell(cio);
@@ -1940,7 +1962,8 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag }
}
- compressed_index = create_index_into_byte_array(&cstr_info, &compressed_index_size);
+ compressed_index = (int*)
+ create_index_into_byte_array(&cstr_info, &compressed_index_size);
/* Allocates the Java compressedIndex byte[] and sends this index into the Java object */
fid = (*env)->GetFieldID(env, cls,"compressedIndex", "[B");
jba = (*env)->NewByteArray(env, compressed_index_size+1);
@@ -1955,14 +1978,14 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag f = fopen(parameters.outfile, "wb");
if (!f) {
fprintf(stderr, "failed to open [%s] for writing\n", parameters.outfile);
- return -1;
+ goto fin;
}
fwrite(cio->buffer, 1, codestream_length, f);
fclose(f);
fprintf(stdout,"Generated outfile [%s]\n",parameters.outfile);
}
- /* Write the generated codestream to the Java pre-allocated compressedStream byte[] */
+/* Write the generated codestream to the Java pre-allocated compressedStream byte[] */
fid = (*env)->GetFieldID(env, cls,"compressedStream", "[B");
jba = (*env)->GetObjectField(env, obj, fid);
jbBody = (*env)->GetPrimitiveArrayCritical(env, jba, 0);
@@ -1984,5 +2007,10 @@ JNIEXPORT jlong JNICALL Java_org_openJpeg_OpenJPEGJavaEncoder_internalEncodeImag if(parameters.cp_comment) free(parameters.cp_comment);
if(parameters.cp_matrice) free(parameters.cp_matrice);
- return codestream_length;
+ retval = codestream_length;
+
+fin:
+ free(argv);
+
+ return retval;
}
|
