Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

jdmainct.c File Reference

#include "jinclude.h"
#include "jpeglib.h"

Go to the source code of this file.


Data Structures

struct  my_main_controller

Defines

#define JPEG_INTERNALS
#define CTX_PREPARE_FOR_IMCU   0
#define CTX_PROCESS_IMCU   1
#define CTX_POSTPONED_ROW   2

Typedefs

typedef my_main_controllermy_main_ptr

Functions

 METHODDEF (void) process_data_simple_main JPP((j_decompress_ptr cinfo
 alloc_funny_pointers (j_decompress_ptr cinfo)
 make_funny_pointers (j_decompress_ptr cinfo)
 set_wraparound_pointers (j_decompress_ptr cinfo)
 set_bottom_pointers (j_decompress_ptr cinfo)
 start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
 process_data_simple_main (j_decompress_ptr cinfo, JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)
 process_data_context_main (j_decompress_ptr cinfo, JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)
 process_data_crank_post (j_decompress_ptr cinfo, JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)
 jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)

Variables

JSAMPARRAY output_buf
JSAMPARRAY JDIMENSIONout_row_ctr
JSAMPARRAY JDIMENSION JDIMENSION out_rows_avail

Define Documentation

#define CTX_POSTPONED_ROW   2
 

Definition at line 139 of file jdmainct.c.

Referenced by process_data_context_main().

#define CTX_PREPARE_FOR_IMCU   0
 

Definition at line 137 of file jdmainct.c.

Referenced by process_data_context_main(), and start_pass_main().

#define CTX_PROCESS_IMCU   1
 

Definition at line 138 of file jdmainct.c.

Referenced by process_data_context_main().

#define JPEG_INTERNALS
 

Definition at line 16 of file jdmainct.c.


Typedef Documentation

typedef my_main_controller* my_main_ptr
 

Definition at line 134 of file jdmainct.c.


Function Documentation

alloc_funny_pointers j_decompress_ptr    cinfo
 

Definition at line 157 of file jdmainct.c.

References compptr, jpeg_component_info::DCT_scaled_size, JPOOL_IMAGE, JSAMPARRAY, JSAMPROW, jpeg_decompress_struct::main, jpeg_decompress_struct::min_DCT_scaled_size, SIZEOF, jpeg_component_info::v_samp_factor, and my_main_controller::xbuffer.

Referenced by jinit_d_main_controller().

00161 {
00162   my_main_ptr main = (my_main_ptr) cinfo->main;
00163   int ci, rgroup;
00164   int M = cinfo->min_DCT_scaled_size;
00165   jpeg_component_info *compptr;
00166   JSAMPARRAY xbuf;
00167 
00168   /* Get top-level space for component array pointers.
00169    * We alloc both arrays with one call to save a few cycles.
00170    */
00171   main->xbuffer[0] = (JSAMPIMAGE)
00172     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
00173                                 cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
00174   main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components;
00175 
00176   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
00177        ci++, compptr++) {
00178     rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
00179       cinfo->min_DCT_scaled_size; /* height of a row group of component */
00180     /* Get space for pointer lists --- M+4 row groups in each list.
00181      * We alloc both pointer lists with one call to save a few cycles.
00182      */
00183     xbuf = (JSAMPARRAY)
00184       (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
00185                                   2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
00186     xbuf += rgroup;             /* want one row group at negative offsets */
00187     main->xbuffer[0][ci] = xbuf;
00188     xbuf += rgroup * (M + 4);
00189     main->xbuffer[1][ci] = xbuf;
00190   }
00191 }

jinit_d_main_controller j_decompress_ptr    cinfo,
boolean    need_full_buffer
 

Definition at line 476 of file jdmainct.c.

References alloc_funny_pointers(), compptr, jpeg_component_info::DCT_scaled_size, ERREXIT, JPOOL_IMAGE, need_full_buffer, SIZEOF, start_pass_main(), jpeg_component_info::v_samp_factor, and jpeg_component_info::width_in_blocks.

Referenced by master_selection().

00477 {
00478   my_main_ptr main;
00479   int ci, rgroup, ngroups;
00480   jpeg_component_info *compptr;
00481 
00482   main = (my_main_ptr)
00483     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
00484                                 SIZEOF(my_main_controller));
00485   cinfo->main = (struct jpeg_d_main_controller *) main;
00486   main->pub.start_pass = start_pass_main;
00487 
00488   if (need_full_buffer)         /* shouldn't happen */
00489     ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00490 
00491   /* Allocate the workspace.
00492    * ngroups is the number of row groups we need.
00493    */
00494   if (cinfo->upsample->need_context_rows) {
00495     if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */
00496       ERREXIT(cinfo, JERR_NOTIMPL);
00497     alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */
00498     ngroups = cinfo->min_DCT_scaled_size + 2;
00499   } else {
00500     ngroups = cinfo->min_DCT_scaled_size;
00501   }
00502 
00503   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
00504        ci++, compptr++) {
00505     rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
00506       cinfo->min_DCT_scaled_size; /* height of a row group of component */
00507     main->buffer[ci] = (*cinfo->mem->alloc_sarray)
00508                         ((j_common_ptr) cinfo, JPOOL_IMAGE,
00509                          compptr->width_in_blocks * compptr->DCT_scaled_size,
00510                          (JDIMENSION) (rgroup * ngroups));
00511   }
00512 }

make_funny_pointers j_decompress_ptr    cinfo
 

Definition at line 195 of file jdmainct.c.

References my_main_controller::buffer, jpeg_decompress_struct::comp_info, compptr, jpeg_component_info::DCT_scaled_size, i, JSAMPARRAY, jpeg_decompress_struct::main, jpeg_decompress_struct::min_DCT_scaled_size, jpeg_decompress_struct::num_components, jpeg_component_info::v_samp_factor, and my_main_controller::xbuffer.

Referenced by start_pass_main().

00202 {
00203   my_main_ptr main = (my_main_ptr) cinfo->main;
00204   int ci, i, rgroup;
00205   int M = cinfo->min_DCT_scaled_size;
00206   jpeg_component_info *compptr;
00207   JSAMPARRAY buf, xbuf0, xbuf1;
00208 
00209   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
00210        ci++, compptr++) {
00211     rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
00212       cinfo->min_DCT_scaled_size; /* height of a row group of component */
00213     xbuf0 = main->xbuffer[0][ci];
00214     xbuf1 = main->xbuffer[1][ci];
00215     /* First copy the workspace pointers as-is */
00216     buf = main->buffer[ci];
00217     for (i = 0; i < rgroup * (M + 2); i++) {
00218       xbuf0[i] = xbuf1[i] = buf[i];
00219     }
00220     /* In the second list, put the last four row groups in swapped order */
00221     for (i = 0; i < rgroup * 2; i++) {
00222       xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i];
00223       xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i];
00224     }
00225     /* The wraparound pointers at top and bottom will be filled later
00226      * (see set_wraparound_pointers, below).  Initially we want the "above"
00227      * pointers to duplicate the first actual data line.  This only needs
00228      * to happen in xbuffer[0].
00229      */
00230     for (i = 0; i < rgroup; i++) {
00231       xbuf0[i - rgroup] = xbuf0[0];
00232     }
00233   }
00234 }

METHODDEF void   
 

process_data_context_main j_decompress_ptr    cinfo,
JSAMPARRAY    output_buf,
JDIMENSION   out_row_ctr,
JDIMENSION    out_rows_avail
 

Definition at line 385 of file jdmainct.c.

References my_main_controller::buffer_full, jpeg_decompress_struct::coef, my_main_controller::context_state, CTX_POSTPONED_ROW, CTX_PREPARE_FOR_IMCU, CTX_PROCESS_IMCU, my_main_controller::iMCU_row_ctr, JDIMENSION, JSAMPARRAY, jpeg_decompress_struct::main, jpeg_decompress_struct::min_DCT_scaled_size, output_buf, jpeg_decompress_struct::post, my_main_controller::rowgroup_ctr, my_main_controller::rowgroups_avail, set_bottom_pointers(), set_wraparound_pointers(), jpeg_decompress_struct::total_iMCU_rows, my_main_controller::whichptr, and my_main_controller::xbuffer.

Referenced by start_pass_main().

00388 {
00389   my_main_ptr main = (my_main_ptr) cinfo->main;
00390 
00391   /* Read input data if we haven't filled the main buffer yet */
00392   if (! main->buffer_full) {
00393     if (! (*cinfo->coef->decompress_data) (cinfo,
00394                                            main->xbuffer[main->whichptr]))
00395       return;                   /* suspension forced, can do nothing more */
00396     main->buffer_full = TRUE;   /* OK, we have an iMCU row to work with */
00397     main->iMCU_row_ctr++;       /* count rows received */
00398   }
00399 
00400   /* Postprocessor typically will not swallow all the input data it is handed
00401    * in one call (due to filling the output buffer first).  Must be prepared
00402    * to exit and restart.  This switch lets us keep track of how far we got.
00403    * Note that each case falls through to the next on successful completion.
00404    */
00405   switch (main->context_state) {
00406   case CTX_POSTPONED_ROW:
00407     /* Call postprocessor using previously set pointers for postponed row */
00408     (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
00409                         &main->rowgroup_ctr, main->rowgroups_avail,
00410                         output_buf, out_row_ctr, out_rows_avail);
00411     if (main->rowgroup_ctr < main->rowgroups_avail)
00412       return;                   /* Need to suspend */
00413     main->context_state = CTX_PREPARE_FOR_IMCU;
00414     if (*out_row_ctr >= out_rows_avail)
00415       return;                   /* Postprocessor exactly filled output buf */
00416     /*FALLTHROUGH*/
00417   case CTX_PREPARE_FOR_IMCU:
00418     /* Prepare to process first M-1 row groups of this iMCU row */
00419     main->rowgroup_ctr = 0;
00420     main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1);
00421     /* Check for bottom of image: if so, tweak pointers to "duplicate"
00422      * the last sample row, and adjust rowgroups_avail to ignore padding rows.
00423      */
00424     if (main->iMCU_row_ctr == cinfo->total_iMCU_rows)
00425       set_bottom_pointers(cinfo);
00426     main->context_state = CTX_PROCESS_IMCU;
00427     /*FALLTHROUGH*/
00428   case CTX_PROCESS_IMCU:
00429     /* Call postprocessor using previously set pointers */
00430     (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
00431                         &main->rowgroup_ctr, main->rowgroups_avail,
00432                         output_buf, out_row_ctr, out_rows_avail);
00433     if (main->rowgroup_ctr < main->rowgroups_avail)
00434       return;                   /* Need to suspend */
00435     /* After the first iMCU, change wraparound pointers to normal state */
00436     if (main->iMCU_row_ctr == 1)
00437       set_wraparound_pointers(cinfo);
00438     /* Prepare to load new iMCU row using other xbuffer list */
00439     main->whichptr ^= 1;        /* 0=>1 or 1=>0 */
00440     main->buffer_full = FALSE;
00441     /* Still need to process last row group of this iMCU row, */
00442     /* which is saved at index M+1 of the other xbuffer */
00443     main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1);
00444     main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2);
00445     main->context_state = CTX_POSTPONED_ROW;
00446   }
00447 }

process_data_crank_post j_decompress_ptr    cinfo,
JSAMPARRAY    output_buf,
JDIMENSION   out_row_ctr,
JDIMENSION    out_rows_avail
 

Definition at line 459 of file jdmainct.c.

References JDIMENSION, JSAMPARRAY, output_buf, and jpeg_decompress_struct::post.

Referenced by start_pass_main().

00462 {
00463   (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,
00464                                      (JDIMENSION *) NULL, (JDIMENSION) 0,
00465                                      output_buf, out_row_ctr, out_rows_avail);
00466 }

process_data_simple_main j_decompress_ptr    cinfo,
JSAMPARRAY    output_buf,
JDIMENSION   out_row_ctr,
JDIMENSION    out_rows_avail
 

Definition at line 345 of file jdmainct.c.

References my_main_controller::buffer, my_main_controller::buffer_full, jpeg_decompress_struct::coef, JDIMENSION, JSAMPARRAY, jpeg_decompress_struct::main, jpeg_decompress_struct::min_DCT_scaled_size, output_buf, jpeg_decompress_struct::post, and my_main_controller::rowgroup_ctr.

Referenced by start_pass_main().

00348 {
00349   my_main_ptr main = (my_main_ptr) cinfo->main;
00350   JDIMENSION rowgroups_avail;
00351 
00352   /* Read input data if we haven't filled the main buffer yet */
00353   if (! main->buffer_full) {
00354     if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer))
00355       return;                   /* suspension forced, can do nothing more */
00356     main->buffer_full = TRUE;   /* OK, we have an iMCU row to work with */
00357   }
00358 
00359   /* There are always min_DCT_scaled_size row groups in an iMCU row. */
00360   rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size;
00361   /* Note: at the bottom of the image, we may pass extra garbage row groups
00362    * to the postprocessor.  The postprocessor has to check for bottom
00363    * of image anyway (at row resolution), so no point in us doing it too.
00364    */
00365 
00366   /* Feed the postprocessor */
00367   (*cinfo->post->post_process_data) (cinfo, main->buffer,
00368                                      &main->rowgroup_ctr, rowgroups_avail,
00369                                      output_buf, out_row_ctr, out_rows_avail);
00370 
00371   /* Has postprocessor consumed all the data yet? If so, mark buffer empty */
00372   if (main->rowgroup_ctr >= rowgroups_avail) {
00373     main->buffer_full = FALSE;
00374     main->rowgroup_ctr = 0;
00375   }
00376 }

set_bottom_pointers j_decompress_ptr    cinfo
 

Definition at line 266 of file jdmainct.c.

References jpeg_decompress_struct::comp_info, compptr, jpeg_component_info::DCT_scaled_size, jpeg_component_info::downsampled_height, i, JSAMPARRAY, jpeg_decompress_struct::main, jpeg_decompress_struct::min_DCT_scaled_size, jpeg_decompress_struct::num_components, my_main_controller::rowgroups_avail, jpeg_component_info::v_samp_factor, my_main_controller::whichptr, and my_main_controller::xbuffer.

Referenced by process_data_context_main().

00271 {
00272   my_main_ptr main = (my_main_ptr) cinfo->main;
00273   int ci, i, rgroup, iMCUheight, rows_left;
00274   jpeg_component_info *compptr;
00275   JSAMPARRAY xbuf;
00276 
00277   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
00278        ci++, compptr++) {
00279     /* Count sample rows in one iMCU row and in one row group */
00280     iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size;
00281     rgroup = iMCUheight / cinfo->min_DCT_scaled_size;
00282     /* Count nondummy sample rows remaining for this component */
00283     rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight);
00284     if (rows_left == 0) rows_left = iMCUheight;
00285     /* Count nondummy row groups.  Should get same answer for each component,
00286      * so we need only do it once.
00287      */
00288     if (ci == 0) {
00289       main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
00290     }
00291     /* Duplicate the last real sample row rgroup*2 times; this pads out the
00292      * last partial rowgroup and ensures at least one full rowgroup of context.
00293      */
00294     xbuf = main->xbuffer[main->whichptr][ci];
00295     for (i = 0; i < rgroup * 2; i++) {
00296       xbuf[rows_left + i] = xbuf[rows_left-1];
00297     }
00298   }
00299 }

set_wraparound_pointers j_decompress_ptr    cinfo
 

Definition at line 238 of file jdmainct.c.

References jpeg_decompress_struct::comp_info, compptr, jpeg_component_info::DCT_scaled_size, i, JSAMPARRAY, jpeg_decompress_struct::main, jpeg_decompress_struct::min_DCT_scaled_size, jpeg_decompress_struct::num_components, jpeg_component_info::v_samp_factor, and my_main_controller::xbuffer.

Referenced by process_data_context_main().

00242 {
00243   my_main_ptr main = (my_main_ptr) cinfo->main;
00244   int ci, i, rgroup;
00245   int M = cinfo->min_DCT_scaled_size;
00246   jpeg_component_info *compptr;
00247   JSAMPARRAY xbuf0, xbuf1;
00248 
00249   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
00250        ci++, compptr++) {
00251     rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /
00252       cinfo->min_DCT_scaled_size; /* height of a row group of component */
00253     xbuf0 = main->xbuffer[0][ci];
00254     xbuf1 = main->xbuffer[1][ci];
00255     for (i = 0; i < rgroup; i++) {
00256       xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];
00257       xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];
00258       xbuf0[rgroup*(M+2) + i] = xbuf0[i];
00259       xbuf1[rgroup*(M+2) + i] = xbuf1[i];
00260     }
00261   }
00262 }

start_pass_main j_decompress_ptr    cinfo,
J_BUF_MODE    pass_mode
 

Definition at line 307 of file jdmainct.c.

References my_main_controller::buffer_full, my_main_controller::context_state, CTX_PREPARE_FOR_IMCU, ERREXIT, my_main_controller::iMCU_row_ctr, J_BUF_MODE, JBUF_CRANK_DEST, JBUF_PASS_THRU, jpeg_decompress_struct::main, make_funny_pointers(), jpeg_upsampler::need_context_rows, process_data_context_main(), process_data_crank_post(), process_data_simple_main(), my_main_controller::pub, my_main_controller::rowgroup_ctr, jpeg_decompress_struct::upsample, and my_main_controller::whichptr.

Referenced by jinit_d_main_controller().

00308 {
00309   my_main_ptr main = (my_main_ptr) cinfo->main;
00310 
00311   switch (pass_mode) {
00312   case JBUF_PASS_THRU:
00313     if (cinfo->upsample->need_context_rows) {
00314       main->pub.process_data = process_data_context_main;
00315       make_funny_pointers(cinfo); /* Create the xbuffer[] lists */
00316       main->whichptr = 0;       /* Read first iMCU row into xbuffer[0] */
00317       main->context_state = CTX_PREPARE_FOR_IMCU;
00318       main->iMCU_row_ctr = 0;
00319     } else {
00320       /* Simple case with no context needed */
00321       main->pub.process_data = process_data_simple_main;
00322     }
00323     main->buffer_full = FALSE;  /* Mark buffer empty */
00324     main->rowgroup_ctr = 0;
00325     break;
00326 #ifdef QUANT_2PASS_SUPPORTED
00327   case JBUF_CRANK_DEST:
00328     /* For last pass of 2-pass quantization, just crank the postprocessor */
00329     main->pub.process_data = process_data_crank_post;
00330     break;
00331 #endif
00332   default:
00333     ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
00334     break;
00335   }
00336 }

Variable Documentation

JSAMPIMAGE JDIMENSION JDIMENSION JSAMPARRAY JDIMENSION * out_row_ctr
 

Definition at line 61 of file jdpostct.c.

Referenced by post_process_1pass(), post_process_2pass(), and post_process_prepass().

JSAMPIMAGE JDIMENSION JDIMENSION JSAMPARRAY JDIMENSION JDIMENSION out_rows_avail
 

Definition at line 61 of file jdpostct.c.

Referenced by post_process_1pass(), post_process_2pass(), and post_process_prepass().

JSAMPARRAY output_buf
 

Definition at line 151 of file jdmainct.c.

Referenced by process_data_context_main(), process_data_crank_post(), and process_data_simple_main().

 

Powered by Plone

This site conforms to the following standards: