19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jcmainct.c 39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1994-1996, Thomas G. Lane. 59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software. 69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file. 79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains the main buffer controller for compression. 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The main buffer lies between the pre-processor and the JPEG 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * compressor proper; it holds downsampled data in the JPEG colorspace. 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define JPEG_INTERNALS 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jinclude.h" 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "jpeglib.h" 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Note: currently, there is no operating mode in which a full-image buffer 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * is needed at this step. If there were, that mode could not be used with 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * "raw data" input, since this module is bypassed in that case. However, 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * we've left the code here for possible use in special applications. 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#undef FULL_MAIN_BUFFER_SUPPORTED 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Private buffer controller object */ 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct { 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct jpeg_c_main_controller pub; /* public fields */ 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION cur_iMCU_row; /* number of current iMCU row */ 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */ 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project boolean suspended; /* remember if we suspended output */ 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project J_BUF_MODE pass_mode; /* current operating mode */ 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If using just a strip buffer, this points to the entire set of buffers 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (we allocate one for each component). In the full-image case, this 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * points to the currently accessible strips of the virtual arrays. 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY buffer[MAX_COMPONENTS]; 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef FULL_MAIN_BUFFER_SUPPORTED 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If using full-image storage, this array holds pointers to virtual-array 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * control blocks for each component. Unused if not full-image storage. 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_sarray_ptr whole_image[MAX_COMPONENTS]; 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} my_main_controller; 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef my_main_controller * my_main_ptr; 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Forward declarations */ 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) process_data_simple_main 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef FULL_MAIN_BUFFER_SUPPORTED 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) process_data_buffer_main 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initialize for a processing pass. 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode) 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_main_ptr main = (my_main_ptr) cinfo->main; 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Do nothing in raw-data mode. */ 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->raw_data_in) 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return; 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->cur_iMCU_row = 0; /* initialize counters */ 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->rowgroup_ctr = 0; 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->suspended = FALSE; 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->pass_mode = pass_mode; /* save mode for use by process_data */ 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch (pass_mode) { 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JBUF_PASS_THRU: 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef FULL_MAIN_BUFFER_SUPPORTED 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (main->whole_image[0] != NULL) 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->pub.process_data = process_data_simple_main; 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef FULL_MAIN_BUFFER_SUPPORTED 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JBUF_SAVE_SOURCE: 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JBUF_CRANK_DEST: 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case JBUF_SAVE_AND_PASS: 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (main->whole_image[0] == NULL) 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->pub.process_data = process_data_buffer_main; 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project default: 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Process some data. 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This routine handles the simple pass-through mode, 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * where we have only a strip buffer. 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectprocess_data_simple_main (j_compress_ptr cinfo, 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION in_rows_avail) 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_main_ptr main = (my_main_ptr) cinfo->main; 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (main->cur_iMCU_row < cinfo->total_iMCU_rows) { 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Read input data if we haven't filled the main buffer yet */ 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (main->rowgroup_ctr < DCTSIZE) 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->prep->pre_process_data) (cinfo, 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project input_buf, in_row_ctr, in_rows_avail, 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->buffer, &main->rowgroup_ctr, 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) DCTSIZE); 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If we don't have a full iMCU row buffered, return to application for 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * more data. Note that preprocessor will always pad to fill the iMCU row 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * at the bottom of the image. 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (main->rowgroup_ctr != DCTSIZE) 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return; 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Send the completed row to the compressor */ 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) { 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If compressor did not consume the whole row, then we must need to 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * suspend processing and return to the application. In this situation 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * we pretend we didn't yet consume the last input row; otherwise, if 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * it happened to be the last row of the image, the application would 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * think we were done. 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! main->suspended) { 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*in_row_ctr)--; 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->suspended = TRUE; 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return; 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We did finish the row. Undo our little suspension hack if a previous 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * call suspended; then mark the main buffer empty. 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (main->suspended) { 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*in_row_ctr)++; 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->suspended = FALSE; 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->rowgroup_ctr = 0; 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->cur_iMCU_row++; 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef FULL_MAIN_BUFFER_SUPPORTED 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Process some data. 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This routine handles all of the modes that use a full-size buffer. 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectprocess_data_buffer_main (j_compress_ptr cinfo, 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION in_rows_avail) 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_main_ptr main = (my_main_ptr) cinfo->main; 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci; 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project boolean writing = (main->pass_mode != JBUF_CRANK_DEST); 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (main->cur_iMCU_row < cinfo->total_iMCU_rows) { 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Realign the virtual buffers if at the start of an iMCU row. */ 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (main->rowgroup_ctr == 0) { 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ci++, compptr++) { 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->buffer[ci] = (*cinfo->mem->access_virt_sarray) 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, main->whole_image[ci], 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE), 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing); 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* In a read pass, pretend we just read some source data. */ 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! writing) { 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE; 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->rowgroup_ctr = DCTSIZE; 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If a write pass, read input data until the current iMCU row is full. */ 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Note: preprocessor will pad if necessary to fill the last iMCU row. */ 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (writing) { 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->prep->pre_process_data) (cinfo, 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project input_buf, in_row_ctr, in_rows_avail, 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->buffer, &main->rowgroup_ctr, 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) DCTSIZE); 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Return to application if we need more data to fill the iMCU row. */ 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (main->rowgroup_ctr < DCTSIZE) 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return; 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Emit data, unless this is a sink-only pass. */ 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (main->pass_mode != JBUF_SAVE_SOURCE) { 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) { 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If compressor did not consume the whole row, then we must need to 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * suspend processing and return to the application. In this situation 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * we pretend we didn't yet consume the last input row; otherwise, if 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * it happened to be the last row of the image, the application would 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * think we were done. 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! main->suspended) { 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*in_row_ctr)--; 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->suspended = TRUE; 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return; 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We did finish the row. Undo our little suspension hack if a previous 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * call suspended; then mark the main buffer empty. 2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (main->suspended) { 2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*in_row_ctr)++; 2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->suspended = FALSE; 2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* If get here, we are done with this iMCU row. Mark buffer empty. */ 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->rowgroup_ctr = 0; 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->cur_iMCU_row++; 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* FULL_MAIN_BUFFER_SUPPORTED */ 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Initialize main buffer controller. 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer) 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project my_main_ptr main; 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci; 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_component_info *compptr; 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main = (my_main_ptr) 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SIZEOF(my_main_controller)); 2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->main = (struct jpeg_c_main_controller *) main; 2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->pub.start_pass = start_pass_main; 2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We don't need to create a buffer in raw-data mode. */ 2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->raw_data_in) 2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return; 2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Create the buffer. It holds downsampled data, so each component 2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * may be of a different size. 2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (need_full_buffer) { 2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef FULL_MAIN_BUFFER_SUPPORTED 2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Allocate a full-image virtual array for each component */ 2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Note we pad the bottom to a multiple of the iMCU height */ 2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ci++, compptr++) { 2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->whole_image[ci] = (*cinfo->mem->request_virt_sarray) 2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, 2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr->width_in_blocks * DCTSIZE, 2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) jround_up((long) compptr->height_in_blocks, 2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (long) compptr->v_samp_factor) * DCTSIZE, 2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) (compptr->v_samp_factor * DCTSIZE)); 2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); 2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef FULL_MAIN_BUFFER_SUPPORTED 2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->whole_image[0] = NULL; /* flag for no virtual arrays */ 2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Allocate a strip buffer for each component */ 2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; 2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ci++, compptr++) { 2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project main->buffer[ci] = (*cinfo->mem->alloc_sarray) 2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, JPOOL_IMAGE, 2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project compptr->width_in_blocks * DCTSIZE, 2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) (compptr->v_samp_factor * DCTSIZE)); 2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 294