LCOV - code coverage report
Current view: top level - media/libjpeg - jcmarker.c (source / functions) Hit Total Coverage
Test: output.info Lines: 0 214 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 19 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * jcmarker.c
       3             :  *
       4             :  * This file was part of the Independent JPEG Group's software:
       5             :  * Copyright (C) 1991-1998, Thomas G. Lane.
       6             :  * Modified 2003-2010 by Guido Vollbeding.
       7             :  * libjpeg-turbo Modifications:
       8             :  * Copyright (C) 2010, D. R. Commander.
       9             :  * For conditions of distribution and use, see the accompanying README.ijg
      10             :  * file.
      11             :  *
      12             :  * This file contains routines to write JPEG datastream markers.
      13             :  */
      14             : 
      15             : #define JPEG_INTERNALS
      16             : #include "jinclude.h"
      17             : #include "jpeglib.h"
      18             : #include "jpegcomp.h"
      19             : 
      20             : 
      21             : typedef enum {                  /* JPEG marker codes */
      22             :   M_SOF0  = 0xc0,
      23             :   M_SOF1  = 0xc1,
      24             :   M_SOF2  = 0xc2,
      25             :   M_SOF3  = 0xc3,
      26             : 
      27             :   M_SOF5  = 0xc5,
      28             :   M_SOF6  = 0xc6,
      29             :   M_SOF7  = 0xc7,
      30             : 
      31             :   M_JPG   = 0xc8,
      32             :   M_SOF9  = 0xc9,
      33             :   M_SOF10 = 0xca,
      34             :   M_SOF11 = 0xcb,
      35             : 
      36             :   M_SOF13 = 0xcd,
      37             :   M_SOF14 = 0xce,
      38             :   M_SOF15 = 0xcf,
      39             : 
      40             :   M_DHT   = 0xc4,
      41             : 
      42             :   M_DAC   = 0xcc,
      43             : 
      44             :   M_RST0  = 0xd0,
      45             :   M_RST1  = 0xd1,
      46             :   M_RST2  = 0xd2,
      47             :   M_RST3  = 0xd3,
      48             :   M_RST4  = 0xd4,
      49             :   M_RST5  = 0xd5,
      50             :   M_RST6  = 0xd6,
      51             :   M_RST7  = 0xd7,
      52             : 
      53             :   M_SOI   = 0xd8,
      54             :   M_EOI   = 0xd9,
      55             :   M_SOS   = 0xda,
      56             :   M_DQT   = 0xdb,
      57             :   M_DNL   = 0xdc,
      58             :   M_DRI   = 0xdd,
      59             :   M_DHP   = 0xde,
      60             :   M_EXP   = 0xdf,
      61             : 
      62             :   M_APP0  = 0xe0,
      63             :   M_APP1  = 0xe1,
      64             :   M_APP2  = 0xe2,
      65             :   M_APP3  = 0xe3,
      66             :   M_APP4  = 0xe4,
      67             :   M_APP5  = 0xe5,
      68             :   M_APP6  = 0xe6,
      69             :   M_APP7  = 0xe7,
      70             :   M_APP8  = 0xe8,
      71             :   M_APP9  = 0xe9,
      72             :   M_APP10 = 0xea,
      73             :   M_APP11 = 0xeb,
      74             :   M_APP12 = 0xec,
      75             :   M_APP13 = 0xed,
      76             :   M_APP14 = 0xee,
      77             :   M_APP15 = 0xef,
      78             : 
      79             :   M_JPG0  = 0xf0,
      80             :   M_JPG13 = 0xfd,
      81             :   M_COM   = 0xfe,
      82             : 
      83             :   M_TEM   = 0x01,
      84             : 
      85             :   M_ERROR = 0x100
      86             : } JPEG_MARKER;
      87             : 
      88             : 
      89             : /* Private state */
      90             : 
      91             : typedef struct {
      92             :   struct jpeg_marker_writer pub; /* public fields */
      93             : 
      94             :   unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */
      95             : } my_marker_writer;
      96             : 
      97             : typedef my_marker_writer *my_marker_ptr;
      98             : 
      99             : 
     100             : /*
     101             :  * Basic output routines.
     102             :  *
     103             :  * Note that we do not support suspension while writing a marker.
     104             :  * Therefore, an application using suspension must ensure that there is
     105             :  * enough buffer space for the initial markers (typ. 600-700 bytes) before
     106             :  * calling jpeg_start_compress, and enough space to write the trailing EOI
     107             :  * (a few bytes) before calling jpeg_finish_compress.  Multipass compression
     108             :  * modes are not supported at all with suspension, so those two are the only
     109             :  * points where markers will be written.
     110             :  */
     111             : 
     112             : LOCAL(void)
     113           0 : emit_byte (j_compress_ptr cinfo, int val)
     114             : /* Emit a byte */
     115             : {
     116           0 :   struct jpeg_destination_mgr *dest = cinfo->dest;
     117             : 
     118           0 :   *(dest->next_output_byte)++ = (JOCTET) val;
     119           0 :   if (--dest->free_in_buffer == 0) {
     120           0 :     if (! (*dest->empty_output_buffer) (cinfo))
     121           0 :       ERREXIT(cinfo, JERR_CANT_SUSPEND);
     122             :   }
     123           0 : }
     124             : 
     125             : 
     126             : LOCAL(void)
     127           0 : emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)
     128             : /* Emit a marker code */
     129             : {
     130           0 :   emit_byte(cinfo, 0xFF);
     131           0 :   emit_byte(cinfo, (int) mark);
     132           0 : }
     133             : 
     134             : 
     135             : LOCAL(void)
     136           0 : emit_2bytes (j_compress_ptr cinfo, int value)
     137             : /* Emit a 2-byte integer; these are always MSB first in JPEG files */
     138             : {
     139           0 :   emit_byte(cinfo, (value >> 8) & 0xFF);
     140           0 :   emit_byte(cinfo, value & 0xFF);
     141           0 : }
     142             : 
     143             : 
     144             : /*
     145             :  * Routines to write specific marker types.
     146             :  */
     147             : 
     148             : LOCAL(int)
     149           0 : emit_dqt (j_compress_ptr cinfo, int index)
     150             : /* Emit a DQT marker */
     151             : /* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */
     152             : {
     153           0 :   JQUANT_TBL *qtbl = cinfo->quant_tbl_ptrs[index];
     154             :   int prec;
     155             :   int i;
     156             : 
     157           0 :   if (qtbl == NULL)
     158           0 :     ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);
     159             : 
     160           0 :   prec = 0;
     161           0 :   for (i = 0; i < DCTSIZE2; i++) {
     162           0 :     if (qtbl->quantval[i] > 255)
     163           0 :       prec = 1;
     164             :   }
     165             : 
     166           0 :   if (! qtbl->sent_table) {
     167           0 :     emit_marker(cinfo, M_DQT);
     168             : 
     169           0 :     emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2);
     170             : 
     171           0 :     emit_byte(cinfo, index + (prec<<4));
     172             : 
     173           0 :     for (i = 0; i < DCTSIZE2; i++) {
     174             :       /* The table entries must be emitted in zigzag order. */
     175           0 :       unsigned int qval = qtbl->quantval[jpeg_natural_order[i]];
     176           0 :       if (prec)
     177           0 :         emit_byte(cinfo, (int) (qval >> 8));
     178           0 :       emit_byte(cinfo, (int) (qval & 0xFF));
     179             :     }
     180             : 
     181           0 :     qtbl->sent_table = TRUE;
     182             :   }
     183             : 
     184           0 :   return prec;
     185             : }
     186             : 
     187             : 
     188             : LOCAL(void)
     189           0 : emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)
     190             : /* Emit a DHT marker */
     191             : {
     192             :   JHUFF_TBL *htbl;
     193             :   int length, i;
     194             : 
     195           0 :   if (is_ac) {
     196           0 :     htbl = cinfo->ac_huff_tbl_ptrs[index];
     197           0 :     index += 0x10;              /* output index has AC bit set */
     198             :   } else {
     199           0 :     htbl = cinfo->dc_huff_tbl_ptrs[index];
     200             :   }
     201             : 
     202           0 :   if (htbl == NULL)
     203           0 :     ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);
     204             : 
     205           0 :   if (! htbl->sent_table) {
     206           0 :     emit_marker(cinfo, M_DHT);
     207             : 
     208           0 :     length = 0;
     209           0 :     for (i = 1; i <= 16; i++)
     210           0 :       length += htbl->bits[i];
     211             : 
     212           0 :     emit_2bytes(cinfo, length + 2 + 1 + 16);
     213           0 :     emit_byte(cinfo, index);
     214             : 
     215           0 :     for (i = 1; i <= 16; i++)
     216           0 :       emit_byte(cinfo, htbl->bits[i]);
     217             : 
     218           0 :     for (i = 0; i < length; i++)
     219           0 :       emit_byte(cinfo, htbl->huffval[i]);
     220             : 
     221           0 :     htbl->sent_table = TRUE;
     222             :   }
     223           0 : }
     224             : 
     225             : 
     226             : LOCAL(void)
     227           0 : emit_dac (j_compress_ptr cinfo)
     228             : /* Emit a DAC marker */
     229             : /* Since the useful info is so small, we want to emit all the tables in */
     230             : /* one DAC marker.  Therefore this routine does its own scan of the table. */
     231             : {
     232             : #ifdef C_ARITH_CODING_SUPPORTED
     233             :   char dc_in_use[NUM_ARITH_TBLS];
     234             :   char ac_in_use[NUM_ARITH_TBLS];
     235             :   int length, i;
     236             :   jpeg_component_info *compptr;
     237             : 
     238             :   for (i = 0; i < NUM_ARITH_TBLS; i++)
     239             :     dc_in_use[i] = ac_in_use[i] = 0;
     240             : 
     241             :   for (i = 0; i < cinfo->comps_in_scan; i++) {
     242             :     compptr = cinfo->cur_comp_info[i];
     243             :     /* DC needs no table for refinement scan */
     244             :     if (cinfo->Ss == 0 && cinfo->Ah == 0)
     245             :       dc_in_use[compptr->dc_tbl_no] = 1;
     246             :     /* AC needs no table when not present */
     247             :     if (cinfo->Se)
     248             :       ac_in_use[compptr->ac_tbl_no] = 1;
     249             :   }
     250             : 
     251             :   length = 0;
     252             :   for (i = 0; i < NUM_ARITH_TBLS; i++)
     253             :     length += dc_in_use[i] + ac_in_use[i];
     254             : 
     255             :   if (length) {
     256             :     emit_marker(cinfo, M_DAC);
     257             : 
     258             :     emit_2bytes(cinfo, length*2 + 2);
     259             : 
     260             :     for (i = 0; i < NUM_ARITH_TBLS; i++) {
     261             :       if (dc_in_use[i]) {
     262             :         emit_byte(cinfo, i);
     263             :         emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));
     264             :       }
     265             :       if (ac_in_use[i]) {
     266             :         emit_byte(cinfo, i + 0x10);
     267             :         emit_byte(cinfo, cinfo->arith_ac_K[i]);
     268             :       }
     269             :     }
     270             :   }
     271             : #endif /* C_ARITH_CODING_SUPPORTED */
     272           0 : }
     273             : 
     274             : 
     275             : LOCAL(void)
     276           0 : emit_dri (j_compress_ptr cinfo)
     277             : /* Emit a DRI marker */
     278             : {
     279           0 :   emit_marker(cinfo, M_DRI);
     280             : 
     281           0 :   emit_2bytes(cinfo, 4);        /* fixed length */
     282             : 
     283           0 :   emit_2bytes(cinfo, (int) cinfo->restart_interval);
     284           0 : }
     285             : 
     286             : 
     287             : LOCAL(void)
     288           0 : emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
     289             : /* Emit a SOF marker */
     290             : {
     291             :   int ci;
     292             :   jpeg_component_info *compptr;
     293             : 
     294           0 :   emit_marker(cinfo, code);
     295             : 
     296           0 :   emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */
     297             : 
     298             :   /* Make sure image isn't bigger than SOF field can handle */
     299           0 :   if ((long) cinfo->_jpeg_height > 65535L ||
     300           0 :       (long) cinfo->_jpeg_width > 65535L)
     301           0 :     ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);
     302             : 
     303           0 :   emit_byte(cinfo, cinfo->data_precision);
     304           0 :   emit_2bytes(cinfo, (int) cinfo->_jpeg_height);
     305           0 :   emit_2bytes(cinfo, (int) cinfo->_jpeg_width);
     306             : 
     307           0 :   emit_byte(cinfo, cinfo->num_components);
     308             : 
     309           0 :   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
     310           0 :        ci++, compptr++) {
     311           0 :     emit_byte(cinfo, compptr->component_id);
     312           0 :     emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);
     313           0 :     emit_byte(cinfo, compptr->quant_tbl_no);
     314             :   }
     315           0 : }
     316             : 
     317             : 
     318             : LOCAL(void)
     319           0 : emit_sos (j_compress_ptr cinfo)
     320             : /* Emit a SOS marker */
     321             : {
     322             :   int i, td, ta;
     323             :   jpeg_component_info *compptr;
     324             : 
     325           0 :   emit_marker(cinfo, M_SOS);
     326             : 
     327           0 :   emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */
     328             : 
     329           0 :   emit_byte(cinfo, cinfo->comps_in_scan);
     330             : 
     331           0 :   for (i = 0; i < cinfo->comps_in_scan; i++) {
     332           0 :     compptr = cinfo->cur_comp_info[i];
     333           0 :     emit_byte(cinfo, compptr->component_id);
     334             : 
     335             :     /* We emit 0 for unused field(s); this is recommended by the P&M text
     336             :      * but does not seem to be specified in the standard.
     337             :      */
     338             : 
     339             :     /* DC needs no table for refinement scan */
     340           0 :     td = cinfo->Ss == 0 && cinfo->Ah == 0 ? compptr->dc_tbl_no : 0;
     341             :     /* AC needs no table when not present */
     342           0 :     ta = cinfo->Se ? compptr->ac_tbl_no : 0;
     343             : 
     344           0 :     emit_byte(cinfo, (td << 4) + ta);
     345             :   }
     346             : 
     347           0 :   emit_byte(cinfo, cinfo->Ss);
     348           0 :   emit_byte(cinfo, cinfo->Se);
     349           0 :   emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);
     350           0 : }
     351             : 
     352             : 
     353             : LOCAL(void)
     354           0 : emit_jfif_app0 (j_compress_ptr cinfo)
     355             : /* Emit a JFIF-compliant APP0 marker */
     356             : {
     357             :   /*
     358             :    * Length of APP0 block       (2 bytes)
     359             :    * Block ID                   (4 bytes - ASCII "JFIF")
     360             :    * Zero byte                  (1 byte to terminate the ID string)
     361             :    * Version Major, Minor       (2 bytes - major first)
     362             :    * Units                      (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)
     363             :    * Xdpu                       (2 bytes - dots per unit horizontal)
     364             :    * Ydpu                       (2 bytes - dots per unit vertical)
     365             :    * Thumbnail X size           (1 byte)
     366             :    * Thumbnail Y size           (1 byte)
     367             :    */
     368             : 
     369           0 :   emit_marker(cinfo, M_APP0);
     370             : 
     371           0 :   emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */
     372             : 
     373           0 :   emit_byte(cinfo, 0x4A);       /* Identifier: ASCII "JFIF" */
     374           0 :   emit_byte(cinfo, 0x46);
     375           0 :   emit_byte(cinfo, 0x49);
     376           0 :   emit_byte(cinfo, 0x46);
     377           0 :   emit_byte(cinfo, 0);
     378           0 :   emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */
     379           0 :   emit_byte(cinfo, cinfo->JFIF_minor_version);
     380           0 :   emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */
     381           0 :   emit_2bytes(cinfo, (int) cinfo->X_density);
     382           0 :   emit_2bytes(cinfo, (int) cinfo->Y_density);
     383           0 :   emit_byte(cinfo, 0);          /* No thumbnail image */
     384           0 :   emit_byte(cinfo, 0);
     385           0 : }
     386             : 
     387             : 
     388             : LOCAL(void)
     389           0 : emit_adobe_app14 (j_compress_ptr cinfo)
     390             : /* Emit an Adobe APP14 marker */
     391             : {
     392             :   /*
     393             :    * Length of APP14 block      (2 bytes)
     394             :    * Block ID                   (5 bytes - ASCII "Adobe")
     395             :    * Version Number             (2 bytes - currently 100)
     396             :    * Flags0                     (2 bytes - currently 0)
     397             :    * Flags1                     (2 bytes - currently 0)
     398             :    * Color transform            (1 byte)
     399             :    *
     400             :    * Although Adobe TN 5116 mentions Version = 101, all the Adobe files
     401             :    * now in circulation seem to use Version = 100, so that's what we write.
     402             :    *
     403             :    * We write the color transform byte as 1 if the JPEG color space is
     404             :    * YCbCr, 2 if it's YCCK, 0 otherwise.  Adobe's definition has to do with
     405             :    * whether the encoder performed a transformation, which is pretty useless.
     406             :    */
     407             : 
     408           0 :   emit_marker(cinfo, M_APP14);
     409             : 
     410           0 :   emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */
     411             : 
     412           0 :   emit_byte(cinfo, 0x41);       /* Identifier: ASCII "Adobe" */
     413           0 :   emit_byte(cinfo, 0x64);
     414           0 :   emit_byte(cinfo, 0x6F);
     415           0 :   emit_byte(cinfo, 0x62);
     416           0 :   emit_byte(cinfo, 0x65);
     417           0 :   emit_2bytes(cinfo, 100);      /* Version */
     418           0 :   emit_2bytes(cinfo, 0);        /* Flags0 */
     419           0 :   emit_2bytes(cinfo, 0);        /* Flags1 */
     420           0 :   switch (cinfo->jpeg_color_space) {
     421             :   case JCS_YCbCr:
     422           0 :     emit_byte(cinfo, 1);        /* Color transform = 1 */
     423           0 :     break;
     424             :   case JCS_YCCK:
     425           0 :     emit_byte(cinfo, 2);        /* Color transform = 2 */
     426           0 :     break;
     427             :   default:
     428           0 :     emit_byte(cinfo, 0);        /* Color transform = 0 */
     429           0 :     break;
     430             :   }
     431           0 : }
     432             : 
     433             : 
     434             : /*
     435             :  * These routines allow writing an arbitrary marker with parameters.
     436             :  * The only intended use is to emit COM or APPn markers after calling
     437             :  * write_file_header and before calling write_frame_header.
     438             :  * Other uses are not guaranteed to produce desirable results.
     439             :  * Counting the parameter bytes properly is the caller's responsibility.
     440             :  */
     441             : 
     442             : METHODDEF(void)
     443           0 : write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
     444             : /* Emit an arbitrary marker header */
     445             : {
     446           0 :   if (datalen > (unsigned int) 65533)           /* safety check */
     447           0 :     ERREXIT(cinfo, JERR_BAD_LENGTH);
     448             : 
     449           0 :   emit_marker(cinfo, (JPEG_MARKER) marker);
     450             : 
     451           0 :   emit_2bytes(cinfo, (int) (datalen + 2));      /* total length */
     452           0 : }
     453             : 
     454             : METHODDEF(void)
     455           0 : write_marker_byte (j_compress_ptr cinfo, int val)
     456             : /* Emit one byte of marker parameters following write_marker_header */
     457             : {
     458           0 :   emit_byte(cinfo, val);
     459           0 : }
     460             : 
     461             : 
     462             : /*
     463             :  * Write datastream header.
     464             :  * This consists of an SOI and optional APPn markers.
     465             :  * We recommend use of the JFIF marker, but not the Adobe marker,
     466             :  * when using YCbCr or grayscale data.  The JFIF marker should NOT
     467             :  * be used for any other JPEG colorspace.  The Adobe marker is helpful
     468             :  * to distinguish RGB, CMYK, and YCCK colorspaces.
     469             :  * Note that an application can write additional header markers after
     470             :  * jpeg_start_compress returns.
     471             :  */
     472             : 
     473             : METHODDEF(void)
     474           0 : write_file_header (j_compress_ptr cinfo)
     475             : {
     476           0 :   my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
     477             : 
     478           0 :   emit_marker(cinfo, M_SOI);    /* first the SOI */
     479             : 
     480             :   /* SOI is defined to reset restart interval to 0 */
     481           0 :   marker->last_restart_interval = 0;
     482             : 
     483           0 :   if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */
     484           0 :     emit_jfif_app0(cinfo);
     485           0 :   if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */
     486           0 :     emit_adobe_app14(cinfo);
     487           0 : }
     488             : 
     489             : 
     490             : /*
     491             :  * Write frame header.
     492             :  * This consists of DQT and SOFn markers.
     493             :  * Note that we do not emit the SOF until we have emitted the DQT(s).
     494             :  * This avoids compatibility problems with incorrect implementations that
     495             :  * try to error-check the quant table numbers as soon as they see the SOF.
     496             :  */
     497             : 
     498             : METHODDEF(void)
     499           0 : write_frame_header (j_compress_ptr cinfo)
     500             : {
     501             :   int ci, prec;
     502             :   boolean is_baseline;
     503             :   jpeg_component_info *compptr;
     504             : 
     505             :   /* Emit DQT for each quantization table.
     506             :    * Note that emit_dqt() suppresses any duplicate tables.
     507             :    */
     508           0 :   prec = 0;
     509           0 :   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
     510           0 :        ci++, compptr++) {
     511           0 :     prec += emit_dqt(cinfo, compptr->quant_tbl_no);
     512             :   }
     513             :   /* now prec is nonzero iff there are any 16-bit quant tables. */
     514             : 
     515             :   /* Check for a non-baseline specification.
     516             :    * Note we assume that Huffman table numbers won't be changed later.
     517             :    */
     518           0 :   if (cinfo->arith_code || cinfo->progressive_mode ||
     519           0 :       cinfo->data_precision != 8) {
     520           0 :     is_baseline = FALSE;
     521             :   } else {
     522           0 :     is_baseline = TRUE;
     523           0 :     for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
     524           0 :          ci++, compptr++) {
     525           0 :       if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)
     526           0 :         is_baseline = FALSE;
     527             :     }
     528           0 :     if (prec && is_baseline) {
     529           0 :       is_baseline = FALSE;
     530             :       /* If it's baseline except for quantizer size, warn the user */
     531           0 :       TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);
     532             :     }
     533             :   }
     534             : 
     535             :   /* Emit the proper SOF marker */
     536           0 :   if (cinfo->arith_code) {
     537           0 :     if (cinfo->progressive_mode)
     538           0 :       emit_sof(cinfo, M_SOF10); /* SOF code for progressive arithmetic */
     539             :     else
     540           0 :       emit_sof(cinfo, M_SOF9);  /* SOF code for sequential arithmetic */
     541             :   } else {
     542           0 :     if (cinfo->progressive_mode)
     543           0 :       emit_sof(cinfo, M_SOF2);  /* SOF code for progressive Huffman */
     544           0 :     else if (is_baseline)
     545           0 :       emit_sof(cinfo, M_SOF0);  /* SOF code for baseline implementation */
     546             :     else
     547           0 :       emit_sof(cinfo, M_SOF1);  /* SOF code for non-baseline Huffman file */
     548             :   }
     549           0 : }
     550             : 
     551             : 
     552             : /*
     553             :  * Write scan header.
     554             :  * This consists of DHT or DAC markers, optional DRI, and SOS.
     555             :  * Compressed data will be written following the SOS.
     556             :  */
     557             : 
     558             : METHODDEF(void)
     559           0 : write_scan_header (j_compress_ptr cinfo)
     560             : {
     561           0 :   my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
     562             :   int i;
     563             :   jpeg_component_info *compptr;
     564             : 
     565           0 :   if (cinfo->arith_code) {
     566             :     /* Emit arith conditioning info.  We may have some duplication
     567             :      * if the file has multiple scans, but it's so small it's hardly
     568             :      * worth worrying about.
     569             :      */
     570           0 :     emit_dac(cinfo);
     571             :   } else {
     572             :     /* Emit Huffman tables.
     573             :      * Note that emit_dht() suppresses any duplicate tables.
     574             :      */
     575           0 :     for (i = 0; i < cinfo->comps_in_scan; i++) {
     576           0 :       compptr = cinfo->cur_comp_info[i];
     577             :       /* DC needs no table for refinement scan */
     578           0 :       if (cinfo->Ss == 0 && cinfo->Ah == 0)
     579           0 :         emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
     580             :       /* AC needs no table when not present */
     581           0 :       if (cinfo->Se)
     582           0 :         emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
     583             :     }
     584             :   }
     585             : 
     586             :   /* Emit DRI if required --- note that DRI value could change for each scan.
     587             :    * We avoid wasting space with unnecessary DRIs, however.
     588             :    */
     589           0 :   if (cinfo->restart_interval != marker->last_restart_interval) {
     590           0 :     emit_dri(cinfo);
     591           0 :     marker->last_restart_interval = cinfo->restart_interval;
     592             :   }
     593             : 
     594           0 :   emit_sos(cinfo);
     595           0 : }
     596             : 
     597             : 
     598             : /*
     599             :  * Write datastream trailer.
     600             :  */
     601             : 
     602             : METHODDEF(void)
     603           0 : write_file_trailer (j_compress_ptr cinfo)
     604             : {
     605           0 :   emit_marker(cinfo, M_EOI);
     606           0 : }
     607             : 
     608             : 
     609             : /*
     610             :  * Write an abbreviated table-specification datastream.
     611             :  * This consists of SOI, DQT and DHT tables, and EOI.
     612             :  * Any table that is defined and not marked sent_table = TRUE will be
     613             :  * emitted.  Note that all tables will be marked sent_table = TRUE at exit.
     614             :  */
     615             : 
     616             : METHODDEF(void)
     617           0 : write_tables_only (j_compress_ptr cinfo)
     618             : {
     619             :   int i;
     620             : 
     621           0 :   emit_marker(cinfo, M_SOI);
     622             : 
     623           0 :   for (i = 0; i < NUM_QUANT_TBLS; i++) {
     624           0 :     if (cinfo->quant_tbl_ptrs[i] != NULL)
     625           0 :       (void) emit_dqt(cinfo, i);
     626             :   }
     627             : 
     628           0 :   if (! cinfo->arith_code) {
     629           0 :     for (i = 0; i < NUM_HUFF_TBLS; i++) {
     630           0 :       if (cinfo->dc_huff_tbl_ptrs[i] != NULL)
     631           0 :         emit_dht(cinfo, i, FALSE);
     632           0 :       if (cinfo->ac_huff_tbl_ptrs[i] != NULL)
     633           0 :         emit_dht(cinfo, i, TRUE);
     634             :     }
     635             :   }
     636             : 
     637           0 :   emit_marker(cinfo, M_EOI);
     638           0 : }
     639             : 
     640             : 
     641             : /*
     642             :  * Initialize the marker writer module.
     643             :  */
     644             : 
     645             : GLOBAL(void)
     646           0 : jinit_marker_writer (j_compress_ptr cinfo)
     647             : {
     648             :   my_marker_ptr marker;
     649             : 
     650             :   /* Create the subobject */
     651           0 :   marker = (my_marker_ptr)
     652           0 :     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
     653             :                                 sizeof(my_marker_writer));
     654           0 :   cinfo->marker = (struct jpeg_marker_writer *) marker;
     655             :   /* Initialize method pointers */
     656           0 :   marker->pub.write_file_header = write_file_header;
     657           0 :   marker->pub.write_frame_header = write_frame_header;
     658           0 :   marker->pub.write_scan_header = write_scan_header;
     659           0 :   marker->pub.write_file_trailer = write_file_trailer;
     660           0 :   marker->pub.write_tables_only = write_tables_only;
     661           0 :   marker->pub.write_marker_header = write_marker_header;
     662           0 :   marker->pub.write_marker_byte = write_marker_byte;
     663             :   /* Initialize private state */
     664           0 :   marker->last_restart_interval = 0;
     665           0 : }

Generated by: LCOV version 1.13