GLOBAL int jpeg_read_header (j_decompress_ptr cinfo, boolean require_image) { int retcode; if (cinfo->global_state == DSTATE_START) { /* First-time actions: reset appropriate modules */ (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); (*cinfo->marker->reset_marker_reader) (cinfo); (*cinfo->src->init_source) (cinfo); cinfo->global_state = DSTATE_INHEADER; } else if (cinfo->global_state != DSTATE_INHEADER) { ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); } retcode = (*cinfo->marker->read_markers) (cinfo); switch (retcode) { case JPEG_HEADER_OK: /* Found SOS, prepare to decompress */ /* Set up default parameters based on header data */ default_decompress_parms(cinfo); /* Set global state: ready for start_decompress */ cinfo->global_state = DSTATE_READY; break; case JPEG_HEADER_TABLES_ONLY: /* Found EOI before any SOS */ if (cinfo->marker->saw_SOF) ERREXIT(cinfo, JERR_SOF_NO_SOS); if (require_image) /* Complain if application wants an image */ ERREXIT(cinfo, JERR_NO_IMAGE); /* We need not do any cleanup since only permanent storage (for DQT, DHT) * has been allocated. */ /* Set global state: ready for a new datastream */ cinfo->global_state = DSTATE_START; break; case JPEG_SUSPENDED: /* Had to suspend before end of headers */ /* no work */ break; } return retcode; }
GLOBAL int jpeg_consume_input (j_decompress_ptr cinfo) { int retcode = JPEG_SUSPENDED; /* NB: every possible DSTATE value should be listed in this switch */ switch (cinfo->global_state) { case DSTATE_START: /* Start-of-datastream actions: reset appropriate modules */ (*cinfo->inputctl->reset_input_controller) (cinfo); /* Initialize application's data source module */ (*cinfo->src->init_source) (cinfo); cinfo->global_state = DSTATE_INHEADER; /*FALLTHROUGH*/ case DSTATE_INHEADER: retcode = (*cinfo->inputctl->consume_input) (cinfo); if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */ /* Set up default parameters based on header data */ default_decompress_parms(cinfo); /* Set global state: ready for start_decompress */ cinfo->global_state = DSTATE_READY; } break; case DSTATE_READY: /* Can't advance past first SOS until start_decompress is called */ retcode = JPEG_REACHED_SOS; break; case DSTATE_PRELOAD: case DSTATE_PRESCAN: case DSTATE_SCANNING: case DSTATE_RAW_OK: case DSTATE_BUFIMAGE: case DSTATE_BUFPOST: case DSTATE_STOPPING: retcode = (*cinfo->inputctl->consume_input) (cinfo); break; default: ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); } return retcode; }