151 JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
152 JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
153 int blkn, ci, xindex, yindex, yoffset, useful_width;
157 inverse_DCT_method_ptr inverse_DCT;
160 for (yoffset = coef->
MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
162 for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
165 jzero_far((void FAR *) coef->MCU_buffer[0],
166 (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
167 if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
169 coef->MCU_vert_offset = yoffset;
170 coef->MCU_ctr = MCU_col_num;
171 return JPEG_SUSPENDED;
179 for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
180 compptr = cinfo->cur_comp_info[ci];
182 if (! compptr->component_needed) {
183 blkn += compptr->MCU_blocks;
186 inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index];
187 useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
188 : compptr->last_col_width;
189 output_ptr = output_buf[compptr->component_index] +
190 yoffset * compptr->DCT_scaled_size;
191 start_col = MCU_col_num * compptr->MCU_sample_width;
192 for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
193 if (cinfo->input_iMCU_row < last_iMCU_row ||
194 yoffset+yindex < compptr->last_row_height) {
195 output_col = start_col;
196 for (xindex = 0; xindex < useful_width; xindex++) {
197 (*inverse_DCT) (cinfo, compptr,
198 (JCOEFPTR) coef->MCU_buffer[blkn+xindex],
199 output_ptr, output_col);
200 output_col += compptr->DCT_scaled_size;
203 blkn += compptr->MCU_width;
204 output_ptr += compptr->DCT_scaled_size;
212 cinfo->output_iMCU_row++;
213 if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
214 start_iMCU_row3(cinfo);
215 return JPEG_ROW_COMPLETED;
218 (*cinfo->inputctl->finish_input_pass) (cinfo);
248 int blkn, ci, xindex, yindex, yoffset;
255 for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
256 compptr = cinfo->cur_comp_info[ci];
257 buffer[ci] = (*cinfo->mem->access_virt_barray)
259 cinfo->input_iMCU_row *
compptr->v_samp_factor,
268 for (yoffset = coef->
MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
270 for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
274 for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
275 compptr = cinfo->cur_comp_info[ci];
276 start_col = MCU_col_num * compptr->MCU_width;
277 for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
278 buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
279 for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
280 coef->MCU_buffer[blkn++] = buffer_ptr++;
285 if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
287 coef->MCU_vert_offset = yoffset;
288 coef->MCU_ctr = MCU_col_num;
289 return JPEG_SUSPENDED;
296 if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
297 start_iMCU_row3(cinfo);
298 return JPEG_ROW_COMPLETED;
301 (*cinfo->inputctl->finish_input_pass) (cinfo);
318 JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
320 int ci, block_row, block_rows;
326 inverse_DCT_method_ptr inverse_DCT;
329 while (cinfo->input_scan_number < cinfo->output_scan_number ||
330 (cinfo->input_scan_number == cinfo->output_scan_number &&
331 cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
332 if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED)
333 return JPEG_SUSPENDED;
337 for (ci = 0,
compptr = cinfo->comp_info; ci < cinfo->num_components;
340 if (! compptr->component_needed)
343 buffer = (*cinfo->mem->access_virt_barray)
344 ((j_common_ptr) cinfo, coef->whole_image[ci],
345 cinfo->output_iMCU_row * compptr->v_samp_factor,
346 (JDIMENSION) compptr->v_samp_factor, FALSE);
348 if (cinfo->output_iMCU_row < last_iMCU_row)
349 block_rows = compptr->v_samp_factor;
352 block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
353 if (block_rows == 0) block_rows = compptr->v_samp_factor;
355 inverse_DCT = cinfo->idct->inverse_DCT[ci];
358 for (block_row = 0; block_row < block_rows; block_row++) {
359 buffer_ptr = buffer[block_row];
361 for (block_num = 0; block_num <
compptr->width_in_blocks; block_num++) {
367 output_ptr +=
compptr->DCT_scaled_size;
371 if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
464 JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
466 int ci, block_row, block_rows, access_rows;
468 JBLOCKROW buffer_ptr, prev_block_row, next_block_row;
472 inverse_DCT_method_ptr inverse_DCT;
473 boolean first_row, last_row;
477 INT32 Q00,Q01,Q02,Q10,Q11,Q20, num;
478 int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9;
482 while (cinfo->input_scan_number <= cinfo->output_scan_number &&
483 ! cinfo->inputctl->eoi_reached) {
484 if (cinfo->input_scan_number == cinfo->output_scan_number) {
490 JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0;
491 if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta)
499 for (ci = 0,
compptr = cinfo->comp_info; ci < cinfo->num_components;
502 if (! compptr->component_needed)
505 if (cinfo->output_iMCU_row < last_iMCU_row) {
506 block_rows = compptr->v_samp_factor;
507 access_rows = block_rows * 2;
511 block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
512 if (block_rows == 0) block_rows = compptr->v_samp_factor;
513 access_rows = block_rows;
517 if (cinfo->output_iMCU_row > 0) {
518 access_rows += compptr->v_samp_factor;
519 buffer = (*cinfo->mem->access_virt_barray)
520 ((j_common_ptr) cinfo, coef->whole_image[ci],
521 (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
522 (JDIMENSION) access_rows, FALSE);
523 buffer += compptr->v_samp_factor;
526 buffer = (*cinfo->mem->access_virt_barray)
527 ((j_common_ptr) cinfo, coef->whole_image[ci],
528 (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE);
532 coef_bits = coef->coef_bits_latch + (ci *
SAVED_COEFS);
533 quanttbl =
compptr->quant_table;
534 Q00 = quanttbl->quantval[0];
535 Q01 = quanttbl->quantval[
Q01_POS];
536 Q10 = quanttbl->quantval[
Q10_POS];
537 Q20 = quanttbl->quantval[
Q20_POS];
538 Q11 = quanttbl->quantval[
Q11_POS];
539 Q02 = quanttbl->quantval[
Q02_POS];
540 inverse_DCT = cinfo->idct->inverse_DCT[ci];
543 for (block_row = 0; block_row < block_rows; block_row++) {
544 buffer_ptr =
buffer[block_row];
545 if (first_row && block_row == 0)
546 prev_block_row = buffer_ptr;
548 prev_block_row =
buffer[block_row-1];
549 if (last_row && block_row == block_rows-1)
550 next_block_row = buffer_ptr;
552 next_block_row =
buffer[block_row+1];
556 DC1 = DC2 = DC3 = (
int) prev_block_row[0][0];
557 DC4 = DC5 = DC6 = (
int) buffer_ptr[0][0];
558 DC7 = DC8 = DC9 = (
int) next_block_row[0][0];
560 last_block_column =
compptr->width_in_blocks - 1;
561 for (block_num = 0; block_num <= last_block_column; block_num++) {
565 if (block_num < last_block_column) {
566 DC3 = (
int) prev_block_row[1][0];
567 DC6 = (
int) buffer_ptr[1][0];
568 DC9 = (
int) next_block_row[1][0];
575 if ((Al=coef_bits[1]) != 0 &&
workspace[1] == 0) {
576 num = 36 * Q00 * (DC4 - DC6);
578 pred = (
int) (((Q01<<7) + num) / (Q01<<8));
579 if (Al > 0 && pred >= (1<<Al))
582 pred = (
int) (((Q01<<7) - num) / (Q01<<8));
583 if (Al > 0 && pred >= (1<<Al))
590 if ((Al=coef_bits[2]) != 0 &&
workspace[8] == 0) {
591 num = 36 * Q00 * (DC2 - DC8);
593 pred = (
int) (((Q10<<7) + num) / (Q10<<8));
594 if (Al > 0 && pred >= (1<<Al))
597 pred = (
int) (((Q10<<7) - num) / (Q10<<8));
598 if (Al > 0 && pred >= (1<<Al))
605 if ((Al=coef_bits[3]) != 0 &&
workspace[16] == 0) {
606 num = 9 * Q00 * (DC2 + DC8 - 2*DC5);
608 pred = (
int) (((Q20<<7) + num) / (Q20<<8));
609 if (Al > 0 && pred >= (1<<Al))
612 pred = (
int) (((Q20<<7) - num) / (Q20<<8));
613 if (Al > 0 && pred >= (1<<Al))
620 if ((Al=coef_bits[4]) != 0 &&
workspace[9] == 0) {
621 num = 5 * Q00 * (DC1 - DC3 - DC7 + DC9);
623 pred = (
int) (((Q11<<7) + num) / (Q11<<8));
624 if (Al > 0 && pred >= (1<<Al))
627 pred = (
int) (((Q11<<7) - num) / (Q11<<8));
628 if (Al > 0 && pred >= (1<<Al))
635 if ((Al=coef_bits[5]) != 0 &&
workspace[2] == 0) {
636 num = 9 * Q00 * (DC4 + DC6 - 2*DC5);
638 pred = (
int) (((Q02<<7) + num) / (Q02<<8));
639 if (Al > 0 && pred >= (1<<Al))
642 pred = (
int) (((Q02<<7) - num) / (Q02<<8));
643 if (Al > 0 && pred >= (1<<Al))
653 DC1 = DC2; DC2 = DC3;
654 DC4 = DC5; DC5 = DC6;
655 DC7 = DC8; DC8 = DC9;
656 buffer_ptr++, prev_block_row++, next_block_row++;
659 output_ptr +=
compptr->DCT_scaled_size;
663 if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)