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