WIP: begin to test opj_decode_tile_data
This commit is contained in:
parent
6561d70664
commit
ac59fd1476
1
CHANGES
1
CHANGES
|
@ -6,6 +6,7 @@ What's New for OpenJPEG
|
||||||
+ : added
|
+ : added
|
||||||
|
|
||||||
September 19, 2011
|
September 19, 2011
|
||||||
|
+ [mickael] WIP: begin to test opj_decode_tile_data
|
||||||
+ [mickael] WIP: update t1, t2, tcd to use same strut as in V2
|
+ [mickael] WIP: update t1, t2, tcd to use same strut as in V2
|
||||||
+ [mickael] WIP: begin to test opj_read_tile_header with V2 style
|
+ [mickael] WIP: begin to test opj_read_tile_header with V2 style
|
||||||
+ [mickael] WIP: create a new framework to output file information
|
+ [mickael] WIP: create a new framework to output file information
|
||||||
|
|
|
@ -374,6 +374,8 @@ int main(int argc, char *argv[])
|
||||||
opj_codestream_info_t* cstr_info =NULL; /* Codestream information structure */
|
opj_codestream_info_t* cstr_info =NULL; /* Codestream information structure */
|
||||||
opj_bool l_go_on = OPJ_TRUE;
|
opj_bool l_go_on = OPJ_TRUE;
|
||||||
|
|
||||||
|
OPJ_UINT32 l_max_data_size = 1000;
|
||||||
|
OPJ_BYTE * l_data = (OPJ_BYTE *) malloc(1000);
|
||||||
|
|
||||||
/* FIXME configure the event callbacks (not required) */
|
/* FIXME configure the event callbacks (not required) */
|
||||||
memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
|
memset(&event_mgr, 0, sizeof(opj_event_mgr_t));
|
||||||
|
@ -518,6 +520,7 @@ int main(int argc, char *argv[])
|
||||||
OPJ_INT32 l_current_tile_x0,l_current_tile_y0,l_current_tile_x1,l_current_tile_y1;
|
OPJ_INT32 l_current_tile_x0,l_current_tile_y0,l_current_tile_x1,l_current_tile_y1;
|
||||||
OPJ_UINT32 l_nb_comps, l_tile_index, l_data_size;
|
OPJ_UINT32 l_nb_comps, l_tile_index, l_data_size;
|
||||||
|
|
||||||
|
|
||||||
if (! opj_read_tile_header( dinfo,
|
if (! opj_read_tile_header( dinfo,
|
||||||
cio,
|
cio,
|
||||||
&l_tile_index,
|
&l_tile_index,
|
||||||
|
@ -535,6 +538,32 @@ int main(int argc, char *argv[])
|
||||||
opj_destroy_codec(dinfo);
|
opj_destroy_codec(dinfo);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (l_go_on) {
|
||||||
|
|
||||||
|
if (l_data_size > l_max_data_size) {
|
||||||
|
|
||||||
|
l_data = (OPJ_BYTE *) realloc(l_data,l_data_size);
|
||||||
|
if (! l_data) {
|
||||||
|
opj_stream_destroy(cio);
|
||||||
|
fclose(fsrc);
|
||||||
|
opj_destroy_codec(dinfo);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
l_max_data_size = l_data_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! opj_decode_tile_data(dinfo,l_tile_index,l_data,l_data_size,cio))
|
||||||
|
{
|
||||||
|
free(l_data);
|
||||||
|
opj_stream_destroy(cio);
|
||||||
|
fclose(fsrc);
|
||||||
|
opj_destroy_codec(dinfo);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/** now should inspect image to know the reduction factor and then how to behave with data */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dump file informations from header */
|
/* Dump file informations from header */
|
||||||
|
|
|
@ -5715,7 +5715,7 @@ opj_bool j2k_read_tile_header( opj_j2k_v2_t * p_j2k,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
|
/* Read into the codestream until reach the EOC or ! can_decode ??? FIXME */
|
||||||
while (! p_j2k->m_specific_param.m_decoder.m_can_decode && l_current_marker != J2K_MS_EOC) {
|
while ( (!p_j2k->m_specific_param.m_decoder.m_can_decode) && (l_current_marker != J2K_MS_EOC) ) {
|
||||||
|
|
||||||
/* Try to read until the Start Of Data is detected */
|
/* Try to read until the Start Of Data is detected */
|
||||||
while (l_current_marker != J2K_MS_SOD) {
|
while (l_current_marker != J2K_MS_SOD) {
|
||||||
|
@ -5848,82 +5848,79 @@ opj_bool j2k_read_tile_header( opj_j2k_v2_t * p_j2k,
|
||||||
*p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
|
*p_tile_x1 = p_j2k->m_tcd->tcd_image->tiles->x1;
|
||||||
*p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
|
*p_tile_y1 = p_j2k->m_tcd->tcd_image->tiles->y1;
|
||||||
*p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
|
*p_nb_comps = p_j2k->m_tcd->tcd_image->tiles->numcomps;
|
||||||
p_j2k->m_specific_param.m_decoder.m_state |= 0x0080;// FIXME J2K_DEC_STATE_DATA;
|
|
||||||
|
p_j2k->m_specific_param.m_decoder.m_state |= 0x0080;// FIXME J2K_DEC_STATE_DATA;
|
||||||
|
|
||||||
return OPJ_TRUE;
|
return OPJ_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
opj_bool j2k_decode_tile (
|
opj_bool j2k_decode_tile ( opj_j2k_v2_t * p_j2k,
|
||||||
opj_j2k_v2_t * p_j2k,
|
OPJ_UINT32 p_tile_index,
|
||||||
OPJ_UINT32 p_tile_index,
|
OPJ_BYTE * p_data,
|
||||||
OPJ_BYTE * p_data,
|
OPJ_UINT32 p_data_size,
|
||||||
OPJ_UINT32 p_data_size,
|
opj_stream_private_t *p_stream,
|
||||||
opj_stream_private_t *p_stream,
|
opj_event_mgr_t * p_manager )
|
||||||
opj_event_mgr_t * p_manager
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
OPJ_UINT32 l_current_marker;
|
OPJ_UINT32 l_current_marker;
|
||||||
OPJ_BYTE l_data [2];
|
OPJ_BYTE l_data [2];
|
||||||
opj_tcp_v2_t * l_tcp;
|
opj_tcp_v2_t * l_tcp;
|
||||||
|
|
||||||
// preconditions
|
/* preconditions */
|
||||||
assert(p_stream != 00);
|
assert(p_stream != 00);
|
||||||
assert(p_j2k != 00);
|
assert(p_j2k != 00);
|
||||||
assert(p_manager != 00);
|
assert(p_manager != 00);
|
||||||
|
|
||||||
if
|
if ( !(p_j2k->m_specific_param.m_decoder.m_state & 0x0080/*FIXME J2K_DEC_STATE_DATA*/)
|
||||||
(! (p_j2k->m_specific_param.m_decoder.m_state & 0x0080/*FIXME J2K_DEC_STATE_DATA*/) || p_tile_index != p_j2k->m_current_tile_number)
|
|| (p_tile_index != p_j2k->m_current_tile_number) ) {
|
||||||
{
|
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
|
l_tcp = &(p_j2k->m_cp.tcps[p_tile_index]);
|
||||||
if
|
if (! l_tcp->m_data) {
|
||||||
(! l_tcp->m_data)
|
|
||||||
{
|
|
||||||
j2k_tcp_destroy(&(p_j2k->m_cp.tcps[p_tile_index]));
|
j2k_tcp_destroy(&(p_j2k->m_cp.tcps[p_tile_index]));
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
if
|
|
||||||
(! tcd_decode_tile_v2(p_j2k->m_tcd, l_tcp->m_data, l_tcp->m_data_size, p_tile_index, p_j2k->cstr_info))
|
if (! tcd_decode_tile_v2( p_j2k->m_tcd,
|
||||||
{
|
l_tcp->m_data,
|
||||||
|
l_tcp->m_data_size,
|
||||||
|
p_tile_index,
|
||||||
|
p_j2k->cstr_info) ) {
|
||||||
j2k_tcp_destroy(l_tcp);
|
j2k_tcp_destroy(l_tcp);
|
||||||
p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;//FIXME J2K_DEC_STATE_ERR;
|
p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;//FIXME J2K_DEC_STATE_ERR;
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
if
|
|
||||||
(! tcd_update_tile_data(p_j2k->m_tcd,p_data,p_data_size))
|
if (! tcd_update_tile_data(p_j2k->m_tcd,p_data,p_data_size)) {
|
||||||
{
|
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
j2k_tcp_destroy(l_tcp);
|
j2k_tcp_destroy(l_tcp);
|
||||||
p_j2k->m_tcd->tcp = 0;
|
p_j2k->m_tcd->tcp = 0;
|
||||||
|
|
||||||
p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
|
p_j2k->m_specific_param.m_decoder.m_can_decode = 0;
|
||||||
p_j2k->m_specific_param.m_decoder.m_state &= (~ (0x0080));// FIXME J2K_DEC_STATE_DATA);
|
p_j2k->m_specific_param.m_decoder.m_state &= (~ (0x0080));// FIXME J2K_DEC_STATE_DATA);
|
||||||
if
|
|
||||||
(p_j2k->m_specific_param.m_decoder.m_state != 0x0100)//FIXME J2K_DEC_STATE_EOC)
|
if (p_j2k->m_specific_param.m_decoder.m_state != 0x0100){ //FIXME J2K_DEC_STATE_EOC)
|
||||||
{
|
if (opj_stream_read_data(p_stream,l_data,2,p_manager) != 2) {
|
||||||
if
|
|
||||||
(opj_stream_read_data(p_stream,l_data,2,p_manager) != 2)
|
|
||||||
{
|
|
||||||
opj_event_msg_v2(p_manager, EVT_ERROR, "Stream too short\n");
|
opj_event_msg_v2(p_manager, EVT_ERROR, "Stream too short\n");
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
opj_read_bytes(l_data,&l_current_marker,2);
|
opj_read_bytes(l_data,&l_current_marker,2);
|
||||||
if
|
|
||||||
(l_current_marker == J2K_MS_EOC)
|
if (l_current_marker == J2K_MS_EOC) {
|
||||||
{
|
|
||||||
p_j2k->m_current_tile_number = 0;
|
p_j2k->m_current_tile_number = 0;
|
||||||
p_j2k->m_specific_param.m_decoder.m_state = 0x0100;//FIXME J2K_DEC_STATE_EOC;
|
p_j2k->m_specific_param.m_decoder.m_state = 0x0100;//FIXME J2K_DEC_STATE_EOC;
|
||||||
}
|
}
|
||||||
else if
|
else if (l_current_marker != J2K_MS_SOT)
|
||||||
(l_current_marker != J2K_MS_SOT)
|
|
||||||
{
|
{
|
||||||
opj_event_msg_v2(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
|
opj_event_msg_v2(p_manager, EVT_ERROR, "Stream too short, expected SOT\n");
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return OPJ_TRUE;
|
return OPJ_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -794,3 +794,41 @@ opj_bool OPJ_CALLCONV opj_read_tile_header(
|
||||||
}
|
}
|
||||||
return OPJ_FALSE;
|
return OPJ_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a tile data. This function is compulsory and allows one to decode tile data. opj_read_tile_header should be called before.
|
||||||
|
* The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile.
|
||||||
|
*
|
||||||
|
* @param p_codec the jpeg2000 codec.
|
||||||
|
* @param p_tile_index the index of the tile being decoded, this should be the value set by opj_read_tile_header.
|
||||||
|
* @param p_data pointer to a memory block that will hold the decoded data.
|
||||||
|
* @param p_data_size size of p_data. p_data_size should be bigger or equal to the value set by opj_read_tile_header.
|
||||||
|
* @param p_stream the stream to decode.
|
||||||
|
*
|
||||||
|
* @return true if the data could be decoded.
|
||||||
|
*/
|
||||||
|
opj_bool OPJ_CALLCONV opj_decode_tile_data(
|
||||||
|
opj_codec_t *p_codec,
|
||||||
|
OPJ_UINT32 p_tile_index,
|
||||||
|
OPJ_BYTE * p_data,
|
||||||
|
OPJ_UINT32 p_data_size,
|
||||||
|
opj_stream_t *p_stream
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (p_codec && p_data && p_stream) {
|
||||||
|
opj_codec_private_t * l_info = (opj_codec_private_t *) p_codec;
|
||||||
|
opj_stream_private_t * l_cio = (opj_stream_private_t *) p_stream;
|
||||||
|
|
||||||
|
if (! l_info->is_decompressor) {
|
||||||
|
return OPJ_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return l_info->m_codec_data.m_decompression.opj_decode_tile_data( l_info->m_codec,
|
||||||
|
p_tile_index,
|
||||||
|
p_data,
|
||||||
|
p_data_size,
|
||||||
|
l_cio,
|
||||||
|
l_info->m_event_mgr);
|
||||||
|
}
|
||||||
|
return OPJ_FALSE;
|
||||||
|
}
|
||||||
|
|
|
@ -1365,6 +1365,25 @@ OPJ_API opj_bool OPJ_CALLCONV opj_read_tile_header( opj_codec_t *p_codec,
|
||||||
OPJ_UINT32 * p_nb_comps,
|
OPJ_UINT32 * p_nb_comps,
|
||||||
opj_bool * p_should_go_on );
|
opj_bool * p_should_go_on );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads a tile data. This function is compulsory and allows one to decode tile data. opj_read_tile_header should be called before.
|
||||||
|
* The user may need to refer to the image got by opj_read_header to understand the size being taken by the tile.
|
||||||
|
*
|
||||||
|
* @param p_codec the jpeg2000 codec.
|
||||||
|
* @param p_tile_index the index of the tile being decoded, this should be the value set by opj_read_tile_header.
|
||||||
|
* @param p_data pointer to a memory block that will hold the decoded data.
|
||||||
|
* @param p_data_size size of p_data. p_data_size should be bigger or equal to the value set by opj_read_tile_header.
|
||||||
|
* @param p_stream the stream to decode.
|
||||||
|
*
|
||||||
|
* @return true if the data could be decoded.
|
||||||
|
*/
|
||||||
|
OPJ_API opj_bool OPJ_CALLCONV opj_decode_tile_data( opj_codec_t *p_codec,
|
||||||
|
OPJ_UINT32 p_tile_index,
|
||||||
|
OPJ_BYTE * p_data,
|
||||||
|
OPJ_UINT32 p_data_size,
|
||||||
|
opj_stream_t *p_stream );
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -903,6 +903,7 @@ opj_bool t2_decode_packets_v2(
|
||||||
p_max_len -= l_nb_bytes_read;
|
p_max_len -= l_nb_bytes_read;
|
||||||
|
|
||||||
/* INDEX >> */
|
/* INDEX >> */
|
||||||
|
#ifdef TODO_MSD
|
||||||
if(p_cstr_info) {
|
if(p_cstr_info) {
|
||||||
opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];
|
opj_tile_info_v2_t *info_TL = &p_cstr_info->tile[p_tile_no];
|
||||||
opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];
|
opj_packet_info_t *info_PK = &info_TL->packet[p_cstr_info->packno];
|
||||||
|
@ -920,15 +921,18 @@ opj_bool t2_decode_packets_v2(
|
||||||
info_PK->end_ph_pos += info_PK->start_pos - 1; // End of packet header which now only represents the distance
|
info_PK->end_ph_pos += info_PK->start_pos - 1; // End of packet header which now only represents the distance
|
||||||
++p_cstr_info->packno;
|
++p_cstr_info->packno;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
/* << INDEX */
|
/* << INDEX */
|
||||||
}
|
}
|
||||||
++l_current_pi;
|
++l_current_pi;
|
||||||
}
|
}
|
||||||
/* INDEX >> */
|
/* INDEX >> */
|
||||||
|
#ifdef TODO_MSD
|
||||||
if
|
if
|
||||||
(p_cstr_info) {
|
(p_cstr_info) {
|
||||||
p_cstr_info->tile[p_tile_no].tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; // Number of packets in last tile-part
|
p_cstr_info->tile[p_tile_no].tp[curtp].tp_numpacks = p_cstr_info->packno - tp_start_packno; // Number of packets in last tile-part
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
/* << INDEX */
|
/* << INDEX */
|
||||||
|
|
||||||
/* don't forget to release pi */
|
/* don't forget to release pi */
|
||||||
|
@ -1024,7 +1028,7 @@ static opj_bool t2_decode_packet_v2(
|
||||||
|
|
||||||
*p_data_read = l_nb_total_bytes_read;
|
*p_data_read = l_nb_total_bytes_read;
|
||||||
|
|
||||||
return OPJ_FALSE;
|
return OPJ_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static opj_bool t2_skip_packet(
|
static opj_bool t2_skip_packet(
|
||||||
|
|
Loading…
Reference in New Issue