WIP: add support of jp2 for new j2k_dump function and some other small stuff
This commit is contained in:
parent
b0ef524b9e
commit
3b30e42551
1
CHANGES
1
CHANGES
@ -6,6 +6,7 @@ What's New for OpenJPEG
|
||||
+ : added
|
||||
|
||||
September 19, 2011
|
||||
+ [mickael] WIP: add support of jp2 for new j2k_dump function and some other small stuff
|
||||
+ [mickael] WIP: new image_header struct is used and enable used of cstr_info
|
||||
+ [mickael] WIP: manage the case of event_mgr is not provided to setup_decoder function
|
||||
+ [mickael] WIP: insert elements from V2 framework into the trunk (add missing files).
|
||||
|
@ -29,6 +29,8 @@
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "openjpeg.h"
|
||||
#include "index.h"
|
||||
|
||||
@ -389,3 +391,354 @@ int write_index_file(opj_codestream_info_t *cstr_info, char *index) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------------------ */
|
||||
|
||||
/**
|
||||
Write a structured index to a file
|
||||
@param cstr_info Codestream information
|
||||
@param index Index filename
|
||||
@return Returns 0 if successful, returns 1 otherwise
|
||||
*/
|
||||
int write_index_file_v2(FILE* stream, opj_codestream_info_t *cstr_info) {
|
||||
int tileno, compno, layno, resno, precno, pack_nb, x, y;
|
||||
double total_disto = 0;
|
||||
/* UniPG>> */
|
||||
int tilepartno;
|
||||
char disto_on, numpix_on;
|
||||
|
||||
#ifdef USE_JPWL
|
||||
if (!strcmp(index, JPWL_PRIVATEINDEX_NAME))
|
||||
return EXIT_SUCCESS;
|
||||
#endif /* USE_JPWL */
|
||||
/* <<UniPG */
|
||||
|
||||
if (!cstr_info)
|
||||
return EXIT_FAILURE;
|
||||
|
||||
if (!stream)
|
||||
return EXIT_FAILURE;
|
||||
|
||||
if (cstr_info->tile[0].distotile)
|
||||
disto_on = 1;
|
||||
else
|
||||
disto_on = 0;
|
||||
|
||||
if (cstr_info->tile[0].numpix)
|
||||
numpix_on = 1;
|
||||
else
|
||||
numpix_on = 0;
|
||||
|
||||
fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h);
|
||||
fprintf(stream, "%d\n", cstr_info->prog);
|
||||
fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y);
|
||||
fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th);
|
||||
fprintf(stream, "%d\n", cstr_info->numcomps);
|
||||
fprintf(stream, "%d\n", cstr_info->numlayers);
|
||||
fprintf(stream, "%d\n", cstr_info->numdecompos[0]); /* based on component 0 */
|
||||
|
||||
for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) {
|
||||
fprintf(stream, "[%d,%d] ",
|
||||
(1 << cstr_info->tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno])); /* based on tile 0 and component 0 */
|
||||
}
|
||||
|
||||
fprintf(stream, "\n");
|
||||
/* UniPG>> */
|
||||
fprintf(stream, "%d\n", cstr_info->main_head_start);
|
||||
/* <<UniPG */
|
||||
fprintf(stream, "%d\n", cstr_info->main_head_end);
|
||||
fprintf(stream, "%d\n", cstr_info->codestream_size);
|
||||
|
||||
fprintf(stream, "\nINFO ON TILES\n");
|
||||
fprintf(stream, "tileno start_pos end_hd end_tile nbparts");
|
||||
if (disto_on)
|
||||
fprintf(stream," disto");
|
||||
if (numpix_on)
|
||||
fprintf(stream," nbpix");
|
||||
if (disto_on && numpix_on)
|
||||
fprintf(stream," disto/nbpix");
|
||||
fprintf(stream, "\n");
|
||||
|
||||
for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
|
||||
fprintf(stream, "%4d %9d %9d %9d %9d",
|
||||
cstr_info->tile[tileno].tileno,
|
||||
cstr_info->tile[tileno].start_pos,
|
||||
cstr_info->tile[tileno].end_header,
|
||||
cstr_info->tile[tileno].end_pos,
|
||||
cstr_info->tile[tileno].num_tps);
|
||||
if (disto_on)
|
||||
fprintf(stream," %9e", cstr_info->tile[tileno].distotile);
|
||||
if (numpix_on)
|
||||
fprintf(stream," %9d", cstr_info->tile[tileno].numpix);
|
||||
if (disto_on && numpix_on)
|
||||
fprintf(stream," %9e", cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix);
|
||||
fprintf(stream, "\n");
|
||||
}
|
||||
|
||||
for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {
|
||||
int start_pos, end_ph_pos, end_pos;
|
||||
double disto = 0;
|
||||
int max_numdecompos = 0;
|
||||
pack_nb = 0;
|
||||
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
if (max_numdecompos < cstr_info->numdecompos[compno])
|
||||
max_numdecompos = cstr_info->numdecompos[compno];
|
||||
}
|
||||
|
||||
fprintf(stream, "\nTILE %d DETAILS\n", tileno);
|
||||
fprintf(stream, "part_nb tileno start_pack num_packs start_pos end_tph_pos end_pos\n");
|
||||
for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++)
|
||||
fprintf(stream, "%4d %9d %9d %9d %9d %11d %9d\n",
|
||||
tilepartno, tileno,
|
||||
cstr_info->tile[tileno].tp[tilepartno].tp_start_pack,
|
||||
cstr_info->tile[tileno].tp[tilepartno].tp_numpacks,
|
||||
cstr_info->tile[tileno].tp[tilepartno].tp_start_pos,
|
||||
cstr_info->tile[tileno].tp[tilepartno].tp_end_header,
|
||||
cstr_info->tile[tileno].tp[tilepartno].tp_end_pos
|
||||
);
|
||||
|
||||
if (cstr_info->prog == LRCP) { /* LRCP */
|
||||
fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos");
|
||||
if (disto_on)
|
||||
fprintf(stream, " disto");
|
||||
fprintf(stream,"\n");
|
||||
|
||||
for (layno = 0; layno < cstr_info->numlayers; layno++) {
|
||||
for (resno = 0; resno < max_numdecompos + 1; resno++) {
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
int prec_max;
|
||||
if (resno > cstr_info->numdecompos[compno])
|
||||
break;
|
||||
prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
for (precno = 0; precno < prec_max; precno++) {
|
||||
start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
|
||||
end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
|
||||
end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
|
||||
disto = cstr_info->tile[tileno].packet[pack_nb].disto;
|
||||
fprintf(stream, "%4d %6d %7d %5d %6d %6d %6d %6d %7d",
|
||||
pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos);
|
||||
if (disto_on)
|
||||
fprintf(stream, " %8e", disto);
|
||||
fprintf(stream, "\n");
|
||||
total_disto += disto;
|
||||
pack_nb++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* LRCP */
|
||||
|
||||
else if (cstr_info->prog == RLCP) { /* RLCP */
|
||||
fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos\n");
|
||||
if (disto_on)
|
||||
fprintf(stream, " disto");
|
||||
fprintf(stream,"\n");
|
||||
|
||||
for (resno = 0; resno < max_numdecompos + 1; resno++) {
|
||||
for (layno = 0; layno < cstr_info->numlayers; layno++) {
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
int prec_max;
|
||||
if (resno > cstr_info->numdecompos[compno])
|
||||
break;
|
||||
prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
for (precno = 0; precno < prec_max; precno++) {
|
||||
start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
|
||||
end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
|
||||
end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
|
||||
disto = cstr_info->tile[tileno].packet[pack_nb].disto;
|
||||
fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d %9d %7d",
|
||||
pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos);
|
||||
if (disto_on)
|
||||
fprintf(stream, " %8e", disto);
|
||||
fprintf(stream, "\n");
|
||||
total_disto += disto;
|
||||
pack_nb++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} /* RLCP */
|
||||
|
||||
else if (cstr_info->prog == RPCL) { /* RPCL */
|
||||
|
||||
fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos");
|
||||
if (disto_on)
|
||||
fprintf(stream, " disto");
|
||||
fprintf(stream,"\n");
|
||||
|
||||
for (resno = 0; resno < max_numdecompos + 1; resno++) {
|
||||
int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
for (precno = 0; precno < numprec; precno++) {
|
||||
/* I suppose components have same XRsiz, YRsiz */
|
||||
int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
|
||||
int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
|
||||
int x1 = x0 + cstr_info->tile_x;
|
||||
int y1 = y0 + cstr_info->tile_y;
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
int pcnx = cstr_info->tile[tileno].pw[resno];
|
||||
int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
|
||||
int precno_y = (int) floor( (float)precno/(float)pcnx );
|
||||
if (resno > cstr_info->numdecompos[compno])
|
||||
break;
|
||||
for(y = y0; y < y1; y++) {
|
||||
if (precno_y*pcy == y ) {
|
||||
for (x = x0; x < x1; x++) {
|
||||
if (precno_x*pcx == x ) {
|
||||
for (layno = 0; layno < cstr_info->numlayers; layno++) {
|
||||
start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
|
||||
end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
|
||||
end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
|
||||
disto = cstr_info->tile[tileno].packet[pack_nb].disto;
|
||||
fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d %9d %7d",
|
||||
pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos);
|
||||
if (disto_on)
|
||||
fprintf(stream, " %8e", disto);
|
||||
fprintf(stream, "\n");
|
||||
total_disto += disto;
|
||||
pack_nb++;
|
||||
}
|
||||
}
|
||||
}/* x = x0..x1 */
|
||||
}
|
||||
} /* y = y0..y1 */
|
||||
} /* precno */
|
||||
} /* compno */
|
||||
} /* resno */
|
||||
} /* RPCL */
|
||||
|
||||
else if (cstr_info->prog == PCRL) { /* PCRL */
|
||||
/* I suppose components have same XRsiz, YRsiz */
|
||||
int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
|
||||
int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
|
||||
int x1 = x0 + cstr_info->tile_x;
|
||||
int y1 = y0 + cstr_info->tile_y;
|
||||
|
||||
// Count the maximum number of precincts
|
||||
int max_numprec = 0;
|
||||
for (resno = 0; resno < max_numdecompos + 1; resno++) {
|
||||
int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
if (numprec > max_numprec)
|
||||
max_numprec = numprec;
|
||||
}
|
||||
|
||||
fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos");
|
||||
if (disto_on)
|
||||
fprintf(stream, " disto");
|
||||
fprintf(stream,"\n");
|
||||
|
||||
for (precno = 0; precno < max_numprec; precno++) {
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {
|
||||
int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
int pcnx = cstr_info->tile[tileno].pw[resno];
|
||||
int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
|
||||
int precno_y = (int) floor( (float)precno/(float)pcnx );
|
||||
if (precno >= numprec)
|
||||
continue;
|
||||
for(y = y0; y < y1; y++) {
|
||||
if (precno_y*pcy == y ) {
|
||||
for (x = x0; x < x1; x++) {
|
||||
if (precno_x*pcx == x ) {
|
||||
for (layno = 0; layno < cstr_info->numlayers; layno++) {
|
||||
start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
|
||||
end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
|
||||
end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
|
||||
disto = cstr_info->tile[tileno].packet[pack_nb].disto;
|
||||
fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %7d",
|
||||
pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos);
|
||||
if (disto_on)
|
||||
fprintf(stream, " %8e", disto);
|
||||
fprintf(stream, "\n");
|
||||
total_disto += disto;
|
||||
pack_nb++;
|
||||
}
|
||||
}
|
||||
}/* x = x0..x1 */
|
||||
}
|
||||
} /* y = y0..y1 */
|
||||
} /* resno */
|
||||
} /* compno */
|
||||
} /* precno */
|
||||
} /* PCRL */
|
||||
|
||||
else { /* CPRL */
|
||||
// Count the maximum number of precincts
|
||||
int max_numprec = 0;
|
||||
for (resno = 0; resno < max_numdecompos + 1; resno++) {
|
||||
int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
if (numprec > max_numprec)
|
||||
max_numprec = numprec;
|
||||
}
|
||||
|
||||
fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos");
|
||||
if (disto_on)
|
||||
fprintf(stream, " disto");
|
||||
fprintf(stream,"\n");
|
||||
|
||||
for (compno = 0; compno < cstr_info->numcomps; compno++) {
|
||||
/* I suppose components have same XRsiz, YRsiz */
|
||||
int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;
|
||||
int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;
|
||||
int x1 = x0 + cstr_info->tile_x;
|
||||
int y1 = y0 + cstr_info->tile_y;
|
||||
|
||||
for (precno = 0; precno < max_numprec; precno++) {
|
||||
for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {
|
||||
int numprec = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];
|
||||
int pcnx = cstr_info->tile[tileno].pw[resno];
|
||||
int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );
|
||||
int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;
|
||||
int precno_y = (int) floor( (float)precno/(float)pcnx );
|
||||
if (precno >= numprec)
|
||||
continue;
|
||||
|
||||
for(y = y0; y < y1; y++) {
|
||||
if (precno_y*pcy == y ) {
|
||||
for (x = x0; x < x1; x++) {
|
||||
if (precno_x*pcx == x ) {
|
||||
for (layno = 0; layno < cstr_info->numlayers; layno++) {
|
||||
start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;
|
||||
end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;
|
||||
end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;
|
||||
disto = cstr_info->tile[tileno].packet[pack_nb].disto;
|
||||
fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %7d",
|
||||
pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos);
|
||||
if (disto_on)
|
||||
fprintf(stream, " %8e", disto);
|
||||
fprintf(stream, "\n");
|
||||
total_disto += disto;
|
||||
pack_nb++;
|
||||
}
|
||||
}
|
||||
}/* x = x0..x1 */
|
||||
}
|
||||
} /* y = y0..y1 */
|
||||
} /* resno */
|
||||
} /* precno */
|
||||
} /* compno */
|
||||
} /* CPRL */
|
||||
} /* tileno */
|
||||
|
||||
if (disto_on) {
|
||||
fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */
|
||||
fprintf(stream, "%.8e\n", total_disto); /* SE totale */
|
||||
}
|
||||
/* UniPG>> */
|
||||
/* print the markers' list */
|
||||
if (cstr_info->marknum) {
|
||||
fprintf(stream, "\nMARKER LIST\n");
|
||||
fprintf(stream, "%d\n", cstr_info->marknum);
|
||||
fprintf(stream, "type\tstart_pos length\n");
|
||||
for (x = 0; x < cstr_info->marknum; x++)
|
||||
fprintf(stream, "%X\t%9d %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len);
|
||||
}
|
||||
/* <<UniPG */
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 20010, Mathieu Malaterre, GDCM
|
||||
* Copyright (c) 2010, Mathieu Malaterre, GDCM
|
||||
* Copyright (c) 2011, Mickael Savinaud, Communications & Systemes <mickael.savinaud@c-s.fr>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -474,6 +475,7 @@ int main(int argc, char *argv[])
|
||||
if (parameters.decod_format == J2K_CFMT){
|
||||
/* dump image */
|
||||
j2k_dump_image(fout, image);
|
||||
write_index_file_v2(fout, cstr_info);
|
||||
/* dump cp */
|
||||
//j2k_dump_cp(stdout, image, ((opj_codec_private_t)dinfo)->m_codec);
|
||||
//j2k_dump_cp(fout, image, ((opj_j2k_t*)dinfo->j2k_handle)->cp);
|
||||
@ -541,6 +543,8 @@ static void j2k_dump_image(FILE *fd, opj_image_header_t * img) {
|
||||
fprintf(fd, " sgnd=%d\n", comp->sgnd);
|
||||
fprintf(fd, " }\n");
|
||||
}
|
||||
fprintf(fd, " XTOsiz=%d, YTOsiz=%d, XTsiz=%d, YTsiz=%d\n", img->tile_x0, img->tile_y0, img->tile_width, img->tile_height);
|
||||
fprintf(fd, " Nb of tiles in x direction=%d, Nb of tiles in y direction=%d\n", img->nb_tiles_x, img->nb_tiles_y);
|
||||
fprintf(fd, "}\n");
|
||||
}
|
||||
|
||||
|
@ -3693,6 +3693,27 @@ void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters) {
|
||||
}
|
||||
}
|
||||
|
||||
void j2k_setup_decoder_v2(opj_j2k_v2_t *j2k, opj_dparameters_t *parameters) {
|
||||
if(j2k && parameters) {
|
||||
/* create and initialize the coding parameters structure */
|
||||
//opj_cp_v2_t *cp = (opj_cp_v2_t*) opj_calloc(1, sizeof(opj_cp_v2_t));
|
||||
j2k->m_cp.m_specific_param.m_dec.m_layer = parameters->cp_layer;
|
||||
j2k->m_cp.m_specific_param.m_dec.m_reduce = parameters->cp_reduce;
|
||||
|
||||
/*cp->reduce = parameters->cp_reduce;
|
||||
cp->layer = parameters->cp_layer;
|
||||
cp->limit_decoding = parameters->cp_limit_decoding;*/
|
||||
|
||||
// TODO MS
|
||||
#ifdef USE_JPWL
|
||||
cp->correct = parameters->jpwl_correct;
|
||||
cp->exp_comps = parameters->jpwl_exp_comps;
|
||||
cp->max_tiles = parameters->jpwl_max_tiles;
|
||||
#endif /* USE_JPWL */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
opj_image_t* j2k_decode(opj_j2k_t *j2k, opj_cio_t *cio, opj_codestream_info_t *cstr_info) {
|
||||
opj_image_t *image = NULL;
|
||||
|
||||
@ -3888,6 +3909,43 @@ opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo) {
|
||||
return j2k;
|
||||
}
|
||||
|
||||
opj_j2k_v2_t* j2k_create_compress_v2()
|
||||
{
|
||||
opj_j2k_v2_t *l_j2k = (opj_j2k_v2_t*) opj_malloc(sizeof(opj_j2k_v2_t));
|
||||
if (!l_j2k) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(l_j2k,0,sizeof(opj_j2k_v2_t));
|
||||
|
||||
l_j2k->m_is_decoder = 0;
|
||||
l_j2k->m_cp.m_is_decoder = 0;
|
||||
|
||||
l_j2k->m_specific_param.m_encoder.m_header_tile_data = (OPJ_BYTE *) opj_malloc(J2K_DEFAULT_HEADER_SIZE);
|
||||
if (! l_j2k->m_specific_param.m_encoder.m_header_tile_data) {
|
||||
j2k_destroy(l_j2k);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
l_j2k->m_specific_param.m_encoder.m_header_tile_data_size = J2K_DEFAULT_HEADER_SIZE;
|
||||
|
||||
// validation list creation
|
||||
l_j2k->m_validation_list = opj_procedure_list_create();
|
||||
if (! l_j2k->m_validation_list) {
|
||||
j2k_destroy(l_j2k);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// execution list creation
|
||||
l_j2k->m_procedure_list = opj_procedure_list_create();
|
||||
if (! l_j2k->m_procedure_list) {
|
||||
j2k_destroy(l_j2k);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return l_j2k;
|
||||
}
|
||||
|
||||
void j2k_destroy_compress(opj_j2k_t *j2k) {
|
||||
int tileno;
|
||||
|
||||
@ -4443,7 +4501,7 @@ static void j2k_add_tlmarker( int tileno, opj_codestream_info_t *cstr_info, unsi
|
||||
* codestream.
|
||||
*/
|
||||
opj_bool j2k_end_decompress(
|
||||
opj_j2k_t *p_j2k,
|
||||
opj_j2k_v2_t *p_j2k,
|
||||
opj_stream_private_t *p_stream,
|
||||
opj_event_mgr_t * p_manager)
|
||||
{
|
||||
|
@ -784,6 +784,9 @@ Decoding parameters are returned in j2k->cp.
|
||||
@param parameters decompression parameters
|
||||
*/
|
||||
void j2k_setup_decoder(opj_j2k_t *j2k, opj_dparameters_t *parameters);
|
||||
|
||||
void j2k_setup_decoder_v2(opj_j2k_v2_t *j2k, opj_dparameters_t *parameters);
|
||||
|
||||
/**
|
||||
Decode an image from a JPEG-2000 codestream
|
||||
@param j2k J2K decompressor handle
|
||||
@ -806,6 +809,14 @@ Creates a J2K compression structure
|
||||
@return Returns a handle to a J2K compressor if successful, returns NULL otherwise
|
||||
*/
|
||||
opj_j2k_t* j2k_create_compress(opj_common_ptr cinfo);
|
||||
|
||||
/**
|
||||
Creates a J2K compression structure
|
||||
@param cinfo Codec context info
|
||||
@return Returns a handle to a J2K compressor if successful, returns NULL otherwise
|
||||
*/
|
||||
opj_j2k_v2_t* j2k_create_compress_v2();
|
||||
|
||||
/**
|
||||
Destroy a J2K compressor handle
|
||||
@param j2k J2K compressor handle to destroy
|
||||
@ -842,7 +853,7 @@ opj_bool j2k_encode(opj_j2k_t *j2k, opj_cio_t *cio, opj_image_t *image, opj_code
|
||||
* Ends the decompression procedures and possibiliy add data to be read after the
|
||||
* codestream.
|
||||
*/
|
||||
opj_bool j2k_end_decompress(opj_j2k_t *j2k, struct opj_stream_private *cio, struct opj_event_mgr * p_manager);
|
||||
opj_bool j2k_end_decompress(opj_j2k_v2_t *j2k, struct opj_stream_private *cio, struct opj_event_mgr * p_manager);
|
||||
|
||||
/**
|
||||
* Reads a jpeg2000 codestream header structure.
|
||||
|
1420
libopenjpeg/jp2.c
1420
libopenjpeg/jp2.c
File diff suppressed because it is too large
Load Diff
@ -41,19 +41,53 @@
|
||||
|
||||
#define JP2_JP 0x6a502020 /**< JPEG 2000 signature box */
|
||||
#define JP2_FTYP 0x66747970 /**< File type box */
|
||||
#define JP2_JP2H 0x6a703268 /**< JP2 header box */
|
||||
#define JP2_IHDR 0x69686472 /**< Image header box */
|
||||
#define JP2_COLR 0x636f6c72 /**< Colour specification box */
|
||||
|
||||
#define JP2_JP2H 0x6a703268 /**< JP2 header box (super-box) */
|
||||
#define JP2_IHDR 0x69686472 /**< Image header box */
|
||||
#define JP2_BPCC 0x62706363 /**< Bits per component box */
|
||||
#define JP2_COLR 0x636f6c72 /**< Colour specification box */
|
||||
#define JP2_PCLR 0x70636c72 /**< Palette box */
|
||||
#define JP2_CMAP 0x636d6170 /**< Component Mapping box */
|
||||
#define JP2_CDEF 0x63646566 /**< Channel Definition box */
|
||||
// For the future MSD
|
||||
// #define JP2_RES 0x72657320 /**< Resolution box (super-box) */
|
||||
|
||||
#define JP2_JP2C 0x6a703263 /**< Contiguous codestream box */
|
||||
#define JP2_URL 0x75726c20 /**< URL box */
|
||||
|
||||
// For the future MSD
|
||||
// #define JP2_JP2I 0x6a703269 /**< Intellectual property box */
|
||||
// #define JP2_XML 0x786d6c20 /**< XML box */
|
||||
// #define JP2_UUID 0x75756994 /**< UUID box */
|
||||
// #define JP2_UINF 0x75696e66 /**< UUID info box (super-box) */
|
||||
// #define JP2_ULST 0x756c7374 /**< UUID list box */
|
||||
#define JP2_URL 0x75726c20 /**< Data entry URL box */
|
||||
|
||||
#define JP2_DTBL 0x6474626c /**< Data Reference box */
|
||||
#define JP2_BPCC 0x62706363 /**< Bits per component box */
|
||||
|
||||
#define JP2_JP2 0x6a703220 /**< File type fields */
|
||||
#define JP2_PCLR 0x70636c72 /**< Palette box */
|
||||
#define JP2_CMAP 0x636d6170 /**< Component Mapping box */
|
||||
#define JP2_CDEF 0x63646566 /**< Channel Definition box */
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
typedef enum
|
||||
{
|
||||
JP2_STATE_NONE = 0x0,
|
||||
JP2_STATE_SIGNATURE = 0x1,
|
||||
JP2_STATE_FILE_TYPE = 0x2,
|
||||
JP2_STATE_HEADER = 0x4,
|
||||
JP2_STATE_CODESTREAM = 0x8,
|
||||
JP2_STATE_END_CODESTREAM = 0x10,
|
||||
JP2_STATE_UNKNOWN = 0x80000000
|
||||
}
|
||||
JP2_STATE;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
JP2_IMG_STATE_NONE = 0x0,
|
||||
JP2_IMG_STATE_UNKNOWN = 0x80000000
|
||||
}
|
||||
JP2_IMG_STATE;
|
||||
|
||||
/**
|
||||
Channel description: channel index, type, assocation
|
||||
*/
|
||||
@ -143,15 +177,64 @@ typedef struct opj_jp2 {
|
||||
opj_bool jpip_on;
|
||||
} opj_jp2_t;
|
||||
|
||||
/**
|
||||
JPEG-2000 file format reader/writer
|
||||
*/
|
||||
typedef struct opj_jp2_v2
|
||||
{
|
||||
/** handle to the J2K codec */
|
||||
struct opj_j2k_v2 *j2k;
|
||||
/** list of validation procedures */
|
||||
struct opj_procedure_list * m_validation_list;
|
||||
/** list of execution procedures */
|
||||
struct opj_procedure_list * m_procedure_list;
|
||||
|
||||
/* width of image */
|
||||
OPJ_UINT32 w;
|
||||
/* height of image */
|
||||
OPJ_UINT32 h;
|
||||
/* number of components in the image */
|
||||
OPJ_UINT32 numcomps;
|
||||
OPJ_UINT32 bpc;
|
||||
OPJ_UINT32 C;
|
||||
OPJ_UINT32 UnkC;
|
||||
OPJ_UINT32 IPR;
|
||||
OPJ_UINT32 meth;
|
||||
OPJ_UINT32 approx;
|
||||
OPJ_UINT32 enumcs;
|
||||
OPJ_UINT32 precedence;
|
||||
OPJ_UINT32 brand;
|
||||
OPJ_UINT32 minversion;
|
||||
OPJ_UINT32 numcl;
|
||||
OPJ_UINT32 *cl;
|
||||
opj_jp2_comps_t *comps;
|
||||
OPJ_UINT32 j2k_codestream_offset;
|
||||
OPJ_UINT32 jp2_state;
|
||||
OPJ_UINT32 jp2_img_state;
|
||||
|
||||
opj_jp2_color_t color;
|
||||
|
||||
}
|
||||
opj_jp2_v2_t;
|
||||
|
||||
/**
|
||||
JP2 Box
|
||||
*/
|
||||
typedef struct opj_jp2_box {
|
||||
int length;
|
||||
int type;
|
||||
int init_pos;
|
||||
OPJ_INT32 length;
|
||||
OPJ_INT32 type;
|
||||
OPJ_INT32 init_pos;
|
||||
} opj_jp2_box_t;
|
||||
|
||||
typedef struct opj_jp2_header_handler
|
||||
{
|
||||
/* marker value */
|
||||
int id;
|
||||
/* action linked to the marker */
|
||||
opj_bool (*handler) (opj_jp2_v2_t *jp2, unsigned char * p_header_data, OPJ_UINT32 p_header_size, struct opj_event_mgr * p_manager);
|
||||
}
|
||||
opj_jp2_header_handler_t;
|
||||
|
||||
/** @name Exported functions */
|
||||
/*@{*/
|
||||
/* ----------------------------------------------------------------------- */
|
||||
@ -188,6 +271,13 @@ Decoding parameters are returned in jp2->j2k->cp.
|
||||
*/
|
||||
void jp2_setup_decoder(opj_jp2_t *jp2, opj_dparameters_t *parameters);
|
||||
/**
|
||||
Setup the decoder decoding parameters using user parameters.
|
||||
Decoding parameters are returned in jp2->j2k->cp.
|
||||
@param jp2 JP2 decompressor handle
|
||||
@param parameters decompression parameters
|
||||
*/
|
||||
void jp2_setup_decoder_v2(opj_jp2_v2_t *jp2, opj_dparameters_t *parameters);
|
||||
/**
|
||||
Decode an image from a JPEG-2000 file stream
|
||||
@param jp2 JP2 decompressor handle
|
||||
@param cio Input buffer stream
|
||||
@ -224,7 +314,100 @@ Encode an image into a JPEG-2000 file stream
|
||||
*/
|
||||
opj_bool opj_jp2_encode(opj_jp2_t *jp2, opj_cio_t *cio, opj_image_t *image, opj_codestream_info_t *cstr_info);
|
||||
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Ends the decompression procedures and possibiliy add data to be read after the
|
||||
* codestream.
|
||||
*/
|
||||
opj_bool jp2_end_decompress(opj_jp2_v2_t *jp2, struct opj_stream_private *cio, struct opj_event_mgr * p_manager);
|
||||
|
||||
/**
|
||||
* Reads a jpeg2000 file header structure.
|
||||
*
|
||||
* @param cio the stream to read data from.
|
||||
* @param jp2 the jpeg2000 file header structure.
|
||||
* @param p_manager the user event manager.
|
||||
*
|
||||
* @return true if the box is valid.
|
||||
*/
|
||||
opj_bool jp2_read_header( struct opj_stream_private *p_stream,
|
||||
opj_jp2_v2_t *jp2,
|
||||
opj_image_header_t ** p_image_header,
|
||||
struct opj_codestream_info** p_cstr_info,
|
||||
struct opj_event_mgr * p_manager
|
||||
);
|
||||
|
||||
/**
|
||||
* Reads a tile header.
|
||||
* @param p_j2k the jpeg2000 codec.
|
||||
* @param p_stream the stream to write data to.
|
||||
* @param p_manager the user event manager.
|
||||
*/
|
||||
opj_bool jp2_read_tile_header (
|
||||
opj_jp2_v2_t * p_j2k,
|
||||
OPJ_UINT32 * p_tile_index,
|
||||
OPJ_UINT32 * p_data_size,
|
||||
OPJ_INT32 * p_tile_x0,
|
||||
OPJ_INT32 * p_tile_y0,
|
||||
OPJ_INT32 * p_tile_x1,
|
||||
OPJ_INT32 * p_tile_y1,
|
||||
OPJ_UINT32 * p_nb_comps,
|
||||
opj_bool * p_go_on,
|
||||
struct opj_stream_private *p_stream,
|
||||
struct opj_event_mgr * p_manager
|
||||
);
|
||||
|
||||
/**
|
||||
* Decode tile data.
|
||||
* @param p_j2k the jpeg2000 codec.
|
||||
* @param p_stream the stream to write data to.
|
||||
* @param p_manager the user event manager.
|
||||
*/
|
||||
opj_bool opj_jp2_decode_tile (
|
||||
opj_jp2_v2_t * p_jp2,
|
||||
OPJ_UINT32 p_tile_index,
|
||||
OPJ_BYTE * p_data,
|
||||
OPJ_UINT32 p_data_size,
|
||||
struct opj_stream_private *p_stream,
|
||||
struct opj_event_mgr * p_manager
|
||||
);
|
||||
|
||||
/**
|
||||
* Creates a jpeg2000 file decompressor.
|
||||
*
|
||||
* @return an empty jpeg2000 file codec.
|
||||
*/
|
||||
opj_jp2_v2_t* jp2_create (opj_bool p_is_decoder);
|
||||
|
||||
/**
|
||||
Destroy a JP2 decompressor handle
|
||||
@param jp2 JP2 decompressor handle to destroy
|
||||
*/
|
||||
void jp2_destroy(opj_jp2_v2_t *jp2);
|
||||
|
||||
|
||||
/**
|
||||
* Sets the given area to be decoded. This function should be called right after opj_read_header and before any tile header reading.
|
||||
*
|
||||
* @param p_jp2 the jpeg2000 codec.
|
||||
* @param p_end_x the right position of the rectangle to decode (in image coordinates).
|
||||
* @param p_start_y the up position of the rectangle to decode (in image coordinates).
|
||||
* @param p_end_y the bottom position of the rectangle to decode (in image coordinates).
|
||||
* @param p_manager the user event manager
|
||||
*
|
||||
* @return true if the area could be set.
|
||||
*/
|
||||
opj_bool jp2_set_decode_area(
|
||||
opj_jp2_v2_t *p_jp2,
|
||||
OPJ_INT32 p_start_x,
|
||||
OPJ_INT32 p_start_y,
|
||||
OPJ_INT32 p_end_x,
|
||||
OPJ_INT32 p_end_y,
|
||||
struct opj_event_mgr * p_manager
|
||||
);
|
||||
|
||||
/*@}*/
|
||||
|
||||
/*@}*/
|
||||
|
@ -55,7 +55,7 @@ typedef struct opj_decompression
|
||||
opj_bool (*opj_decode_tile_data)(void * p_codec,OPJ_UINT32 p_tile_index,OPJ_BYTE * p_data,OPJ_UINT32 p_data_size,struct opj_stream_private *p_cio,struct opj_event_mgr * p_manager);
|
||||
opj_bool (* opj_end_decompress) (void *p_codec,struct opj_stream_private *cio,struct opj_event_mgr * p_manager);
|
||||
void (* opj_destroy) (void * p_codec);
|
||||
void (*opj_setup_decoder) (void * p_codec,opj_dparameters_t * p_param);
|
||||
void (*opj_setup_decoder) (void * p_codec, opj_dparameters_t * p_param);
|
||||
opj_bool (*opj_set_decode_area) (void * p_codec,OPJ_INT32 p_start_x,OPJ_INT32 p_end_x,OPJ_INT32 p_start_y,OPJ_INT32 p_end_y,struct opj_event_mgr * p_manager);
|
||||
|
||||
|
||||
@ -212,11 +212,9 @@ opj_codec_t* OPJ_CALLCONV opj_create_decompress_v2(OPJ_CODEC_FORMAT p_format)
|
||||
|
||||
l_info->is_decompressor = 1;
|
||||
|
||||
switch
|
||||
(p_format)
|
||||
{
|
||||
switch (p_format) {
|
||||
case CODEC_J2K:
|
||||
l_info->m_codec_data.m_decompression.opj_decode = (opj_image_t* (*) (void *, struct opj_stream_private *, struct opj_event_mgr * ))j2k_decode;
|
||||
l_info->m_codec_data.m_decompression.opj_decode = (opj_image_t* (*) (void *, struct opj_stream_private *, struct opj_event_mgr * ))j2k_decode; // TODO MSD
|
||||
l_info->m_codec_data.m_decompression.opj_end_decompress = (opj_bool (*) (void *,struct opj_stream_private *,struct opj_event_mgr *))j2k_end_decompress;
|
||||
l_info->m_codec_data.m_decompression.opj_read_header = (opj_bool (*) (
|
||||
struct opj_stream_private *,
|
||||
@ -241,31 +239,24 @@ opj_codec_t* OPJ_CALLCONV opj_create_decompress_v2(OPJ_CODEC_FORMAT p_format)
|
||||
l_info->m_codec_data.m_decompression.opj_decode_tile_data = (opj_bool (*) (void *,OPJ_UINT32,OPJ_BYTE*,OPJ_UINT32,struct opj_stream_private *, struct opj_event_mgr * )) j2k_decode_tile;
|
||||
l_info->m_codec_data.m_decompression.opj_set_decode_area = (opj_bool (*) (void *,OPJ_INT32,OPJ_INT32,OPJ_INT32,OPJ_INT32, struct opj_event_mgr * )) j2k_set_decode_area;
|
||||
l_info->m_codec = j2k_create_decompress_v2();
|
||||
if
|
||||
(! l_info->m_codec)
|
||||
{
|
||||
|
||||
if (! l_info->m_codec) {
|
||||
opj_free(l_info);
|
||||
return 00;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case CODEC_JP2:
|
||||
/* get a JP2 decoder handle */
|
||||
#ifdef TODO_MSD
|
||||
l_info->m_codec_data.m_decompression.opj_decode = (opj_image_t* (*) (void *, struct opj_stream_private *, struct opj_event_mgr * ))opj_jp2_decode;
|
||||
l_info->m_codec_data.m_decompression.opj_decode = (opj_image_t* (*) (void *, struct opj_stream_private *, struct opj_event_mgr * ))opj_jp2_decode; // TODO MSD
|
||||
l_info->m_codec_data.m_decompression.opj_end_decompress = (opj_bool (*) (void *,struct opj_stream_private *,struct opj_event_mgr *)) jp2_end_decompress;
|
||||
l_info->m_codec_data.m_decompression.opj_read_header = (opj_bool (*) (
|
||||
void *,
|
||||
opj_image_t **,
|
||||
|
||||
OPJ_INT32 * ,
|
||||
OPJ_INT32 * ,
|
||||
OPJ_UINT32 * ,
|
||||
OPJ_UINT32 * ,
|
||||
OPJ_UINT32 * ,
|
||||
OPJ_UINT32 * ,
|
||||
struct opj_stream_private *,
|
||||
struct opj_event_mgr * )) jp2_read_header;
|
||||
struct opj_stream_private *,
|
||||
void *,
|
||||
opj_image_header_t **,
|
||||
opj_codestream_info_t**,
|
||||
struct opj_event_mgr * )) jp2_read_header;
|
||||
|
||||
l_info->m_codec_data.m_decompression.opj_read_tile_header = (
|
||||
opj_bool (*) (
|
||||
@ -284,18 +275,16 @@ opj_codec_t* OPJ_CALLCONV opj_create_decompress_v2(OPJ_CODEC_FORMAT p_format)
|
||||
l_info->m_codec_data.m_decompression.opj_decode_tile_data = (opj_bool (*) (void *,OPJ_UINT32,OPJ_BYTE*,OPJ_UINT32,struct opj_stream_private *, struct opj_event_mgr * )) opj_jp2_decode_tile;
|
||||
|
||||
l_info->m_codec_data.m_decompression.opj_destroy = (void (*) (void *))jp2_destroy;
|
||||
l_info->m_codec_data.m_decompression.opj_setup_decoder = (void (*) (void * ,opj_dparameters_t * )) jp2_setup_decoder;
|
||||
l_info->m_codec_data.m_decompression.opj_setup_decoder = (void (*) (void * ,opj_dparameters_t * )) jp2_setup_decoder_v2;
|
||||
l_info->m_codec_data.m_decompression.opj_set_decode_area = (opj_bool (*) (void *,OPJ_INT32,OPJ_INT32,OPJ_INT32,OPJ_INT32, struct opj_event_mgr * )) jp2_set_decode_area;
|
||||
|
||||
|
||||
l_info->m_codec = jp2_create(OPJ_TRUE);
|
||||
if
|
||||
(! l_info->m_codec)
|
||||
{
|
||||
|
||||
if (! l_info->m_codec) {
|
||||
opj_free(l_info);
|
||||
return 00;
|
||||
}
|
||||
#endif
|
||||
|
||||
break;
|
||||
case CODEC_UNKNOWN:
|
||||
case CODEC_JPT:
|
||||
|
@ -812,6 +812,107 @@ typedef struct opj_codestream_info {
|
||||
opj_tile_info_t *tile;
|
||||
} opj_codestream_info_t;
|
||||
|
||||
// NEW codestream
|
||||
|
||||
typedef struct opj_tile_v2_info {
|
||||
|
||||
/** number of tile */
|
||||
int tileno;
|
||||
|
||||
/** start position */
|
||||
int start_pos;
|
||||
/** end position of the header */
|
||||
int end_header;
|
||||
/** end position */
|
||||
int end_pos;
|
||||
|
||||
/** add fixed_quality */
|
||||
int numpix;
|
||||
/** add fixed_quality */
|
||||
double distotile;
|
||||
|
||||
/** precinct number for each resolution level (width) */
|
||||
int pw[33];
|
||||
/** precinct number for each resolution level (height) */
|
||||
int ph[33];
|
||||
/** precinct size (in power of 2), in X for each resolution level */
|
||||
int pdx[33];
|
||||
/** precinct size (in power of 2), in Y for each resolution level */
|
||||
int pdy[33];
|
||||
/** information concerning packets inside tile */
|
||||
opj_packet_info_t *packet;
|
||||
|
||||
|
||||
/** number of tile parts */
|
||||
int num_tps;
|
||||
/** information concerning tile parts */
|
||||
opj_tp_info_t *tp;
|
||||
|
||||
/** value of thresh for each layer by tile cfr. Marcela */
|
||||
double *thresh;
|
||||
} opj_tile_info_v2_t;
|
||||
|
||||
/**
|
||||
Index structure of the codestream
|
||||
*/
|
||||
typedef struct opj_codestream_v2_info {
|
||||
/** image width */
|
||||
int image_w;
|
||||
/** image height */
|
||||
int image_h;
|
||||
/** numbers of component */
|
||||
int numcomps;
|
||||
|
||||
/** progression order */
|
||||
OPJ_PROG_ORDER prog;
|
||||
/** number of layer */
|
||||
int numlayers;
|
||||
|
||||
/** */
|
||||
int tx0;
|
||||
/** */
|
||||
int ty0;
|
||||
/** tile size in x */
|
||||
int tdx;
|
||||
/** tile size in y */
|
||||
int tdy;
|
||||
/** number of tiles in X */
|
||||
int tw;
|
||||
/** number of tiles in Y */
|
||||
int th;
|
||||
|
||||
/** number of decomposition for each component */
|
||||
int *numdecompos;
|
||||
|
||||
/** maximum distortion reduction on the whole image (add for Marcela) */
|
||||
double D_max;
|
||||
/** packet number */
|
||||
int packno;
|
||||
/** writing the packet in the index with t2_encode_packets */
|
||||
int index_write;
|
||||
|
||||
|
||||
|
||||
/* UniPG>> */
|
||||
/** number of markers */
|
||||
int marknum;
|
||||
/** list of markers */
|
||||
opj_marker_info_t *marker;
|
||||
/** actual size of markers array */
|
||||
int maxmarknum;
|
||||
/* <<UniPG */
|
||||
|
||||
/** main header position */
|
||||
int main_head_start;
|
||||
/** main header position */
|
||||
int main_head_end;
|
||||
/** codestream's size */
|
||||
int codestream_size;
|
||||
|
||||
/** information regarding tiles inside image */
|
||||
opj_tile_info_v2_t *tile;
|
||||
} opj_codestream_info_v2_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user