/* * jcmarker.c * * This file was part of the Independent JPEG Group's software: * Copyright (C) 1991-1998, Thomas G. Lane. * Modified 2003-2010 by Guido Vollbeding. * libjpeg-turbo Modifications: * Copyright (C) 2010, D. R. Commander. * For conditions of distribution and use, see the accompanying README.ijg * file. * * This file contains routines to write JPEG datastream markers. */ #define JPEG_INTERNALS #include "jinclude.h" #include "jpeglib.h" #include "jpegcomp.h" JPEG_MARKER; /* Private state */ my_marker_writer; my_marker_ptr; /* * Basic output routines. * * Note that we do not support suspension while writing a marker. * Therefore, an application using suspension must ensure that there is * enough buffer space for the initial markers (typ. 600-700 bytes) before * calling jpeg_start_compress, and enough space to write the trailing EOI * (a few bytes) before calling jpeg_finish_compress. Multipass compression * modes are not supported at all with suspension, so those two are the only * points where markers will be written. */ LOCAL(void) emit_byte(j_compress_ptr cinfo, int val) /* Emit a byte */ { … } LOCAL(void) emit_marker(j_compress_ptr cinfo, JPEG_MARKER mark) /* Emit a marker code */ { … } LOCAL(void) emit_2bytes(j_compress_ptr cinfo, int value) /* Emit a 2-byte integer; these are always MSB first in JPEG files */ { … } /* * Routines to write specific marker types. */ LOCAL(int) emit_dqt(j_compress_ptr cinfo, int index) /* Emit a DQT marker */ /* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */ { … } LOCAL(void) emit_dht(j_compress_ptr cinfo, int index, boolean is_ac) /* Emit a DHT marker */ { … } LOCAL(void) emit_dac(j_compress_ptr cinfo) /* Emit a DAC marker */ /* Since the useful info is so small, we want to emit all the tables in */ /* one DAC marker. Therefore this routine does its own scan of the table. */ { … } LOCAL(void) emit_dri(j_compress_ptr cinfo) /* Emit a DRI marker */ { … } LOCAL(void) emit_sof(j_compress_ptr cinfo, JPEG_MARKER code) /* Emit a SOF marker */ { … } LOCAL(void) emit_sos(j_compress_ptr cinfo) /* Emit a SOS marker */ { … } LOCAL(void) emit_jfif_app0(j_compress_ptr cinfo) /* Emit a JFIF-compliant APP0 marker */ { … } LOCAL(void) emit_adobe_app14(j_compress_ptr cinfo) /* Emit an Adobe APP14 marker */ { … } /* * These routines allow writing an arbitrary marker with parameters. * The only intended use is to emit COM or APPn markers after calling * write_file_header and before calling write_frame_header. * Other uses are not guaranteed to produce desirable results. * Counting the parameter bytes properly is the caller's responsibility. */ METHODDEF(void) write_marker_header(j_compress_ptr cinfo, int marker, unsigned int datalen) /* Emit an arbitrary marker header */ { … } METHODDEF(void) write_marker_byte(j_compress_ptr cinfo, int val) /* Emit one byte of marker parameters following write_marker_header */ { … } /* * Write datastream header. * This consists of an SOI and optional APPn markers. * We recommend use of the JFIF marker, but not the Adobe marker, * when using YCbCr or grayscale data. The JFIF marker should NOT * be used for any other JPEG colorspace. The Adobe marker is helpful * to distinguish RGB, CMYK, and YCCK colorspaces. * Note that an application can write additional header markers after * jpeg_start_compress returns. */ METHODDEF(void) write_file_header(j_compress_ptr cinfo) { … } /* * Write frame header. * This consists of DQT and SOFn markers. * Note that we do not emit the SOF until we have emitted the DQT(s). * This avoids compatibility problems with incorrect implementations that * try to error-check the quant table numbers as soon as they see the SOF. */ METHODDEF(void) write_frame_header(j_compress_ptr cinfo) { … } /* * Write scan header. * This consists of DHT or DAC markers, optional DRI, and SOS. * Compressed data will be written following the SOS. */ METHODDEF(void) write_scan_header(j_compress_ptr cinfo) { … } /* * Write datastream trailer. */ METHODDEF(void) write_file_trailer(j_compress_ptr cinfo) { … } /* * Write an abbreviated table-specification datastream. * This consists of SOI, DQT and DHT tables, and EOI. * Any table that is defined and not marked sent_table = TRUE will be * emitted. Note that all tables will be marked sent_table = TRUE at exit. */ METHODDEF(void) write_tables_only(j_compress_ptr cinfo) { … } /* * Initialize the marker writer module. */ GLOBAL(void) jinit_marker_writer(j_compress_ptr cinfo) { … }