1f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 2f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * jdmarker.c 3f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 43395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * This file was part of the Independent JPEG Group's software: 5f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Copyright (C) 1991-1998, Thomas G. Lane. 63395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org * libjpeg-turbo Modifications: 7df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org * Copyright (C) 2012, D. R. Commander. 8f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For conditions of distribution and use, see the accompanying README file. 9f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 10f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file contains routines to decode JPEG datastream markers. 11f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Most of the complexity arises from our desire to support input 12f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * suspension: if not all of the data for a marker is available, 13f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * we must exit back to the application. On resumption, we reprocess 14f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the marker. 15f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 16f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 17f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define JPEG_INTERNALS 18f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jinclude.h" 19f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "jpeglib.h" 20f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 21f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 22f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef enum { /* JPEG marker codes */ 23f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF0 = 0xc0, 24f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF1 = 0xc1, 25f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF2 = 0xc2, 26f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF3 = 0xc3, 27f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 28f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF5 = 0xc5, 29f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF6 = 0xc6, 30f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF7 = 0xc7, 31f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 32f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_JPG = 0xc8, 33f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF9 = 0xc9, 34f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF10 = 0xca, 35f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF11 = 0xcb, 36f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 37f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF13 = 0xcd, 38f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF14 = 0xce, 39f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOF15 = 0xcf, 40f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 41f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_DHT = 0xc4, 42f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 43f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_DAC = 0xcc, 44f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 45f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_RST0 = 0xd0, 46f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_RST1 = 0xd1, 47f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_RST2 = 0xd2, 48f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_RST3 = 0xd3, 49f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_RST4 = 0xd4, 50f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_RST5 = 0xd5, 51f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_RST6 = 0xd6, 52f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_RST7 = 0xd7, 53f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 54f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOI = 0xd8, 55f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_EOI = 0xd9, 56f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_SOS = 0xda, 57f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_DQT = 0xdb, 58f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_DNL = 0xdc, 59f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_DRI = 0xdd, 60f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_DHP = 0xde, 61f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_EXP = 0xdf, 62f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 63f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP0 = 0xe0, 64f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP1 = 0xe1, 65f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP2 = 0xe2, 66f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP3 = 0xe3, 67f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP4 = 0xe4, 68f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP5 = 0xe5, 69f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP6 = 0xe6, 70f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP7 = 0xe7, 71f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP8 = 0xe8, 72f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP9 = 0xe9, 73f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP10 = 0xea, 74f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP11 = 0xeb, 75f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP12 = 0xec, 76f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP13 = 0xed, 77f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP14 = 0xee, 78f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_APP15 = 0xef, 79f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 80f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_JPG0 = 0xf0, 81f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_JPG13 = 0xfd, 82f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_COM = 0xfe, 83f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 84f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_TEM = 0x01, 85f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 86f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org M_ERROR = 0x100 87f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} JPEG_MARKER; 88f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 89f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 90f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Private state */ 91f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 92f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef struct { 93f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org struct jpeg_marker_reader pub; /* public fields */ 94f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 95f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Application-overridable marker processing methods */ 96f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_marker_parser_method process_COM; 97f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_marker_parser_method process_APPn[16]; 98f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 99f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Limit on marker data length to save for each marker type */ 100f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int length_limit_COM; 101f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int length_limit_APPn[16]; 102f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 103f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Status of COM/APPn marker saving */ 104f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */ 105f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int bytes_read; /* data bytes read so far in marker */ 106f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Note: cur_marker is not linked into marker_list until it's all read. */ 107f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} my_marker_reader; 108f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 109f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef my_marker_reader * my_marker_ptr; 110f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 111f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 112f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 113f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Macros for fetching data from the data source module. 114f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 115f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect 116f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the current restart point; we update them only when we have reached a 117f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * suitable place to restart if a suspension occurs. 118f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 119f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 120f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Declare and initialize local copies of input pointer/count */ 121f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define INPUT_VARS(cinfo) \ 122f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org struct jpeg_source_mgr * datasrc = (cinfo)->src; \ 123f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org const JOCTET * next_input_byte = datasrc->next_input_byte; \ 124f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org size_t bytes_in_buffer = datasrc->bytes_in_buffer 125f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 126f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Unload the local copies --- do this only at a restart boundary */ 127f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define INPUT_SYNC(cinfo) \ 128f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ( datasrc->next_input_byte = next_input_byte, \ 129f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org datasrc->bytes_in_buffer = bytes_in_buffer ) 130f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 131f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */ 132f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define INPUT_RELOAD(cinfo) \ 133f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ( next_input_byte = datasrc->next_input_byte, \ 134f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bytes_in_buffer = datasrc->bytes_in_buffer ) 135f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 136f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available. 137f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Note we do *not* do INPUT_SYNC before calling fill_input_buffer, 138f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * but we must reload the local copies after a successful fill. 139f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 140f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define MAKE_BYTE_AVAIL(cinfo,action) \ 141f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (bytes_in_buffer == 0) { \ 142f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! (*datasrc->fill_input_buffer) (cinfo)) \ 143f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org { action; } \ 144f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_RELOAD(cinfo); \ 145f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 146f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 147f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Read a byte into variable V. 148f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * If must suspend, take the specified action (typically "return FALSE"). 149f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 150f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define INPUT_BYTE(cinfo,V,action) \ 151f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ 152f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bytes_in_buffer--; \ 153f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org V = GETJOCTET(*next_input_byte++); ) 154f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 155f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* As above, but read two bytes interpreted as an unsigned 16-bit integer. 156f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * V should be declared unsigned int or perhaps INT32. 157f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 158f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define INPUT_2BYTES(cinfo,V,action) \ 159f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ 160f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bytes_in_buffer--; \ 161f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \ 162f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MAKE_BYTE_AVAIL(cinfo,action); \ 163f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bytes_in_buffer--; \ 164f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org V += GETJOCTET(*next_input_byte++); ) 165f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 166f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 167f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 168f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Routines to process JPEG markers. 169f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 170f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Entry condition: JPEG marker itself has been read and its code saved 171f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * in cinfo->unread_marker; input restart point is just after the marker. 172f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 173f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Exit: if return TRUE, have read and processed any parameters, and have 174f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * updated the restart point to point after the parameters. 175f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * If return FALSE, was forced to suspend before reaching end of 176f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * marker parameters; restart point has not been moved. Same routine 177f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * will be called again after application supplies more input data. 178f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 179f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This approach to suspension assumes that all of a marker's parameters 180f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * can fit into a single input bufferload. This should hold for "normal" 181f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * markers. Some COM/APPn markers might have large parameter segments 182f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * that might not fit. If we are simply dropping such a marker, we use 183f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * skip_input_data to get past it, and thereby put the problem on the 184f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * source manager's shoulders. If we are saving the marker's contents 185f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * into memory, we use a slightly different convention: when forced to 186f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * suspend, the marker processor updates the restart point to the end of 187f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * what it's consumed (ie, the end of the buffer) before returning FALSE. 188f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * On resumption, cinfo->unread_marker still contains the marker code, 189f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * but the data source will point to the next chunk of marker data. 190f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The marker processor must retain internal state to deal with this. 191f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 192f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Note that we don't bother to avoid duplicate trace messages if a 193f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * suspension occurs within marker parameters. Other side effects 194f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * require more care. 195f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 196f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 197f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 198f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 199f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgget_soi (j_decompress_ptr cinfo) 200f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Process an SOI marker */ 201f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 202f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int i; 203f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 204f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS(cinfo, 1, JTRC_SOI); 205f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 206f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->marker->saw_SOI) 207f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_SOI_DUPLICATE); 208f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 209f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Reset all parameters that are defined to be reset by SOI */ 210f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 211f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < NUM_ARITH_TBLS; i++) { 212f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_dc_L[i] = 0; 213f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_dc_U[i] = 1; 214f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_ac_K[i] = 5; 215f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 216f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->restart_interval = 0; 217f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 218f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Set initial assumptions for colorspace etc */ 219f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 220f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->jpeg_color_space = JCS_UNKNOWN; 221f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */ 222f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 223f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->saw_JFIF_marker = FALSE; 224f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */ 225f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->JFIF_minor_version = 1; 226f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->density_unit = 0; 227f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->X_density = 1; 228f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Y_density = 1; 229f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->saw_Adobe_marker = FALSE; 230f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Adobe_transform = 0; 231f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 232f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker->saw_SOI = TRUE; 233f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 234f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 235f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 236f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 237f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 238f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 239f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgget_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith) 240f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Process a SOFn marker */ 241f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 242f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 length; 243f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int c, ci; 244f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_component_info * compptr; 245f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 246f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 247f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->progressive_mode = is_prog; 248f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_code = is_arith; 249f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 250f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, length, return FALSE); 251f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 252f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE); 253f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE); 254f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE); 255f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, cinfo->num_components, return FALSE); 256f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 257f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= 8; 258f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 259f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker, 260f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (int) cinfo->image_width, (int) cinfo->image_height, 261f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_components); 262f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 263f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->marker->saw_SOF) 264f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_SOF_DUPLICATE); 265f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 266f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We don't support files in which the image height is initially specified */ 267f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* as 0 and is later redefined by DNL. As long as we have to check that, */ 268f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* might as well have a general sanity check. */ 269f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->image_height <= 0 || cinfo->image_width <= 0 270f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org || cinfo->num_components <= 0) 271f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_EMPTY_IMAGE); 272f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 273f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length != (cinfo->num_components * 3)) 274f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_LENGTH); 275f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 276f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->comp_info == NULL) /* do only once, even if suspend */ 277f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small) 278f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ((j_common_ptr) cinfo, JPOOL_IMAGE, 279f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->num_components * SIZEOF(jpeg_component_info)); 280f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 281f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 282f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ci++, compptr++) { 283f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->component_index = ci; 284f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, compptr->component_id, return FALSE); 285f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, c, return FALSE); 286f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->h_samp_factor = (c >> 4) & 15; 287f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->v_samp_factor = (c ) & 15; 288f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE); 289f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 290f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT, 291f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->component_id, compptr->h_samp_factor, 292f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->v_samp_factor, compptr->quant_tbl_no); 293f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 294f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 295f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker->saw_SOF = TRUE; 296f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 297f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 298f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 299f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 300f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 301f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 302f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 303f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgget_sos (j_decompress_ptr cinfo) 304f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Process a SOS marker */ 305f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 306f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 length; 3073395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org int i, ci, n, c, cc, pi; 308f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_component_info * compptr; 309f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 310f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 311f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! cinfo->marker->saw_SOF) 312f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_SOS_NO_SOF); 313f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 314f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, length, return FALSE); 315f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 316f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */ 317f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 318f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 1, JTRC_SOS, n); 319f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 320f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN) 321f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_LENGTH); 322f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 323f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->comps_in_scan = n; 324f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 325f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Collect the component-spec parameters */ 326f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 3273c45e9e0f9a46aa54355adda4d4a539298f0b865cevans@chromium.org for (i = 0; i < MAX_COMPS_IN_SCAN; i++) 328df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org cinfo->cur_comp_info[i] = NULL; 329df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org 330f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < n; i++) { 331f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, cc, return FALSE); 332f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, c, return FALSE); 333f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 3343c45e9e0f9a46aa54355adda4d4a539298f0b865cevans@chromium.org for (ci = 0, compptr = cinfo->comp_info; 3353c45e9e0f9a46aa54355adda4d4a539298f0b865cevans@chromium.org ci < cinfo->num_components && ci < MAX_COMPS_IN_SCAN; 336f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ci++, compptr++) { 337df5ffdd8b73415b78055177148995bdbdf38b12ehbono@chromium.org if (cc == compptr->component_id && !cinfo->cur_comp_info[ci]) 338f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org goto id_found; 339f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 340f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 341f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); 342f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 343f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org id_found: 344f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 345f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->cur_comp_info[i] = compptr; 346f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->dc_tbl_no = (c >> 4) & 15; 347f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->ac_tbl_no = (c ) & 15; 348f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 349f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, 350f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org compptr->dc_tbl_no, compptr->ac_tbl_no); 3512285c50bcd51dd999d80b99b30ce9aef9fb80833noel@chromium.org 3522285c50bcd51dd999d80b99b30ce9aef9fb80833noel@chromium.org /* This CSi (cc) should differ from the previous CSi */ 3533395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org for (pi = 0; pi < i; pi++) { 3543395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org if (cinfo->cur_comp_info[pi] == compptr) { 3552285c50bcd51dd999d80b99b30ce9aef9fb80833noel@chromium.org ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); 3563395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org } 3572285c50bcd51dd999d80b99b30ce9aef9fb80833noel@chromium.org } 358f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 359f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 360f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Collect the additional scan parameters Ss, Se, Ah/Al. */ 361f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, c, return FALSE); 362f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Ss = c; 363f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, c, return FALSE); 364f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Se = c; 365f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, c, return FALSE); 366f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Ah = (c >> 4) & 15; 367f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Al = (c ) & 15; 368f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 369f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se, 370f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Ah, cinfo->Al); 371f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 372f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Prepare to scan data & restart markers */ 373f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker->next_restart_num = 0; 374f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 375f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Count another SOS marker */ 376f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->input_scan_number++; 377f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 378f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 379f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 380f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 381f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 382f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 383f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef D_ARITH_CODING_SUPPORTED 384f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 385f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 386f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgget_dac (j_decompress_ptr cinfo) 387f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Process a DAC marker */ 388f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 389f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 length; 390f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int index, val; 391f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 392f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 393f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, length, return FALSE); 394f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= 2; 395f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 396f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (length > 0) { 397f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, index, return FALSE); 398f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, val, return FALSE); 399f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 400f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= 2; 401f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 402f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS2(cinfo, 1, JTRC_DAC, index, val); 403f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 404f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (index < 0 || index >= (2*NUM_ARITH_TBLS)) 405f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_DAC_INDEX, index); 406f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 407f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (index >= NUM_ARITH_TBLS) { /* define AC table */ 408f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val; 409f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { /* define DC table */ 410f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F); 411f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->arith_dc_U[index] = (UINT8) (val >> 4); 412f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index]) 413f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_DAC_VALUE, val); 414f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 415f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 416f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 417f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length != 0) 418f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_LENGTH); 419f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 420f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 421f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 422f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 423f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 424f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#else /* ! D_ARITH_CODING_SUPPORTED */ 425f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 426f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define get_dac(cinfo) skip_variable(cinfo) 427f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 428f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* D_ARITH_CODING_SUPPORTED */ 429f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 430f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 431f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 432f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgget_dht (j_decompress_ptr cinfo) 433f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Process a DHT marker */ 434f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 435f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 length; 436f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org UINT8 bits[17]; 437f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org UINT8 huffval[256]; 438f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int i, index, count; 439f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JHUFF_TBL **htblptr; 440f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 441f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 442f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, length, return FALSE); 443f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= 2; 444f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 445f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (length > 16) { 446f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, index, return FALSE); 447f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 448f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 1, JTRC_DHT, index); 449f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 450f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bits[0] = 0; 451f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org count = 0; 452f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 1; i <= 16; i++) { 453f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, bits[i], return FALSE); 454f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org count += bits[i]; 455f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 456f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 457f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= 1 + 16; 458f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 459f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS8(cinfo, 2, JTRC_HUFFBITS, 460f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bits[1], bits[2], bits[3], bits[4], 461f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bits[5], bits[6], bits[7], bits[8]); 462f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS8(cinfo, 2, JTRC_HUFFBITS, 463f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bits[9], bits[10], bits[11], bits[12], 464f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bits[13], bits[14], bits[15], bits[16]); 465f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 466f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Here we just do minimal validation of the counts to avoid walking 467f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * off the end of our table space. jdhuff.c will check more carefully. 468f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 469f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (count > 256 || ((INT32) count) > length) 470f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); 471f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 472f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < count; i++) 473f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, huffval[i], return FALSE); 474f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 47532cab49bd4cb1ce069a435fd75f9439c34ddc6f8noel@chromium.org MEMZERO(&huffval[count], (256 - count) * SIZEOF(UINT8)); 4763395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org 477f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= count; 478f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 479f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (index & 0x10) { /* AC table definition */ 480f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org index -= 0x10; 4813395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org if (index < 0 || index >= NUM_HUFF_TBLS) 4823395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org ERREXIT1(cinfo, JERR_DHT_INDEX, index); 483f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org htblptr = &cinfo->ac_huff_tbl_ptrs[index]; 484f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { /* DC table definition */ 4853395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org if (index < 0 || index >= NUM_HUFF_TBLS) 4863395bcc26e390d2960d15020d4a4d27ae0c122fenoel@chromium.org ERREXIT1(cinfo, JERR_DHT_INDEX, index); 487f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org htblptr = &cinfo->dc_huff_tbl_ptrs[index]; 488f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 489f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 490f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (*htblptr == NULL) 491f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 492f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 493f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); 494f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval)); 495f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 496f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 497f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length != 0) 498f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_LENGTH); 499f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 500f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 501f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 502f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 503f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 504f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 505f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 506f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgget_dqt (j_decompress_ptr cinfo) 507f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Process a DQT marker */ 508f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 509f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 length; 510f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int n, i, prec; 511f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int tmp; 512f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JQUANT_TBL *quant_ptr; 513f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 514f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 515f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, length, return FALSE); 516f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= 2; 517f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 518f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (length > 0) { 519f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, n, return FALSE); 520f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org prec = n >> 4; 521f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org n &= 0x0F; 522f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 523f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS2(cinfo, 1, JTRC_DQT, n, prec); 524f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 525f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (n >= NUM_QUANT_TBLS) 526f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_DQT_INDEX, n); 527f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 528f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->quant_tbl_ptrs[n] == NULL) 529f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo); 530f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org quant_ptr = cinfo->quant_tbl_ptrs[n]; 531f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 532f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < DCTSIZE2; i++) { 533f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (prec) 534f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, tmp, return FALSE); 535f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 536f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, tmp, return FALSE); 537f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* We convert the zigzag-order table to natural array order. */ 538f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp; 539f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 540f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 541f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->err->trace_level >= 2) { 542f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < DCTSIZE2; i += 8) { 543f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS8(cinfo, 2, JTRC_QUANTVALS, 544f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org quant_ptr->quantval[i], quant_ptr->quantval[i+1], 545f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org quant_ptr->quantval[i+2], quant_ptr->quantval[i+3], 546f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org quant_ptr->quantval[i+4], quant_ptr->quantval[i+5], 547f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]); 548f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 549f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 550f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 551f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= DCTSIZE2+1; 552f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (prec) length -= DCTSIZE2; 553f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 554f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 555f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length != 0) 556f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_LENGTH); 557f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 558f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 559f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 560f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 561f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 562f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 563f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 564f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgget_dri (j_decompress_ptr cinfo) 565f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Process a DRI marker */ 566f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 567f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 length; 568f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int tmp; 569f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 570f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 571f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, length, return FALSE); 572f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 573f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length != 4) 574f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT(cinfo, JERR_BAD_LENGTH); 575f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 576f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, tmp, return FALSE); 577f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 578f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 1, JTRC_DRI, tmp); 579f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 580f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->restart_interval = tmp; 581f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 582f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 583f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 584f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 585f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 586f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 587f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 588f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Routines for processing APPn and COM markers. 589f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * These are either saved in memory or discarded, per application request. 590f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * APP0 and APP14 are specially checked to see if they are 591f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * JFIF and Adobe markers, respectively. 592f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 593f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 594f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */ 595f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */ 596f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#define APPN_DATA_LEN 14 /* Must be the largest of the above!! */ 597f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 598f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 599f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 600f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgexamine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data, 601f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int datalen, INT32 remaining) 602f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Examine first few bytes from an APP0. 603f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Take appropriate action if it is a JFIF marker. 604f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * datalen is # of bytes at data[], remaining is length of rest of marker data. 605f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 606f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 607f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 totallen = (INT32) datalen + remaining; 608f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 609f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (datalen >= APP0_DATA_LEN && 610f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[0]) == 0x4A && 611f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[1]) == 0x46 && 612f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[2]) == 0x49 && 613f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[3]) == 0x46 && 614f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[4]) == 0) { 615f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Found JFIF APP0 marker: save info */ 616f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->saw_JFIF_marker = TRUE; 617f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->JFIF_major_version = GETJOCTET(data[5]); 618f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->JFIF_minor_version = GETJOCTET(data[6]); 619f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->density_unit = GETJOCTET(data[7]); 620f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]); 621f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]); 622f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Check version. 623f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Major version must be 1, anything else signals an incompatible change. 624f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * (We used to treat this as an error, but now it's a nonfatal warning, 625f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * because some bozo at Hijaak couldn't read the spec.) 626f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Minor version should be 0..2, but process anyway if newer. 627f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 628f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->JFIF_major_version != 1) 629f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org WARNMS2(cinfo, JWRN_JFIF_MAJOR, 630f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->JFIF_major_version, cinfo->JFIF_minor_version); 631f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Generate trace messages */ 632f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS5(cinfo, 1, JTRC_JFIF, 633f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->JFIF_major_version, cinfo->JFIF_minor_version, 634f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->X_density, cinfo->Y_density, cinfo->density_unit); 635f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Validate thumbnail dimensions and issue appropriate messages */ 636f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (GETJOCTET(data[12]) | GETJOCTET(data[13])) 637f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, 638f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[12]), GETJOCTET(data[13])); 639f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org totallen -= APP0_DATA_LEN; 640f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (totallen != 641f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3)) 642f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen); 643f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else if (datalen >= 6 && 644f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[0]) == 0x4A && 645f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[1]) == 0x46 && 646f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[2]) == 0x58 && 647f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[3]) == 0x58 && 648f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[4]) == 0) { 649f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Found JFIF "JFXX" extension APP0 marker */ 650f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* The library doesn't actually do anything with these, 651f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * but we try to produce a helpful trace message. 652f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 653f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org switch (GETJOCTET(data[5])) { 654f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case 0x10: 655f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen); 656f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 657f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case 0x11: 658f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen); 659f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 660f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case 0x13: 661f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen); 662f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 663f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org default: 664f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, 665f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[5]), (int) totallen); 666f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 667f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 668f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 669f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Start of APP0 does not match "JFIF" or "JFXX", or too short */ 670f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen); 671f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 672f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 673f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 674f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 675f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void) 676f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgexamine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data, 677f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int datalen, INT32 remaining) 678f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Examine first few bytes from an APP14. 679f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Take appropriate action if it is an Adobe marker. 680f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * datalen is # of bytes at data[], remaining is length of rest of marker data. 681f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 682f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 683f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int version, flags0, flags1, transform; 684f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 685f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (datalen >= APP14_DATA_LEN && 686f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[0]) == 0x41 && 687f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[1]) == 0x64 && 688f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[2]) == 0x6F && 689f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[3]) == 0x62 && 690f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org GETJOCTET(data[4]) == 0x65) { 691f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Found Adobe APP14 marker */ 692f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]); 693f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]); 694f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]); 695f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org transform = GETJOCTET(data[11]); 696f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform); 697f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->saw_Adobe_marker = TRUE; 698f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->Adobe_transform = (UINT8) transform; 699f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 700f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Start of APP14 does not match "Adobe", or too short */ 701f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining)); 702f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 703f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 704f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 705f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 706f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 707f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgget_interesting_appn (j_decompress_ptr cinfo) 708f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Process an APP0 or APP14 marker without saving it */ 709f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 710f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 length; 711f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JOCTET b[APPN_DATA_LEN]; 712f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int i, numtoread; 713f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 714f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 715f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, length, return FALSE); 716f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= 2; 717f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 718f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* get the interesting part of the marker data */ 719f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length >= APPN_DATA_LEN) 720f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org numtoread = APPN_DATA_LEN; 721f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else if (length > 0) 722f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org numtoread = (unsigned int) length; 723f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 724f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org numtoread = 0; 725f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < numtoread; i++) 726f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, b[i], return FALSE); 727f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= numtoread; 728f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 729f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* process it */ 730f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org switch (cinfo->unread_marker) { 731f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP0: 732f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length); 733f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 734f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP14: 735f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length); 736f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 737f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org default: 738f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* can't get here unless jpeg_save_markers chooses wrong processor */ 739f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); 740f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 741f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 742f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 743f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* skip any remaining data -- could be lots */ 744f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 745f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length > 0) 746f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->src->skip_input_data) (cinfo, (long) length); 747f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 748f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 749f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 750f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 751f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 752f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef SAVE_MARKERS_SUPPORTED 753f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 754f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 755f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgsave_marker (j_decompress_ptr cinfo) 756f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Save an APPn or COM marker into the marker list */ 757f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 758f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org my_marker_ptr marker = (my_marker_ptr) cinfo->marker; 759f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_saved_marker_ptr cur_marker = marker->cur_marker; 760f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int bytes_read, data_length; 761f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org JOCTET FAR * data; 762f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 length = 0; 763f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 764f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 765f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cur_marker == NULL) { 766f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* begin reading a marker */ 767f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, length, return FALSE); 768f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= 2; 769f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length >= 0) { /* watch out for bogus length word */ 770f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* figure out how much we want to save */ 771f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int limit; 772f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->unread_marker == (int) M_COM) 773f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org limit = marker->length_limit_COM; 774f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 775f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0]; 776f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if ((unsigned int) length < limit) 777f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org limit = (unsigned int) length; 778f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* allocate and initialize the marker item */ 779f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cur_marker = (jpeg_saved_marker_ptr) 780f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, 781f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SIZEOF(struct jpeg_marker_struct) + limit); 782f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cur_marker->next = NULL; 783f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cur_marker->marker = (UINT8) cinfo->unread_marker; 784f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cur_marker->original_length = (unsigned int) length; 785f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cur_marker->data_length = limit; 786f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* data area is just beyond the jpeg_marker_struct */ 787f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1); 788f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->cur_marker = cur_marker; 789f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->bytes_read = 0; 790f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bytes_read = 0; 791f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org data_length = limit; 792f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 793f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* deal with bogus length word */ 794f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bytes_read = data_length = 0; 795f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org data = NULL; 796f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 797f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 798f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* resume reading a marker */ 799f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bytes_read = marker->bytes_read; 800f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org data_length = cur_marker->data_length; 801f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org data = cur_marker->data + bytes_read; 802f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 803f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 804f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (bytes_read < data_length) { 805f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); /* move the restart point to here */ 806f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->bytes_read = bytes_read; 807f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* If there's not at least one byte in buffer, suspend */ 808f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org MAKE_BYTE_AVAIL(cinfo, return FALSE); 809f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Copy bytes with reasonable rapidity */ 810f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (bytes_read < data_length && bytes_in_buffer > 0) { 811f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *data++ = *next_input_byte++; 812f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bytes_in_buffer--; 813f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org bytes_read++; 814f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 815f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 816f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 817f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Done reading what we want to read */ 818f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cur_marker != NULL) { /* will be NULL if bogus length word */ 819f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Add new marker to end of list */ 820f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->marker_list == NULL) { 821f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker_list = cur_marker; 822f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 823f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_saved_marker_ptr prev = cinfo->marker_list; 824f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (prev->next != NULL) 825f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org prev = prev->next; 826f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org prev->next = cur_marker; 827f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 828f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Reset pointer & calc remaining data length */ 829f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org data = cur_marker->data; 830f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length = cur_marker->original_length - data_length; 831f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 832f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Reset to initial state for next marker */ 833f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->cur_marker = NULL; 834f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 835f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Process the marker if interesting; else just make a generic trace msg */ 836f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org switch (cinfo->unread_marker) { 837f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP0: 838f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org examine_app0(cinfo, data, data_length, length); 839f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 840f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP14: 841f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org examine_app14(cinfo, data, data_length, length); 842f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 843f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org default: 844f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, 845f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (int) (data_length + length)); 846f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 847f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 848f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 849f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* skip any remaining data -- could be lots */ 850f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); /* do before skip_input_data */ 851f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length > 0) 852f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->src->skip_input_data) (cinfo, (long) length); 853f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 854f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 855f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 856f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 857f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* SAVE_MARKERS_SUPPORTED */ 858f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 859f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 860f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 861f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgskip_variable (j_decompress_ptr cinfo) 862f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Skip over an unknown or uninteresting variable-length marker */ 863f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 864f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INT32 length; 865f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 866f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 867f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_2BYTES(cinfo, length, return FALSE); 868f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length -= 2; 869f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 870f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length); 871f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 872f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); /* do before skip_input_data */ 873f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length > 0) 874f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->src->skip_input_data) (cinfo, (long) length); 875f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 876f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 877f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 878f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 879f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 880f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 881f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Find the next JPEG marker, save it in cinfo->unread_marker. 882f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Returns FALSE if had to suspend before reaching a marker; 883f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * in that case cinfo->unread_marker is unchanged. 884f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 885f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Note that the result might not be a valid marker code, 886f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * but it will never be 0 or FF. 887f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 888f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 889f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 890f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgnext_marker (j_decompress_ptr cinfo) 891f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 892f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int c; 893f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 894f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 895f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (;;) { 896f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, c, return FALSE); 897f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Skip any non-FF bytes. 898f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This may look a bit inefficient, but it will not occur in a valid file. 899f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * We sync after each discarded byte so that a suspending data source 900f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * can discard the byte from its buffer. 901f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 902f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org while (c != 0xFF) { 903f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker->discarded_bytes++; 904f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 905f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, c, return FALSE); 906f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 907f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* This loop swallows any duplicate FF bytes. Extra FFs are legal as 908f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * pad bytes, so don't count them in discarded_bytes. We assume there 909f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * will not be so many consecutive FF bytes as to overflow a suspending 910f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * data source's input buffer. 911f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 912f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org do { 913f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, c, return FALSE); 914f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } while (c == 0xFF); 915f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (c != 0) 916f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; /* found a valid marker, exit loop */ 917f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Reach here if we found a stuffed-zero data sequence (FF/00). 918f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Discard it and loop back to try again. 919f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 920f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker->discarded_bytes += 2; 921f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 922f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 923f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 924f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->marker->discarded_bytes != 0) { 925538d9fdfaa6b768ad53ed57fe487ca61aff13e3chbono@chromium.org TRACEMS2(cinfo, 1, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c); 926f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker->discarded_bytes = 0; 927f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 928f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 929f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->unread_marker = c; 930f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 931f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 932f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 933f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 934f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 935f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 936f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(boolean) 937f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgfirst_marker (j_decompress_ptr cinfo) 938f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Like next_marker, but used to obtain the initial SOI marker. */ 939f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* For this marker, we do not allow preceding garbage or fill; otherwise, 940f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * we might well scan an entire input file before realizing it ain't JPEG. 941f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * If an application wants to process non-JFIF files, it must seek to the 942f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * SOI before calling the JPEG library. 943f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 944f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 945f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int c, c2; 946f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_VARS(cinfo); 947f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 948f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, c, return FALSE); 949f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_BYTE(cinfo, c2, return FALSE); 950f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (c != 0xFF || c2 != (int) M_SOI) 951f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT2(cinfo, JERR_NO_SOI, c, c2); 952f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 953f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->unread_marker = c2; 954f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 955f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org INPUT_SYNC(cinfo); 956f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 957f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 958f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 95911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org#ifdef MOTION_JPEG_SUPPORTED 96011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 96111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org/* The default Huffman tables used by motion JPEG frames. When a motion JPEG 96211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org * frame does not have DHT tables, we should use the huffman tables suggested by 96311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org * the JPEG standard. Each of these tables represents a member of the JHUFF_TBLS 96411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org * struct so we can just copy it to the according JHUFF_TBLS member. 96511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org */ 96611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org/* DC table 0 */ 96711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.orgLOCAL(const unsigned char) mjpg_dc0_bits[] = { 96811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 96911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 97011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org}; 97111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 97211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.orgLOCAL(const unsigned char) mjpg_dc0_huffval[] = { 97311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 97411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x08, 0x09, 0x0A, 0x0B 97511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org}; 97611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 97711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org/* DC table 1 */ 97811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.orgLOCAL(const unsigned char) mjpg_dc1_bits[] = { 97911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 98011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 98111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org}; 98211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 98311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.orgLOCAL(const unsigned char) mjpg_dc1_huffval[] = { 98411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 98511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x08, 0x09, 0x0A, 0x0B 98611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org}; 98711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 98811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org/* AC table 0 */ 98911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.orgLOCAL(const unsigned char) mjpg_ac0_bits[] = { 99011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 99111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D 99211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org}; 99311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 99411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.orgLOCAL(const unsigned char) mjpg_ac0_huffval[] = { 99511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 99611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 99711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 99811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 99911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 100011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 100111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 100211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 100311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 100411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 100511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 100611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 100711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 100811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 100911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 101011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 101111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 101211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 101311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 101411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 101511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xF9, 0xFA 101611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org}; 101711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 101811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org/* AC table 1 */ 101911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.orgLOCAL(const unsigned char) mjpg_ac1_bits[] = { 102011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 102111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77 102211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org}; 102311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 102411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.orgLOCAL(const unsigned char) mjpg_ac1_huffval[] = { 102511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 102611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 102711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 102811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 102911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 103011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 103111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 103211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 103311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 103411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 103511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 103611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 103711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 103811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 103911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 104011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 104111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 104211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 104311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 104411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 104511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 0xF9, 0xFA 104611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org}; 104711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 104811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org/* Loads the default Huffman tables used by motion JPEG frames. This function 104911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org * just copies the huffman tables suggested in the JPEG standard when we have 105011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org * not load them. 105111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org */ 105211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.orgLOCAL(void) 105311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.orgmjpg_load_huff_tables (j_decompress_ptr cinfo) 105411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org{ 105511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org JHUFF_TBL *htblptr; 105611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 105711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org if (! cinfo->dc_huff_tbl_ptrs[0]) { 105811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 105911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMZERO(htblptr, SIZEOF(JHUFF_TBL)); 106011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMCOPY(&htblptr->bits[1], mjpg_dc0_bits, SIZEOF(mjpg_dc0_bits)); 106111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMCOPY(&htblptr->huffval[0], mjpg_dc0_huffval, SIZEOF(mjpg_dc0_huffval)); 106211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org cinfo->dc_huff_tbl_ptrs[0] = htblptr; 106311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org } 106411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 106511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org if (! cinfo->dc_huff_tbl_ptrs[1]) { 106611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 106711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMZERO(htblptr, SIZEOF(JHUFF_TBL)); 106811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMCOPY(&htblptr->bits[1], mjpg_dc1_bits, SIZEOF(mjpg_dc1_bits)); 106911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMCOPY(&htblptr->huffval[0], mjpg_dc1_huffval, SIZEOF(mjpg_dc1_huffval)); 107011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org cinfo->dc_huff_tbl_ptrs[1] = htblptr; 107111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org } 107211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 107311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org if (! cinfo->ac_huff_tbl_ptrs[0]) { 107411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 107511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMZERO(htblptr, SIZEOF(JHUFF_TBL)); 107611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMCOPY(&htblptr->bits[1], mjpg_ac0_bits, SIZEOF(mjpg_ac0_bits)); 107711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMCOPY(&htblptr->huffval[0], mjpg_ac0_huffval, SIZEOF(mjpg_ac0_huffval)); 107811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org cinfo->ac_huff_tbl_ptrs[0] = htblptr; 107911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org } 108011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 108111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org if (! cinfo->ac_huff_tbl_ptrs[1]) { 108211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); 108311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMZERO(htblptr, SIZEOF(JHUFF_TBL)); 108411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMCOPY(&htblptr->bits[1], mjpg_ac1_bits, SIZEOF(mjpg_ac1_bits)); 108511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org MEMCOPY(&htblptr->huffval[0], mjpg_ac1_huffval, SIZEOF(mjpg_ac1_huffval)); 108611a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org cinfo->ac_huff_tbl_ptrs[1] = htblptr; 108711a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org } 108811a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org} 108911a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 109011a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org#else 109111a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 109211a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org#define mjpg_load_huff_tables(cinfo) 109311a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 109411a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org#endif /* MOTION_JPEG_SUPPORTED */ 109511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org 1096f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1097f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 1098f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Read markers until SOS or EOI. 1099f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 1100f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Returns same codes as are defined for jpeg_consume_input: 1101f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. 1102f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1103f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1104f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(int) 1105f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgread_markers (j_decompress_ptr cinfo) 1106f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 1107f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Outer loop repeats once for each marker. */ 1108f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (;;) { 1109f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Collect the marker proper, unless we already did. */ 1110f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* NB: first_marker() enforces the requirement that SOI appear first. */ 1111f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->unread_marker == 0) { 1112f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! cinfo->marker->saw_SOI) { 1113f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! first_marker(cinfo)) 1114f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1115f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 1116f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! next_marker(cinfo)) 1117f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1118f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 1119f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 1120f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* At this point cinfo->unread_marker contains the marker code and the 1121f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * input point is just past the marker proper, but before any parameters. 1122f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * A suspension will cause us to return with this state still true. 1123f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1124f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org switch (cinfo->unread_marker) { 1125f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOI: 1126f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! get_soi(cinfo)) 1127f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1128f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1129f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1130f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF0: /* Baseline */ 1131f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF1: /* Extended sequential, Huffman */ 1132f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! get_sof(cinfo, FALSE, FALSE)) 1133f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1134f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1135f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1136f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF2: /* Progressive, Huffman */ 1137f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! get_sof(cinfo, TRUE, FALSE)) 1138f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1139f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1140f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1141f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF9: /* Extended sequential, arithmetic */ 1142f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! get_sof(cinfo, FALSE, TRUE)) 1143f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1144f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1145f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1146f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF10: /* Progressive, arithmetic */ 1147f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! get_sof(cinfo, TRUE, TRUE)) 1148f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1149f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1150f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1151f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Currently unsupported SOFn types */ 1152f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF3: /* Lossless, Huffman */ 1153f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF5: /* Differential sequential, Huffman */ 1154f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF6: /* Differential progressive, Huffman */ 1155f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF7: /* Differential lossless, Huffman */ 1156f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_JPG: /* Reserved for JPEG extensions */ 1157f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF11: /* Lossless, arithmetic */ 1158f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF13: /* Differential sequential, arithmetic */ 1159f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF14: /* Differential progressive, arithmetic */ 1160f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOF15: /* Differential lossless, arithmetic */ 1161f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker); 1162f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1163f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1164f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_SOS: 116511a02ed81bfa320425301cb3439ea21bdaa1f5e7hbono@chromium.org mjpg_load_huff_tables(cinfo); 1166f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! get_sos(cinfo)) 1167f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1168f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->unread_marker = 0; /* processed the marker */ 1169f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_REACHED_SOS; 1170f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1171f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_EOI: 1172f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS(cinfo, 1, JTRC_EOI); 1173f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->unread_marker = 0; /* processed the marker */ 1174f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_REACHED_EOI; 1175f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1176f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_DAC: 1177f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! get_dac(cinfo)) 1178f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1179f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1180f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1181f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_DHT: 1182f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! get_dht(cinfo)) 1183f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1184f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1185f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1186f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_DQT: 1187f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! get_dqt(cinfo)) 1188f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1189f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1190f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1191f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_DRI: 1192f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! get_dri(cinfo)) 1193f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1194f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1195f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1196f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP0: 1197f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP1: 1198f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP2: 1199f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP3: 1200f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP4: 1201f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP5: 1202f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP6: 1203f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP7: 1204f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP8: 1205f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP9: 1206f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP10: 1207f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP11: 1208f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP12: 1209f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP13: 1210f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP14: 1211f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_APP15: 1212f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[ 1213f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->unread_marker - (int) M_APP0]) (cinfo)) 1214f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1215f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1216f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1217f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_COM: 1218f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo)) 1219f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1220f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1221f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1222f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_RST0: /* these are all parameterless */ 1223f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_RST1: 1224f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_RST2: 1225f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_RST3: 1226f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_RST4: 1227f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_RST5: 1228f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_RST6: 1229f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_RST7: 1230f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_TEM: 1231f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker); 1232f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1233f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1234f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case M_DNL: /* Ignore DNL ... perhaps the wrong thing */ 1235f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! skip_variable(cinfo)) 1236f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return JPEG_SUSPENDED; 1237f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1238f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1239f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org default: /* must be DHP, EXP, JPGn, or RESn */ 1240f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* For now, we treat the reserved markers as fatal errors since they are 1241f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * likely to be used to signal incompatible JPEG Part 3 extensions. 1242f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Once the JPEG 3 version-number marker is well defined, this code 1243f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * ought to change! 1244f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1245f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); 1246f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1247f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 1248f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Successfully processed marker, so reset state variable */ 1249f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->unread_marker = 0; 1250f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } /* end loop */ 1251f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 1252f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1253f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1254f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 1255f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Read a restart marker, which is expected to appear next in the datastream; 1256f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * if the marker is not there, take appropriate recovery action. 1257f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Returns FALSE if suspension is required. 1258f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 1259f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This is called by the entropy decoder after it has read an appropriate 1260f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder 1261f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * has already read a marker from the data source. Under normal conditions 1262f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * cinfo->unread_marker will be reset to 0 before returning; if not reset, 1263f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * it holds a marker which the decoder will be unable to read past. 1264f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1265f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1266f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(boolean) 1267f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgread_restart_marker (j_decompress_ptr cinfo) 1268f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 1269f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Obtain a marker unless we already did. */ 1270f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Note that next_marker will complain if it skips any data. */ 1271f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->unread_marker == 0) { 1272f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! next_marker(cinfo)) 1273f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; 1274f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 1275f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1276f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (cinfo->unread_marker == 1277f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ((int) M_RST0 + cinfo->marker->next_restart_num)) { 1278f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Normal case --- swallow the marker and let entropy decoder continue */ 1279f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num); 1280f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->unread_marker = 0; 1281f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 1282f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Uh-oh, the restart markers have been messed up. */ 1283f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Let the data source manager determine how to resync. */ 1284f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! (*cinfo->src->resync_to_restart) (cinfo, 1285f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker->next_restart_num)) 1286f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; 1287f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 1288f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1289f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Update next-restart state */ 1290f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7; 1291f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1292f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 1293f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 1294f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1295f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1296f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 1297f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This is the default resync_to_restart method for data source managers 1298f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * to use if they don't have any better approach. Some data source managers 1299f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * may be able to back up, or may have additional knowledge about the data 1300f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * which permits a more intelligent recovery strategy; such managers would 1301f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * presumably supply their own resync method. 1302f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 1303f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * read_restart_marker calls resync_to_restart if it finds a marker other than 1304f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the restart marker it was expecting. (This code is *not* used unless 1305f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * a nonzero restart interval has been declared.) cinfo->unread_marker is 1306f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the marker code actually found (might be anything, except 0 or FF). 1307f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The desired restart marker number (0..7) is passed as a parameter. 1308f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This routine is supposed to apply whatever error recovery strategy seems 1309f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * appropriate in order to position the input stream to the next data segment. 1310f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Note that cinfo->unread_marker is treated as a marker appearing before 1311f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * the current data-source input point; usually it should be reset to zero 1312f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * before returning. 1313f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Returns FALSE if suspension is required. 1314f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 1315f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This implementation is substantially constrained by wanting to treat the 1316f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * input as a data stream; this means we can't back up. Therefore, we have 1317f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * only the following actions to work with: 1318f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 1. Simply discard the marker and let the entropy decoder resume at next 1319f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * byte of file. 1320f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 2. Read forward until we find another marker, discarding intervening 1321f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * data. (In theory we could look ahead within the current bufferload, 1322f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * without having to discard data if we don't find the desired marker. 1323f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This idea is not implemented here, in part because it makes behavior 1324f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * dependent on buffer size and chance buffer-boundary positions.) 1325f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 3. Leave the marker unread (by failing to zero cinfo->unread_marker). 1326f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This will cause the entropy decoder to process an empty data segment, 1327f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * inserting dummy zeroes, and then we will reprocess the marker. 1328f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * 1329f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * #2 is appropriate if we think the desired marker lies ahead, while #3 is 1330f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * appropriate if the found marker is a future restart marker (indicating 1331f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * that we have missed the desired restart marker, probably because it got 1332f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * corrupted). 1333f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * We apply #2 or #3 if the found marker is a restart marker no more than 1334f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * two counts behind or ahead of the expected one. We also apply #2 if the 1335f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * found marker is not a legal JPEG marker code (it's certainly bogus data). 1336f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * If the found marker is a restart marker more than 2 counts away, we do #1 1337f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * (too much risk that the marker is erroneous; with luck we will be able to 1338f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * resync at some future point). 1339f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For any valid non-restart JPEG marker, we apply #3. This keeps us from 1340f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * overrunning the end of a scan. An implementation limited to single-scan 1341f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * files might find it better to apply #2 for markers other than EOI, since 1342f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * any other marker would have to be bogus data in that case. 1343f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1344f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1345f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(boolean) 1346f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_resync_to_restart (j_decompress_ptr cinfo, int desired) 1347f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 1348f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int marker = cinfo->unread_marker; 1349f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int action = 1; 1350f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1351f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Always put up a warning. */ 1352f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired); 1353f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1354f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Outer loop handles repeated decision after scanning forward. */ 1355f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (;;) { 1356f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (marker < (int) M_SOF0) 1357f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org action = 2; /* invalid marker */ 1358f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else if (marker < (int) M_RST0 || marker > (int) M_RST7) 1359f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org action = 3; /* valid non-restart marker */ 1360f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else { 1361f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (marker == ((int) M_RST0 + ((desired+1) & 7)) || 1362f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker == ((int) M_RST0 + ((desired+2) & 7))) 1363f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org action = 3; /* one of the next two expected restarts */ 1364f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else if (marker == ((int) M_RST0 + ((desired-1) & 7)) || 1365f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker == ((int) M_RST0 + ((desired-2) & 7))) 1366f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org action = 2; /* a prior restart, so advance */ 1367f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 1368f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org action = 1; /* desired restart or too far away */ 1369f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 1370f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action); 1371f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org switch (action) { 1372f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case 1: 1373f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Discard marker and let entropy decoder resume processing. */ 1374f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->unread_marker = 0; 1375f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 1376f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case 2: 1377f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Scan to the next marker, and repeat the decision loop. */ 1378f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (! next_marker(cinfo)) 1379f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return FALSE; 1380f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker = cinfo->unread_marker; 1381f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org break; 1382f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org case 3: 1383f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Return without advancing past this marker. */ 1384f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Entropy decoder will be forced to process an empty segment. */ 1385f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org return TRUE; 1386f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 1387f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } /* end loop */ 1388f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 1389f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1390f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1391f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 1392f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Reset marker processing state to begin a fresh datastream. 1393f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1394f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1395f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void) 1396f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgreset_marker_reader (j_decompress_ptr cinfo) 1397f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 1398f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org my_marker_ptr marker = (my_marker_ptr) cinfo->marker; 1399f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1400f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->comp_info = NULL; /* until allocated by get_sof */ 1401f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->input_scan_number = 0; /* no SOS seen yet */ 1402f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->unread_marker = 0; /* no pending marker */ 1403f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->pub.saw_SOI = FALSE; /* set internal state too */ 1404f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->pub.saw_SOF = FALSE; 1405f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->pub.discarded_bytes = 0; 1406f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->cur_marker = NULL; 1407f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 1408f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1409f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1410f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 1411f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Initialize the marker reader module. 1412f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This is called only once, when the decompression object is created. 1413f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1414f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1415f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 1416f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjinit_marker_reader (j_decompress_ptr cinfo) 1417f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 1418f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org my_marker_ptr marker; 1419f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org int i; 1420f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1421f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Create subobject in permanent pool */ 1422f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker = (my_marker_ptr) 1423f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, 1424f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org SIZEOF(my_marker_reader)); 1425f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org cinfo->marker = (struct jpeg_marker_reader *) marker; 1426f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize public method pointers */ 1427f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->pub.reset_marker_reader = reset_marker_reader; 1428f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->pub.read_markers = read_markers; 1429f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->pub.read_restart_marker = read_restart_marker; 1430f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Initialize COM/APPn processing. 1431f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * By default, we examine and then discard APP0 and APP14, 1432f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * but simply discard COM and all other APPn. 1433f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1434f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->process_COM = skip_variable; 1435f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->length_limit_COM = 0; 1436f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org for (i = 0; i < 16; i++) { 1437f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->process_APPn[i] = skip_variable; 1438f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->length_limit_APPn[i] = 0; 1439f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 1440f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->process_APPn[0] = get_interesting_appn; 1441f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->process_APPn[14] = get_interesting_appn; 1442f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Reset marker processing state */ 1443f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org reset_marker_reader(cinfo); 1444f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 1445f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1446f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1447f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 1448f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Control saving of COM and APPn markers into marker_list. 1449f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1450f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1451f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef SAVE_MARKERS_SUPPORTED 1452f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1453f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 1454f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_save_markers (j_decompress_ptr cinfo, int marker_code, 1455f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org unsigned int length_limit) 1456f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 1457f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org my_marker_ptr marker = (my_marker_ptr) cinfo->marker; 1458f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org long maxlength; 1459f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_marker_parser_method processor; 1460f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1461f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Length limit mustn't be larger than what we can allocate 1462f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * (should only be a concern in a 16-bit environment). 1463f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1464f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct); 1465f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (((long) length_limit) > maxlength) 1466f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length_limit = (unsigned int) maxlength; 1467f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1468f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* Choose processor routine to use. 1469f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * APP0/APP14 have special requirements. 1470f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1471f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (length_limit) { 1472f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org processor = save_marker; 1473f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* If saving APP0/APP14, save at least enough for our internal use. */ 1474f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN) 1475f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length_limit = APP0_DATA_LEN; 1476f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN) 1477f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org length_limit = APP14_DATA_LEN; 1478f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else { 1479f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org processor = skip_variable; 1480f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org /* If discarding APP0/APP14, use our regular on-the-fly processor. */ 1481f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14) 1482f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org processor = get_interesting_appn; 1483f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } 1484f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1485f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (marker_code == (int) M_COM) { 1486f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->process_COM = processor; 1487f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->length_limit_COM = length_limit; 1488f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) { 1489f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->process_APPn[marker_code - (int) M_APP0] = processor; 1490f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit; 1491f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org } else 1492f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); 1493f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 1494f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1495f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* SAVE_MARKERS_SUPPORTED */ 1496f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1497f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1498f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* 1499f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Install a special processing method for COM or APPn markers. 1500f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */ 1501f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1502f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(void) 1503f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code, 1504f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org jpeg_marker_parser_method routine) 1505f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{ 1506f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org my_marker_ptr marker = (my_marker_ptr) cinfo->marker; 1507f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org 1508f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org if (marker_code == (int) M_COM) 1509f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->process_COM = routine; 1510f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) 1511f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org marker->process_APPn[marker_code - (int) M_APP0] = routine; 1512f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org else 1513f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); 1514f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} 1515