]> granicus.if.org Git - openjpeg/commitdiff
[trunk] WIP: add a read MCT marker function (JPEG2000 part 2)
authorMickael Savinaud <savmickael@users.noreply.github.com>
Wed, 12 Oct 2011 14:30:22 +0000 (14:30 +0000)
committerMickael Savinaud <savmickael@users.noreply.github.com>
Wed, 12 Oct 2011 14:30:22 +0000 (14:30 +0000)
CHANGES
libopenjpeg/j2k.c
libopenjpeg/j2k.h

diff --git a/CHANGES b/CHANGES
index 075486249b3d99701a97f02e970430c61be0a33b..2e0471e53cda1fac11b239643aa0f426ec9595c9 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -5,6 +5,9 @@ What's New for OpenJPEG
 ! : changed
 + : added
 
+October 12, 2011
++ [mickael] WIP: add a read MCT marker function (part 2) 
+
 October 11, 2011
 * [mickael] WIP: correct a segfault inside j2k_dump output
 * [mickael] WIP: correct some segfault with win platform and remove a aligned allocation which produce error when a realloc is done on this pointer.
index bd429af0c7768483fd966d61be7a14cda770be25..7b1a7ff516f77d306f923a8098eeab028244b60c 100644 (file)
@@ -699,6 +699,20 @@ static opj_bool j2k_read_unk_v2 (  opj_j2k_v2_t *p_j2k,
                                                                        OPJ_UINT32 *output_marker,
                                                                        struct opj_event_mgr * p_manager );
 
+/**
+ * Reads a MCT marker (Multiple Component Transform)
+ *
+ * @param      p_header_data   the data contained in the MCT box.
+ * @param      p_j2k                   the jpeg2000 codec.
+ * @param      p_header_size   the size of the data contained in the MCT marker.
+ * @param      p_manager               the user event manager.
+*/
+static opj_bool j2k_read_mct ( opj_j2k_v2_t *p_j2k,
+                                                               OPJ_BYTE * p_header_data,
+                                                               OPJ_UINT32 p_header_size,
+                                                               struct opj_event_mgr * p_manager );
+
+
 /**
  * Copy the image header from the jpeg2000 codec into an external image_header
  *
@@ -735,6 +749,17 @@ j2k_prog_order_t j2k_prog_order_list[] = {
        {(OPJ_PROG_ORDER)-1, ""}
 };
 
+/**
+ * FIXME DOC
+ */
+const OPJ_UINT32 MCT_ELEMENT_SIZE [] =
+{
+       2,
+       4,
+       4,
+       8
+};
+
 typedef struct opj_dec_memory_marker_handler
 {
        /** marker value */
@@ -791,12 +816,10 @@ const opj_dec_memory_marker_handler_t j2k_memory_marker_handler_tab [] =
   {J2K_MS_SOP, 0, 0},
   {J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg_v2},
   {J2K_MS_COM, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_com_v2},
-#ifdef TODO_MS /* FIXME */
   {J2K_MS_MCT, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_mct},
-  {J2K_MS_CBD, J2K_STATE_MH , j2k_read_cbd},
/*FIXME MSD  {J2K_MS_CBD, J2K_STATE_MH , j2k_read_cbd},
   {J2K_MS_MCC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_mcc},
-  {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_mco},
-#endif
+  {J2K_MS_MCO, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_mco}, */
 #ifdef USE_JPWL
 #ifdef TODO_MS /* FIXME */
   {J2K_MS_EPC, J2K_STATE_MH | J2K_STATE_TPH, j2k_read_epc},
@@ -4032,6 +4055,116 @@ static opj_dec_mstabent_t *j2k_dec_mstab_lookup(int id) {
        return e;
 }
 
+
+/**
+ * Reads a MCT marker (Multiple Component Transform)
+ *
+ * @param      p_header_data   the data contained in the MCT box.
+ * @param      p_j2k                   the jpeg2000 codec.
+ * @param      p_header_size   the size of the data contained in the MCT marker.
+ * @param      p_manager               the user event manager.
+*/
+opj_bool j2k_read_mct (        opj_j2k_v2_t *p_j2k,
+                                               OPJ_BYTE * p_header_data,
+                                               OPJ_UINT32 p_header_size,
+                                               struct opj_event_mgr * p_manager )
+{
+       OPJ_UINT32 i;
+       opj_tcp_v2_t *l_tcp = 00;
+       OPJ_UINT32 l_tmp;
+       OPJ_UINT32 l_indix;
+       opj_mct_data_t * l_mct_data;
+
+       /* preconditions */
+       assert(p_header_data != 00);
+       assert(p_j2k != 00);
+
+       l_tcp = p_j2k->m_specific_param.m_decoder.m_state == J2K_STATE_TPH ?
+                       &p_j2k->m_cp.tcps[p_j2k->m_current_tile_number] :
+                       p_j2k->m_specific_param.m_decoder.m_default_tcp;
+
+       if (p_header_size < 2) {
+               opj_event_msg_v2(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+               return OPJ_FALSE;
+       }
+
+       /* first marker */
+       opj_read_bytes(p_header_data,&l_tmp,2);                         /* Zmct */
+       p_header_data += 2;
+       if (l_tmp != 0) {
+               opj_event_msg_v2(p_manager, EVT_WARNING, "Cannot take in charge mct data within multiple MCT records\n");
+               return OPJ_TRUE;
+       }
+
+       if(p_header_size <= 6) {
+               opj_event_msg_v2(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+               return OPJ_FALSE;
+       }
+
+       /* Imct -> no need for other values, take the first, type is double with decorrelation x0000 1101 0000 0000*/
+       opj_read_bytes(p_header_data,&l_tmp,2);                         /* Imct */
+       p_header_data += 2;
+
+       l_indix = l_tmp & 0xff;
+       l_mct_data = l_tcp->m_mct_records;
+
+       for (i=0;i<l_tcp->m_nb_mct_records;++i) {
+               if (l_mct_data->m_index == l_indix) {
+                       break;
+               }
+               ++l_mct_data;
+       }
+
+       /* NOT FOUND */
+       if (i == l_tcp->m_nb_mct_records) {
+               if (l_tcp->m_nb_mct_records == l_tcp->m_nb_max_mct_records) {
+                       l_tcp->m_nb_max_mct_records += J2K_MCT_DEFAULT_NB_RECORDS;
+
+                       l_tcp->m_mct_records = (opj_mct_data_t*)opj_realloc(l_tcp->m_mct_records,l_tcp->m_nb_max_mct_records * sizeof(opj_mct_data_t));
+                       if(! l_tcp->m_mct_records) {
+                               opj_event_msg_v2(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+                               return OPJ_FALSE;
+                       }
+
+                       l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
+                       memset(l_mct_data ,0,(l_tcp->m_nb_max_mct_records - l_tcp->m_nb_mct_records) * sizeof(opj_mct_data_t));
+               }
+
+               l_mct_data = l_tcp->m_mct_records + l_tcp->m_nb_mct_records;
+       }
+
+       if (l_mct_data->m_data) {
+               opj_free(l_mct_data->m_data);
+               l_mct_data->m_data = 00;
+       }
+
+       l_mct_data->m_index = l_indix;
+       l_mct_data->m_array_type = (J2K_MCT_ARRAY_TYPE)((l_tmp  >> 8) & 3);
+       l_mct_data->m_element_type = (J2K_MCT_ELEMENT_TYPE)((l_tmp  >> 10) & 3);
+
+       opj_read_bytes(p_header_data,&l_tmp,2);                         /* Ymct */
+       p_header_data+=2;
+       if (l_tmp != 0) {
+               opj_event_msg_v2(p_manager, EVT_WARNING, "Cannot take in charge multiple MCT markers\n");
+               return OPJ_TRUE;
+       }
+
+       p_header_size -= 6;
+
+       l_mct_data->m_data = (OPJ_BYTE*)opj_malloc(p_header_size);
+       if (! l_mct_data->m_data) {
+               opj_event_msg_v2(p_manager, EVT_ERROR, "Error reading MCT marker\n");
+               return OPJ_FALSE;
+       }
+       memcpy(l_mct_data->m_data,p_header_data,p_header_size);
+
+       l_mct_data->m_data_size = p_header_size;
+       ++l_tcp->m_nb_mct_records;
+
+       return OPJ_TRUE;
+}
+
+
 /* ----------------------------------------------------------------------- */
 /* J2K / JPT decoder interface                                             */
 /* ----------------------------------------------------------------------- */
index 270232aa0407fbb49fd58dd4820348349e7a2c6c..c4b098084e92ae1260ff1b37e7d1a416f8df8317 100644 (file)
@@ -77,15 +77,12 @@ The functions in J2K.C have for goal to read/write the several parts of the code
 #define J2K_MS_EPH 0xff92      /**< EPH marker value */
 #define J2K_MS_CRG 0xff63      /**< CRG marker value */
 #define J2K_MS_COM 0xff64      /**< COM marker value */
-
-#define J2K_MS_UNK 0           /**< UNKNOWN marker value */
-
-#ifdef TODO_MS /* FIXME */
 #define J2K_MS_CBD 0xff78      /**< CBD marker value */
 #define J2K_MS_MCC 0xff75      /**< MCC marker value */
 #define J2K_MS_MCT 0xff74      /**< MCT marker value */
 #define J2K_MS_MCO 0xff77      /**< MCO marker value */
-#endif
+
+#define J2K_MS_UNK 0           /**< UNKNOWN marker value */
 
 /* UniPG>> */
 #ifdef USE_JPWL
@@ -122,6 +119,27 @@ typedef enum J2K_STATUS {
        J2K_STATE_ERR    = 0x8000 /**< the decoding process has encountered an error (FIXME warning V1 = 0x0080)*/
 } J2K_STATUS;
 
+/**
+ * Type of elements storing in the MCT data
+ */
+typedef enum MCT_ELEMENT_TYPE
+{
+       MCT_TYPE_INT16 = 0,             /** MCT data is stored as signed shorts*/
+       MCT_TYPE_INT32 = 1,             /** MCT data is stored as signed integers*/
+       MCT_TYPE_FLOAT = 2,             /** MCT data is stored as floats*/
+       MCT_TYPE_DOUBLE = 3             /** MCT data is stored as doubles*/
+} J2K_MCT_ELEMENT_TYPE;
+
+/**
+ * Type of MCT array
+ */
+typedef enum MCT_ARRAY_TYPE
+{
+       MCT_TYPE_DEPENDENCY = 0,
+       MCT_TYPE_DECORRELATION = 1,
+       MCT_TYPE_OFFSET = 2
+} J2K_MCT_ARRAY_TYPE;
+
 /* ----------------------------------------------------------------------- */
 
 /** 
@@ -247,28 +265,9 @@ typedef struct opj_tcp {
        opj_tccp_t *tccps;
 } opj_tcp_t;
 
-
-/**
- * Type of data for storing the MCT data
- */
-typedef enum MCT_ELEMENT_TYPE
-{
-       MCT_TYPE_INT16 = 0,             /** MCT data is stored as signed shorts*/
-       MCT_TYPE_INT32 = 1,             /** MCT data is stored as signed integers*/
-       MCT_TYPE_FLOAT = 2,             /** MCT data is stored as floats*/
-       MCT_TYPE_DOUBLE = 3             /** MCT data is stored as doubles*/
-} J2K_MCT_ELEMENT_TYPE;
-
 /**
- * Type of data for storing the MCT data
+ * FIXME DOC
  */
-typedef enum MCT_ARRAY_TYPE
-{
-       MCT_TYPE_DEPENDENCY = 0,
-       MCT_TYPE_DECORRELATION = 1,
-       MCT_TYPE_OFFSET = 2
-} J2K_MCT_ARRAY_TYPE;
-
 typedef struct opj_mct_data
 {
        J2K_MCT_ELEMENT_TYPE m_element_type;
@@ -279,6 +278,9 @@ typedef struct opj_mct_data
 }
 opj_mct_data_t;
 
+/**
+ * FIXME DOC
+ */
 typedef struct opj_simple_mcc_decorrelation_data
 {
        OPJ_UINT32                       m_index;