1f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 2f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jcapimin.c 3f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 4f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Copyright (C) 1994-1998, Thomas G. Lane. 59862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org * Modified 2003-2010 by Guido Vollbeding. 6f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file is part of the Independent JPEG Group's software. 7f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For conditions of distribution and use, see the accompanying README file. 8f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 9f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file contains application interface code for the compression half 10f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * of the JPEG library. These are the "minimum" API routines that may be 11f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * needed in either the normal full-compression case or the transcoding-only 12f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * case. 13f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 14f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Most of the routines intended to be called directly by an application 15f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * are in this file or in jcapistd.c. But also see jcparam.c for 16f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * parameter-setup helper routines, jcomapi.c for routines shared by 17f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * compression and decompression, and jctrans.c for the transcoding case. 18f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 19f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 20f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define JPEG_INTERNALS 21f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jinclude.h" 22f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jpeglib.h" 23f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 24f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 25f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 26f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Initialization of a JPEG compression object. 27f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The error manager must already be set up (in case memory manager fails). 28f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 29f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 30f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 31f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize) 32f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 33f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int i; 34f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 35f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Guard against version mismatches between library and caller. */ 36f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ 37f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (version != JPEG_LIB_VERSION) 38f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); 39f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (structsize != SIZEOF(struct jpeg_compress_struct)) 40f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, 41f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (int) SIZEOF(struct jpeg_compress_struct), (int) structsize); 42f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 43f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* For debugging purposes, we zero the whole master structure. 44f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * But the application has already set the err pointer, and may have set 45f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * client_data, so we have to save and restore those fields. 46f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Note: if application hasn't set client_data, tools like Purify may 47f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * complain here. 48f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 49f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { 50f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org struct jpeg_error_mgr * err = cinfo->err; 51f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org void * client_data = cinfo->client_data; /* ignore Purify complaint here */ 52f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct)); 53f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->err = err; 54f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->client_data = client_data; 55f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 56f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->is_decompressor = FALSE; 57f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 58f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize a memory manager instance for this object */ 59f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jinit_memory_mgr((j_common_ptr) cinfo); 60f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 61f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Zero out pointers to permanent structures. */ 62f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progress = NULL; 63f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dest = NULL; 64f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 65f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->comp_info = NULL; 66f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 679862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org for (i = 0; i < NUM_QUANT_TBLS; i++) { 68f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->quant_tbl_ptrs[i] = NULL; 699862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#if JPEG_LIB_VERSION >= 70 709862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->q_scale_factor[i] = 100; 719862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#endif 729862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org } 73f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 74f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < NUM_HUFF_TBLS; i++) { 75f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->dc_huff_tbl_ptrs[i] = NULL; 76f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->ac_huff_tbl_ptrs[i] = NULL; 77f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 78f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 799862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#if JPEG_LIB_VERSION >= 80 809862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org /* Must do it here for emit_dqt in case jpeg_write_tables is used */ 819862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->block_size = DCTSIZE; 829862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->natural_order = jpeg_natural_order; 839862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org cinfo->lim_Se = DCTSIZE2-1; 849862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org#endif 859862697206250265c6bb37a4186b0a411c78de3bhbono@chromium.org 86f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->script_space = NULL; 87f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 88f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->input_gamma = 1.0; /* in case application forgets */ 89f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 90f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* OK, I'm ready */ 91f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state = CSTATE_START; 92f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 93f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 94f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 95f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 96f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Destruction of a JPEG compression object 97f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 98f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 99f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 100f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_destroy_compress (j_compress_ptr cinfo) 101f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 102f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ 103f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 104f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 105f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 106f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 107f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Abort processing of a JPEG compression operation, 108f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * but don't destroy the object itself. 109f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 110f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 111f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 112f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_abort_compress (j_compress_ptr cinfo) 113f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 114f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_abort((j_common_ptr) cinfo); /* use common routine */ 115f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 116f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 117f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 118f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 119f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Forcibly suppress or un-suppress all quantization and Huffman tables. 120f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Marks all currently defined tables as already written (if suppress) 121f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * or not written (if !suppress). This will control whether they get emitted 122f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * by a subsequent jpeg_start_compress call. 123f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 124f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This routine is exported for use by applications that want to produce 125f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * abbreviated JPEG datastreams. It logically belongs in jcparam.c, but 126f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * since it is called by jpeg_start_compress, we put it here --- otherwise 127f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jcparam.o would be linked whether the application used it or not. 128f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 129f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 130f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 131f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress) 132f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 133f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int i; 134f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JQUANT_TBL * qtbl; 135f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JHUFF_TBL * htbl; 136f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 137f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < NUM_QUANT_TBLS; i++) { 138f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL) 139f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org qtbl->sent_table = suppress; 140f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 141f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 142f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < NUM_HUFF_TBLS; i++) { 143f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL) 144f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org htbl->sent_table = suppress; 145f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL) 146f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org htbl->sent_table = suppress; 147f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 148f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 149f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 150f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 151f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 152f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Finish JPEG compression. 153f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 154f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * If a multipass operating mode was selected, this may do a great deal of 155f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * work including most of the actual output. 156f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 157f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 158f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 159f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_finish_compress (j_compress_ptr cinfo) 160f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 161f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JDIMENSION iMCU_row; 162f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 163f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state == CSTATE_SCANNING || 164f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state == CSTATE_RAW_OK) { 165f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Terminate first pass */ 166f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->next_scanline < cinfo->image_height) 167f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); 168f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->master->finish_pass) (cinfo); 169f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else if (cinfo->global_state != CSTATE_WRCOEFS) 170f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 171f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Perform any remaining passes */ 172f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (! cinfo->master->is_last_pass) { 173f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->master->prepare_for_pass) (cinfo); 174f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) { 175f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->progress != NULL) { 176f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progress->pass_counter = (long) iMCU_row; 177f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows; 178f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); 179f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 180f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We bypass the main controller and invoke coef controller directly; 181f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * all work is being done from the coefficient buffer. 182f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 183f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL)) 184f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_CANT_SUSPEND); 185f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 186f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->master->finish_pass) (cinfo); 187f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 188f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Write EOI, do final cleanup */ 189f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->marker->write_file_trailer) (cinfo); 190f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->dest->term_destination) (cinfo); 191f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We can use jpeg_abort to release memory and reset global_state */ 192f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_abort((j_common_ptr) cinfo); 193f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 194f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 195f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 196f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 197f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Write a special marker. 198f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This is only recommended for writing COM or APPn markers. 199f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Must be called after jpeg_start_compress() and before 200f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * first call to jpeg_write_scanlines() or jpeg_write_raw_data(). 201f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 202f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 203f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 204f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_write_marker (j_compress_ptr cinfo, int marker, 205f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org const JOCTET *dataptr, unsigned int datalen) 206f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 207f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val)); 208f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 209f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->next_scanline != 0 || 210f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (cinfo->global_state != CSTATE_SCANNING && 211f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state != CSTATE_RAW_OK && 212f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state != CSTATE_WRCOEFS)) 213f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 214f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 215f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); 216f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */ 217f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (datalen--) { 218f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*write_marker_byte) (cinfo, *dataptr); 219f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org dataptr++; 220f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 221f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 222f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 223f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Same, but piecemeal. */ 224f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 225f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 226f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen) 227f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 228f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->next_scanline != 0 || 229f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (cinfo->global_state != CSTATE_SCANNING && 230f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state != CSTATE_RAW_OK && 231f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->global_state != CSTATE_WRCOEFS)) 232f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 233f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 234f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); 235f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 236f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 237f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 238f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_write_m_byte (j_compress_ptr cinfo, int val) 239f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 240f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->marker->write_marker_byte) (cinfo, val); 241f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 242f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 243f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 244f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 245f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Alternate compression function: just write an abbreviated table file. 246f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Before calling this, all parameters and a data destination must be set up. 247f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 248f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * To produce a pair of files containing abbreviated tables and abbreviated 249f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * image data, one would proceed as follows: 250f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 251f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * initialize JPEG object 252f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * set JPEG parameters 253f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * set destination to table file 254f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jpeg_write_tables(cinfo); 255f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * set destination to image file 256f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jpeg_start_compress(cinfo, FALSE); 257f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * write data... 258f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jpeg_finish_compress(cinfo); 259f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 260f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jpeg_write_tables has the side effect of marking all tables written 261f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * (same as jpeg_suppress_tables(..., TRUE)). Thus a subsequent start_compress 262f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * will not re-emit the tables unless it is passed write_all_tables=TRUE. 263f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 264f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 265f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 266f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_write_tables (j_compress_ptr cinfo) 267f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 268f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->global_state != CSTATE_START) 269f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 270f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 271f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* (Re)initialize error mgr and destination modules */ 272f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); 273f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->dest->init_destination) (cinfo); 274f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize the marker writer ... bit of a crock to do it here. */ 275f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jinit_marker_writer(cinfo); 276f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Write them tables! */ 277f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->marker->write_tables_only) (cinfo); 278f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* And clean up. */ 279f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->dest->term_destination) (cinfo); 280f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* 281f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * In library releases up through v6a, we called jpeg_abort() here to free 282f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * any working memory allocated by the destination manager and marker 283f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * writer. Some applications had a problem with that: they allocated space 284f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * of their own from the library memory manager, and didn't want it to go 285f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * away during write_tables. So now we do nothing. This will cause a 286f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * memory leak if an app calls write_tables repeatedly without doing a full 287f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * compression cycle or otherwise resetting the JPEG object. However, that 288f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * seems less bad than unexpectedly freeing memory in the normal case. 289f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * An app that prefers the old behavior can call jpeg_abort for itself after 290f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * each call to jpeg_write_tables(). 291f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 292f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 293