]> Creatis software - gdcm.git/blobdiff - src/jpeg/libijg/jctrans.c
ENH: * Finished lossless transition, not only do we now read all lossless jpeg
[gdcm.git] / src / jpeg / libijg / jctrans.c
index b84f1d8464213351984d9cee446878fca43d4a1c..0c94656a68411784d1e076f23056e28514947386 100644 (file)
 #define JPEG_INTERNALS
 #include "jinclude.h"
 #include "jpeglib.h"
+#include "jlossy.h"    /* Private declarations for lossy codec */
 
 
 /* Forward declarations */
 LOCAL(void) transencode_master_selection
   JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
+LOCAL(void) transencode_codec
+  JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
 LOCAL(void) transencode_coef_controller
   JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays));
 
@@ -158,6 +161,7 @@ LOCAL(void)
 transencode_master_selection (j_compress_ptr cinfo,
             jvirt_barray_ptr * coef_arrays)
 {
+  cinfo->data_unit = DCTSIZE;
   /* Although we don't actually use input_components for transcoding,
    * jcmaster.c's initial_setup will complain if input_components is 0.
    */
@@ -165,22 +169,8 @@ transencode_master_selection (j_compress_ptr cinfo,
   /* Initialize master control (includes parameter checking/processing) */
   jinit_c_master_control(cinfo, TRUE /* transcode only */);
 
-  /* Entropy encoding: either Huffman or arithmetic coding. */
-  if (cinfo->arith_code) {
-    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
-  } else {
-    if (cinfo->progressive_mode) {
-#ifdef C_PROGRESSIVE_SUPPORTED
-      jinit_phuff_encoder(cinfo);
-#else
-      ERREXIT(cinfo, JERR_NOT_COMPILED);
-#endif
-    } else
-      jinit_huff_encoder(cinfo);
-  }
-
-  /* We need a special coefficient buffer controller. */
-  transencode_coef_controller(cinfo, coef_arrays);
+  /* We need a special compression codec. */
+  transencode_codec(cinfo, coef_arrays);
 
   jinit_marker_writer(cinfo);
 
@@ -206,8 +196,6 @@ transencode_master_selection (j_compress_ptr cinfo,
 /* Private buffer controller object */
 
 typedef struct {
-  struct jpeg_c_coef_controller pub; /* public fields */
-
   JDIMENSION iMCU_row_num;  /* iMCU row # within image */
   JDIMENSION mcu_ctr;    /* counts MCUs processed in current row */
   int MCU_vert_offset;    /* counts MCU rows within iMCU row */
@@ -217,17 +205,18 @@ typedef struct {
   jvirt_barray_ptr * whole_image;
 
   /* Workspace for constructing dummy blocks at right/bottom edges. */
-  JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU];
-} my_coef_controller;
+  JBLOCKROW dummy_buffer[C_MAX_DATA_UNITS_IN_MCU];
+} c_coef_controller;
 
-typedef my_coef_controller * my_coef_ptr;
+typedef c_coef_controller * c_coef_ptr;
 
 
 LOCAL(void)
 start_iMCU_row (j_compress_ptr cinfo)
 /* Reset within-iMCU-row counters for a new row */
 {
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  j_lossy_c_ptr lossyc = (j_lossy_c_ptr) cinfo->codec;
+  c_coef_ptr coef = (c_coef_ptr) lossyc->coef_private;
 
   /* In an interleaved scan, an MCU row is the same as an iMCU row.
    * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
@@ -254,7 +243,8 @@ start_iMCU_row (j_compress_ptr cinfo)
 METHODDEF(void)
 start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
 {
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  j_lossy_c_ptr lossyc = (j_lossy_c_ptr) cinfo->codec;
+  c_coef_ptr coef = (c_coef_ptr) lossyc->coef_private;
 
   if (pass_mode != JBUF_CRANK_DEST)
     ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
@@ -277,18 +267,18 @@ start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
 METHODDEF(boolean)
 compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
 {
-  my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
+  j_lossy_c_ptr lossyc = (j_lossy_c_ptr) cinfo->codec;
+  c_coef_ptr coef = (c_coef_ptr) lossyc->coef_private;
   JDIMENSION MCU_col_num;  /* index of current MCU within row */
   JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
   JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
   int blkn, ci, xindex, yindex, yoffset, blockcnt;
   JDIMENSION start_col;
   JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
-  JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
+  JBLOCKROW MCU_buffer[C_MAX_DATA_UNITS_IN_MCU];
   JBLOCKROW buffer_ptr;
   jpeg_component_info *compptr;
-
-  input_buf = 0;
+  (void)input_buf;
 
   /* Align the virtual buffers for the components used in this scan. */
   for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
@@ -336,7 +326,7 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
   }
       }
       /* Try to write the MCU. */
-      if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) {
+      if (! (*lossyc->entropy_encode_mcu) (cinfo, MCU_buffer)) {
   /* Suspension forced; update state counters and exit */
   coef->MCU_vert_offset = yoffset;
   coef->mcu_ctr = MCU_col_num;
@@ -357,7 +347,7 @@ compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
  * Initialize coefficient buffer controller.
  *
  * Each passed coefficient array must be the right size for that
- * coefficient: width_in_blocks wide and height_in_blocks high,
+ * coefficient: width_in_data_units wide and height_in_data_units high,
  * with unitheight at least v_samp_factor.
  */
 
@@ -365,16 +355,15 @@ LOCAL(void)
 transencode_coef_controller (j_compress_ptr cinfo,
            jvirt_barray_ptr * coef_arrays)
 {
-  my_coef_ptr coef;
+  j_lossy_c_ptr lossyc = (j_lossy_c_ptr) cinfo->codec;
+  c_coef_ptr coef;
   JBLOCKROW buffer;
   int i;
 
-  coef = (my_coef_ptr)
+  coef = (c_coef_ptr)
     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-        SIZEOF(my_coef_controller));
-  cinfo->coef = (struct jpeg_c_coef_controller *) coef;
-  coef->pub.start_pass = start_pass_coef;
-  coef->pub.compress_data = compress_output;
+        SIZEOF(c_coef_controller));
+  lossyc->coef_private = (struct jpeg_c_coef_controller *) coef;
 
   /* Save pointer to virtual arrays */
   coef->whole_image = coef_arrays;
@@ -382,9 +371,51 @@ transencode_coef_controller (j_compress_ptr cinfo,
   /* Allocate and pre-zero space for dummy DCT blocks. */
   buffer = (JBLOCKROW)
     (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-        C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
-  jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
-  for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
+        C_MAX_DATA_UNITS_IN_MCU * SIZEOF(JBLOCK));
+  jzero_far((void FAR *) buffer, C_MAX_DATA_UNITS_IN_MCU * SIZEOF(JBLOCK));
+  for (i = 0; i < C_MAX_DATA_UNITS_IN_MCU; i++) {
     coef->dummy_buffer[i] = buffer + i;
   }
 }
+
+
+/*
+ * Initialize the transencoer codec.
+ * This is called only once, during master selection.
+ */
+
+LOCAL(void)
+transencode_codec (j_compress_ptr cinfo,
+       jvirt_barray_ptr * coef_arrays)
+{
+  j_lossy_c_ptr lossyc;
+
+  /* Create subobject in permanent pool */
+  lossyc = (j_lossy_c_ptr)
+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
+        SIZEOF(jpeg_lossy_c_codec));
+  cinfo->codec = (struct jpeg_c_codec *) lossyc;
+
+  /* Initialize sub-modules */
+
+  /* Entropy encoding: either Huffman or arithmetic coding. */
+  if (cinfo->arith_code) {
+    jinit_arith_encoder(cinfo);
+  } else {
+    if (cinfo->process == JPROC_PROGRESSIVE) {
+#ifdef C_PROGRESSIVE_SUPPORTED
+      jinit_phuff_encoder(cinfo);
+#else
+      ERREXIT(cinfo, JERR_NOT_COMPILED);
+#endif
+    } else
+      jinit_shuff_encoder(cinfo);
+  }
+
+  /* We need a special coefficient buffer controller. */
+  transencode_coef_controller(cinfo, coef_arrays);
+
+  /* Initialize method pointers */
+  lossyc->pub.start_pass = start_pass_coef;
+  lossyc->pub.compress_data = compress_output;
+}