- opj_free(p_cstr_ind);
- }
-}
-
-static void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp)
-{
- if (p_tcp == 00) {
- return;
- }
-
- if (p_tcp->ppt_markers != 00) {
- OPJ_UINT32 i;
- for (i = 0U; i < p_tcp->ppt_markers_count; ++i) {
- if (p_tcp->ppt_markers[i].m_data != NULL) {
- opj_free(p_tcp->ppt_markers[i].m_data);
- }
- }
- p_tcp->ppt_markers_count = 0U;
- opj_free(p_tcp->ppt_markers);
- p_tcp->ppt_markers = NULL;
- }
-
- if (p_tcp->ppt_buffer != 00) {
- opj_free(p_tcp->ppt_buffer);
- p_tcp->ppt_buffer = 00;
- }
-
- if (p_tcp->tccps != 00) {
- opj_free(p_tcp->tccps);
- p_tcp->tccps = 00;
- }
-
- if (p_tcp->m_mct_coding_matrix != 00) {
- opj_free(p_tcp->m_mct_coding_matrix);
- p_tcp->m_mct_coding_matrix = 00;
- }
-
- if (p_tcp->m_mct_decoding_matrix != 00) {
- opj_free(p_tcp->m_mct_decoding_matrix);
- p_tcp->m_mct_decoding_matrix = 00;
- }
-
- if (p_tcp->m_mcc_records) {
- opj_free(p_tcp->m_mcc_records);
- p_tcp->m_mcc_records = 00;
- p_tcp->m_nb_max_mcc_records = 0;
- p_tcp->m_nb_mcc_records = 0;
- }
-
- if (p_tcp->m_mct_records) {
- opj_mct_data_t * l_mct_data = p_tcp->m_mct_records;
- OPJ_UINT32 i;
-
- for (i=0;i<p_tcp->m_nb_mct_records;++i) {
- if (l_mct_data->m_data) {
- opj_free(l_mct_data->m_data);
- l_mct_data->m_data = 00;
- }
-
- ++l_mct_data;
- }
-
- opj_free(p_tcp->m_mct_records);
- p_tcp->m_mct_records = 00;
- }
-
- if (p_tcp->mct_norms != 00) {
- opj_free(p_tcp->mct_norms);
- p_tcp->mct_norms = 00;
- }
-
- opj_j2k_tcp_data_destroy(p_tcp);
-
-}
-
-static void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp)
-{
- if (p_tcp->m_data) {
- opj_free(p_tcp->m_data);
- p_tcp->m_data = NULL;
- p_tcp->m_data_size = 0;
- }
-}
-
-static void opj_j2k_cp_destroy (opj_cp_t *p_cp)
-{
- OPJ_UINT32 l_nb_tiles;
- opj_tcp_t * l_current_tile = 00;
-
- if (p_cp == 00)
- {
- return;
- }
- if (p_cp->tcps != 00)
- {
- OPJ_UINT32 i;
- l_current_tile = p_cp->tcps;
- l_nb_tiles = p_cp->th * p_cp->tw;
-
- for (i = 0U; i < l_nb_tiles; ++i)
- {
- opj_j2k_tcp_destroy(l_current_tile);
- ++l_current_tile;
- }
- opj_free(p_cp->tcps);
- p_cp->tcps = 00;
- }
- if (p_cp->ppm_markers != 00) {
- OPJ_UINT32 i;
- for (i = 0U; i < p_cp->ppm_markers_count; ++i) {
- if (p_cp->ppm_markers[i].m_data != NULL) {
- opj_free(p_cp->ppm_markers[i].m_data);
- }
- }
- p_cp->ppm_markers_count = 0U;
- opj_free(p_cp->ppm_markers);
- p_cp->ppm_markers = NULL;
- }
- opj_free(p_cp->ppm_buffer);
- p_cp->ppm_buffer = 00;
- p_cp->ppm_data = NULL; /* ppm_data belongs to the allocated buffer pointed by ppm_buffer */
- opj_free(p_cp->comment);
- p_cp->comment = 00;
- if (! p_cp->m_is_decoder)
- {
- opj_free(p_cp->m_specific_param.m_enc.m_matrice);
- p_cp->m_specific_param.m_enc.m_matrice = 00;
- }
-}
-
-static OPJ_BOOL opj_j2k_need_nb_tile_parts_correction(opj_stream_private_t *p_stream, OPJ_UINT32 tile_no, OPJ_BOOL* p_correction_needed, opj_event_mgr_t * p_manager )
-{
- OPJ_BYTE l_header_data[10];
- OPJ_OFF_T l_stream_pos_backup;
- OPJ_UINT32 l_current_marker;
- OPJ_UINT32 l_marker_size;
- OPJ_UINT32 l_tile_no, l_tot_len, l_current_part, l_num_parts;
-
- /* initialize to no correction needed */
- *p_correction_needed = OPJ_FALSE;
-
- l_stream_pos_backup = opj_stream_tell(p_stream);
- if (l_stream_pos_backup == -1) {
- /* let's do nothing */
- return OPJ_TRUE;
- }
-
- for (;;) {
- /* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */
- if (opj_stream_read_data(p_stream,l_header_data, 2, p_manager) != 2) {
- /* assume all is OK */
- if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
- return OPJ_FALSE;
- }
- return OPJ_TRUE;
- }
-
- /* Read 2 bytes from buffer as the new marker ID */
- opj_read_bytes(l_header_data, &l_current_marker, 2);
-
- if (l_current_marker != J2K_MS_SOT) {
- /* assume all is OK */
- if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
- return OPJ_FALSE;
- }
- return OPJ_TRUE;
- }
-
- /* Try to read 2 bytes (the marker size) from stream and copy them into the buffer */
- if (opj_stream_read_data(p_stream, l_header_data, 2, p_manager) != 2) {
- opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
- return OPJ_FALSE;
- }
-
- /* Read 2 bytes from the buffer as the marker size */
- opj_read_bytes(l_header_data, &l_marker_size, 2);
-
- /* Check marker size for SOT Marker */
- if (l_marker_size != 10) {
- opj_event_msg(p_manager, EVT_ERROR, "Inconsistent marker size\n");
- return OPJ_FALSE;
- }
- l_marker_size -= 2;
-
- if (opj_stream_read_data(p_stream, l_header_data, l_marker_size, p_manager) != l_marker_size) {
- opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n");
- return OPJ_FALSE;
- }
-
- if (! opj_j2k_get_sot_values(l_header_data, l_marker_size, &l_tile_no, &l_tot_len, &l_current_part, &l_num_parts, p_manager)) {
- return OPJ_FALSE;
- }
-
- if (l_tile_no == tile_no) {
- /* we found what we were looking for */
- break;
- }
-
- if ((l_tot_len == 0U) || (l_tot_len < 14U)) {
- /* last SOT until EOC or invalid Psot value */
- /* assume all is OK */
- if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
- return OPJ_FALSE;
- }
- return OPJ_TRUE;
- }
- l_tot_len -= 12U;
- /* look for next SOT marker */
- if (opj_stream_skip(p_stream, (OPJ_OFF_T)(l_tot_len), p_manager) != (OPJ_OFF_T)(l_tot_len)) {
- /* assume all is OK */
- if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
- return OPJ_FALSE;
- }
- return OPJ_TRUE;
- }
- }
-
- /* check for correction */
- if (l_current_part == l_num_parts) {
- *p_correction_needed = OPJ_TRUE;
- }
-
- if (! opj_stream_seek(p_stream, l_stream_pos_backup, p_manager)) {
- return OPJ_FALSE;
- }
- return OPJ_TRUE;
-}
-
-OPJ_BOOL opj_j2k_read_tile_header( opj_j2k_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,
- opj_stream_private_t *p_stream,
- opj_event_mgr_t * p_manager )
-{
- OPJ_UINT32 l_current_marker = J2K_MS_SOT;
- OPJ_UINT32 l_marker_size;
- const opj_dec_memory_marker_handler_t * l_marker_handler = 00;
- opj_tcp_t * l_tcp = NULL;
-
- /* preconditions */
- assert(p_stream != 00);
- assert(p_j2k != 00);
- assert(p_manager != 00);
-
- /* Reach the End Of Codestream ?*/
- if (p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_EOC){
- l_current_marker = J2K_MS_EOC;
- }
- /* We need to encounter a SOT marker (a new tile-part header) */
- else if (p_j2k->m_specific_param.m_decoder.m_state != J2K_STATE_TPHSOT){