Index: third_party/libopenjpeg20/j2k.c |
diff --git a/third_party/libopenjpeg20/j2k.c b/third_party/libopenjpeg20/j2k.c |
index 7b4bc58a6c052df3e9c784370b4435ef39e604bb..849d0b4242f393c8d5f519037a06b341c529ceed 100644 |
--- a/third_party/libopenjpeg20/j2k.c |
+++ b/third_party/libopenjpeg20/j2k.c |
@@ -51,7 +51,7 @@ |
/** |
* Sets up the procedures to do on reading header. Developpers wanting to extend the library can add their own reading procedures. |
*/ |
-static void opj_j2k_setup_header_reading (opj_j2k_t *p_j2k); |
+static OPJ_BOOL opj_j2k_setup_header_reading (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager); |
/** |
* The read header procedure. |
@@ -90,19 +90,19 @@ static OPJ_BOOL opj_j2k_decoding_validation ( opj_j2k_t * p_j2k, |
* Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters |
* are valid. Developpers wanting to extend the library can add their own validation procedures. |
*/ |
-static void opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k); |
+static OPJ_BOOL opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager); |
/** |
* Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters |
* are valid. Developpers wanting to extend the library can add their own validation procedures. |
*/ |
-static void opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k); |
+static OPJ_BOOL opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager); |
/** |
* Sets up the validation ,i.e. adds the procedures to lauch to make sure the codec parameters |
* are valid. Developpers wanting to extend the library can add their own validation procedures. |
*/ |
-static void opj_j2k_setup_end_compress (opj_j2k_t *p_j2k); |
+static OPJ_BOOL opj_j2k_setup_end_compress (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager); |
/** |
* The mct encoding validation procedure. |
@@ -360,7 +360,7 @@ static OPJ_BOOL opj_j2k_post_write_tile (opj_j2k_t * p_j2k, |
* Sets up the procedures to do on writing header. |
* Developers wanting to extend the library can add their own writing procedures. |
*/ |
-static void opj_j2k_setup_header_writing (opj_j2k_t *p_j2k); |
+static OPJ_BOOL opj_j2k_setup_header_writing (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager); |
static OPJ_BOOL opj_j2k_write_first_tile_part( opj_j2k_t *p_j2k, |
OPJ_BYTE * p_data, |
@@ -718,28 +718,28 @@ static OPJ_BOOL opj_j2k_read_plt ( opj_j2k_t *p_j2k, |
OPJ_UINT32 p_header_size, |
opj_event_mgr_t * p_manager ); |
-#if 0 |
/** |
- * Reads a PPM marker (Packed packet headers, main header) |
+ * Reads a PPM marker (Packed headers, main header) |
* |
* @param p_header_data the data contained in the POC box. |
* @param p_j2k the jpeg2000 codec. |
* @param p_header_size the size of the data contained in the POC marker. |
* @param p_manager the user event manager. |
-*/ |
-static OPJ_BOOL j2k_read_ppm_v2 ( |
- opj_j2k_t *p_j2k, |
- OPJ_BYTE * p_header_data, |
- OPJ_UINT32 p_header_size, |
- struct opj_event_mgr * p_manager |
- ); |
-#endif |
+ */ |
-static OPJ_BOOL j2k_read_ppm_v3 ( |
- opj_j2k_t *p_j2k, |
- OPJ_BYTE * p_header_data, |
- OPJ_UINT32 p_header_size, |
- opj_event_mgr_t * p_manager ); |
+static OPJ_BOOL opj_j2k_read_ppm ( |
+ opj_j2k_t *p_j2k, |
+ OPJ_BYTE * p_header_data, |
+ OPJ_UINT32 p_header_size, |
+ opj_event_mgr_t * p_manager ); |
+ |
+/** |
+ * Merges all PPM markers read (Packed headers, main header) |
+ * |
+ * @param p_cp main coding parameters. |
+ * @param p_manager the user event manager. |
+ */ |
+static OPJ_BOOL opj_j2k_merge_ppm ( opj_cp_t *p_cp, opj_event_mgr_t * p_manager ); |
/** |
* Reads a PPT marker (Packed packet headers, tile-part header) |
@@ -753,6 +753,17 @@ static OPJ_BOOL opj_j2k_read_ppt ( opj_j2k_t *p_j2k, |
OPJ_BYTE * p_header_data, |
OPJ_UINT32 p_header_size, |
opj_event_mgr_t * p_manager ); |
+ |
+/** |
+ * Merges all PPT markers read (Packed headers, tile-part header) |
+ * |
+ * @param p_tcp the tile. |
+ * @param p_manager the user event manager. |
+ */ |
+static OPJ_BOOL opj_j2k_merge_ppt ( opj_tcp_t *p_tcp, |
+ opj_event_mgr_t * p_manager ); |
+ |
+ |
/** |
* Writes the TLM marker (Tile Length Marker) |
* |
@@ -780,12 +791,32 @@ static OPJ_BOOL opj_j2k_write_sot( opj_j2k_t *p_j2k, |
opj_event_mgr_t * p_manager ); |
/** |
- * Reads a PPT marker (Packed packet headers, tile-part header) |
+ * Reads values from a SOT marker (Start of tile-part) |
* |
- * @param p_header_data the data contained in the PPT box. |
- * @param p_j2k the jpeg2000 codec. |
+ * the j2k decoder state is not affected. No side effects, no checks except for p_header_size. |
+ * |
+ * @param p_header_data the data contained in the SOT marker. |
+ * @param p_header_size the size of the data contained in the SOT marker. |
+ * @param p_tile_no Isot. |
+ * @param p_tot_len Psot. |
+ * @param p_current_part TPsot. |
+ * @param p_num_parts TNsot. |
+ * @param p_manager the user event manager. |
+ */ |
+static OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE * p_header_data, |
+ OPJ_UINT32 p_header_size, |
+ OPJ_UINT32* p_tile_no, |
+ OPJ_UINT32* p_tot_len, |
+ OPJ_UINT32* p_current_part, |
+ OPJ_UINT32* p_num_parts, |
+ opj_event_mgr_t * p_manager ); |
+/** |
+ * Reads a SOT marker (Start of tile-part) |
+ * |
+ * @param p_header_data the data contained in the SOT marker. |
+ * @param p_j2k the jpeg2000 codec. |
* @param p_header_size the size of the data contained in the PPT marker. |
- * @param p_manager the user event manager. |
+ * @param p_manager the user event manager. |
*/ |
static OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k, |
OPJ_BYTE * p_header_data, |
@@ -821,7 +852,7 @@ static OPJ_BOOL opj_j2k_read_sod( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ); |
-void opj_j2k_update_tlm (opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size ) |
+static void opj_j2k_update_tlm (opj_j2k_t * p_j2k, OPJ_UINT32 p_tile_part_size ) |
{ |
opj_write_bytes(p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current,p_j2k->m_current_tile_number,1); /* PSOT */ |
++p_j2k->m_specific_param.m_encoder.m_tlm_sot_offsets_current; |
@@ -1179,6 +1210,18 @@ static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_ima |
static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz, opj_event_mgr_t *p_manager); |
+/** |
+ * Checks for invalid number of tile-parts in SOT marker (TPsot==TNsot). See issue 254. |
+ * |
+ * @param p_stream the stream to read data from. |
+ * @param tile_no tile number we're looking for. |
+ * @param p_correction_needed output value. if true, non conformant codestream needs TNsot correction. |
+ * @param p_manager the user event manager. |
+ * |
+ * @return true if the function was successful, false else. |
+ */ |
+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 ); |
+ |
/*@}*/ |
/*@}*/ |
@@ -1189,7 +1232,7 @@ typedef struct j2k_prog_order{ |
char str_prog[5]; |
}j2k_prog_order_t; |
-j2k_prog_order_t j2k_prog_order_list[] = { |
+static j2k_prog_order_t j2k_prog_order_list[] = { |
{OPJ_CPRL, "CPRL"}, |
{OPJ_LRCP, "LRCP"}, |
{OPJ_PCRL, "PCRL"}, |
@@ -1211,7 +1254,7 @@ static const OPJ_UINT32 MCT_ELEMENT_SIZE [] = |
typedef void (* opj_j2k_mct_function) (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem); |
-const opj_j2k_mct_function j2k_mct_read_functions_to_float [] = |
+static const opj_j2k_mct_function j2k_mct_read_functions_to_float [] = |
{ |
opj_j2k_read_int16_to_float, |
opj_j2k_read_int32_to_float, |
@@ -1219,7 +1262,7 @@ const opj_j2k_mct_function j2k_mct_read_functions_to_float [] = |
opj_j2k_read_float64_to_float |
}; |
-const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] = |
+static const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] = |
{ |
opj_j2k_read_int16_to_int32, |
opj_j2k_read_int32_to_int32, |
@@ -1227,7 +1270,7 @@ const opj_j2k_mct_function j2k_mct_read_functions_to_int32 [] = |
opj_j2k_read_float64_to_int32 |
}; |
-const opj_j2k_mct_function j2k_mct_write_functions_from_float [] = |
+static const opj_j2k_mct_function j2k_mct_write_functions_from_float [] = |
{ |
opj_j2k_write_float_to_int16, |
opj_j2k_write_float_to_int32, |
@@ -1249,7 +1292,7 @@ typedef struct opj_dec_memory_marker_handler |
} |
opj_dec_memory_marker_handler_t; |
-const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] = |
+static const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] = |
{ |
{J2K_MS_SOT, J2K_STATE_MH | J2K_STATE_TPHSOT, opj_j2k_read_sot}, |
{J2K_MS_COD, J2K_STATE_MH | J2K_STATE_TPH, opj_j2k_read_cod}, |
@@ -1262,7 +1305,7 @@ const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] = |
{J2K_MS_TLM, J2K_STATE_MH, opj_j2k_read_tlm}, |
{J2K_MS_PLM, J2K_STATE_MH, opj_j2k_read_plm}, |
{J2K_MS_PLT, J2K_STATE_TPH, opj_j2k_read_plt}, |
- {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm_v3}, |
+ {J2K_MS_PPM, J2K_STATE_MH, opj_j2k_read_ppm}, |
{J2K_MS_PPT, J2K_STATE_TPH, opj_j2k_read_ppt}, |
{J2K_MS_SOP, 0, 0}, |
{J2K_MS_CRG, J2K_STATE_MH, opj_j2k_read_crg}, |
@@ -1286,7 +1329,7 @@ const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] = |
{J2K_MS_UNK, J2K_STATE_MH | J2K_STATE_TPH, 0}/*opj_j2k_read_unk is directly used*/ |
}; |
-void opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; |
OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data; |
@@ -1302,7 +1345,7 @@ void opj_j2k_read_int16_to_float (const void * p_src_data, void * p_dest_data, |
} |
} |
-void opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; |
OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data; |
@@ -1318,7 +1361,7 @@ void opj_j2k_read_int32_to_float (const void * p_src_data, void * p_dest_data, |
} |
} |
-void opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; |
OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data; |
@@ -1334,7 +1377,7 @@ void opj_j2k_read_float32_to_float (const void * p_src_data, void * p_dest_data |
} |
} |
-void opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; |
OPJ_FLOAT32 * l_dest_data = (OPJ_FLOAT32 *) p_dest_data; |
@@ -1350,7 +1393,7 @@ void opj_j2k_read_float64_to_float (const void * p_src_data, void * p_dest_data |
} |
} |
-void opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; |
OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data; |
@@ -1366,7 +1409,7 @@ void opj_j2k_read_int16_to_int32 (const void * p_src_data, void * p_dest_data, |
} |
} |
-void opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; |
OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data; |
@@ -1382,7 +1425,7 @@ void opj_j2k_read_int32_to_int32 (const void * p_src_data, void * p_dest_data, |
} |
} |
-void opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; |
OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data; |
@@ -1398,7 +1441,7 @@ void opj_j2k_read_float32_to_int32 (const void * p_src_data, void * p_dest_data |
} |
} |
-void opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_src_data = (OPJ_BYTE *) p_src_data; |
OPJ_INT32 * l_dest_data = (OPJ_INT32 *) p_dest_data; |
@@ -1414,7 +1457,7 @@ void opj_j2k_read_float64_to_int32 (const void * p_src_data, void * p_dest_data |
} |
} |
-void opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data; |
OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data; |
@@ -1430,7 +1473,7 @@ void opj_j2k_write_float_to_int16 (const void * p_src_data, void * p_dest_data, |
} |
} |
-void opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data; |
OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data; |
@@ -1446,7 +1489,7 @@ void opj_j2k_write_float_to_int32 (const void * p_src_data, void * p_dest_data, |
} |
} |
-void opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data; |
OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data; |
@@ -1462,7 +1505,7 @@ void opj_j2k_write_float_to_float (const void * p_src_data, void * p_dest_data, |
} |
} |
-void opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
+static void opj_j2k_write_float_to_float64 (const void * p_src_data, void * p_dest_data, OPJ_UINT32 p_nb_elem) |
{ |
OPJ_BYTE * l_dest_data = (OPJ_BYTE *) p_dest_data; |
OPJ_FLOAT32 * l_src_data = (OPJ_FLOAT32 *) p_src_data; |
@@ -1488,7 +1531,7 @@ char *opj_j2k_convert_progression_order(OPJ_PROG_ORDER prg_order){ |
return po->str_prog; |
} |
-OPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs, |
+static OPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs, |
OPJ_UINT32 p_nb_pocs, |
OPJ_UINT32 p_nb_resolutions, |
OPJ_UINT32 p_num_comps, |
@@ -1592,7 +1635,7 @@ OPJ_BOOL opj_j2k_check_poc_val( const opj_poc_t *p_pocs, |
/* ----------------------------------------------------------------------- */ |
-OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno) |
+static OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno) |
{ |
const OPJ_CHAR *prog = 00; |
OPJ_INT32 i; |
@@ -1650,7 +1693,7 @@ OPJ_UINT32 opj_j2k_get_num_tp(opj_cp_t *cp, OPJ_UINT32 pino, OPJ_UINT32 tileno) |
return tpnum; |
} |
-OPJ_BOOL opj_j2k_calculate_tp( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_calculate_tp( opj_j2k_t *p_j2k, |
opj_cp_t *cp, |
OPJ_UINT32 * p_nb_tiles, |
opj_image_t *image, |
@@ -1728,7 +1771,7 @@ OPJ_BOOL opj_j2k_calculate_tp( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_soc( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_soc( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
{ |
@@ -1806,7 +1849,7 @@ static OPJ_BOOL opj_j2k_read_soc( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_siz( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_siz( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
{ |
@@ -1999,14 +2042,8 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k, |
} |
/* testcase issue427-illegal-tile-offset.jp2 */ |
- l_tx1 = l_cp->tx0 + l_cp->tdx; |
- if (l_tx1 < l_cp->tx0) { /* manage overflow */ |
- l_tx1 = 0xFFFFFFFFU; |
- } |
- l_ty1 = l_cp->ty0 + l_cp->tdy; |
- if (l_ty1 < l_cp->ty0) { /* manage overflow */ |
- l_ty1 = 0xFFFFFFFFU; |
- } |
+ l_tx1 = opj_uint_adds(l_cp->tx0, l_cp->tdx); /* manage overflow */ |
+ l_ty1 = opj_uint_adds(l_cp->ty0, l_cp->tdy); /* manage overflow */ |
if ((l_cp->tx0 > l_image->x0) || (l_cp->ty0 > l_image->y0) || (l_tx1 <= l_image->x0) || (l_ty1 <= l_image->y0) ) { |
opj_event_msg(p_manager, EVT_ERROR, "Error with SIZ marker: illegal tile offset\n"); |
return OPJ_FALSE; |
@@ -2254,7 +2291,7 @@ static OPJ_BOOL opj_j2k_read_siz(opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_com( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_com( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager |
) |
@@ -2328,7 +2365,7 @@ static OPJ_BOOL opj_j2k_read_com ( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_cod( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_cod( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
{ |
@@ -2514,7 +2551,7 @@ static OPJ_BOOL opj_j2k_read_cod ( opj_j2k_t *p_j2k, |
} |
#if 0 |
-OPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k, |
OPJ_UINT32 p_comp_no, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
@@ -2561,7 +2598,7 @@ OPJ_BOOL opj_j2k_write_coc( opj_j2k_t *p_j2k, |
#endif |
#if 0 |
-void opj_j2k_write_coc_in_memory( opj_j2k_t *p_j2k, |
+static void opj_j2k_write_coc_in_memory( opj_j2k_t *p_j2k, |
OPJ_UINT32 p_comp_no, |
OPJ_BYTE * p_data, |
OPJ_UINT32 * p_data_written, |
@@ -2607,7 +2644,7 @@ void opj_j2k_write_coc_in_memory( opj_j2k_t *p_j2k, |
} |
#endif |
-OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k) |
+static OPJ_UINT32 opj_j2k_get_max_coc_size(opj_j2k_t *p_j2k) |
{ |
OPJ_UINT32 i,j; |
OPJ_UINT32 l_nb_comp; |
@@ -2689,7 +2726,7 @@ static OPJ_BOOL opj_j2k_read_coc ( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_qcd( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_qcd( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager |
) |
@@ -2780,7 +2817,7 @@ static OPJ_BOOL opj_j2k_read_qcd ( opj_j2k_t *p_j2k, |
} |
#if 0 |
-OPJ_BOOL opj_j2k_write_qcc( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_qcc( opj_j2k_t *p_j2k, |
OPJ_UINT32 p_comp_no, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager |
@@ -2821,7 +2858,7 @@ OPJ_BOOL opj_j2k_write_qcc( opj_j2k_t *p_j2k, |
#endif |
#if 0 |
-void opj_j2k_write_qcc_in_memory( opj_j2k_t *p_j2k, |
+static void opj_j2k_write_qcc_in_memory( opj_j2k_t *p_j2k, |
OPJ_UINT32 p_comp_no, |
OPJ_BYTE * p_data, |
OPJ_UINT32 * p_data_written, |
@@ -2871,7 +2908,7 @@ void opj_j2k_write_qcc_in_memory( opj_j2k_t *p_j2k, |
} |
#endif |
-OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k) |
+static OPJ_UINT32 opj_j2k_get_max_qcc_size (opj_j2k_t *p_j2k) |
{ |
return opj_j2k_get_max_coc_size(p_j2k); |
} |
@@ -2963,7 +3000,7 @@ static OPJ_BOOL opj_j2k_read_qcc( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_poc( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_poc( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager |
) |
@@ -3014,7 +3051,7 @@ OPJ_BOOL opj_j2k_write_poc( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-void opj_j2k_write_poc_in_memory( opj_j2k_t *p_j2k, |
+static void opj_j2k_write_poc_in_memory( opj_j2k_t *p_j2k, |
OPJ_BYTE * p_data, |
OPJ_UINT32 * p_data_written, |
opj_event_mgr_t * p_manager |
@@ -3089,7 +3126,7 @@ void opj_j2k_write_poc_in_memory( opj_j2k_t *p_j2k, |
*p_data_written = l_poc_size; |
} |
-OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k) |
+static OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k) |
{ |
opj_tcp_t * l_tcp = 00; |
OPJ_UINT32 l_nb_tiles = 0; |
@@ -3109,7 +3146,7 @@ OPJ_UINT32 opj_j2k_get_max_poc_size(opj_j2k_t *p_j2k) |
return 4 + 9 * l_max_poc; |
} |
-OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k) |
+static OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k) |
{ |
OPJ_UINT32 i; |
OPJ_UINT32 l_nb_tiles; |
@@ -3128,7 +3165,7 @@ OPJ_UINT32 opj_j2k_get_max_toc_size (opj_j2k_t *p_j2k) |
return 12 * l_max; |
} |
-OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k) |
+static OPJ_UINT32 opj_j2k_get_specific_header_sizes(opj_j2k_t *p_j2k) |
{ |
OPJ_UINT32 l_nb_bytes = 0; |
OPJ_UINT32 l_nb_comps; |
@@ -3458,382 +3495,220 @@ static OPJ_BOOL opj_j2k_read_plt ( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-#if 0 |
-OPJ_BOOL j2k_read_ppm_v2 ( |
- opj_j2k_t *p_j2k, |
- OPJ_BYTE * p_header_data, |
- OPJ_UINT32 p_header_size, |
- struct opj_event_mgr * p_manager |
- ) |
-{ |
- |
- opj_cp_t *l_cp = 00; |
- OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm; |
- |
- /* preconditions */ |
- assert(p_header_data != 00); |
- assert(p_j2k != 00); |
- assert(p_manager != 00); |
- |
- if (p_header_size < 1) { |
- opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n"); |
- return OPJ_FALSE; |
- } |
- |
- l_cp = &(p_j2k->m_cp); |
- l_cp->ppm = 1; |
- |
- opj_read_bytes(p_header_data,&l_Z_ppm,1); /* Z_ppm */ |
- ++p_header_data; |
- --p_header_size; |
- |
- /* First PPM marker */ |
- if (l_Z_ppm == 0) { |
- if (p_header_size < 4) { |
- opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n"); |
- return OPJ_FALSE; |
- } |
- |
- opj_read_bytes(p_header_data,&l_N_ppm,4); /* N_ppm */ |
- p_header_data+=4; |
- p_header_size-=4; |
- |
- /* First PPM marker: Initialization */ |
- l_cp->ppm_len = l_N_ppm; |
- l_cp->ppm_data_size = 0; |
- |
- l_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_cp->ppm_len); |
- if (l_cp->ppm_buffer == 00) { |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading ppm marker\n"); |
- return OPJ_FALSE; |
- } |
- memset(l_cp->ppm_buffer,0,l_cp->ppm_len); |
- |
- l_cp->ppm_data = l_cp->ppm_buffer; |
- } |
- |
- while (1) { |
- if (l_cp->ppm_data_size == l_cp->ppm_len) { |
- if (p_header_size >= 4) { |
- /* read a N_ppm */ |
- opj_read_bytes(p_header_data,&l_N_ppm,4); /* N_ppm */ |
- p_header_data+=4; |
- p_header_size-=4; |
- l_cp->ppm_len += l_N_ppm ; |
- |
- OPJ_BYTE *new_ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len); |
- if (! new_ppm_buffer) { |
- opj_free(l_cp->ppm_buffer); |
- l_cp->ppm_buffer = NULL; |
- l_cp->ppm_len = 0; |
- l_cp->ppm_data = NULL; |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory reading ppm marker\n"); |
- return OPJ_FALSE; |
- } |
- l_cp->ppm_buffer = new_ppm_buffer; |
- memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm); |
- l_cp->ppm_data = l_cp->ppm_buffer; |
- } |
- else { |
- return OPJ_FALSE; |
- } |
- } |
- |
- l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size; |
+/** |
+ * Reads a PPM marker (Packed packet headers, main header) |
+ * |
+ * @param p_header_data the data contained in the POC box. |
+ * @param p_j2k the jpeg2000 codec. |
+ * @param p_header_size the size of the data contained in the POC marker. |
+ * @param p_manager the user event manager. |
+ */ |
- if (l_remaining_data <= p_header_size) { |
- /* we must store less information than available in the packet */ |
- memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data); |
- l_cp->ppm_data_size = l_cp->ppm_len; |
- p_header_size -= l_remaining_data; |
- p_header_data += l_remaining_data; |
- } |
- else { |
- memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size); |
- l_cp->ppm_data_size += p_header_size; |
- p_header_data += p_header_size; |
- p_header_size = 0; |
- break; |
- } |
- } |
+static OPJ_BOOL opj_j2k_read_ppm ( |
+ opj_j2k_t *p_j2k, |
+ OPJ_BYTE * p_header_data, |
+ OPJ_UINT32 p_header_size, |
+ opj_event_mgr_t * p_manager ) |
+{ |
+ opj_cp_t *l_cp = 00; |
+ OPJ_UINT32 l_Z_ppm; |
+ |
+ /* preconditions */ |
+ assert(p_header_data != 00); |
+ assert(p_j2k != 00); |
+ assert(p_manager != 00); |
+ |
+ /* We need to have the Z_ppm element + 1 byte of Nppm/Ippm at minimum */ |
+ if (p_header_size < 2) { |
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n"); |
+ return OPJ_FALSE; |
+ } |
+ |
+ l_cp = &(p_j2k->m_cp); |
+ l_cp->ppm = 1; |
+ |
+ opj_read_bytes(p_header_data,&l_Z_ppm,1); /* Z_ppm */ |
+ ++p_header_data; |
+ --p_header_size; |
+ |
+ /* check allocation needed */ |
+ if (l_cp->ppm_markers == NULL) { /* first PPM marker */ |
+ OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */ |
+ assert(l_cp->ppm_markers_count == 0U); |
+ |
+ l_cp->ppm_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx)); |
+ if (l_cp->ppm_markers == NULL) { |
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n"); |
+ return OPJ_FALSE; |
+ } |
+ l_cp->ppm_markers_count = l_newCount; |
+ } else if (l_cp->ppm_markers_count <= l_Z_ppm) { |
+ OPJ_UINT32 l_newCount = l_Z_ppm + 1U; /* can't overflow, l_Z_ppm is UINT8 */ |
+ opj_ppx *new_ppm_markers; |
+ new_ppm_markers = (opj_ppx *) opj_realloc(l_cp->ppm_markers, l_newCount * sizeof(opj_ppx)); |
+ if (new_ppm_markers == NULL) { |
+ /* clean up to be done on l_cp destruction */ |
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n"); |
+ return OPJ_FALSE; |
+ } |
+ l_cp->ppm_markers = new_ppm_markers; |
+ memset(l_cp->ppm_markers + l_cp->ppm_markers_count, 0, (l_newCount - l_cp->ppm_markers_count) * sizeof(opj_ppx)); |
+ l_cp->ppm_markers_count = l_newCount; |
+ } |
+ |
+ if (l_cp->ppm_markers[l_Z_ppm].m_data != NULL) { |
+ /* clean up to be done on l_cp destruction */ |
+ opj_event_msg(p_manager, EVT_ERROR, "Zppm %u already read\n", l_Z_ppm); |
+ return OPJ_FALSE; |
+ } |
+ |
+ l_cp->ppm_markers[l_Z_ppm].m_data = opj_malloc(p_header_size); |
+ if (l_cp->ppm_markers[l_Z_ppm].m_data == NULL) { |
+ /* clean up to be done on l_cp destruction */ |
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n"); |
+ return OPJ_FALSE; |
+ } |
+ l_cp->ppm_markers[l_Z_ppm].m_data_size = p_header_size; |
+ memcpy(l_cp->ppm_markers[l_Z_ppm].m_data, p_header_data, p_header_size); |
- return OPJ_TRUE; |
+ return OPJ_TRUE; |
} |
-#endif |
-OPJ_BOOL j2k_read_ppm_v3 ( |
- opj_j2k_t *p_j2k, |
- OPJ_BYTE * p_header_data, |
- OPJ_UINT32 p_header_size, |
- struct opj_event_mgr * p_manager |
- ) |
+/** |
+ * Merges all PPM markers read (Packed headers, main header) |
+ * |
+ * @param p_cp main coding parameters. |
+ * @param p_manager the user event manager. |
+ */ |
+static OPJ_BOOL opj_j2k_merge_ppm ( opj_cp_t *p_cp, opj_event_mgr_t * p_manager ) |
{ |
- opj_cp_t *l_cp = 00; |
- OPJ_UINT32 l_remaining_data, l_Z_ppm, l_N_ppm; |
- |
- /* preconditions */ |
- assert(p_header_data != 00); |
- assert(p_j2k != 00); |
- assert(p_manager != 00); |
- |
- /* Minimum size of PPM marker is equal to the size of Zppm element */ |
- if (p_header_size < 1) { |
- opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n"); |
- return OPJ_FALSE; |
- } |
- |
- l_cp = &(p_j2k->m_cp); |
- l_cp->ppm = 1; |
- |
- opj_read_bytes(p_header_data,&l_Z_ppm,1); /* Z_ppm */ |
- ++p_header_data; |
- --p_header_size; |
- |
- /* First PPM marker */ |
- if (l_Z_ppm == 0) { |
- if (l_cp->ppm_data != NULL) { |
- opj_event_msg(p_manager, EVT_ERROR, "Zppm O already processed. Found twice.\n"); |
- opj_free(l_cp->ppm_data); |
- l_cp->ppm_data = NULL; |
- l_cp->ppm_buffer = NULL; |
- l_cp->ppm = 0; /* do not use PPM */ |
- return OPJ_FALSE; |
- } |
- /* We need now at least the Nppm^0 element */ |
- if (p_header_size < 4) { |
- opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n"); |
- return OPJ_FALSE; |
- } |
- |
- opj_read_bytes(p_header_data,&l_N_ppm,4); /* First N_ppm */ |
- p_header_data+=4; |
- p_header_size-=4; |
- |
- /* sanity check: how much bytes is left for Ippm */ |
- if( p_header_size < l_N_ppm ) |
- { |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes (%u) to hold Ippm series (%u), Index (%d)\n", p_header_size, l_N_ppm, l_Z_ppm ); |
- opj_free(l_cp->ppm_data); |
- l_cp->ppm_data = NULL; |
- l_cp->ppm_buffer = NULL; |
- l_cp->ppm = 0; /* do not use PPM */ |
- return OPJ_FALSE; |
- } |
- |
- /* First PPM marker: Initialization */ |
- l_cp->ppm_len = l_N_ppm; |
- l_cp->ppm_data_read = 0; |
- |
- l_cp->ppm_data = (OPJ_BYTE *) opj_calloc(1,l_cp->ppm_len); |
- l_cp->ppm_buffer = l_cp->ppm_data; |
- if (l_cp->ppm_data == 00) { |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read ppm marker\n"); |
- return OPJ_FALSE; |
- } |
- |
- l_cp->ppm_data_current = l_cp->ppm_data; |
- |
- /*l_cp->ppm_data = l_cp->ppm_buffer;*/ |
- } |
- else { |
- if (p_header_size < 4) { |
- opj_event_msg(p_manager, EVT_WARNING, "Empty PPM marker\n"); |
- return OPJ_TRUE; |
- } |
- else { |
- /* Uncompleted Ippm series in the previous PPM marker?*/ |
- if (l_cp->ppm_data_read < l_cp->ppm_len) { |
- /* Get the place where add the remaining Ippm series*/ |
- l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_data_read]); |
- l_N_ppm = l_cp->ppm_len - l_cp->ppm_data_read; |
- } |
- else { |
- OPJ_BYTE *new_ppm_data; |
- opj_read_bytes(p_header_data,&l_N_ppm,4); /* First N_ppm */ |
- p_header_data+=4; |
- p_header_size-=4; |
- |
- /* sanity check: how much bytes is left for Ippm */ |
- if( p_header_size < l_N_ppm ) |
- { |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes (%u) to hold Ippm series (%u), Index (%d)\n", p_header_size, l_N_ppm, l_Z_ppm ); |
- opj_free(l_cp->ppm_data); |
- l_cp->ppm_data = NULL; |
- l_cp->ppm_buffer = NULL; |
- l_cp->ppm = 0; /* do not use PPM */ |
- return OPJ_FALSE; |
- } |
- /* Increase the size of ppm_data to add the new Ippm series*/ |
- assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating"); |
- new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm); |
- if (! new_ppm_data) { |
- opj_free(l_cp->ppm_data); |
- l_cp->ppm_data = NULL; |
- l_cp->ppm_buffer = NULL; /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */ |
- l_cp->ppm_len = 0; |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new Ippm series\n"); |
- return OPJ_FALSE; |
- } |
- l_cp->ppm_data = new_ppm_data; |
- l_cp->ppm_buffer = l_cp->ppm_data; |
- |
- /* Keep the position of the place where concatenate the new series*/ |
- l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]); |
- l_cp->ppm_len += l_N_ppm; |
- } |
- } |
- } |
- |
- l_remaining_data = p_header_size; |
- |
- while (l_remaining_data >= l_N_ppm) { |
- /* read a complete Ippm series*/ |
- memcpy(l_cp->ppm_data_current, p_header_data, l_N_ppm); |
- p_header_size -= l_N_ppm; |
- p_header_data += l_N_ppm; |
- |
- l_cp->ppm_data_read += l_N_ppm; /* Increase the number of data read*/ |
- |
- if (p_header_size) |
- { |
- if (p_header_size < 4) { |
- opj_free(l_cp->ppm_data); |
- l_cp->ppm_data = NULL; |
- l_cp->ppm_buffer = NULL; /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */ |
- l_cp->ppm_len = 0; |
- l_cp->ppm = 0; |
- opj_event_msg(p_manager, EVT_ERROR, "Error reading PPM marker\n"); |
- return OPJ_FALSE; |
- } |
- opj_read_bytes(p_header_data,&l_N_ppm,4); /* N_ppm^i */ |
- p_header_data+=4; |
- p_header_size-=4; |
- } |
- else { |
- l_remaining_data = p_header_size; |
- break; |
- } |
- |
- l_remaining_data = p_header_size; |
- |
- /* Next Ippm series is a complete series ?*/ |
- if (l_remaining_data >= l_N_ppm) { |
- OPJ_BYTE *new_ppm_data; |
- /* Increase the size of ppm_data to add the new Ippm series*/ |
- assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating"); |
- /* Overflow check */ |
- if ((l_cp->ppm_len + l_N_ppm) < l_N_ppm) { |
- opj_free(l_cp->ppm_data); |
- l_cp->ppm_data = NULL; |
- l_cp->ppm_buffer = NULL; /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */ |
- l_cp->ppm_len = 0; |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (complete) Ippm series\n"); |
- return OPJ_FALSE; |
- } |
- new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm); |
- if (! new_ppm_data) { |
- opj_free(l_cp->ppm_data); |
- l_cp->ppm_data = NULL; |
- l_cp->ppm_buffer = NULL; /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */ |
- l_cp->ppm_len = 0; |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (complete) Ippm series\n"); |
- return OPJ_FALSE; |
- } |
- l_cp->ppm_data = new_ppm_data; |
- l_cp->ppm_buffer = l_cp->ppm_data; |
- |
- /* Keep the position of the place where concatenate the new series */ |
- l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]); |
- l_cp->ppm_len += l_N_ppm; |
- } |
- |
- } |
- |
- /* Need to read an incomplete Ippm series*/ |
- if (l_remaining_data) { |
- OPJ_BYTE *new_ppm_data; |
- assert(l_cp->ppm_data == l_cp->ppm_buffer && "We need ppm_data and ppm_buffer to be the same when reallocating"); |
- |
- /* Overflow check */ |
- if ((l_cp->ppm_len + l_N_ppm) < l_N_ppm) { |
- opj_free(l_cp->ppm_data); |
- l_cp->ppm_data = NULL; |
- l_cp->ppm_buffer = NULL; /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */ |
- l_cp->ppm_len = 0; |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (complete) Ippm series\n"); |
- return OPJ_FALSE; |
- } |
- new_ppm_data = (OPJ_BYTE *) opj_realloc(l_cp->ppm_data, l_cp->ppm_len + l_N_ppm); |
- if (! new_ppm_data) { |
- opj_free(l_cp->ppm_data); |
- l_cp->ppm_data = NULL; |
- l_cp->ppm_buffer = NULL; /* TODO: no need for a new local variable: ppm_buffer and ppm_data are enough */ |
- l_cp->ppm_len = 0; |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to increase the size of ppm_data to add the new (incomplete) Ippm series\n"); |
- return OPJ_FALSE; |
- } |
- l_cp->ppm_data = new_ppm_data; |
- l_cp->ppm_buffer = l_cp->ppm_data; |
- |
- /* Keep the position of the place where concatenate the new series*/ |
- l_cp->ppm_data_current = &(l_cp->ppm_data[l_cp->ppm_len]); |
- l_cp->ppm_len += l_N_ppm; |
- |
- /* Read incomplete Ippm series*/ |
- memcpy(l_cp->ppm_data_current, p_header_data, l_remaining_data); |
- p_header_size -= l_remaining_data; |
- p_header_data += l_remaining_data; |
- |
- l_cp->ppm_data_read += l_remaining_data; /* Increase the number of data read*/ |
- } |
- |
-#ifdef CLEAN_MSD |
- |
- if (l_cp->ppm_data_size == l_cp->ppm_len) { |
- if (p_header_size >= 4) { |
- /* read a N_ppm*/ |
- opj_read_bytes(p_header_data,&l_N_ppm,4); /* N_ppm */ |
- p_header_data+=4; |
- p_header_size-=4; |
- l_cp->ppm_len += l_N_ppm ; |
- |
- OPJ_BYTE *new_ppm_buffer = (OPJ_BYTE *) opj_realloc(l_cp->ppm_buffer, l_cp->ppm_len); |
- if (! new_ppm_buffer) { |
- opj_free(l_cp->ppm_buffer); |
- l_cp->ppm_buffer = NULL; |
- l_cp->ppm_len = 0; |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read ppm marker\n"); |
- return OPJ_FALSE; |
- } |
- l_cp->ppm_buffer = new_ppm_buffer; |
- memset(l_cp->ppm_buffer+l_cp->ppm_data_size,0,l_N_ppm); |
- |
- l_cp->ppm_data = l_cp->ppm_buffer; |
- } |
- else { |
- return OPJ_FALSE; |
- } |
- } |
- |
- l_remaining_data = l_cp->ppm_len - l_cp->ppm_data_size; |
- |
- if (l_remaining_data <= p_header_size) { |
- /* we must store less information than available in the packet */ |
- memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , l_remaining_data); |
- l_cp->ppm_data_size = l_cp->ppm_len; |
- p_header_size -= l_remaining_data; |
- p_header_data += l_remaining_data; |
- } |
- else { |
- memcpy(l_cp->ppm_buffer + l_cp->ppm_data_size , p_header_data , p_header_size); |
- l_cp->ppm_data_size += p_header_size; |
- p_header_data += p_header_size; |
- p_header_size = 0; |
- break; |
- } |
- } |
-#endif |
- return OPJ_TRUE; |
+ OPJ_UINT32 i, l_ppm_data_size, l_N_ppm_remaining; |
+ |
+ /* preconditions */ |
+ assert(p_cp != 00); |
+ assert(p_manager != 00); |
+ assert(p_cp->ppm_buffer == NULL); |
+ |
+ if (p_cp->ppm == 0U) { |
+ return OPJ_TRUE; |
+ } |
+ |
+ l_ppm_data_size = 0U; |
+ l_N_ppm_remaining = 0U; |
+ for (i = 0U; i < p_cp->ppm_markers_count; ++i) { |
+ if (p_cp->ppm_markers[i].m_data != NULL) { /* standard doesn't seem to require contiguous Zppm */ |
+ OPJ_UINT32 l_N_ppm; |
+ OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size; |
+ const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data; |
+ |
+ if (l_N_ppm_remaining >= l_data_size) { |
+ l_N_ppm_remaining -= l_data_size; |
+ l_data_size = 0U; |
+ } else { |
+ l_data += l_N_ppm_remaining; |
+ l_data_size -= l_N_ppm_remaining; |
+ l_N_ppm_remaining = 0U; |
+ } |
+ |
+ if (l_data_size > 0U) { |
+ do |
+ { |
+ /* read Nppm */ |
+ if (l_data_size < 4U) { |
+ /* clean up to be done on l_cp destruction */ |
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n"); |
+ return OPJ_FALSE; |
+ } |
+ opj_read_bytes(l_data, &l_N_ppm, 4); |
+ l_data+=4; |
+ l_data_size-=4; |
+ l_ppm_data_size += l_N_ppm; /* can't overflow, max 256 markers of max 65536 bytes, that is when PPM markers are not corrupted which is checked elsewhere */ |
+ |
+ if (l_data_size >= l_N_ppm) { |
+ l_data_size -= l_N_ppm; |
+ l_data += l_N_ppm; |
+ } else { |
+ l_N_ppm_remaining = l_N_ppm - l_data_size; |
+ l_data_size = 0U; |
+ } |
+ } while (l_data_size > 0U); |
+ } |
+ } |
+ } |
+ |
+ if (l_N_ppm_remaining != 0U) { |
+ /* clean up to be done on l_cp destruction */ |
+ opj_event_msg(p_manager, EVT_ERROR, "Corrupted PPM markers\n"); |
+ return OPJ_FALSE; |
+ } |
+ |
+ p_cp->ppm_buffer = (OPJ_BYTE *) opj_malloc(l_ppm_data_size); |
+ if (p_cp->ppm_buffer == 00) { |
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPM marker\n"); |
+ return OPJ_FALSE; |
+ } |
+ p_cp->ppm_len = l_ppm_data_size; |
+ l_ppm_data_size = 0U; |
+ l_N_ppm_remaining = 0U; |
+ for (i = 0U; i < p_cp->ppm_markers_count; ++i) { |
+ if (p_cp->ppm_markers[i].m_data != NULL) { /* standard doesn't seem to require contiguous Zppm */ |
+ OPJ_UINT32 l_N_ppm; |
+ OPJ_UINT32 l_data_size = p_cp->ppm_markers[i].m_data_size; |
+ const OPJ_BYTE* l_data = p_cp->ppm_markers[i].m_data; |
+ |
+ if (l_N_ppm_remaining >= l_data_size) { |
+ memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size); |
+ l_ppm_data_size += l_data_size; |
+ l_N_ppm_remaining -= l_data_size; |
+ l_data_size = 0U; |
+ } else { |
+ memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm_remaining); |
+ l_ppm_data_size += l_N_ppm_remaining; |
+ l_data += l_N_ppm_remaining; |
+ l_data_size -= l_N_ppm_remaining; |
+ l_N_ppm_remaining = 0U; |
+ } |
+ |
+ if (l_data_size > 0U) { |
+ do |
+ { |
+ /* read Nppm */ |
+ if (l_data_size < 4U) { |
+ /* clean up to be done on l_cp destruction */ |
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough bytes to read Nppm\n"); |
+ return OPJ_FALSE; |
+ } |
+ opj_read_bytes(l_data, &l_N_ppm, 4); |
+ l_data+=4; |
+ l_data_size-=4; |
+ |
+ if (l_data_size >= l_N_ppm) { |
+ memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_N_ppm); |
+ l_ppm_data_size += l_N_ppm; |
+ l_data_size -= l_N_ppm; |
+ l_data += l_N_ppm; |
+ } else { |
+ memcpy(p_cp->ppm_buffer + l_ppm_data_size, l_data, l_data_size); |
+ l_ppm_data_size += l_data_size; |
+ l_N_ppm_remaining = l_N_ppm - l_data_size; |
+ l_data_size = 0U; |
+ } |
+ } while (l_data_size > 0U); |
+ } |
+ opj_free(p_cp->ppm_markers[i].m_data); |
+ p_cp->ppm_markers[i].m_data = NULL; |
+ p_cp->ppm_markers[i].m_data_size = 0U; |
+ } |
+ } |
+ |
+ p_cp->ppm_data = p_cp->ppm_buffer; |
+ p_cp->ppm_data_size = p_cp->ppm_len; |
+ |
+ p_cp->ppm_markers_count = 0U; |
+ opj_free(p_cp->ppm_markers); |
+ p_cp->ppm_markers = NULL; |
+ |
+ return OPJ_TRUE; |
} |
/** |
@@ -3850,77 +3725,127 @@ static OPJ_BOOL opj_j2k_read_ppt ( opj_j2k_t *p_j2k, |
opj_event_mgr_t * p_manager |
) |
{ |
- opj_cp_t *l_cp = 00; |
- opj_tcp_t *l_tcp = 00; |
- OPJ_UINT32 l_Z_ppt; |
- |
- /* preconditions */ |
- assert(p_header_data != 00); |
- assert(p_j2k != 00); |
- assert(p_manager != 00); |
- |
- /* We need to have the Z_ppt element at minimum */ |
- if (p_header_size < 1) { |
- opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n"); |
- return OPJ_FALSE; |
- } |
- |
- l_cp = &(p_j2k->m_cp); |
- if (l_cp->ppm){ |
- opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n"); |
- return OPJ_FALSE; |
- } |
+ opj_cp_t *l_cp = 00; |
+ opj_tcp_t *l_tcp = 00; |
+ OPJ_UINT32 l_Z_ppt; |
- l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]); |
- l_tcp->ppt = 1; |
+ /* preconditions */ |
+ assert(p_header_data != 00); |
+ assert(p_j2k != 00); |
+ assert(p_manager != 00); |
- opj_read_bytes(p_header_data,&l_Z_ppt,1); /* Z_ppt */ |
- ++p_header_data; |
- --p_header_size; |
- |
- /* Allocate buffer to read the packet header */ |
- if (l_Z_ppt == 0) { |
- /* First PPT marker */ |
- l_tcp->ppt_data_size = 0; |
- l_tcp->ppt_len = p_header_size; |
- |
- opj_free(l_tcp->ppt_buffer); |
- l_tcp->ppt_buffer = (OPJ_BYTE *) opj_calloc(l_tcp->ppt_len, sizeof(OPJ_BYTE) ); |
- if (l_tcp->ppt_buffer == 00) { |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n"); |
- return OPJ_FALSE; |
- } |
- l_tcp->ppt_data = l_tcp->ppt_buffer; |
- |
- /* memset(l_tcp->ppt_buffer,0,l_tcp->ppt_len); */ |
- } |
- else { |
- OPJ_BYTE *new_ppt_buffer; |
- l_tcp->ppt_len += p_header_size; |
- |
- new_ppt_buffer = (OPJ_BYTE *) opj_realloc(l_tcp->ppt_buffer, l_tcp->ppt_len); |
- if (! new_ppt_buffer) { |
- opj_free(l_tcp->ppt_buffer); |
- l_tcp->ppt_buffer = NULL; |
- l_tcp->ppt_len = 0; |
- opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n"); |
- return OPJ_FALSE; |
- } |
- l_tcp->ppt_buffer = new_ppt_buffer; |
- l_tcp->ppt_data = l_tcp->ppt_buffer; |
+ /* We need to have the Z_ppt element + 1 byte of Ippt at minimum */ |
+ if (p_header_size < 2) { |
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker\n"); |
+ return OPJ_FALSE; |
+ } |
- memset(l_tcp->ppt_buffer+l_tcp->ppt_data_size,0,p_header_size); |
- } |
+ l_cp = &(p_j2k->m_cp); |
+ if (l_cp->ppm){ |
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading PPT marker: packet header have been previously found in the main header (PPM marker).\n"); |
+ return OPJ_FALSE; |
+ } |
- /* Read packet header from buffer */ |
- memcpy(l_tcp->ppt_buffer+l_tcp->ppt_data_size,p_header_data,p_header_size); |
+ l_tcp = &(l_cp->tcps[p_j2k->m_current_tile_number]); |
+ l_tcp->ppt = 1; |
- l_tcp->ppt_data_size += p_header_size; |
+ opj_read_bytes(p_header_data,&l_Z_ppt,1); /* Z_ppt */ |
+ ++p_header_data; |
+ --p_header_size; |
+ |
+ /* check allocation needed */ |
+ if (l_tcp->ppt_markers == NULL) { /* first PPT marker */ |
+ OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */ |
+ assert(l_tcp->ppt_markers_count == 0U); |
+ |
+ l_tcp->ppt_markers = (opj_ppx *) opj_calloc(l_newCount, sizeof(opj_ppx)); |
+ if (l_tcp->ppt_markers == NULL) { |
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n"); |
+ return OPJ_FALSE; |
+ } |
+ l_tcp->ppt_markers_count = l_newCount; |
+ } else if (l_tcp->ppt_markers_count <= l_Z_ppt) { |
+ OPJ_UINT32 l_newCount = l_Z_ppt + 1U; /* can't overflow, l_Z_ppt is UINT8 */ |
+ opj_ppx *new_ppt_markers; |
+ new_ppt_markers = (opj_ppx *) opj_realloc(l_tcp->ppt_markers, l_newCount * sizeof(opj_ppx)); |
+ if (new_ppt_markers == NULL) { |
+ /* clean up to be done on l_tcp destruction */ |
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n"); |
+ return OPJ_FALSE; |
+ } |
+ l_tcp->ppt_markers = new_ppt_markers; |
+ memset(l_tcp->ppt_markers + l_tcp->ppt_markers_count, 0, (l_newCount - l_tcp->ppt_markers_count) * sizeof(opj_ppx)); |
+ l_tcp->ppt_markers_count = l_newCount; |
+ } |
+ |
+ if (l_tcp->ppt_markers[l_Z_ppt].m_data != NULL) { |
+ /* clean up to be done on l_tcp destruction */ |
+ opj_event_msg(p_manager, EVT_ERROR, "Zppt %u already read\n", l_Z_ppt); |
+ return OPJ_FALSE; |
+ } |
+ |
+ l_tcp->ppt_markers[l_Z_ppt].m_data = opj_malloc(p_header_size); |
+ if (l_tcp->ppt_markers[l_Z_ppt].m_data == NULL) { |
+ /* clean up to be done on l_tcp destruction */ |
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n"); |
+ return OPJ_FALSE; |
+ } |
+ l_tcp->ppt_markers[l_Z_ppt].m_data_size = p_header_size; |
+ memcpy(l_tcp->ppt_markers[l_Z_ppt].m_data, p_header_data, p_header_size); |
+ return OPJ_TRUE; |
+} |
- return OPJ_TRUE; |
+/** |
+ * Merges all PPT markers read (Packed packet headers, tile-part header) |
+ * |
+ * @param p_tcp the tile. |
+ * @param p_manager the user event manager. |
+ */ |
+static OPJ_BOOL opj_j2k_merge_ppt(opj_tcp_t *p_tcp, opj_event_mgr_t * p_manager) |
+{ |
+ OPJ_UINT32 i, l_ppt_data_size; |
+ /* preconditions */ |
+ assert(p_tcp != 00); |
+ assert(p_manager != 00); |
+ assert(p_tcp->ppt_buffer == NULL); |
+ |
+ if (p_tcp->ppt == 0U) { |
+ return OPJ_TRUE; |
+ } |
+ |
+ l_ppt_data_size = 0U; |
+ for (i = 0U; i < p_tcp->ppt_markers_count; ++i) { |
+ l_ppt_data_size += p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */ |
+ } |
+ |
+ p_tcp->ppt_buffer = (OPJ_BYTE *) opj_malloc(l_ppt_data_size); |
+ if (p_tcp->ppt_buffer == 00) { |
+ opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to read PPT marker\n"); |
+ return OPJ_FALSE; |
+ } |
+ p_tcp->ppt_len = l_ppt_data_size; |
+ l_ppt_data_size = 0U; |
+ for (i = 0U; i < p_tcp->ppt_markers_count; ++i) { |
+ if (p_tcp->ppt_markers[i].m_data != NULL) { /* standard doesn't seem to require contiguous Zppt */ |
+ memcpy(p_tcp->ppt_buffer + l_ppt_data_size, p_tcp->ppt_markers[i].m_data, p_tcp->ppt_markers[i].m_data_size); |
+ l_ppt_data_size += p_tcp->ppt_markers[i].m_data_size; /* can't overflow, max 256 markers of max 65536 bytes */ |
+ |
+ opj_free(p_tcp->ppt_markers[i].m_data); |
+ p_tcp->ppt_markers[i].m_data = NULL; |
+ p_tcp->ppt_markers[i].m_data_size = 0U; |
+ } |
+ } |
+ |
+ p_tcp->ppt_markers_count = 0U; |
+ opj_free(p_tcp->ppt_markers); |
+ p_tcp->ppt_markers = NULL; |
+ |
+ p_tcp->ppt_data = p_tcp->ppt_buffer; |
+ p_tcp->ppt_data_size = p_tcp->ppt_len; |
+ return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_tlm( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_tlm( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager |
) |
@@ -3974,7 +3899,7 @@ OPJ_BOOL opj_j2k_write_tlm( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_sot( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_sot( opj_j2k_t *p_j2k, |
OPJ_BYTE * p_data, |
OPJ_UINT32 * p_data_written, |
const opj_stream_private_t *p_stream, |
@@ -4018,7 +3943,36 @@ OPJ_BOOL opj_j2k_write_sot( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_get_sot_values(OPJ_BYTE * p_header_data, |
+ OPJ_UINT32 p_header_size, |
+ OPJ_UINT32* p_tile_no, |
+ OPJ_UINT32* p_tot_len, |
+ OPJ_UINT32* p_current_part, |
+ OPJ_UINT32* p_num_parts, |
+ opj_event_mgr_t * p_manager ) |
+{ |
+ /* preconditions */ |
+ assert(p_header_data != 00); |
+ assert(p_manager != 00); |
+ |
+ /* Size of this marker is fixed = 12 (we have already read marker and its size)*/ |
+ if (p_header_size != 8) { |
+ opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n"); |
+ return OPJ_FALSE; |
+ } |
+ |
+ opj_read_bytes(p_header_data,p_tile_no,2); /* Isot */ |
+ p_header_data+=2; |
+ opj_read_bytes(p_header_data,p_tot_len,4); /* Psot */ |
+ p_header_data+=4; |
+ opj_read_bytes(p_header_data,p_current_part,1); /* TPsot */ |
+ ++p_header_data; |
+ opj_read_bytes(p_header_data,p_num_parts ,1); /* TNsot */ |
+ ++p_header_data; |
+ return OPJ_TRUE; |
+} |
+ |
+static OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k, |
OPJ_BYTE * p_header_data, |
OPJ_UINT32 p_header_size, |
opj_event_mgr_t * p_manager ) |
@@ -4030,19 +3984,16 @@ OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k, |
OPJ_UINT32 l_tile_x,l_tile_y; |
/* preconditions */ |
- assert(p_header_data != 00); |
+ |
assert(p_j2k != 00); |
assert(p_manager != 00); |
- |
- /* Size of this marker is fixed = 12 (we have already read marker and its size)*/ |
- if (p_header_size != 8) { |
+ |
+ if (! opj_j2k_get_sot_values(p_header_data, p_header_size, &(p_j2k->m_current_tile_number), &l_tot_len, &l_current_part, &l_num_parts, p_manager)) { |
opj_event_msg(p_manager, EVT_ERROR, "Error reading SOT marker\n"); |
return OPJ_FALSE; |
} |
l_cp = &(p_j2k->m_cp); |
- opj_read_bytes(p_header_data,&(p_j2k->m_current_tile_number),2); /* Isot */ |
- p_header_data+=2; |
/* testcase 2.pdf.SIGFPE.706.1112 */ |
if (p_j2k->m_current_tile_number >= l_cp->tw * l_cp->th) { |
@@ -4085,9 +4036,6 @@ OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k, |
/* Optimization possible here with a more complex data structure and with the removing of tiles */ |
/* since the time taken by this function can only grow at the time */ |
- opj_read_bytes(p_header_data,&l_tot_len,4); /* Psot */ |
- p_header_data+=4; |
- |
/* PSot should be equal to zero or >=14 or <= 2^32-1 */ |
if ((l_tot_len !=0 ) && (l_tot_len < 14) ) |
{ |
@@ -4130,13 +4078,8 @@ OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k, |
p_j2k->m_specific_param.m_decoder.m_last_tile_part = 1; |
} |
- opj_read_bytes(p_header_data,&l_current_part ,1); /* TPsot */ |
- ++p_header_data; |
- |
- opj_read_bytes(p_header_data,&l_num_parts ,1); /* TNsot */ |
- ++p_header_data; |
- |
if (l_num_parts != 0) { /* Number of tile-part header is provided by this tile-part header */ |
+ l_num_parts += p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction; |
/* Useful to manage the case of textGBR.jp2 file because two values of TNSot are allowed: the correct numbers of |
* tile-parts for that tile and zero (A.4.2 of 15444-1 : 2002). */ |
if (l_tcp->m_nb_tile_parts) { |
@@ -4286,7 +4229,7 @@ OPJ_BOOL opj_j2k_read_sot ( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_sod( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_sod( opj_j2k_t *p_j2k, |
opj_tcd_t * p_tile_coder, |
OPJ_BYTE * p_data, |
OPJ_UINT32 * p_data_written, |
@@ -4360,7 +4303,7 @@ OPJ_BOOL opj_j2k_write_sod( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager |
) |
@@ -4408,7 +4351,7 @@ OPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k, |
} |
if (! *l_current_data) { |
/* LH: oddly enough, in this path, l_tile_len!=0. |
- * TODO: If this was consistant, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...). |
+ * TODO: If this was consistent, we could simplify the code to only use realloc(), as realloc(0,...) default to malloc(0,...). |
*/ |
*l_current_data = (OPJ_BYTE*) opj_malloc(p_j2k->m_specific_param.m_decoder.m_sot_length); |
} |
@@ -4481,7 +4424,7 @@ OPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
- OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_rgn(opj_j2k_t *p_j2k, |
OPJ_UINT32 p_tile_no, |
OPJ_UINT32 p_comp_no, |
OPJ_UINT32 nb_comps, |
@@ -4538,7 +4481,7 @@ OPJ_BOOL opj_j2k_read_sod (opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_eoc( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_eoc( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager |
) |
@@ -4648,18 +4591,18 @@ static OPJ_BOOL opj_j2k_read_rgn (opj_j2k_t *p_j2k, |
} |
-OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp) |
+static OPJ_FLOAT32 opj_j2k_get_tp_stride (opj_tcp_t * p_tcp) |
{ |
return (OPJ_FLOAT32) ((p_tcp->m_nb_tile_parts - 1) * 14); |
} |
-OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp) |
+static OPJ_FLOAT32 opj_j2k_get_default_stride (opj_tcp_t * p_tcp) |
{ |
(void)p_tcp; |
return 0; |
} |
-OPJ_BOOL opj_j2k_update_rates( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_update_rates( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
{ |
@@ -4822,7 +4765,7 @@ OPJ_BOOL opj_j2k_update_rates( opj_j2k_t *p_j2k, |
} |
#if 0 |
-OPJ_BOOL opj_j2k_read_eoc ( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_read_eoc ( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
{ |
@@ -4872,7 +4815,7 @@ OPJ_BOOL opj_j2k_read_eoc ( opj_j2k_t *p_j2k, |
} |
#endif |
-OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
{ |
@@ -4886,7 +4829,7 @@ OPJ_BOOL opj_j2k_get_end_header(opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_mct_data_group( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_mct_data_group( opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
{ |
@@ -4935,7 +4878,7 @@ OPJ_BOOL opj_j2k_write_mct_data_group( opj_j2k_t *p_j2k, |
} |
#if 0 |
-OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
{ |
@@ -4958,7 +4901,7 @@ OPJ_BOOL opj_j2k_write_all_coc(opj_j2k_t *p_j2k, |
#endif |
#if 0 |
-OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
{ |
@@ -4981,7 +4924,7 @@ OPJ_BOOL opj_j2k_write_all_qcc(opj_j2k_t *p_j2k, |
#endif |
-OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
{ |
@@ -4995,7 +4938,7 @@ OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k, |
l_tccp = p_j2k->m_cp.tcps->tccps; |
- for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) { |
+ for (compno = 0; compno < p_j2k->m_private_image->numcomps; ++compno) { |
if (l_tccp->roishift) { |
if (! opj_j2k_write_rgn(p_j2k,0,compno,p_j2k->m_private_image->numcomps,p_stream,p_manager)) { |
@@ -5009,7 +4952,7 @@ OPJ_BOOL opj_j2k_write_regions( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_epc( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_epc( opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
{ |
@@ -5047,7 +4990,7 @@ OPJ_BOOL opj_j2k_write_epc( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_read_unk ( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_read_unk ( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
OPJ_UINT32 *output_marker, |
opj_event_mgr_t * p_manager |
@@ -5064,7 +5007,7 @@ OPJ_BOOL opj_j2k_read_unk ( opj_j2k_t *p_j2k, |
opj_event_msg(p_manager, EVT_WARNING, "Unknown marker\n"); |
- while(1) { |
+ 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,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) { |
opj_event_msg(p_manager, EVT_ERROR, "Stream too short\n"); |
@@ -5109,7 +5052,7 @@ OPJ_BOOL opj_j2k_read_unk ( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_mct_record( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_mct_record( opj_j2k_t *p_j2k, |
opj_mct_data_t * p_mct_record, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
@@ -5281,7 +5224,7 @@ static OPJ_BOOL opj_j2k_read_mct ( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_mcc_record( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_mcc_record( opj_j2k_t *p_j2k, |
struct opj_simple_mcc_decorrelation_data * p_mcc_record, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
@@ -5384,7 +5327,7 @@ OPJ_BOOL opj_j2k_write_mcc_record( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_read_mcc ( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_read_mcc ( opj_j2k_t *p_j2k, |
OPJ_BYTE * p_header_data, |
OPJ_UINT32 p_header_size, |
opj_event_mgr_t * p_manager ) |
@@ -5599,7 +5542,7 @@ OPJ_BOOL opj_j2k_read_mcc ( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_mco( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_mco( opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager |
) |
@@ -5616,8 +5559,7 @@ OPJ_BOOL opj_j2k_write_mco( opj_j2k_t *p_j2k, |
assert(p_stream != 00); |
l_tcp =&(p_j2k->m_cp.tcps[p_j2k->m_current_tile_number]); |
- l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data; |
- |
+ |
l_mco_size = 5 + l_tcp->m_nb_mcc_records; |
if (l_mco_size > p_j2k->m_specific_param.m_encoder.m_header_tile_data_size) { |
@@ -5632,6 +5574,8 @@ OPJ_BOOL opj_j2k_write_mco( opj_j2k_t *p_j2k, |
p_j2k->m_specific_param.m_encoder.m_header_tile_data = new_header_tile_data; |
p_j2k->m_specific_param.m_encoder.m_header_tile_data_size = l_mco_size; |
} |
+ l_current_data = p_j2k->m_specific_param.m_encoder.m_header_tile_data; |
+ |
opj_write_bytes(l_current_data,J2K_MS_MCO,2); /* MCO */ |
l_current_data += 2; |
@@ -5639,14 +5583,13 @@ OPJ_BOOL opj_j2k_write_mco( opj_j2k_t *p_j2k, |
opj_write_bytes(l_current_data,l_mco_size-2,2); /* Lmco */ |
l_current_data += 2; |
- opj_write_bytes(l_current_data,l_tcp->m_nb_mcc_records,1); /* Nmco : only one tranform stage*/ |
+ opj_write_bytes(l_current_data,l_tcp->m_nb_mcc_records,1); /* Nmco : only one transform stage*/ |
++l_current_data; |
l_mcc_record = l_tcp->m_mcc_records; |
- for (i=0;i<l_tcp->m_nb_mcc_records;++i) { |
+ for (i=0;i<l_tcp->m_nb_mcc_records;++i) { |
opj_write_bytes(l_current_data,l_mcc_record->m_index,1);/* Imco -> use the mcc indicated by 1*/ |
++l_current_data; |
- |
++l_mcc_record; |
} |
@@ -5692,7 +5635,7 @@ static OPJ_BOOL opj_j2k_read_mco ( opj_j2k_t *p_j2k, |
return OPJ_FALSE; |
} |
- opj_read_bytes(p_header_data,&l_nb_stages,1); /* Nmco : only one tranform stage*/ |
+ opj_read_bytes(p_header_data,&l_nb_stages,1); /* Nmco : only one transform stage*/ |
++p_header_data; |
if (l_nb_stages > 1) { |
@@ -5729,7 +5672,7 @@ static OPJ_BOOL opj_j2k_read_mco ( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index) |
+static OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_index) |
{ |
OPJ_UINT32 i; |
opj_simple_mcc_decorrelation_data_t * l_mcc_record; |
@@ -5811,7 +5754,7 @@ OPJ_BOOL opj_j2k_add_mct(opj_tcp_t * p_tcp, opj_image_t * p_image, OPJ_UINT32 p_ |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_cbd( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_cbd( opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
{ |
@@ -5977,7 +5920,7 @@ opj_j2k_t* opj_j2k_create_compress(void) |
return l_j2k; |
} |
-int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres){ |
+static int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres){ |
POC[0].tile = 1; |
POC[0].resno0 = 0; |
POC[0].compno0 = 0; |
@@ -5995,7 +5938,7 @@ int opj_j2k_initialise_4K_poc(opj_poc_t *POC, int numres){ |
return 2; |
} |
-void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager) |
+static void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *image, opj_event_mgr_t *p_manager) |
{ |
/* Configure cinema parameters */ |
int i; |
@@ -6132,7 +6075,7 @@ void opj_j2k_set_cinema_parameters(opj_cparameters_t *parameters, opj_image_t *i |
} |
-OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz, opj_event_mgr_t *p_manager) |
+static OPJ_BOOL opj_j2k_is_cinema_compliant(opj_image_t *image, OPJ_UINT16 rsiz, opj_event_mgr_t *p_manager) |
{ |
OPJ_UINT32 i; |
@@ -6797,7 +6740,11 @@ OPJ_BOOL opj_j2k_read_header( opj_stream_private_t *p_stream, |
} |
/* customization of the validation */ |
- opj_j2k_setup_decoding_validation(p_j2k); |
+ if (! opj_j2k_setup_decoding_validation(p_j2k, p_manager)) { |
+ opj_image_destroy(p_j2k->m_private_image); |
+ p_j2k->m_private_image = NULL; |
+ return OPJ_FALSE; |
+ } |
/* validation of the parameters codec */ |
if (! opj_j2k_exec(p_j2k, p_j2k->m_validation_list, p_stream,p_manager)) { |
@@ -6807,7 +6754,11 @@ OPJ_BOOL opj_j2k_read_header( opj_stream_private_t *p_stream, |
} |
/* customization of the encoding */ |
- opj_j2k_setup_header_reading(p_j2k); |
+ if (! opj_j2k_setup_header_reading(p_j2k, p_manager)) { |
+ opj_image_destroy(p_j2k->m_private_image); |
+ p_j2k->m_private_image = NULL; |
+ return OPJ_FALSE; |
+ } |
/* read header */ |
if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) { |
@@ -6832,30 +6783,42 @@ OPJ_BOOL opj_j2k_read_header( opj_stream_private_t *p_stream, |
return OPJ_TRUE; |
} |
-void opj_j2k_setup_header_reading (opj_j2k_t *p_j2k) |
+static OPJ_BOOL opj_j2k_setup_header_reading (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) |
{ |
/* preconditions*/ |
assert(p_j2k != 00); |
+ assert(p_manager != 00); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_read_header_procedure); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_read_header_procedure, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
/* DEVELOPER CORNER, add your custom procedures */ |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd); |
- |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_copy_default_tcp_and_create_tcd, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ |
+ return OPJ_TRUE; |
} |
-void opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k) |
+static OPJ_BOOL opj_j2k_setup_decoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) |
{ |
/* preconditions*/ |
assert(p_j2k != 00); |
+ assert(p_manager != 00); |
- opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_decoder); |
- opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_decoding_validation); |
- /* DEVELOPER CORNER, add your custom validation procedure */ |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,(opj_procedure)opj_j2k_build_decoder, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list,(opj_procedure)opj_j2k_decoding_validation, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ /* DEVELOPER CORNER, add your custom validation procedure */ |
+ return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_mct_validation ( opj_j2k_t * p_j2k, |
+static OPJ_BOOL opj_j2k_mct_validation ( opj_j2k_t * p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
{ |
@@ -7041,7 +7004,7 @@ OPJ_BOOL opj_j2k_setup_mct_encoding(opj_tcp_t * p_tcp, opj_image_t * p_image) |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_build_decoder (opj_j2k_t * p_j2k, |
+static OPJ_BOOL opj_j2k_build_decoder (opj_j2k_t * p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
{ |
@@ -7053,7 +7016,7 @@ OPJ_BOOL opj_j2k_build_decoder (opj_j2k_t * p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_build_encoder (opj_j2k_t * p_j2k, |
+static OPJ_BOOL opj_j2k_build_encoder (opj_j2k_t * p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
{ |
@@ -7065,7 +7028,7 @@ OPJ_BOOL opj_j2k_build_encoder (opj_j2k_t * p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_encoding_validation ( opj_j2k_t * p_j2k, |
+static OPJ_BOOL opj_j2k_encoding_validation ( opj_j2k_t * p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
{ |
@@ -7108,7 +7071,7 @@ OPJ_BOOL opj_j2k_encoding_validation ( opj_j2k_t * p_j2k, |
return l_is_valid; |
} |
-OPJ_BOOL opj_j2k_decoding_validation ( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_decoding_validation ( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager |
) |
@@ -7138,7 +7101,7 @@ OPJ_BOOL opj_j2k_decoding_validation ( opj_j2k_t *p_j2k, |
return l_is_valid; |
} |
-OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager) |
{ |
@@ -7284,6 +7247,11 @@ OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k, |
opj_event_msg(p_manager, EVT_ERROR, "required QCD marker not found in main header\n"); |
return OPJ_FALSE; |
} |
+ |
+ if (! opj_j2k_merge_ppm(&(p_j2k->m_cp), p_manager)) { |
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPM data\n"); |
+ return OPJ_FALSE; |
+ } |
opj_event_msg(p_manager, EVT_INFO, "Main header has been correctly decoded.\n"); |
@@ -7296,7 +7264,7 @@ OPJ_BOOL opj_j2k_read_header_procedure( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_exec ( opj_j2k_t * p_j2k, |
+static OPJ_BOOL opj_j2k_exec ( opj_j2k_t * p_j2k, |
opj_procedure_list_t * p_procedure_list, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
@@ -7464,7 +7432,7 @@ static OPJ_BOOL opj_j2k_copy_default_tcp_and_create_tcd ( opj_j2k_t * p_j2 |
return OPJ_TRUE; |
} |
-const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler (OPJ_UINT32 p_id) |
+static const opj_dec_memory_marker_handler_t * opj_j2k_get_marker_handler (OPJ_UINT32 p_id) |
{ |
const opj_dec_memory_marker_handler_t *e; |
for (e = j2k_memory_marker_handler_tab; e->id != 0; ++e) { |
@@ -7577,66 +7545,78 @@ void j2k_destroy_cstr_index (opj_codestream_index_t *p_cstr_ind) |
} |
} |
-void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp) |
+static void opj_j2k_tcp_destroy (opj_tcp_t *p_tcp) |
{ |
- if (p_tcp == 00) { |
- return; |
- } |
- |
- 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 == 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; |
- } |
+ if (p_tcp->mct_norms != 00) { |
+ opj_free(p_tcp->mct_norms); |
+ p_tcp->mct_norms = 00; |
+ } |
- opj_j2k_tcp_data_destroy(p_tcp); |
+ opj_j2k_tcp_data_destroy(p_tcp); |
} |
-void opj_j2k_tcp_data_destroy (opj_tcp_t *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); |
@@ -7645,39 +7625,148 @@ void opj_j2k_tcp_data_destroy (opj_tcp_t *p_tcp) |
} |
} |
-void opj_j2k_cp_destroy (opj_cp_t *p_cp) |
+static void opj_j2k_cp_destroy (opj_cp_t *p_cp) |
{ |
- OPJ_UINT32 l_nb_tiles; |
- opj_tcp_t * l_current_tile = 00; |
- OPJ_UINT32 i; |
+ OPJ_UINT32 l_nb_tiles; |
+ opj_tcp_t * l_current_tile = 00; |
- if (p_cp == 00) |
- { |
- return; |
- } |
- if (p_cp->tcps != 00) |
- { |
- l_current_tile = p_cp->tcps; |
- l_nb_tiles = p_cp->th * p_cp->tw; |
+ 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; |
+ } |
+} |
- for (i = 0; i < l_nb_tiles; ++i) |
- { |
- opj_j2k_tcp_destroy(l_current_tile); |
- ++l_current_tile; |
- } |
- opj_free(p_cp->tcps); |
- p_cp->tcps = 00; |
- } |
- 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, |
@@ -7694,7 +7783,6 @@ OPJ_BOOL opj_j2k_read_tile_header( opj_j2k_t * p_j2k, |
OPJ_UINT32 l_marker_size; |
const opj_dec_memory_marker_handler_t * l_marker_handler = 00; |
opj_tcp_t * l_tcp = NULL; |
- OPJ_UINT32 l_nb_tiles; |
/* preconditions */ |
assert(p_stream != 00); |
@@ -7844,7 +7932,30 @@ OPJ_BOOL opj_j2k_read_tile_header( opj_j2k_t * p_j2k, |
if (! opj_j2k_read_sod(p_j2k, p_stream, p_manager)) { |
return OPJ_FALSE; |
} |
- |
+ if (p_j2k->m_specific_param.m_decoder.m_can_decode && !p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked) { |
+ /* Issue 254 */ |
+ OPJ_BOOL l_correction_needed; |
+ |
+ p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1; |
+ if(!opj_j2k_need_nb_tile_parts_correction(p_stream, p_j2k->m_current_tile_number, &l_correction_needed, p_manager)) { |
+ opj_event_msg(p_manager, EVT_ERROR, "opj_j2k_apply_nb_tile_parts_correction error\n"); |
+ return OPJ_FALSE; |
+ } |
+ if (l_correction_needed) { |
+ OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.tw * p_j2k->m_cp.th; |
+ OPJ_UINT32 l_tile_no; |
+ |
+ p_j2k->m_specific_param.m_decoder.m_can_decode = 0; |
+ p_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction = 1; |
+ /* correct tiles */ |
+ for (l_tile_no = 0U; l_tile_no < l_nb_tiles; ++l_tile_no) { |
+ if (p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts != 0U) { |
+ p_j2k->m_cp.tcps[l_tile_no].m_nb_tile_parts+=1; |
+ } |
+ } |
+ opj_event_msg(p_manager, EVT_WARNING, "Non conformant codestream TPsot==TNsot.\n"); |
+ } |
+ } |
if (! p_j2k->m_specific_param.m_decoder.m_can_decode){ |
/* Try to read 2 bytes (the next marker ID) from stream and copy them into the buffer */ |
if (opj_stream_read_data(p_stream,p_j2k->m_specific_param.m_decoder.m_header_data,2,p_manager) != 2) { |
@@ -7883,8 +7994,8 @@ OPJ_BOOL opj_j2k_read_tile_header( opj_j2k_t * p_j2k, |
/* FIXME DOC ???*/ |
if ( ! p_j2k->m_specific_param.m_decoder.m_can_decode) { |
+ OPJ_UINT32 l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw; |
l_tcp = p_j2k->m_cp.tcps + p_j2k->m_current_tile_number; |
- l_nb_tiles = p_j2k->m_cp.th * p_j2k->m_cp.tw; |
while( (p_j2k->m_current_tile_number < l_nb_tiles) && (l_tcp->m_data == 00) ) { |
++p_j2k->m_current_tile_number; |
@@ -7897,8 +8008,12 @@ OPJ_BOOL opj_j2k_read_tile_header( opj_j2k_t * p_j2k, |
} |
} |
+ if (! opj_j2k_merge_ppt(p_j2k->m_cp.tcps + p_j2k->m_current_tile_number, p_manager)) { |
+ opj_event_msg(p_manager, EVT_ERROR, "Failed to merge PPT data\n"); |
+ return OPJ_FALSE; |
+ } |
/*FIXME ???*/ |
- if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number)) { |
+ if (! opj_tcd_init_decode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number, p_manager)) { |
opj_event_msg(p_manager, EVT_ERROR, "Cannot decode tile, memory error\n"); |
return OPJ_FALSE; |
} |
@@ -7951,7 +8066,7 @@ OPJ_BOOL opj_j2k_decode_tile ( opj_j2k_t * p_j2k, |
l_tcp->m_data, |
l_tcp->m_data_size, |
p_tile_index, |
- p_j2k->cstr_index) ) { |
+ p_j2k->cstr_index, p_manager) ) { |
opj_j2k_tcp_destroy(l_tcp); |
p_j2k->m_specific_param.m_decoder.m_state |= 0x8000;/*FIXME J2K_DEC_STATE_ERR;*/ |
opj_event_msg(p_manager, EVT_ERROR, "Failed to decode.\n"); |
@@ -8003,16 +8118,16 @@ OPJ_BOOL opj_j2k_decode_tile ( opj_j2k_t * p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image) |
+static OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_image_t* p_output_image) |
{ |
OPJ_UINT32 i,j,k = 0; |
OPJ_UINT32 l_width_src,l_height_src; |
OPJ_UINT32 l_width_dest,l_height_dest; |
OPJ_INT32 l_offset_x0_src, l_offset_y0_src, l_offset_x1_src, l_offset_y1_src; |
- OPJ_INT32 l_start_offset_src, l_line_offset_src, l_end_offset_src ; |
+ OPJ_SIZE_T l_start_offset_src, l_line_offset_src, l_end_offset_src ; |
OPJ_UINT32 l_start_x_dest , l_start_y_dest; |
OPJ_UINT32 l_x0_dest, l_y0_dest, l_x1_dest, l_y1_dest; |
- OPJ_INT32 l_start_offset_dest, l_line_offset_dest; |
+ OPJ_SIZE_T l_start_offset_dest, l_line_offset_dest; |
opj_image_comp_t * l_img_comp_src = 00; |
opj_image_comp_t * l_img_comp_dest = 00; |
@@ -8038,8 +8153,8 @@ OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_im |
const OPJ_UINT32 MAX_SIZE = UINT32_MAX / sizeof(OPJ_INT32); |
if (height == 0 || width > MAX_SIZE / height) { |
return OPJ_FALSE; |
- } |
- l_img_comp_dest->data = (OPJ_INT32*) opj_calloc(width * height, sizeof(OPJ_INT32)); |
+ } |
+ l_img_comp_dest->data = (OPJ_INT32*)opj_calloc(width * height, sizeof(OPJ_INT32)); |
if (!l_img_comp_dest->data) { |
return OPJ_FALSE; |
} |
@@ -8073,9 +8188,9 @@ OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_im |
l_height_src = (OPJ_UINT32)(l_res->y1 - l_res->y0); |
/* Border of the current output component*/ |
- l_x0_dest = (OPJ_UINT32)opj_int_ceildivpow2((OPJ_INT32)l_img_comp_dest->x0, (OPJ_INT32)l_img_comp_dest->factor); |
- l_y0_dest = (OPJ_UINT32)opj_int_ceildivpow2((OPJ_INT32)l_img_comp_dest->y0, (OPJ_INT32)l_img_comp_dest->factor); |
- l_x1_dest = l_x0_dest + l_img_comp_dest->w; |
+ l_x0_dest = opj_uint_ceildivpow2(l_img_comp_dest->x0, l_img_comp_dest->factor); |
+ l_y0_dest = opj_uint_ceildivpow2(l_img_comp_dest->y0, l_img_comp_dest->factor); |
+ l_x1_dest = l_x0_dest + l_img_comp_dest->w; /* can't overflow given that image->x1 is uint32 */ |
l_y1_dest = l_y0_dest + l_img_comp_dest->h; |
/*if (i == 0) { |
@@ -8106,7 +8221,7 @@ OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_im |
} |
} |
else { |
- l_start_x_dest = 0 ; |
+ l_start_x_dest = 0U; |
l_offset_x0_src = (OPJ_INT32)l_x0_dest - l_res->x0; |
if ( l_x1_dest >= (OPJ_UINT32)l_res->x1 ) { |
@@ -8133,7 +8248,7 @@ OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_im |
} |
} |
else { |
- l_start_y_dest = 0 ; |
+ l_start_y_dest = 0U; |
l_offset_y0_src = (OPJ_INT32)l_y0_dest - l_res->y0; |
if ( l_y1_dest >= (OPJ_UINT32)l_res->y1 ) { |
@@ -8156,13 +8271,13 @@ OPJ_BOOL opj_j2k_update_image_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data, opj_im |
/*-----*/ |
/* Compute the input buffer offset */ |
- l_start_offset_src = l_offset_x0_src + l_offset_y0_src * (OPJ_INT32)l_width_src; |
- l_line_offset_src = l_offset_x1_src + l_offset_x0_src; |
- l_end_offset_src = l_offset_y1_src * (OPJ_INT32)l_width_src - l_offset_x0_src; |
+ l_start_offset_src = (OPJ_SIZE_T)l_offset_x0_src + (OPJ_SIZE_T)l_offset_y0_src * (OPJ_SIZE_T)l_width_src; |
+ l_line_offset_src = (OPJ_SIZE_T)l_offset_x1_src + (OPJ_SIZE_T)l_offset_x0_src; |
+ l_end_offset_src = (OPJ_SIZE_T)l_offset_y1_src * (OPJ_SIZE_T)l_width_src - (OPJ_SIZE_T)l_offset_x0_src; |
/* Compute the output buffer offset */ |
- l_start_offset_dest = (OPJ_INT32)(l_start_x_dest + l_start_y_dest * l_img_comp_dest->w); |
- l_line_offset_dest = (OPJ_INT32)(l_img_comp_dest->w - l_width_dest); |
+ l_start_offset_dest = (OPJ_SIZE_T)l_start_x_dest + (OPJ_SIZE_T)l_start_y_dest * (OPJ_SIZE_T)l_img_comp_dest->w; |
+ l_line_offset_dest = (OPJ_SIZE_T)l_img_comp_dest->w - (OPJ_SIZE_T)l_width_dest; |
/* Move the output buffer to the first place where we will write*/ |
l_dest_ptr = l_img_comp_dest->data + l_start_offset_dest; |
@@ -8436,6 +8551,10 @@ opj_j2k_t* opj_j2k_create_decompress(void) |
l_j2k->m_is_decoder = 1; |
l_j2k->m_cp.m_is_decoder = 1; |
+#ifdef OPJ_DISABLE_TPSOT_FIX |
+ l_j2k->m_specific_param.m_decoder.m_nb_tile_parts_correction_checked = 1; |
+#endif |
+ |
l_j2k->m_specific_param.m_decoder.m_default_tcp = (opj_tcp_t*) opj_calloc(1,sizeof(opj_tcp_t)); |
if (!l_j2k->m_specific_param.m_decoder.m_default_tcp) { |
opj_j2k_destroy(l_j2k); |
@@ -8478,7 +8597,7 @@ opj_j2k_t* opj_j2k_create_decompress(void) |
return l_j2k; |
} |
-opj_codestream_index_t* opj_j2k_create_cstr_index(void) |
+static opj_codestream_index_t* opj_j2k_create_cstr_index(void) |
{ |
opj_codestream_index_t* cstr_index = (opj_codestream_index_t*) |
opj_calloc(1,sizeof(opj_codestream_index_t)); |
@@ -8489,15 +8608,17 @@ opj_codestream_index_t* opj_j2k_create_cstr_index(void) |
cstr_index->marknum = 0; |
cstr_index->marker = (opj_marker_info_t*) |
opj_calloc(cstr_index->maxmarknum, sizeof(opj_marker_info_t)); |
- if (!cstr_index-> marker) |
+ if (!cstr_index-> marker) { |
+ opj_free(cstr_index); |
return NULL; |
+ } |
cstr_index->tile_index = NULL; |
return cstr_index; |
} |
-OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size ( opj_j2k_t *p_j2k, |
+static OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size ( opj_j2k_t *p_j2k, |
OPJ_UINT32 p_tile_no, |
OPJ_UINT32 p_comp_no ) |
{ |
@@ -8524,7 +8645,7 @@ OPJ_UINT32 opj_j2k_get_SPCod_SPCoc_size ( opj_j2k_t *p_j2k, |
} |
} |
-OPJ_BOOL opj_j2k_write_SPCod_SPCoc( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_SPCod_SPCoc( opj_j2k_t *p_j2k, |
OPJ_UINT32 p_tile_no, |
OPJ_UINT32 p_comp_no, |
OPJ_BYTE * p_data, |
@@ -8590,7 +8711,7 @@ OPJ_BOOL opj_j2k_write_SPCod_SPCoc( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_read_SPCod_SPCoc( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_read_SPCod_SPCoc( opj_j2k_t *p_j2k, |
OPJ_UINT32 compno, |
OPJ_BYTE * p_header_data, |
OPJ_UINT32 * p_header_size, |
@@ -8713,7 +8834,7 @@ OPJ_BOOL opj_j2k_read_SPCod_SPCoc( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k ) |
+static void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k ) |
{ |
/* loop */ |
OPJ_UINT32 i; |
@@ -8746,7 +8867,7 @@ void opj_j2k_copy_tile_component_parameters( opj_j2k_t *p_j2k ) |
} |
} |
-OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k, |
+static OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k, |
OPJ_UINT32 p_tile_no, |
OPJ_UINT32 p_comp_no ) |
{ |
@@ -8777,7 +8898,7 @@ OPJ_UINT32 opj_j2k_get_SQcd_SQcc_size ( opj_j2k_t *p_j2k, |
} |
} |
-OPJ_BOOL opj_j2k_write_SQcd_SQcc( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_SQcd_SQcc( opj_j2k_t *p_j2k, |
OPJ_UINT32 p_tile_no, |
OPJ_UINT32 p_comp_no, |
OPJ_BYTE * p_data, |
@@ -8850,7 +8971,7 @@ OPJ_BOOL opj_j2k_write_SQcd_SQcc( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k, |
OPJ_UINT32 p_comp_no, |
OPJ_BYTE* p_header_data, |
OPJ_UINT32 * p_header_size, |
@@ -8967,7 +9088,7 @@ OPJ_BOOL opj_j2k_read_SQcd_SQcc(opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k ) |
+static void opj_j2k_copy_tile_quantization_parameters( opj_j2k_t *p_j2k ) |
{ |
OPJ_UINT32 i; |
opj_cp_t *l_cp = NULL; |
@@ -9094,7 +9215,7 @@ void j2k_dump (opj_j2k_t* p_j2k, OPJ_INT32 flag, FILE* out_stream) |
} |
-void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream) |
+static void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream) |
{ |
opj_codestream_index_t* cstr_index = p_j2k->cstr_index; |
OPJ_UINT32 it_marker, it_tile, it_tile_part; |
@@ -9163,7 +9284,7 @@ void opj_j2k_dump_MH_index(opj_j2k_t* p_j2k, FILE* out_stream) |
} |
-void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream) |
+static void opj_j2k_dump_MH_info(opj_j2k_t* p_j2k, FILE* out_stream) |
{ |
fprintf(out_stream, "Codestream info from main header: {\n"); |
@@ -9403,7 +9524,7 @@ opj_codestream_index_t* j2k_get_cstr_index(opj_j2k_t* p_j2k) |
return l_cstr_index; |
} |
-OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k) |
+static OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k) |
{ |
OPJ_UINT32 it_tile=0; |
@@ -9424,7 +9545,7 @@ OPJ_BOOL opj_j2k_allocate_tile_element_cstr_index(opj_j2k_t *p_j2k) |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager) |
{ |
@@ -9443,7 +9564,7 @@ OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k, |
} |
l_max_data_size = 1000; |
- while (OPJ_TRUE) { |
+ for (;;) { |
if (! opj_j2k_read_tile_header( p_j2k, |
&l_current_tile_no, |
&l_data_size, |
@@ -9500,14 +9621,18 @@ OPJ_BOOL opj_j2k_decode_tiles ( opj_j2k_t *p_j2k, |
/** |
* Sets up the procedures to do on decoding data. Developpers wanting to extend the library can add their own reading procedures. |
*/ |
-static void opj_j2k_setup_decoding (opj_j2k_t *p_j2k) |
+static OPJ_BOOL opj_j2k_setup_decoding (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) |
{ |
/* preconditions*/ |
assert(p_j2k != 00); |
+ assert(p_manager != 00); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_tiles); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_tiles, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
/* DEVELOPER CORNER, add your custom procedures */ |
+ return OPJ_TRUE; |
} |
/* |
@@ -9550,14 +9675,14 @@ static OPJ_BOOL opj_j2k_decode_one_tile ( opj_j2k_t *p_j2k, |
* so move to the last SOT read */ |
if ( !(opj_stream_read_seek(p_stream, p_j2k->m_specific_param.m_decoder.m_last_sot_read_pos+2, p_manager)) ){ |
opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n"); |
- opj_free(l_current_data); |
+ opj_free(l_current_data); |
return OPJ_FALSE; |
} |
} |
else{ |
if ( !(opj_stream_read_seek(p_stream, p_j2k->cstr_index->tile_index[l_tile_no_to_dec].tp_index[0].start_pos+2, p_manager)) ) { |
opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n"); |
- opj_free(l_current_data); |
+ opj_free(l_current_data); |
return OPJ_FALSE; |
} |
} |
@@ -9566,7 +9691,7 @@ static OPJ_BOOL opj_j2k_decode_one_tile ( opj_j2k_t *p_j2k, |
p_j2k->m_specific_param.m_decoder.m_state = J2K_STATE_TPHSOT; |
} |
- while (OPJ_TRUE) { |
+ for (;;) { |
if (! opj_j2k_read_tile_header( p_j2k, |
&l_current_tile_no, |
&l_data_size, |
@@ -9615,6 +9740,7 @@ static OPJ_BOOL opj_j2k_decode_one_tile ( opj_j2k_t *p_j2k, |
/* move into the codestream to the the first SOT (FIXME or not move?)*/ |
if (!(opj_stream_read_seek(p_stream, p_j2k->cstr_index->main_head_end + 2, p_manager) ) ) { |
opj_event_msg(p_manager, EVT_ERROR, "Problem with seek function\n"); |
+ opj_free(l_current_data); |
return OPJ_FALSE; |
} |
break; |
@@ -9633,14 +9759,18 @@ static OPJ_BOOL opj_j2k_decode_one_tile ( opj_j2k_t *p_j2k, |
/** |
* Sets up the procedures to do on decoding one tile. Developpers wanting to extend the library can add their own reading procedures. |
*/ |
-static void opj_j2k_setup_decoding_tile (opj_j2k_t *p_j2k) |
+static OPJ_BOOL opj_j2k_setup_decoding_tile (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) |
{ |
/* preconditions*/ |
assert(p_j2k != 00); |
+ assert(p_manager != 00); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_one_tile); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_decode_one_tile, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
/* DEVELOPER CORNER, add your custom procedures */ |
+ return OPJ_TRUE; |
} |
OPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k, |
@@ -9652,7 +9782,7 @@ OPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k, |
if (!p_image) |
return OPJ_FALSE; |
- |
+ |
p_j2k->m_output_image = opj_image_create0(); |
if (! (p_j2k->m_output_image)) { |
return OPJ_FALSE; |
@@ -9660,7 +9790,7 @@ OPJ_BOOL opj_j2k_decode(opj_j2k_t * p_j2k, |
opj_copy_image_header(p_image, p_j2k->m_output_image); |
/* customization of the decoding */ |
- opj_j2k_setup_decoding(p_j2k); |
+ opj_j2k_setup_decoding(p_j2k, p_manager); |
/* Decode the codestream */ |
if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) { |
@@ -9756,7 +9886,7 @@ OPJ_BOOL opj_j2k_get_tile( opj_j2k_t *p_j2k, |
p_j2k->m_specific_param.m_decoder.m_tile_ind_to_dec = (OPJ_INT32)tile_index; |
/* customization of the decoding */ |
- opj_j2k_setup_decoding_tile(p_j2k); |
+ opj_j2k_setup_decoding_tile(p_j2k, p_manager); |
/* Decode the codestream */ |
if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) { |
@@ -9851,7 +9981,6 @@ OPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k, |
} |
return OPJ_FALSE; |
} |
- opj_alloc_tile_component_data(l_tilec); |
} |
} |
l_current_tile_size = opj_tcd_get_encoded_tile_size(p_j2k->m_tcd); |
@@ -9877,11 +10006,15 @@ OPJ_BOOL opj_j2k_encode(opj_j2k_t * p_j2k, |
/* now copy this data into the tile component */ |
if (! opj_tcd_copy_tile_data(p_j2k->m_tcd,l_current_data,l_current_tile_size)) { |
opj_event_msg(p_manager, EVT_ERROR, "Size mismatch between tile data and sent data." ); |
+ opj_free(l_current_data); |
return OPJ_FALSE; |
} |
} |
if (! opj_j2k_post_write_tile (p_j2k,p_stream,p_manager)) { |
+ if (l_current_data) { |
+ opj_free(l_current_data); |
+ } |
return OPJ_FALSE; |
} |
} |
@@ -9897,7 +10030,9 @@ OPJ_BOOL opj_j2k_end_compress( opj_j2k_t *p_j2k, |
opj_event_mgr_t * p_manager) |
{ |
/* customization of the encoding */ |
- opj_j2k_setup_end_compress(p_j2k); |
+ if (! opj_j2k_setup_end_compress(p_j2k, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
if (! opj_j2k_exec (p_j2k, p_j2k->m_procedure_list, p_stream, p_manager)) |
{ |
@@ -9937,7 +10072,9 @@ OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k, |
} |
/* customization of the validation */ |
- opj_j2k_setup_encoding_validation (p_j2k); |
+ if (! opj_j2k_setup_encoding_validation (p_j2k, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
/* validation of the parameters codec */ |
if (! opj_j2k_exec(p_j2k,p_j2k->m_validation_list,p_stream,p_manager)) { |
@@ -9945,7 +10082,9 @@ OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k, |
} |
/* customization of the encoding */ |
- opj_j2k_setup_header_writing(p_j2k); |
+ if (! opj_j2k_setup_header_writing(p_j2k, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
/* write header */ |
if (! opj_j2k_exec (p_j2k,p_j2k->m_procedure_list,p_stream,p_manager)) { |
@@ -9955,7 +10094,7 @@ OPJ_BOOL opj_j2k_start_compress(opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k, |
+static OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k, |
OPJ_UINT32 p_tile_index, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
@@ -9973,14 +10112,14 @@ OPJ_BOOL opj_j2k_pre_write_tile ( opj_j2k_t * p_j2k, |
p_j2k->m_specific_param.m_encoder.m_current_poc_tile_part_number = 0; |
/* initialisation before tile encoding */ |
- if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number)) { |
+ if (! opj_tcd_init_encode_tile(p_j2k->m_tcd, p_j2k->m_current_tile_number, p_manager)) { |
return OPJ_FALSE; |
} |
return OPJ_TRUE; |
} |
-void opj_get_tile_dimensions(opj_image_t * l_image, |
+static void opj_get_tile_dimensions(opj_image_t * l_image, |
opj_tcd_tilecomp_t * l_tilec, |
opj_image_comp_t * l_img_comp, |
OPJ_UINT32* l_size_comp, |
@@ -10011,7 +10150,7 @@ void opj_get_tile_dimensions(opj_image_t * l_image, |
*l_tile_offset = ((OPJ_UINT32)l_tilec->x0 - *l_offset_x) + ((OPJ_UINT32)l_tilec->y0 - *l_offset_y) * *l_image_width; |
} |
-void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data) |
+static void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data) |
{ |
OPJ_UINT32 i,j,k = 0; |
@@ -10104,7 +10243,7 @@ void opj_j2k_get_tile_data (opj_tcd_t * p_tcd, OPJ_BYTE * p_data) |
} |
} |
-OPJ_BOOL opj_j2k_post_write_tile ( opj_j2k_t * p_j2k, |
+static OPJ_BOOL opj_j2k_post_write_tile ( opj_j2k_t * p_j2k, |
opj_stream_private_t *p_stream, |
opj_event_mgr_t * p_manager ) |
{ |
@@ -10146,79 +10285,133 @@ OPJ_BOOL opj_j2k_post_write_tile ( opj_j2k_t * p_j2k, |
return OPJ_TRUE; |
} |
-void opj_j2k_setup_end_compress (opj_j2k_t *p_j2k) |
+static OPJ_BOOL opj_j2k_setup_end_compress (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) |
{ |
/* preconditions */ |
assert(p_j2k != 00); |
+ assert(p_manager != 00); |
/* DEVELOPER CORNER, insert your custom procedures */ |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_eoc ); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_eoc, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) { |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_updated_tlm); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_updated_tlm, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
} |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_epc ); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_end_encoding ); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_destroy_header_memory); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_epc, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_end_encoding, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_destroy_header_memory, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ return OPJ_TRUE; |
} |
-void opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k) |
+static OPJ_BOOL opj_j2k_setup_encoding_validation (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) |
{ |
/* preconditions */ |
assert(p_j2k != 00); |
+ assert(p_manager != 00); |
- opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_encoder); |
- opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_encoding_validation); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_build_encoder, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_encoding_validation, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
/* DEVELOPER CORNER, add your custom validation procedure */ |
- opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_mct_validation); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_validation_list, (opj_procedure)opj_j2k_mct_validation, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ |
+ return OPJ_TRUE; |
} |
-void opj_j2k_setup_header_writing (opj_j2k_t *p_j2k) |
+static OPJ_BOOL opj_j2k_setup_header_writing (opj_j2k_t *p_j2k, opj_event_mgr_t * p_manager) |
{ |
/* preconditions */ |
assert(p_j2k != 00); |
+ assert(p_manager != 00); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_init_info ); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_soc ); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_siz ); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_cod ); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_qcd ); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_init_info, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_soc, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_siz, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_cod, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_qcd, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
if (OPJ_IS_CINEMA(p_j2k->m_cp.rsiz)) { |
/* No need for COC or QCC, QCD and COD are used |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_coc ); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_qcc ); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_coc, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_all_qcc, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
*/ |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_tlm ); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_tlm, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
if (p_j2k->m_cp.rsiz == OPJ_PROFILE_CINEMA_4K) { |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_poc ); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_poc, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
} |
} |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_regions); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_regions, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
if (p_j2k->m_cp.comment != 00) { |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_com); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_com, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
} |
/* DEVELOPER CORNER, insert your custom procedures */ |
if (p_j2k->m_cp.rsiz & OPJ_EXTENSION_MCT) { |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_mct_data_group ); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_write_mct_data_group, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
} |
/* End of Developer Corner */ |
if (p_j2k->cstr_index) { |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_get_end_header ); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_get_end_header, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
} |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_create_tcd); |
- opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_update_rates); |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_create_tcd, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ if (! opj_procedure_list_add_procedure(p_j2k->m_procedure_list,(opj_procedure)opj_j2k_update_rates, p_manager)) { |
+ return OPJ_FALSE; |
+ } |
+ |
+ return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_first_tile_part (opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_first_tile_part (opj_j2k_t *p_j2k, |
OPJ_BYTE * p_data, |
OPJ_UINT32 * p_data_written, |
OPJ_UINT32 p_total_data_size, |
@@ -10298,7 +10491,7 @@ OPJ_BOOL opj_j2k_write_first_tile_part (opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_all_tile_parts( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_all_tile_parts( opj_j2k_t *p_j2k, |
OPJ_BYTE * p_data, |
OPJ_UINT32 * p_data_written, |
OPJ_UINT32 p_total_data_size, |
@@ -10409,7 +10602,7 @@ OPJ_BOOL opj_j2k_write_all_tile_parts( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
{ |
@@ -10440,7 +10633,7 @@ OPJ_BOOL opj_j2k_write_updated_tlm( opj_j2k_t *p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_end_encoding( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_end_encoding( opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
{ |
@@ -10491,7 +10684,7 @@ static OPJ_BOOL opj_j2k_destroy_header_memory ( opj_j2k_t * p_j2k, |
return OPJ_TRUE; |
} |
-OPJ_BOOL opj_j2k_init_info( opj_j2k_t *p_j2k, |
+static OPJ_BOOL opj_j2k_init_info( opj_j2k_t *p_j2k, |
struct opj_stream_private *p_stream, |
struct opj_event_mgr * p_manager ) |
{ |