int jp2_decode(unsigned char *src, int len, jp2_struct_t * jp2_struct, j2k_cp_t * cp) { cio_init(src, len); if (jp2_read_jp()) return 1; if (jp2_read_ftyp(jp2_struct)) return 1; if (jp2_read_jp2h(jp2_struct)) return 1; if (jp2_read_jp2c(src, len, jp2_struct, cp)) return 1; return 0; }
int jp2_write_jp2c(j2k_image_t * img, j2k_cp_t * cp, char *jp2_buffer, char *index) { int len, i, set; char *cstr, *out; jp2_box_t box; box.init_pos = cio_tell(); cio_skip(4); cio_write(JP2_JP2C, 4); // JP2C if (jpwl_cp.JPWL_on){ set=cio_tell(); cstr = (char *) malloc( cp->tdx * cp->tdy * cp->tw * cp->th * 10*sizeof(char)); /* Allocate memory for all tiles */ cio_init(cstr, cp->tdx * cp->tdy * cp->tw * cp->th * 10); len = j2k_encode(img, cp, cstr, cp->tdx * cp->tdy * cp->tw * cp->th * 10, index); if (len == 0) { fprintf(stderr, "failed to encode image\n"); return 1; } out= (char *) malloc(len*6*sizeof(char)); len=jpwl_encode(cstr,out,len); if (len == 0) { fprintf(stderr, "failed to encode image\n"); return 1; } //ricopio la codestream, sono nel buffer out cio_seek(0); for(i=0;i<len;i++) jp2_buffer[set+i]=cio_read(1); //mi rimetto nel buffer jp2_buffer cio_init(jp2_buffer, cp->tdx * cp->tdy * cp->tw * cp->th * 10); //aggiorno la lunghezza della codestream len += set; cio_seek(len); //correggo l'index file e lo scrivo if (info_IM.index_on){ info_IM.Main_head_end += set; //printf("fine_mh: %d\n",info_IM.Main_head_end); //printf("%d\n", info_IM.tile[0].start_pos); info_IM.tile[0].start_pos += set; for (i=0; i < cp->th * cp->tw; i++){ info_IM.tile[i].end_header += set; info_IM.tile[i].end_pos += set; if (i < cp->tw * cp->th) info_IM.tile[i+1].start_pos += set; pack_corr(set, i); } } if (cp->index_on && use_index){ write_index(index, len); } free(cstr); free(out); } else{ len = j2k_encode(img, cp, jp2_buffer, cp->tdx * cp->tdy * cp->th * cp->tw * 2, index); } box.length = cio_tell() - box.init_pos; cio_seek(box.init_pos); cio_write(box.length, 4); /* L */ cio_seek(box.init_pos + box.length); return box.length; }