Change CMakeLists.txt to build examples by default (image_to_j2k and j2k_to_image).
[openjpeg.git] / libopenjpeg / jp2.c
index d102349d82e78f4ddfc63ef9f4095f2ffb09ab2d..b2831cfb0b5940d9b4594bb4d90a53aca528e0dd 100644 (file)
@@ -71,7 +71,7 @@ Read the FTYP box - File type box
 @return Returns true if successful, returns false otherwise
 */
 static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio);
-static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, char *index);
+static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
 static bool jp2_read_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, unsigned int *j2k_codestream_length, unsigned int *j2k_codestream_offset);
 static void jp2_write_jp(opj_cio_t *cio);
 /**
@@ -404,7 +404,7 @@ static bool jp2_read_ftyp(opj_jp2_t *jp2, opj_cio_t *cio) {
        return true;
 }
 
-static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, char *index) {
+static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
        unsigned int j2k_codestream_offset, j2k_codestream_length;
        opj_jp2_box_t box;
 
@@ -416,7 +416,7 @@ static int jp2_write_jp2c(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, ch
 
        /* J2K encoding */
        j2k_codestream_offset = cio_tell(cio);
-       if(!j2k_encode(j2k, cio, image, index)) {
+       if(!j2k_encode(j2k, cio, image, cstr_info)) {
                opj_event_msg(j2k->cinfo, EVT_ERROR, "Failed to encode image\n");
                return 0;
        }
@@ -507,7 +507,7 @@ static bool jp2_read_struct(opj_jp2_t *jp2, opj_cio_t *cio) {
 /* ----------------------------------------------------------------------- */
 
 opj_jp2_t* jp2_create_decompress(opj_common_ptr cinfo) {
-       opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t));
+       opj_jp2_t *jp2 = (opj_jp2_t*) opj_calloc(1, sizeof(opj_jp2_t));
        if(jp2) {
                jp2->cinfo = cinfo;
                /* create the J2K codec */
@@ -541,7 +541,7 @@ void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters) {
        /* further JP2 initializations go here */
 }
 
-opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio) {
+opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio, opj_codestream_info_t *cstr_info) {
        opj_common_ptr cinfo;
        opj_image_t *image = NULL;
 
@@ -558,11 +558,22 @@ opj_image_t* jp2_decode(opj_jp2_t *jp2, opj_cio_t *cio) {
        }
 
        /* J2K decoding */
-       image = j2k_decode(jp2->j2k, cio);
+       image = j2k_decode(jp2->j2k, cio, cstr_info);
        if(!image) {
                opj_event_msg(cinfo, EVT_ERROR, "Failed to decode J2K image\n");
+               return NULL;
        }
 
+       /* Set Image Color Space */
+       if (jp2->enumcs == 16)
+               image->color_space = CLRSPC_SRGB;
+       else if (jp2->enumcs == 17)
+               image->color_space = CLRSPC_GRAY;
+       else if (jp2->enumcs == 18)
+               image->color_space = CLRSPC_SYCC;
+       else
+               image->color_space = CLRSPC_UNKNOWN;
+
        return image;
 }
 
@@ -676,7 +687,7 @@ void jp2_setup_encoder(opj_jp2_t *jp2, opj_cparameters_t *parameters, opj_image_
 
 }
 
-bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, char *index) {
+bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info) {
 
        /* JP2 encoding */
 
@@ -689,7 +700,7 @@ bool jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, char *index)
 
        /* J2K encoding */
 
-       if(!jp2_write_jp2c(jp2, cio, image, index)) {
+       if(!jp2_write_jp2c(jp2, cio, image, cstr_info)) {
                opj_event_msg(jp2->cinfo, EVT_ERROR, "Failed to encode image\n");
                return false;
        }