Coverage Report

Created: 2026-01-09 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libjpeg-turbo.main/src/jdcoefct.c
Line
Count
Source
1
/*
2
 * jdcoefct.c
3
 *
4
 * This file was part of the Independent JPEG Group's software:
5
 * Copyright (C) 1994-1997, Thomas G. Lane.
6
 * libjpeg-turbo Modifications:
7
 * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
8
 * Copyright (C) 2010, 2015-2016, 2019-2020, 2022-2024, D. R. Commander.
9
 * Copyright (C) 2015, 2020, Google, Inc.
10
 * For conditions of distribution and use, see the accompanying README.ijg
11
 * file.
12
 *
13
 * This file contains the coefficient buffer controller for decompression.
14
 * This controller is the top level of the lossy JPEG decompressor proper.
15
 * The coefficient buffer lies between entropy decoding and inverse-DCT steps.
16
 *
17
 * In buffered-image mode, this controller is the interface between
18
 * input-oriented processing and output-oriented processing.
19
 * Also, the input side (only) is used when reading a file for transcoding.
20
 */
21
22
#include "jinclude.h"
23
#include "jdcoefct.h"
24
#include "jpegapicomp.h"
25
#include "jsamplecomp.h"
26
27
28
/* Forward declarations */
29
METHODDEF(int) decompress_onepass(j_decompress_ptr cinfo,
30
                                  _JSAMPIMAGE output_buf);
31
#ifdef D_MULTISCAN_FILES_SUPPORTED
32
METHODDEF(int) decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf);
33
#endif
34
#ifdef BLOCK_SMOOTHING_SUPPORTED
35
LOCAL(boolean) smoothing_ok(j_decompress_ptr cinfo);
36
METHODDEF(int) decompress_smooth_data(j_decompress_ptr cinfo,
37
                                      _JSAMPIMAGE output_buf);
38
#endif
39
40
41
/*
42
 * Initialize for an input processing pass.
43
 */
44
45
METHODDEF(void)
46
start_input_pass(j_decompress_ptr cinfo)
47
221k
{
48
221k
  cinfo->input_iMCU_row = 0;
49
221k
  start_iMCU_row(cinfo);
50
221k
}
jdcoefct-8.c:start_input_pass
Line
Count
Source
47
192k
{
48
192k
  cinfo->input_iMCU_row = 0;
49
192k
  start_iMCU_row(cinfo);
50
192k
}
jdcoefct-12.c:start_input_pass
Line
Count
Source
47
29.6k
{
48
29.6k
  cinfo->input_iMCU_row = 0;
49
29.6k
  start_iMCU_row(cinfo);
50
29.6k
}
51
52
53
/*
54
 * Initialize for an output processing pass.
55
 */
56
57
METHODDEF(void)
58
start_output_pass(j_decompress_ptr cinfo)
59
15.7k
{
60
15.7k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
15.7k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
62
63
  /* If multipass, check to see whether to use block smoothing on this pass */
64
15.7k
  if (coef->pub.coef_arrays != NULL) {
65
12.8k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
3.80k
      coef->pub._decompress_data = decompress_smooth_data;
67
9.02k
    else
68
9.02k
      coef->pub._decompress_data = decompress_data;
69
12.8k
  }
70
15.7k
#endif
71
15.7k
  cinfo->output_iMCU_row = 0;
72
15.7k
}
jdcoefct-8.c:start_output_pass
Line
Count
Source
59
10.2k
{
60
10.2k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
10.2k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
62
63
  /* If multipass, check to see whether to use block smoothing on this pass */
64
10.2k
  if (coef->pub.coef_arrays != NULL) {
65
8.20k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
2.31k
      coef->pub._decompress_data = decompress_smooth_data;
67
5.88k
    else
68
5.88k
      coef->pub._decompress_data = decompress_data;
69
8.20k
  }
70
10.2k
#endif
71
10.2k
  cinfo->output_iMCU_row = 0;
72
10.2k
}
jdcoefct-12.c:start_output_pass
Line
Count
Source
59
5.43k
{
60
5.43k
#ifdef BLOCK_SMOOTHING_SUPPORTED
61
5.43k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
62
63
  /* If multipass, check to see whether to use block smoothing on this pass */
64
5.43k
  if (coef->pub.coef_arrays != NULL) {
65
4.62k
    if (cinfo->do_block_smoothing && smoothing_ok(cinfo))
66
1.49k
      coef->pub._decompress_data = decompress_smooth_data;
67
3.13k
    else
68
3.13k
      coef->pub._decompress_data = decompress_data;
69
4.62k
  }
70
5.43k
#endif
71
5.43k
  cinfo->output_iMCU_row = 0;
72
5.43k
}
73
74
75
/*
76
 * Decompress and return some data in the single-pass case.
77
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
78
 * Input and output must run in lockstep since we have only a one-MCU buffer.
79
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
80
 *
81
 * NB: output_buf contains a plane for each component in image,
82
 * which we index according to the component's SOF position.
83
 */
84
85
METHODDEF(int)
86
decompress_onepass(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
87
801k
{
88
801k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
801k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
801k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
801k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
801k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
801k
  _JSAMPARRAY output_ptr;
94
801k
  JDIMENSION start_col, output_col;
95
801k
  jpeg_component_info *compptr;
96
801k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
2.12M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
1.32M
       yoffset++) {
101
16.8M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
15.5M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
15.5M
      jzero_far((void *)coef->MCU_buffer[0],
105
15.5M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
15.5M
      if (!cinfo->entropy->insufficient_data)
107
4.85M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
15.5M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
0
        coef->MCU_vert_offset = yoffset;
111
0
        coef->MCU_ctr = MCU_col_num;
112
0
        return JPEG_SUSPENDED;
113
0
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
15.5M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
15.5M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
120
        /* Determine where data should go in output_buf and do the IDCT thing.
121
         * We skip dummy blocks at the right and bottom edges (but blkn gets
122
         * incremented past them!).  Note the inner loop relies on having
123
         * allocated the MCU_buffer[] blocks sequentially.
124
         */
125
15.5M
        blkn = 0;               /* index of current DCT block within MCU */
126
31.5M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
16.0M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
16.0M
          if (!compptr->component_needed) {
130
52.3k
            blkn += compptr->MCU_blocks;
131
52.3k
            continue;
132
52.3k
          }
133
15.9M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
15.9M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
14.5M
                         compptr->MCU_width : compptr->last_col_width;
136
15.9M
          output_ptr = output_buf[compptr->component_index] +
137
15.9M
                       yoffset * compptr->_DCT_scaled_size;
138
15.9M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
15.9M
                      compptr->MCU_sample_width;
140
32.3M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
16.4M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
16.2M
                yoffset + yindex < compptr->last_row_height) {
143
16.2M
              output_col = start_col;
144
32.9M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
16.6M
                (*inverse_DCT) (cinfo, compptr,
146
16.6M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
16.6M
                                output_ptr, output_col);
148
16.6M
                output_col += compptr->_DCT_scaled_size;
149
16.6M
              }
150
16.2M
            }
151
16.4M
            blkn += compptr->MCU_width;
152
16.4M
            output_ptr += compptr->_DCT_scaled_size;
153
16.4M
          }
154
15.9M
        }
155
15.5M
      }
156
15.5M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
1.32M
    coef->MCU_ctr = 0;
159
1.32M
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
801k
  cinfo->output_iMCU_row++;
162
801k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
798k
    start_iMCU_row(cinfo);
164
798k
    return JPEG_ROW_COMPLETED;
165
798k
  }
166
  /* Completed the scan */
167
2.85k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
2.85k
  return JPEG_SCAN_COMPLETED;
169
801k
}
jdcoefct-8.c:decompress_onepass
Line
Count
Source
87
521k
{
88
521k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
521k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
521k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
521k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
521k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
521k
  _JSAMPARRAY output_ptr;
94
521k
  JDIMENSION start_col, output_col;
95
521k
  jpeg_component_info *compptr;
96
521k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
1.37M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
852k
       yoffset++) {
101
13.0M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
12.2M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
12.2M
      jzero_far((void *)coef->MCU_buffer[0],
105
12.2M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
12.2M
      if (!cinfo->entropy->insufficient_data)
107
2.13M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
12.2M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
0
        coef->MCU_vert_offset = yoffset;
111
0
        coef->MCU_ctr = MCU_col_num;
112
0
        return JPEG_SUSPENDED;
113
0
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
12.2M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
12.2M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
120
        /* Determine where data should go in output_buf and do the IDCT thing.
121
         * We skip dummy blocks at the right and bottom edges (but blkn gets
122
         * incremented past them!).  Note the inner loop relies on having
123
         * allocated the MCU_buffer[] blocks sequentially.
124
         */
125
12.2M
        blkn = 0;               /* index of current DCT block within MCU */
126
24.7M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
12.5M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
12.5M
          if (!compptr->component_needed) {
130
32.5k
            blkn += compptr->MCU_blocks;
131
32.5k
            continue;
132
32.5k
          }
133
12.5M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
12.5M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
11.6M
                         compptr->MCU_width : compptr->last_col_width;
136
12.5M
          output_ptr = output_buf[compptr->component_index] +
137
12.5M
                       yoffset * compptr->_DCT_scaled_size;
138
12.5M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
12.5M
                      compptr->MCU_sample_width;
140
25.3M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
12.7M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
12.7M
                yoffset + yindex < compptr->last_row_height) {
143
12.7M
              output_col = start_col;
144
25.7M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
12.9M
                (*inverse_DCT) (cinfo, compptr,
146
12.9M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
12.9M
                                output_ptr, output_col);
148
12.9M
                output_col += compptr->_DCT_scaled_size;
149
12.9M
              }
150
12.7M
            }
151
12.7M
            blkn += compptr->MCU_width;
152
12.7M
            output_ptr += compptr->_DCT_scaled_size;
153
12.7M
          }
154
12.5M
        }
155
12.2M
      }
156
12.2M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
852k
    coef->MCU_ctr = 0;
159
852k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
521k
  cinfo->output_iMCU_row++;
162
521k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
519k
    start_iMCU_row(cinfo);
164
519k
    return JPEG_ROW_COMPLETED;
165
519k
  }
166
  /* Completed the scan */
167
2.05k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
2.05k
  return JPEG_SCAN_COMPLETED;
169
521k
}
jdcoefct-12.c:decompress_onepass
Line
Count
Source
87
279k
{
88
279k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
89
279k
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
90
279k
  JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
91
279k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
92
279k
  int blkn, ci, xindex, yindex, yoffset, useful_width;
93
279k
  _JSAMPARRAY output_ptr;
94
279k
  JDIMENSION start_col, output_col;
95
279k
  jpeg_component_info *compptr;
96
279k
  _inverse_DCT_method_ptr inverse_DCT;
97
98
  /* Loop to process as much as one whole iMCU row */
99
753k
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
100
474k
       yoffset++) {
101
3.76M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
102
3.28M
         MCU_col_num++) {
103
      /* Try to fetch an MCU.  Entropy decoder expects buffer to be zeroed. */
104
3.28M
      jzero_far((void *)coef->MCU_buffer[0],
105
3.28M
                (size_t)(cinfo->blocks_in_MCU * sizeof(JBLOCK)));
106
3.28M
      if (!cinfo->entropy->insufficient_data)
107
2.72M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
108
3.28M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
109
        /* Suspension forced; update state counters and exit */
110
0
        coef->MCU_vert_offset = yoffset;
111
0
        coef->MCU_ctr = MCU_col_num;
112
0
        return JPEG_SUSPENDED;
113
0
      }
114
115
      /* Only perform the IDCT on blocks that are contained within the desired
116
       * cropping region.
117
       */
118
3.28M
      if (MCU_col_num >= cinfo->master->first_iMCU_col &&
119
3.28M
          MCU_col_num <= cinfo->master->last_iMCU_col) {
120
        /* Determine where data should go in output_buf and do the IDCT thing.
121
         * We skip dummy blocks at the right and bottom edges (but blkn gets
122
         * incremented past them!).  Note the inner loop relies on having
123
         * allocated the MCU_buffer[] blocks sequentially.
124
         */
125
3.28M
        blkn = 0;               /* index of current DCT block within MCU */
126
6.73M
        for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
127
3.44M
          compptr = cinfo->cur_comp_info[ci];
128
          /* Don't bother to IDCT an uninteresting component. */
129
3.44M
          if (!compptr->component_needed) {
130
19.7k
            blkn += compptr->MCU_blocks;
131
19.7k
            continue;
132
19.7k
          }
133
3.42M
          inverse_DCT = cinfo->idct->_inverse_DCT[compptr->component_index];
134
3.42M
          useful_width = (MCU_col_num < last_MCU_col) ?
135
2.93M
                         compptr->MCU_width : compptr->last_col_width;
136
3.42M
          output_ptr = output_buf[compptr->component_index] +
137
3.42M
                       yoffset * compptr->_DCT_scaled_size;
138
3.42M
          start_col = (MCU_col_num - cinfo->master->first_iMCU_col) *
139
3.42M
                      compptr->MCU_sample_width;
140
7.08M
          for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
141
3.65M
            if (cinfo->input_iMCU_row < last_iMCU_row ||
142
3.54M
                yoffset + yindex < compptr->last_row_height) {
143
3.54M
              output_col = start_col;
144
7.19M
              for (xindex = 0; xindex < useful_width; xindex++) {
145
3.65M
                (*inverse_DCT) (cinfo, compptr,
146
3.65M
                                (JCOEFPTR)coef->MCU_buffer[blkn + xindex],
147
3.65M
                                output_ptr, output_col);
148
3.65M
                output_col += compptr->_DCT_scaled_size;
149
3.65M
              }
150
3.54M
            }
151
3.65M
            blkn += compptr->MCU_width;
152
3.65M
            output_ptr += compptr->_DCT_scaled_size;
153
3.65M
          }
154
3.42M
        }
155
3.28M
      }
156
3.28M
    }
157
    /* Completed an MCU row, but perhaps not an iMCU row */
158
474k
    coef->MCU_ctr = 0;
159
474k
  }
160
  /* Completed the iMCU row, advance counters for next one */
161
279k
  cinfo->output_iMCU_row++;
162
279k
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
163
278k
    start_iMCU_row(cinfo);
164
278k
    return JPEG_ROW_COMPLETED;
165
278k
  }
166
  /* Completed the scan */
167
797
  (*cinfo->inputctl->finish_input_pass) (cinfo);
168
797
  return JPEG_SCAN_COMPLETED;
169
279k
}
170
171
172
/*
173
 * Dummy consume-input routine for single-pass operation.
174
 */
175
176
METHODDEF(int)
177
dummy_consume_data(j_decompress_ptr cinfo)
178
0
{
179
0
  return JPEG_SUSPENDED;        /* Always indicate nothing was done */
180
0
}
Unexecuted instantiation: jdcoefct-8.c:dummy_consume_data
Unexecuted instantiation: jdcoefct-12.c:dummy_consume_data
181
182
183
#ifdef D_MULTISCAN_FILES_SUPPORTED
184
185
/*
186
 * Consume input data and store it in the full-image coefficient buffer.
187
 * We read as much as one fully interleaved MCU row ("iMCU" row) per call,
188
 * ie, v_samp_factor block rows for each component in the scan.
189
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
190
 */
191
192
METHODDEF(int)
193
consume_data(j_decompress_ptr cinfo)
194
89.8M
{
195
89.8M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
89.8M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
89.8M
  int blkn, ci, xindex, yindex, yoffset;
198
89.8M
  JDIMENSION start_col;
199
89.8M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
89.8M
  JBLOCKROW buffer_ptr;
201
89.8M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
189M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
99.1M
    compptr = cinfo->cur_comp_info[ci];
206
99.1M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
99.1M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
99.1M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
99.1M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
210
    /* Note: entropy decoder expects buffer to be zeroed,
211
     * but this is handled automatically by the memory manager
212
     * because we requested a pre-zeroed array.
213
     */
214
99.1M
  }
215
216
  /* Loop to process one whole iMCU row */
217
190M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
100M
       yoffset++) {
219
809M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
709M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
709M
      blkn = 0;                 /* index of current DCT block within MCU */
223
1.53G
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
822M
        compptr = cinfo->cur_comp_info[ci];
225
822M
        start_col = MCU_col_num * compptr->MCU_width;
226
1.72G
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
907M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
2.00G
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
1.09G
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
1.09G
          }
231
907M
        }
232
822M
      }
233
709M
      if (!cinfo->entropy->insufficient_data)
234
318M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
709M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
0
        coef->MCU_vert_offset = yoffset;
239
0
        coef->MCU_ctr = MCU_col_num;
240
0
        return JPEG_SUSPENDED;
241
0
      }
242
709M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
100M
    coef->MCU_ctr = 0;
245
100M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
89.8M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
89.6M
    start_iMCU_row(cinfo);
249
89.6M
    return JPEG_ROW_COMPLETED;
250
89.6M
  }
251
  /* Completed the scan */
252
217k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
217k
  return JPEG_SCAN_COMPLETED;
254
89.8M
}
jdcoefct-8.c:consume_data
Line
Count
Source
194
79.9M
{
195
79.9M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
79.9M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
79.9M
  int blkn, ci, xindex, yindex, yoffset;
198
79.9M
  JDIMENSION start_col;
199
79.9M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
79.9M
  JBLOCKROW buffer_ptr;
201
79.9M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
168M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
88.3M
    compptr = cinfo->cur_comp_info[ci];
206
88.3M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
88.3M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
88.3M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
88.3M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
210
    /* Note: entropy decoder expects buffer to be zeroed,
211
     * but this is handled automatically by the memory manager
212
     * because we requested a pre-zeroed array.
213
     */
214
88.3M
  }
215
216
  /* Loop to process one whole iMCU row */
217
167M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
87.9M
       yoffset++) {
219
716M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
628M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
628M
      blkn = 0;                 /* index of current DCT block within MCU */
223
1.36G
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
735M
        compptr = cinfo->cur_comp_info[ci];
225
735M
        start_col = MCU_col_num * compptr->MCU_width;
226
1.54G
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
811M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
1.81G
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
998M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
998M
          }
231
811M
        }
232
735M
      }
233
628M
      if (!cinfo->entropy->insufficient_data)
234
259M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
628M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
0
        coef->MCU_vert_offset = yoffset;
239
0
        coef->MCU_ctr = MCU_col_num;
240
0
        return JPEG_SUSPENDED;
241
0
      }
242
628M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
87.9M
    coef->MCU_ctr = 0;
245
87.9M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
79.9M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
79.8M
    start_iMCU_row(cinfo);
249
79.8M
    return JPEG_ROW_COMPLETED;
250
79.8M
  }
251
  /* Completed the scan */
252
188k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
188k
  return JPEG_SCAN_COMPLETED;
254
79.9M
}
jdcoefct-12.c:consume_data
Line
Count
Source
194
9.88M
{
195
9.88M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
196
9.88M
  JDIMENSION MCU_col_num;       /* index of current MCU within row */
197
9.88M
  int blkn, ci, xindex, yindex, yoffset;
198
9.88M
  JDIMENSION start_col;
199
9.88M
  JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
200
9.88M
  JBLOCKROW buffer_ptr;
201
9.88M
  jpeg_component_info *compptr;
202
203
  /* Align the virtual buffers for the components used in this scan. */
204
20.6M
  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
205
10.8M
    compptr = cinfo->cur_comp_info[ci];
206
10.8M
    buffer[ci] = (*cinfo->mem->access_virt_barray)
207
10.8M
      ((j_common_ptr)cinfo, coef->whole_image[compptr->component_index],
208
10.8M
       cinfo->input_iMCU_row * compptr->v_samp_factor,
209
10.8M
       (JDIMENSION)compptr->v_samp_factor, TRUE);
210
    /* Note: entropy decoder expects buffer to be zeroed,
211
     * but this is handled automatically by the memory manager
212
     * because we requested a pre-zeroed array.
213
     */
214
10.8M
  }
215
216
  /* Loop to process one whole iMCU row */
217
22.2M
  for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
218
12.3M
       yoffset++) {
219
93.4M
    for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row;
220
81.0M
         MCU_col_num++) {
221
      /* Construct list of pointers to DCT blocks belonging to this MCU */
222
81.0M
      blkn = 0;                 /* index of current DCT block within MCU */
223
168M
      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
224
87.3M
        compptr = cinfo->cur_comp_info[ci];
225
87.3M
        start_col = MCU_col_num * compptr->MCU_width;
226
182M
        for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
227
95.3M
          buffer_ptr = buffer[ci][yindex + yoffset] + start_col;
228
195M
          for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
229
100M
            coef->MCU_buffer[blkn++] = buffer_ptr++;
230
100M
          }
231
95.3M
        }
232
87.3M
      }
233
81.0M
      if (!cinfo->entropy->insufficient_data)
234
59.4M
        cinfo->master->last_good_iMCU_row = cinfo->input_iMCU_row;
235
      /* Try to fetch the MCU. */
236
81.0M
      if (!(*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
237
        /* Suspension forced; update state counters and exit */
238
0
        coef->MCU_vert_offset = yoffset;
239
0
        coef->MCU_ctr = MCU_col_num;
240
0
        return JPEG_SUSPENDED;
241
0
      }
242
81.0M
    }
243
    /* Completed an MCU row, but perhaps not an iMCU row */
244
12.3M
    coef->MCU_ctr = 0;
245
12.3M
  }
246
  /* Completed the iMCU row, advance counters for next one */
247
9.88M
  if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) {
248
9.85M
    start_iMCU_row(cinfo);
249
9.85M
    return JPEG_ROW_COMPLETED;
250
9.85M
  }
251
  /* Completed the scan */
252
28.8k
  (*cinfo->inputctl->finish_input_pass) (cinfo);
253
28.8k
  return JPEG_SCAN_COMPLETED;
254
9.88M
}
255
256
257
/*
258
 * Decompress and return some data in the multi-pass case.
259
 * Always attempts to emit one fully interleaved MCU row ("iMCU" row).
260
 * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED.
261
 *
262
 * NB: output_buf contains a plane for each component in image.
263
 */
264
265
METHODDEF(int)
266
decompress_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
267
2.66M
{
268
2.66M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
2.66M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
2.66M
  JDIMENSION block_num;
271
2.66M
  int ci, block_row, block_rows;
272
2.66M
  JBLOCKARRAY buffer;
273
2.66M
  JBLOCKROW buffer_ptr;
274
2.66M
  _JSAMPARRAY output_ptr;
275
2.66M
  JDIMENSION output_col;
276
2.66M
  jpeg_component_info *compptr;
277
2.66M
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
2.66M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
2.66M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
2.66M
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
283
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
284
0
      return JPEG_SUSPENDED;
285
0
  }
286
287
  /* OK, output from the virtual arrays. */
288
8.82M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
6.15M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
6.15M
    if (!compptr->component_needed)
292
215k
      continue;
293
    /* Align the virtual buffer for this component. */
294
5.94M
    buffer = (*cinfo->mem->access_virt_barray)
295
5.94M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
5.94M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
5.94M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
5.94M
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
5.92M
      block_rows = compptr->v_samp_factor;
301
18.5k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
18.5k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
18.5k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
18.5k
    }
306
5.94M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
5.94M
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
13.7M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
7.82M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
7.82M
      output_col = 0;
312
7.82M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
62.7M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
54.8M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
54.8M
                        output_col);
316
54.8M
        buffer_ptr++;
317
54.8M
        output_col += compptr->_DCT_scaled_size;
318
54.8M
      }
319
7.82M
      output_ptr += compptr->_DCT_scaled_size;
320
7.82M
    }
321
5.94M
  }
322
323
2.66M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
2.65M
    return JPEG_ROW_COMPLETED;
325
8.60k
  return JPEG_SCAN_COMPLETED;
326
2.66M
}
jdcoefct-8.c:decompress_data
Line
Count
Source
267
2.20M
{
268
2.20M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
2.20M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
2.20M
  JDIMENSION block_num;
271
2.20M
  int ci, block_row, block_rows;
272
2.20M
  JBLOCKARRAY buffer;
273
2.20M
  JBLOCKROW buffer_ptr;
274
2.20M
  _JSAMPARRAY output_ptr;
275
2.20M
  JDIMENSION output_col;
276
2.20M
  jpeg_component_info *compptr;
277
2.20M
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
2.20M
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
2.20M
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
2.20M
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
283
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
284
0
      return JPEG_SUSPENDED;
285
0
  }
286
287
  /* OK, output from the virtual arrays. */
288
7.30M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
5.09M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
5.09M
    if (!compptr->component_needed)
292
114k
      continue;
293
    /* Align the virtual buffer for this component. */
294
4.98M
    buffer = (*cinfo->mem->access_virt_barray)
295
4.98M
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
4.98M
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
4.98M
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
4.98M
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
4.97M
      block_rows = compptr->v_samp_factor;
301
12.9k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
12.9k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
12.9k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
12.9k
    }
306
4.98M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
4.98M
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
11.3M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
6.38M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
6.38M
      output_col = 0;
312
6.38M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
50.1M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
43.7M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
43.7M
                        output_col);
316
43.7M
        buffer_ptr++;
317
43.7M
        output_col += compptr->_DCT_scaled_size;
318
43.7M
      }
319
6.38M
      output_ptr += compptr->_DCT_scaled_size;
320
6.38M
    }
321
4.98M
  }
322
323
2.20M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
2.20M
    return JPEG_ROW_COMPLETED;
325
5.88k
  return JPEG_SCAN_COMPLETED;
326
2.20M
}
jdcoefct-12.c:decompress_data
Line
Count
Source
267
455k
{
268
455k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
269
455k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
270
455k
  JDIMENSION block_num;
271
455k
  int ci, block_row, block_rows;
272
455k
  JBLOCKARRAY buffer;
273
455k
  JBLOCKROW buffer_ptr;
274
455k
  _JSAMPARRAY output_ptr;
275
455k
  JDIMENSION output_col;
276
455k
  jpeg_component_info *compptr;
277
455k
  _inverse_DCT_method_ptr inverse_DCT;
278
279
  /* Force some input to be done if we are getting ahead of the input. */
280
455k
  while (cinfo->input_scan_number < cinfo->output_scan_number ||
281
455k
         (cinfo->input_scan_number == cinfo->output_scan_number &&
282
455k
          cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) {
283
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
284
0
      return JPEG_SUSPENDED;
285
0
  }
286
287
  /* OK, output from the virtual arrays. */
288
1.51M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
289
1.05M
       ci++, compptr++) {
290
    /* Don't bother to IDCT an uninteresting component. */
291
1.05M
    if (!compptr->component_needed)
292
101k
      continue;
293
    /* Align the virtual buffer for this component. */
294
957k
    buffer = (*cinfo->mem->access_virt_barray)
295
957k
      ((j_common_ptr)cinfo, coef->whole_image[ci],
296
957k
       cinfo->output_iMCU_row * compptr->v_samp_factor,
297
957k
       (JDIMENSION)compptr->v_samp_factor, FALSE);
298
    /* Count non-dummy DCT block rows in this iMCU row. */
299
957k
    if (cinfo->output_iMCU_row < last_iMCU_row)
300
952k
      block_rows = compptr->v_samp_factor;
301
5.60k
    else {
302
      /* NB: can't use last_row_height here; it is input-side-dependent! */
303
5.60k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
304
5.60k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
305
5.60k
    }
306
957k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
307
957k
    output_ptr = output_buf[ci];
308
    /* Loop over all DCT blocks to be processed. */
309
2.39M
    for (block_row = 0; block_row < block_rows; block_row++) {
310
1.43M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
311
1.43M
      output_col = 0;
312
1.43M
      for (block_num = cinfo->master->first_MCU_col[ci];
313
12.5M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
314
11.1M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)buffer_ptr, output_ptr,
315
11.1M
                        output_col);
316
11.1M
        buffer_ptr++;
317
11.1M
        output_col += compptr->_DCT_scaled_size;
318
11.1M
      }
319
1.43M
      output_ptr += compptr->_DCT_scaled_size;
320
1.43M
    }
321
957k
  }
322
323
455k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
324
452k
    return JPEG_ROW_COMPLETED;
325
2.72k
  return JPEG_SCAN_COMPLETED;
326
455k
}
327
328
#endif /* D_MULTISCAN_FILES_SUPPORTED */
329
330
331
#ifdef BLOCK_SMOOTHING_SUPPORTED
332
333
/*
334
 * This code applies interblock smoothing; the first 9 AC coefficients are
335
 * estimated from the DC values of a DCT block and its 24 neighboring blocks.
336
 * We apply smoothing only for progressive JPEG decoding, and only if
337
 * the coefficients it can estimate are not yet known to full precision.
338
 */
339
340
/* Natural-order array positions of the first 9 zigzag-order coefficients */
341
2.37M
#define Q01_POS  1
342
2.37M
#define Q10_POS  8
343
2.37M
#define Q20_POS  16
344
2.37M
#define Q11_POS  9
345
2.37M
#define Q02_POS  2
346
1.80M
#define Q03_POS  3
347
1.80M
#define Q12_POS  10
348
1.80M
#define Q21_POS  17
349
1.80M
#define Q30_POS  24
350
351
/*
352
 * Determine whether block smoothing is applicable and safe.
353
 * We also latch the current states of the coef_bits[] entries for the
354
 * AC coefficients; otherwise, if the input side of the decompressor
355
 * advances into a new scan, we might think the coefficients are known
356
 * more accurately than they really are.
357
 */
358
359
LOCAL(boolean)
360
smoothing_ok(j_decompress_ptr cinfo)
361
12.8k
{
362
12.8k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
12.8k
  boolean smoothing_useful = FALSE;
364
12.8k
  int ci, coefi;
365
12.8k
  jpeg_component_info *compptr;
366
12.8k
  JQUANT_TBL *qtable;
367
12.8k
  int *coef_bits, *prev_coef_bits;
368
12.8k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
12.8k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
3.49k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
9.33k
  if (coef->coef_bits_latch == NULL)
375
9.33k
    coef->coef_bits_latch = (int *)
376
9.33k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
9.33k
                                  cinfo->num_components * 2 *
378
9.33k
                                  (SAVED_COEFS * sizeof(int)));
379
9.33k
  coef_bits_latch = coef->coef_bits_latch;
380
9.33k
  prev_coef_bits_latch =
381
9.33k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
14.6k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
10.7k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
10.7k
    if ((qtable = compptr->quant_table) == NULL)
387
1.74k
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
9.00k
    if (qtable->quantval[0] == 0 ||
390
8.58k
        qtable->quantval[Q01_POS] == 0 ||
391
8.03k
        qtable->quantval[Q10_POS] == 0 ||
392
7.61k
        qtable->quantval[Q20_POS] == 0 ||
393
7.27k
        qtable->quantval[Q11_POS] == 0 ||
394
6.92k
        qtable->quantval[Q02_POS] == 0 ||
395
6.60k
        qtable->quantval[Q03_POS] == 0 ||
396
6.31k
        qtable->quantval[Q12_POS] == 0 ||
397
6.03k
        qtable->quantval[Q21_POS] == 0 ||
398
5.81k
        qtable->quantval[Q30_POS] == 0)
399
3.37k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
5.63k
    coef_bits = cinfo->coef_bits[ci];
402
5.63k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
5.63k
    if (coef_bits[0] < 0)
404
361
      return FALSE;
405
5.27k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
52.7k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
47.4k
      if (cinfo->input_scan_number > 1)
409
22.6k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
24.7k
      else
411
24.7k
        prev_coef_bits_latch[coefi] = -1;
412
47.4k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
47.4k
      if (coef_bits[coefi] != 0)
414
45.1k
        smoothing_useful = TRUE;
415
47.4k
    }
416
5.27k
    coef_bits_latch += SAVED_COEFS;
417
5.27k
    prev_coef_bits_latch += SAVED_COEFS;
418
5.27k
  }
419
420
3.85k
  return smoothing_useful;
421
9.33k
}
jdcoefct-8.c:smoothing_ok
Line
Count
Source
361
8.20k
{
362
8.20k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
8.20k
  boolean smoothing_useful = FALSE;
364
8.20k
  int ci, coefi;
365
8.20k
  jpeg_component_info *compptr;
366
8.20k
  JQUANT_TBL *qtable;
367
8.20k
  int *coef_bits, *prev_coef_bits;
368
8.20k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
8.20k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
2.02k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
6.18k
  if (coef->coef_bits_latch == NULL)
375
6.18k
    coef->coef_bits_latch = (int *)
376
6.18k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
6.18k
                                  cinfo->num_components * 2 *
378
6.18k
                                  (SAVED_COEFS * sizeof(int)));
379
6.18k
  coef_bits_latch = coef->coef_bits_latch;
380
6.18k
  prev_coef_bits_latch =
381
6.18k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
9.44k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
7.09k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
7.09k
    if ((qtable = compptr->quant_table) == NULL)
387
1.40k
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
5.68k
    if (qtable->quantval[0] == 0 ||
390
5.40k
        qtable->quantval[Q01_POS] == 0 ||
391
5.07k
        qtable->quantval[Q10_POS] == 0 ||
392
4.79k
        qtable->quantval[Q20_POS] == 0 ||
393
4.55k
        qtable->quantval[Q11_POS] == 0 ||
394
4.33k
        qtable->quantval[Q02_POS] == 0 ||
395
4.13k
        qtable->quantval[Q03_POS] == 0 ||
396
3.94k
        qtable->quantval[Q12_POS] == 0 ||
397
3.75k
        qtable->quantval[Q21_POS] == 0 ||
398
3.64k
        qtable->quantval[Q30_POS] == 0)
399
2.17k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
3.51k
    coef_bits = cinfo->coef_bits[ci];
402
3.51k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
3.51k
    if (coef_bits[0] < 0)
404
256
      return FALSE;
405
3.25k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
32.5k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
29.3k
      if (cinfo->input_scan_number > 1)
409
15.0k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
14.3k
      else
411
14.3k
        prev_coef_bits_latch[coefi] = -1;
412
29.3k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
29.3k
      if (coef_bits[coefi] != 0)
414
28.0k
        smoothing_useful = TRUE;
415
29.3k
    }
416
3.25k
    coef_bits_latch += SAVED_COEFS;
417
3.25k
    prev_coef_bits_latch += SAVED_COEFS;
418
3.25k
  }
419
420
2.34k
  return smoothing_useful;
421
6.18k
}
jdcoefct-12.c:smoothing_ok
Line
Count
Source
361
4.62k
{
362
4.62k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
363
4.62k
  boolean smoothing_useful = FALSE;
364
4.62k
  int ci, coefi;
365
4.62k
  jpeg_component_info *compptr;
366
4.62k
  JQUANT_TBL *qtable;
367
4.62k
  int *coef_bits, *prev_coef_bits;
368
4.62k
  int *coef_bits_latch, *prev_coef_bits_latch;
369
370
4.62k
  if (!cinfo->progressive_mode || cinfo->coef_bits == NULL)
371
1.47k
    return FALSE;
372
373
  /* Allocate latch area if not already done */
374
3.15k
  if (coef->coef_bits_latch == NULL)
375
3.15k
    coef->coef_bits_latch = (int *)
376
3.15k
      (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
377
3.15k
                                  cinfo->num_components * 2 *
378
3.15k
                                  (SAVED_COEFS * sizeof(int)));
379
3.15k
  coef_bits_latch = coef->coef_bits_latch;
380
3.15k
  prev_coef_bits_latch =
381
3.15k
    &coef->coef_bits_latch[cinfo->num_components * SAVED_COEFS];
382
383
5.16k
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
384
3.65k
       ci++, compptr++) {
385
    /* All components' quantization values must already be latched. */
386
3.65k
    if ((qtable = compptr->quant_table) == NULL)
387
337
      return FALSE;
388
    /* Verify DC & first 9 AC quantizers are nonzero to avoid zero-divide. */
389
3.31k
    if (qtable->quantval[0] == 0 ||
390
3.18k
        qtable->quantval[Q01_POS] == 0 ||
391
2.96k
        qtable->quantval[Q10_POS] == 0 ||
392
2.82k
        qtable->quantval[Q20_POS] == 0 ||
393
2.72k
        qtable->quantval[Q11_POS] == 0 ||
394
2.59k
        qtable->quantval[Q02_POS] == 0 ||
395
2.47k
        qtable->quantval[Q03_POS] == 0 ||
396
2.37k
        qtable->quantval[Q12_POS] == 0 ||
397
2.27k
        qtable->quantval[Q21_POS] == 0 ||
398
2.17k
        qtable->quantval[Q30_POS] == 0)
399
1.19k
      return FALSE;
400
    /* DC values must be at least partly known for all components. */
401
2.11k
    coef_bits = cinfo->coef_bits[ci];
402
2.11k
    prev_coef_bits = cinfo->coef_bits[ci + cinfo->num_components];
403
2.11k
    if (coef_bits[0] < 0)
404
105
      return FALSE;
405
2.01k
    coef_bits_latch[0] = coef_bits[0];
406
    /* Block smoothing is helpful if some AC coefficients remain inaccurate. */
407
20.1k
    for (coefi = 1; coefi < SAVED_COEFS; coefi++) {
408
18.1k
      if (cinfo->input_scan_number > 1)
409
7.64k
        prev_coef_bits_latch[coefi] = prev_coef_bits[coefi];
410
10.4k
      else
411
10.4k
        prev_coef_bits_latch[coefi] = -1;
412
18.1k
      coef_bits_latch[coefi] = coef_bits[coefi];
413
18.1k
      if (coef_bits[coefi] != 0)
414
17.1k
        smoothing_useful = TRUE;
415
18.1k
    }
416
2.01k
    coef_bits_latch += SAVED_COEFS;
417
2.01k
    prev_coef_bits_latch += SAVED_COEFS;
418
2.01k
  }
419
420
1.51k
  return smoothing_useful;
421
3.15k
}
422
423
424
/*
425
 * Variant of decompress_data for use when doing block smoothing.
426
 */
427
428
METHODDEF(int)
429
decompress_smooth_data(j_decompress_ptr cinfo, _JSAMPIMAGE output_buf)
430
1.56M
{
431
1.56M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
1.56M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
1.56M
  JDIMENSION block_num, last_block_column;
434
1.56M
  int ci, block_row, block_rows, access_rows, image_block_row,
435
1.56M
    image_block_rows;
436
1.56M
  JBLOCKARRAY buffer;
437
1.56M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
1.56M
  JBLOCKROW next_block_row, next_next_block_row;
439
1.56M
  _JSAMPARRAY output_ptr;
440
1.56M
  JDIMENSION output_col;
441
1.56M
  jpeg_component_info *compptr;
442
1.56M
  _inverse_DCT_method_ptr inverse_DCT;
443
1.56M
  boolean change_dc;
444
1.56M
  JCOEF *workspace;
445
1.56M
  int *coef_bits;
446
1.56M
  JQUANT_TBL *quanttbl;
447
1.56M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
1.56M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
1.56M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
1.56M
      DC25;
451
1.56M
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
1.56M
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
1.56M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
1.56M
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
3.98M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
2.41M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
2.41M
    if (!compptr->component_needed)
478
50.6k
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
2.36M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
2.35M
      block_rows = compptr->v_samp_factor;
482
2.35M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
2.35M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
4.31k
      block_rows = compptr->v_samp_factor;
485
4.31k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
4.77k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
4.77k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
4.77k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
4.77k
      access_rows = block_rows; /* this iMCU row only */
491
4.77k
    }
492
    /* Align the virtual buffer for this component. */
493
2.36M
    if (cinfo->output_iMCU_row > 1) {
494
2.35M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
2.35M
      buffer = (*cinfo->mem->access_virt_barray)
496
2.35M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
2.35M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
2.35M
         (JDIMENSION)access_rows, FALSE);
499
2.35M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
2.35M
    } else if (cinfo->output_iMCU_row > 0) {
501
4.31k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
4.31k
      buffer = (*cinfo->mem->access_virt_barray)
503
4.31k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
4.31k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
4.31k
         (JDIMENSION)access_rows, FALSE);
506
4.31k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
4.77k
    } else {
508
4.77k
      buffer = (*cinfo->mem->access_virt_barray)
509
4.77k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
4.77k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
4.77k
    }
512
    /* Fetch component-dependent info.
513
     * If the current scan is incomplete, then we use the component-dependent
514
     * info from the previous scan.
515
     */
516
2.36M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
1.20M
      coef_bits =
518
1.20M
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
1.16M
    else
520
1.16M
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
2.36M
    change_dc =
524
2.36M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
1.91M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
1.84M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
2.36M
    quanttbl = compptr->quant_table;
529
2.36M
    Q00 = quanttbl->quantval[0];
530
2.36M
    Q01 = quanttbl->quantval[Q01_POS];
531
2.36M
    Q10 = quanttbl->quantval[Q10_POS];
532
2.36M
    Q20 = quanttbl->quantval[Q20_POS];
533
2.36M
    Q11 = quanttbl->quantval[Q11_POS];
534
2.36M
    Q02 = quanttbl->quantval[Q02_POS];
535
2.36M
    if (change_dc) {
536
1.80M
      Q03 = quanttbl->quantval[Q03_POS];
537
1.80M
      Q12 = quanttbl->quantval[Q12_POS];
538
1.80M
      Q21 = quanttbl->quantval[Q21_POS];
539
1.80M
      Q30 = quanttbl->quantval[Q30_POS];
540
1.80M
    }
541
2.36M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
2.36M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
2.36M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
5.82M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
3.45M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
3.45M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
3.45M
      if (image_block_row > 0)
550
3.45M
        prev_block_row =
551
3.45M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
4.77k
      else
553
4.77k
        prev_block_row = buffer_ptr;
554
555
3.45M
      if (image_block_row > 1)
556
3.44M
        prev_prev_block_row =
557
3.44M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
9.31k
      else
559
9.31k
        prev_prev_block_row = prev_block_row;
560
561
3.45M
      if (image_block_row < image_block_rows - 1)
562
3.45M
        next_block_row =
563
3.45M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
4.77k
      else
565
4.77k
        next_block_row = buffer_ptr;
566
567
3.45M
      if (image_block_row < image_block_rows - 2)
568
3.45M
        next_next_block_row =
569
3.45M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
8.32k
      else
571
8.32k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
3.45M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
3.45M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
3.45M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
3.45M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
3.45M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
3.45M
      output_col = 0;
582
3.45M
      last_block_column = compptr->width_in_blocks - 1;
583
3.45M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
30.7M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
27.2M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
27.2M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
3.45M
            block_num < last_block_column) {
590
1.74M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
1.74M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
1.74M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
1.74M
          DC19 = DC20 = (int)next_block_row[1][0];
594
1.74M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
1.74M
        }
596
27.2M
        if (block_num + 1 < last_block_column) {
597
22.0M
          DC05 = (int)prev_prev_block_row[2][0];
598
22.0M
          DC10 = (int)prev_block_row[2][0];
599
22.0M
          DC15 = (int)buffer_ptr[2][0];
600
22.0M
          DC20 = (int)next_block_row[2][0];
601
22.0M
          DC25 = (int)next_next_block_row[2][0];
602
22.0M
        }
603
        /* If DC interpolation is enabled, compute coefficient estimates using
604
         * a Gaussian-like kernel, keeping the averages of the DC values.
605
         *
606
         * If DC interpolation is disabled, compute coefficient estimates using
607
         * an algorithm similar to the one described in Section K.8 of the JPEG
608
         * standard, except applied to a 5x5 window rather than a 3x3 window.
609
         *
610
         * An estimate is applied only if the coefficient is still zero and is
611
         * not known to be fully accurate.
612
         */
613
        /* AC01 */
614
27.2M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
26.1M
          num = Q00 * (change_dc ?
616
18.9M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
18.9M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
18.9M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
18.9M
                 DC21 - DC22 + DC24 + DC25) :
620
26.1M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
26.1M
          if (num >= 0) {
622
20.0M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
20.0M
            if (Al > 0 && pred >= (1 << Al))
624
1.38M
              pred = (1 << Al) - 1;
625
20.0M
          } else {
626
6.08M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
6.08M
            if (Al > 0 && pred >= (1 << Al))
628
1.17M
              pred = (1 << Al) - 1;
629
6.08M
            pred = -pred;
630
6.08M
          }
631
26.1M
          workspace[1] = (JCOEF)pred;
632
26.1M
        }
633
        /* AC10 */
634
27.2M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
26.2M
          num = Q00 * (change_dc ?
636
18.9M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
18.9M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
18.9M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
18.9M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
26.2M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
26.2M
          if (num >= 0) {
642
18.6M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
18.6M
            if (Al > 0 && pred >= (1 << Al))
644
2.07M
              pred = (1 << Al) - 1;
645
18.6M
          } else {
646
7.67M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
7.67M
            if (Al > 0 && pred >= (1 << Al))
648
1.80M
              pred = (1 << Al) - 1;
649
7.67M
            pred = -pred;
650
7.67M
          }
651
26.2M
          workspace[8] = (JCOEF)pred;
652
26.2M
        }
653
        /* AC20 */
654
27.2M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
26.3M
          num = Q00 * (change_dc ?
656
18.9M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
18.9M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
26.3M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
26.3M
          if (num >= 0) {
660
16.5M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
16.5M
            if (Al > 0 && pred >= (1 << Al))
662
1.88M
              pred = (1 << Al) - 1;
663
16.5M
          } else {
664
9.80M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
9.80M
            if (Al > 0 && pred >= (1 << Al))
666
1.89M
              pred = (1 << Al) - 1;
667
9.80M
            pred = -pred;
668
9.80M
          }
669
26.3M
          workspace[16] = (JCOEF)pred;
670
26.3M
        }
671
        /* AC11 */
672
27.2M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
26.3M
          num = Q00 * (change_dc ?
674
18.9M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
18.9M
                 9 * DC19 + DC21 - DC25) :
676
26.3M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
7.36M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
26.3M
          if (num >= 0) {
679
20.7M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
20.7M
            if (Al > 0 && pred >= (1 << Al))
681
892k
              pred = (1 << Al) - 1;
682
20.7M
          } else {
683
5.58M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
5.58M
            if (Al > 0 && pred >= (1 << Al))
685
866k
              pred = (1 << Al) - 1;
686
5.58M
            pred = -pred;
687
5.58M
          }
688
26.3M
          workspace[9] = (JCOEF)pred;
689
26.3M
        }
690
        /* AC02 */
691
27.2M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
26.3M
          num = Q00 * (change_dc ?
693
18.9M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
18.9M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
26.3M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
26.3M
          if (num >= 0) {
697
16.7M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
16.7M
            if (Al > 0 && pred >= (1 << Al))
699
1.19M
              pred = (1 << Al) - 1;
700
16.7M
          } else {
701
9.62M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
9.62M
            if (Al > 0 && pred >= (1 << Al))
703
1.20M
              pred = (1 << Al) - 1;
704
9.62M
            pred = -pred;
705
9.62M
          }
706
26.3M
          workspace[2] = (JCOEF)pred;
707
26.3M
        }
708
27.2M
        if (change_dc) {
709
          /* AC03 */
710
18.9M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
18.9M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
18.9M
            if (num >= 0) {
713
15.3M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
15.3M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
15.3M
            } else {
717
3.59M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
3.59M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
3.59M
              pred = -pred;
721
3.59M
            }
722
18.9M
            workspace[3] = (JCOEF)pred;
723
18.9M
          }
724
          /* AC12 */
725
18.9M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
18.9M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
18.9M
            if (num >= 0) {
728
11.5M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
11.5M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
11.5M
            } else {
732
7.40M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
7.40M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
7.40M
              pred = -pred;
736
7.40M
            }
737
18.9M
            workspace[10] = (JCOEF)pred;
738
18.9M
          }
739
          /* AC21 */
740
18.9M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
18.9M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
18.9M
            if (num >= 0) {
743
10.6M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
10.6M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
10.6M
            } else {
747
8.33M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
8.33M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
8.33M
              pred = -pred;
751
8.33M
            }
752
18.9M
            workspace[17] = (JCOEF)pred;
753
18.9M
          }
754
          /* AC30 */
755
18.9M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
18.9M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
18.9M
            if (num >= 0) {
758
14.2M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
14.2M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
14.2M
            } else {
762
4.75M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
4.75M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
4.75M
              pred = -pred;
766
4.75M
            }
767
18.9M
            workspace[24] = (JCOEF)pred;
768
18.9M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
18.9M
          num = Q00 *
773
18.9M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
18.9M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
18.9M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
18.9M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
18.9M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
18.9M
          if (num >= 0) {
779
11.5M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
11.5M
          } else {
781
7.45M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
7.45M
            pred = -pred;
783
7.45M
          }
784
18.9M
          workspace[0] = (JCOEF)pred;
785
18.9M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
27.2M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
27.2M
                        output_col);
790
        /* Advance for next column */
791
27.2M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
27.2M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
27.2M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
27.2M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
27.2M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
27.2M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
27.2M
          prev_prev_block_row++, next_next_block_row++;
798
27.2M
        output_col += compptr->_DCT_scaled_size;
799
27.2M
      }
800
3.45M
      output_ptr += compptr->_DCT_scaled_size;
801
3.45M
    }
802
2.36M
  }
803
804
1.56M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
1.55M
    return JPEG_ROW_COMPLETED;
806
3.71k
  return JPEG_SCAN_COMPLETED;
807
1.56M
}
jdcoefct-8.c:decompress_smooth_data
Line
Count
Source
430
1.01M
{
431
1.01M
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
1.01M
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
1.01M
  JDIMENSION block_num, last_block_column;
434
1.01M
  int ci, block_row, block_rows, access_rows, image_block_row,
435
1.01M
    image_block_rows;
436
1.01M
  JBLOCKARRAY buffer;
437
1.01M
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
1.01M
  JBLOCKROW next_block_row, next_next_block_row;
439
1.01M
  _JSAMPARRAY output_ptr;
440
1.01M
  JDIMENSION output_col;
441
1.01M
  jpeg_component_info *compptr;
442
1.01M
  _inverse_DCT_method_ptr inverse_DCT;
443
1.01M
  boolean change_dc;
444
1.01M
  JCOEF *workspace;
445
1.01M
  int *coef_bits;
446
1.01M
  JQUANT_TBL *quanttbl;
447
1.01M
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
1.01M
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
1.01M
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
1.01M
      DC25;
451
1.01M
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
1.01M
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
1.01M
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
1.01M
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
2.63M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
1.61M
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
1.61M
    if (!compptr->component_needed)
478
20.3k
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
1.59M
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
1.58M
      block_rows = compptr->v_samp_factor;
482
1.58M
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
1.58M
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
2.76k
      block_rows = compptr->v_samp_factor;
485
2.76k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
3.03k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
3.03k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
3.03k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
3.03k
      access_rows = block_rows; /* this iMCU row only */
491
3.03k
    }
492
    /* Align the virtual buffer for this component. */
493
1.59M
    if (cinfo->output_iMCU_row > 1) {
494
1.58M
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
1.58M
      buffer = (*cinfo->mem->access_virt_barray)
496
1.58M
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
1.58M
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
1.58M
         (JDIMENSION)access_rows, FALSE);
499
1.58M
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
1.58M
    } else if (cinfo->output_iMCU_row > 0) {
501
2.76k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
2.76k
      buffer = (*cinfo->mem->access_virt_barray)
503
2.76k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
2.76k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
2.76k
         (JDIMENSION)access_rows, FALSE);
506
2.76k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
3.03k
    } else {
508
3.03k
      buffer = (*cinfo->mem->access_virt_barray)
509
3.03k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
3.03k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
3.03k
    }
512
    /* Fetch component-dependent info.
513
     * If the current scan is incomplete, then we use the component-dependent
514
     * info from the previous scan.
515
     */
516
1.59M
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
884k
      coef_bits =
518
884k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
708k
    else
520
708k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
1.59M
    change_dc =
524
1.59M
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
1.27M
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
1.22M
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
1.59M
    quanttbl = compptr->quant_table;
529
1.59M
    Q00 = quanttbl->quantval[0];
530
1.59M
    Q01 = quanttbl->quantval[Q01_POS];
531
1.59M
    Q10 = quanttbl->quantval[Q10_POS];
532
1.59M
    Q20 = quanttbl->quantval[Q20_POS];
533
1.59M
    Q11 = quanttbl->quantval[Q11_POS];
534
1.59M
    Q02 = quanttbl->quantval[Q02_POS];
535
1.59M
    if (change_dc) {
536
1.19M
      Q03 = quanttbl->quantval[Q03_POS];
537
1.19M
      Q12 = quanttbl->quantval[Q12_POS];
538
1.19M
      Q21 = quanttbl->quantval[Q21_POS];
539
1.19M
      Q30 = quanttbl->quantval[Q30_POS];
540
1.19M
    }
541
1.59M
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
1.59M
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
1.59M
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
3.86M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
2.27M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
2.27M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
2.27M
      if (image_block_row > 0)
550
2.26M
        prev_block_row =
551
2.26M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
3.03k
      else
553
3.03k
        prev_block_row = buffer_ptr;
554
555
2.27M
      if (image_block_row > 1)
556
2.26M
        prev_prev_block_row =
557
2.26M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
5.97k
      else
559
5.97k
        prev_prev_block_row = prev_block_row;
560
561
2.27M
      if (image_block_row < image_block_rows - 1)
562
2.26M
        next_block_row =
563
2.26M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
3.03k
      else
565
3.03k
        next_block_row = buffer_ptr;
566
567
2.27M
      if (image_block_row < image_block_rows - 2)
568
2.26M
        next_next_block_row =
569
2.26M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
5.39k
      else
571
5.39k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
2.27M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
2.27M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
2.27M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
2.27M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
2.27M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
2.27M
      output_col = 0;
582
2.27M
      last_block_column = compptr->width_in_blocks - 1;
583
2.27M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
20.2M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
17.9M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
17.9M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
2.27M
            block_num < last_block_column) {
590
1.14M
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
1.14M
          DC09 = DC10 = (int)prev_block_row[1][0];
592
1.14M
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
1.14M
          DC19 = DC20 = (int)next_block_row[1][0];
594
1.14M
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
1.14M
        }
596
17.9M
        if (block_num + 1 < last_block_column) {
597
14.5M
          DC05 = (int)prev_prev_block_row[2][0];
598
14.5M
          DC10 = (int)prev_block_row[2][0];
599
14.5M
          DC15 = (int)buffer_ptr[2][0];
600
14.5M
          DC20 = (int)next_block_row[2][0];
601
14.5M
          DC25 = (int)next_next_block_row[2][0];
602
14.5M
        }
603
        /* If DC interpolation is enabled, compute coefficient estimates using
604
         * a Gaussian-like kernel, keeping the averages of the DC values.
605
         *
606
         * If DC interpolation is disabled, compute coefficient estimates using
607
         * an algorithm similar to the one described in Section K.8 of the JPEG
608
         * standard, except applied to a 5x5 window rather than a 3x3 window.
609
         *
610
         * An estimate is applied only if the coefficient is still zero and is
611
         * not known to be fully accurate.
612
         */
613
        /* AC01 */
614
17.9M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
17.2M
          num = Q00 * (change_dc ?
616
12.5M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
12.5M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
12.5M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
12.5M
                 DC21 - DC22 + DC24 + DC25) :
620
17.2M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
17.2M
          if (num >= 0) {
622
13.4M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
13.4M
            if (Al > 0 && pred >= (1 << Al))
624
970k
              pred = (1 << Al) - 1;
625
13.4M
          } else {
626
3.80M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
3.80M
            if (Al > 0 && pred >= (1 << Al))
628
821k
              pred = (1 << Al) - 1;
629
3.80M
            pred = -pred;
630
3.80M
          }
631
17.2M
          workspace[1] = (JCOEF)pred;
632
17.2M
        }
633
        /* AC10 */
634
17.9M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
17.3M
          num = Q00 * (change_dc ?
636
12.5M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
12.5M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
12.5M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
12.5M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
17.3M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
17.3M
          if (num >= 0) {
642
12.4M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
12.4M
            if (Al > 0 && pred >= (1 << Al))
644
1.40M
              pred = (1 << Al) - 1;
645
12.4M
          } else {
646
4.90M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
4.90M
            if (Al > 0 && pred >= (1 << Al))
648
1.23M
              pred = (1 << Al) - 1;
649
4.90M
            pred = -pred;
650
4.90M
          }
651
17.3M
          workspace[8] = (JCOEF)pred;
652
17.3M
        }
653
        /* AC20 */
654
17.9M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
17.3M
          num = Q00 * (change_dc ?
656
12.5M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
12.5M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
17.3M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
17.3M
          if (num >= 0) {
660
11.3M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
11.3M
            if (Al > 0 && pred >= (1 << Al))
662
1.22M
              pred = (1 << Al) - 1;
663
11.3M
          } else {
664
6.03M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
6.03M
            if (Al > 0 && pred >= (1 << Al))
666
1.22M
              pred = (1 << Al) - 1;
667
6.03M
            pred = -pred;
668
6.03M
          }
669
17.3M
          workspace[16] = (JCOEF)pred;
670
17.3M
        }
671
        /* AC11 */
672
17.9M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
17.3M
          num = Q00 * (change_dc ?
674
12.5M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
12.5M
                 9 * DC19 + DC21 - DC25) :
676
17.3M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
4.81M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
17.3M
          if (num >= 0) {
679
13.8M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
13.8M
            if (Al > 0 && pred >= (1 << Al))
681
579k
              pred = (1 << Al) - 1;
682
13.8M
          } else {
683
3.44M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
3.44M
            if (Al > 0 && pred >= (1 << Al))
685
566k
              pred = (1 << Al) - 1;
686
3.44M
            pred = -pred;
687
3.44M
          }
688
17.3M
          workspace[9] = (JCOEF)pred;
689
17.3M
        }
690
        /* AC02 */
691
17.9M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
17.3M
          num = Q00 * (change_dc ?
693
12.5M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
12.5M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
17.3M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
17.3M
          if (num >= 0) {
697
11.4M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
11.4M
            if (Al > 0 && pred >= (1 << Al))
699
767k
              pred = (1 << Al) - 1;
700
11.4M
          } else {
701
5.91M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
5.91M
            if (Al > 0 && pred >= (1 << Al))
703
767k
              pred = (1 << Al) - 1;
704
5.91M
            pred = -pred;
705
5.91M
          }
706
17.3M
          workspace[2] = (JCOEF)pred;
707
17.3M
        }
708
17.9M
        if (change_dc) {
709
          /* AC03 */
710
12.5M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
12.5M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
12.5M
            if (num >= 0) {
713
10.2M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
10.2M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
10.2M
            } else {
717
2.24M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
2.24M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
2.24M
              pred = -pred;
721
2.24M
            }
722
12.5M
            workspace[3] = (JCOEF)pred;
723
12.5M
          }
724
          /* AC12 */
725
12.5M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
12.5M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
12.5M
            if (num >= 0) {
728
8.20M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
8.20M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
8.20M
            } else {
732
4.31M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
4.31M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
4.31M
              pred = -pred;
736
4.31M
            }
737
12.5M
            workspace[10] = (JCOEF)pred;
738
12.5M
          }
739
          /* AC21 */
740
12.5M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
12.5M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
12.5M
            if (num >= 0) {
743
7.57M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
7.57M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
7.57M
            } else {
747
4.94M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
4.94M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
4.94M
              pred = -pred;
751
4.94M
            }
752
12.5M
            workspace[17] = (JCOEF)pred;
753
12.5M
          }
754
          /* AC30 */
755
12.5M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
12.5M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
12.5M
            if (num >= 0) {
758
9.51M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
9.51M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
9.51M
            } else {
762
3.01M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
3.01M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
3.01M
              pred = -pred;
766
3.01M
            }
767
12.5M
            workspace[24] = (JCOEF)pred;
768
12.5M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
12.5M
          num = Q00 *
773
12.5M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
12.5M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
12.5M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
12.5M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
12.5M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
12.5M
          if (num >= 0) {
779
8.21M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
8.21M
          } else {
781
4.30M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
4.30M
            pred = -pred;
783
4.30M
          }
784
12.5M
          workspace[0] = (JCOEF)pred;
785
12.5M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
17.9M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
17.9M
                        output_col);
790
        /* Advance for next column */
791
17.9M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
17.9M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
17.9M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
17.9M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
17.9M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
17.9M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
17.9M
          prev_prev_block_row++, next_next_block_row++;
798
17.9M
        output_col += compptr->_DCT_scaled_size;
799
17.9M
      }
800
2.27M
      output_ptr += compptr->_DCT_scaled_size;
801
2.27M
    }
802
1.59M
  }
803
804
1.01M
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
1.01M
    return JPEG_ROW_COMPLETED;
806
2.31k
  return JPEG_SCAN_COMPLETED;
807
1.01M
}
jdcoefct-12.c:decompress_smooth_data
Line
Count
Source
430
545k
{
431
545k
  my_coef_ptr coef = (my_coef_ptr)cinfo->coef;
432
545k
  JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
433
545k
  JDIMENSION block_num, last_block_column;
434
545k
  int ci, block_row, block_rows, access_rows, image_block_row,
435
545k
    image_block_rows;
436
545k
  JBLOCKARRAY buffer;
437
545k
  JBLOCKROW buffer_ptr, prev_prev_block_row, prev_block_row;
438
545k
  JBLOCKROW next_block_row, next_next_block_row;
439
545k
  _JSAMPARRAY output_ptr;
440
545k
  JDIMENSION output_col;
441
545k
  jpeg_component_info *compptr;
442
545k
  _inverse_DCT_method_ptr inverse_DCT;
443
545k
  boolean change_dc;
444
545k
  JCOEF *workspace;
445
545k
  int *coef_bits;
446
545k
  JQUANT_TBL *quanttbl;
447
545k
  JLONG Q00, Q01, Q02, Q03 = 0, Q10, Q11, Q12 = 0, Q20, Q21 = 0, Q30 = 0, num;
448
545k
  int DC01, DC02, DC03, DC04, DC05, DC06, DC07, DC08, DC09, DC10, DC11, DC12,
449
545k
      DC13, DC14, DC15, DC16, DC17, DC18, DC19, DC20, DC21, DC22, DC23, DC24,
450
545k
      DC25;
451
545k
  int Al, pred;
452
453
  /* Keep a local variable to avoid looking it up more than once */
454
545k
  workspace = coef->workspace;
455
456
  /* Force some input to be done if we are getting ahead of the input. */
457
545k
  while (cinfo->input_scan_number <= cinfo->output_scan_number &&
458
545k
         !cinfo->inputctl->eoi_reached) {
459
0
    if (cinfo->input_scan_number == cinfo->output_scan_number) {
460
      /* If input is working on current scan, we ordinarily want it to
461
       * have completed the current row.  But if input scan is DC,
462
       * we want it to keep two rows ahead so that next two block rows' DC
463
       * values are up to date.
464
       */
465
0
      JDIMENSION delta = (cinfo->Ss == 0) ? 2 : 0;
466
0
      if (cinfo->input_iMCU_row > cinfo->output_iMCU_row + delta)
467
0
        break;
468
0
    }
469
0
    if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
470
0
      return JPEG_SUSPENDED;
471
0
  }
472
473
  /* OK, output from the virtual arrays. */
474
1.35M
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
475
804k
       ci++, compptr++) {
476
    /* Don't bother to IDCT an uninteresting component. */
477
804k
    if (!compptr->component_needed)
478
30.2k
      continue;
479
    /* Count non-dummy DCT block rows in this iMCU row. */
480
774k
    if (cinfo->output_iMCU_row + 1 < last_iMCU_row) {
481
770k
      block_rows = compptr->v_samp_factor;
482
770k
      access_rows = block_rows * 3; /* this and next two iMCU rows */
483
770k
    } else if (cinfo->output_iMCU_row < last_iMCU_row) {
484
1.54k
      block_rows = compptr->v_samp_factor;
485
1.54k
      access_rows = block_rows * 2; /* this and next iMCU row */
486
1.73k
    } else {
487
      /* NB: can't use last_row_height here; it is input-side-dependent! */
488
1.73k
      block_rows = (int)(compptr->height_in_blocks % compptr->v_samp_factor);
489
1.73k
      if (block_rows == 0) block_rows = compptr->v_samp_factor;
490
1.73k
      access_rows = block_rows; /* this iMCU row only */
491
1.73k
    }
492
    /* Align the virtual buffer for this component. */
493
774k
    if (cinfo->output_iMCU_row > 1) {
494
770k
      access_rows += 2 * compptr->v_samp_factor; /* prior two iMCU rows too */
495
770k
      buffer = (*cinfo->mem->access_virt_barray)
496
770k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
497
770k
         (cinfo->output_iMCU_row - 2) * compptr->v_samp_factor,
498
770k
         (JDIMENSION)access_rows, FALSE);
499
770k
      buffer += 2 * compptr->v_samp_factor; /* point to current iMCU row */
500
770k
    } else if (cinfo->output_iMCU_row > 0) {
501
1.54k
      access_rows += compptr->v_samp_factor; /* prior iMCU row too */
502
1.54k
      buffer = (*cinfo->mem->access_virt_barray)
503
1.54k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
504
1.54k
         (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor,
505
1.54k
         (JDIMENSION)access_rows, FALSE);
506
1.54k
      buffer += compptr->v_samp_factor; /* point to current iMCU row */
507
1.73k
    } else {
508
1.73k
      buffer = (*cinfo->mem->access_virt_barray)
509
1.73k
        ((j_common_ptr)cinfo, coef->whole_image[ci],
510
1.73k
         (JDIMENSION)0, (JDIMENSION)access_rows, FALSE);
511
1.73k
    }
512
    /* Fetch component-dependent info.
513
     * If the current scan is incomplete, then we use the component-dependent
514
     * info from the previous scan.
515
     */
516
774k
    if (cinfo->output_iMCU_row > cinfo->master->last_good_iMCU_row)
517
322k
      coef_bits =
518
322k
        coef->coef_bits_latch + ((ci + cinfo->num_components) * SAVED_COEFS);
519
451k
    else
520
451k
      coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS);
521
522
    /* We only do DC interpolation if no AC coefficient data is available. */
523
774k
    change_dc =
524
774k
      coef_bits[1] == -1 && coef_bits[2] == -1 && coef_bits[3] == -1 &&
525
638k
      coef_bits[4] == -1 && coef_bits[5] == -1 && coef_bits[6] == -1 &&
526
616k
      coef_bits[7] == -1 && coef_bits[8] == -1 && coef_bits[9] == -1;
527
528
774k
    quanttbl = compptr->quant_table;
529
774k
    Q00 = quanttbl->quantval[0];
530
774k
    Q01 = quanttbl->quantval[Q01_POS];
531
774k
    Q10 = quanttbl->quantval[Q10_POS];
532
774k
    Q20 = quanttbl->quantval[Q20_POS];
533
774k
    Q11 = quanttbl->quantval[Q11_POS];
534
774k
    Q02 = quanttbl->quantval[Q02_POS];
535
774k
    if (change_dc) {
536
605k
      Q03 = quanttbl->quantval[Q03_POS];
537
605k
      Q12 = quanttbl->quantval[Q12_POS];
538
605k
      Q21 = quanttbl->quantval[Q21_POS];
539
605k
      Q30 = quanttbl->quantval[Q30_POS];
540
605k
    }
541
774k
    inverse_DCT = cinfo->idct->_inverse_DCT[ci];
542
774k
    output_ptr = output_buf[ci];
543
    /* Loop over all DCT blocks to be processed. */
544
774k
    image_block_rows = block_rows * cinfo->total_iMCU_rows;
545
1.96M
    for (block_row = 0; block_row < block_rows; block_row++) {
546
1.18M
      image_block_row = cinfo->output_iMCU_row * block_rows + block_row;
547
1.18M
      buffer_ptr = buffer[block_row] + cinfo->master->first_MCU_col[ci];
548
549
1.18M
      if (image_block_row > 0)
550
1.18M
        prev_block_row =
551
1.18M
          buffer[block_row - 1] + cinfo->master->first_MCU_col[ci];
552
1.73k
      else
553
1.73k
        prev_block_row = buffer_ptr;
554
555
1.18M
      if (image_block_row > 1)
556
1.18M
        prev_prev_block_row =
557
1.18M
          buffer[block_row - 2] + cinfo->master->first_MCU_col[ci];
558
3.34k
      else
559
3.34k
        prev_prev_block_row = prev_block_row;
560
561
1.18M
      if (image_block_row < image_block_rows - 1)
562
1.18M
        next_block_row =
563
1.18M
          buffer[block_row + 1] + cinfo->master->first_MCU_col[ci];
564
1.73k
      else
565
1.73k
        next_block_row = buffer_ptr;
566
567
1.18M
      if (image_block_row < image_block_rows - 2)
568
1.18M
        next_next_block_row =
569
1.18M
          buffer[block_row + 2] + cinfo->master->first_MCU_col[ci];
570
2.93k
      else
571
2.93k
        next_next_block_row = next_block_row;
572
573
      /* We fetch the surrounding DC values using a sliding-register approach.
574
       * Initialize all 25 here so as to do the right thing on narrow pics.
575
       */
576
1.18M
      DC01 = DC02 = DC03 = DC04 = DC05 = (int)prev_prev_block_row[0][0];
577
1.18M
      DC06 = DC07 = DC08 = DC09 = DC10 = (int)prev_block_row[0][0];
578
1.18M
      DC11 = DC12 = DC13 = DC14 = DC15 = (int)buffer_ptr[0][0];
579
1.18M
      DC16 = DC17 = DC18 = DC19 = DC20 = (int)next_block_row[0][0];
580
1.18M
      DC21 = DC22 = DC23 = DC24 = DC25 = (int)next_next_block_row[0][0];
581
1.18M
      output_col = 0;
582
1.18M
      last_block_column = compptr->width_in_blocks - 1;
583
1.18M
      for (block_num = cinfo->master->first_MCU_col[ci];
584
10.4M
           block_num <= cinfo->master->last_MCU_col[ci]; block_num++) {
585
        /* Fetch current DCT block into workspace so we can modify it. */
586
9.28M
        jcopy_block_row(buffer_ptr, (JBLOCKROW)workspace, (JDIMENSION)1);
587
        /* Update DC values */
588
9.28M
        if (block_num == cinfo->master->first_MCU_col[ci] &&
589
1.18M
            block_num < last_block_column) {
590
599k
          DC04 = DC05 = (int)prev_prev_block_row[1][0];
591
599k
          DC09 = DC10 = (int)prev_block_row[1][0];
592
599k
          DC14 = DC15 = (int)buffer_ptr[1][0];
593
599k
          DC19 = DC20 = (int)next_block_row[1][0];
594
599k
          DC24 = DC25 = (int)next_next_block_row[1][0];
595
599k
        }
596
9.28M
        if (block_num + 1 < last_block_column) {
597
7.49M
          DC05 = (int)prev_prev_block_row[2][0];
598
7.49M
          DC10 = (int)prev_block_row[2][0];
599
7.49M
          DC15 = (int)buffer_ptr[2][0];
600
7.49M
          DC20 = (int)next_block_row[2][0];
601
7.49M
          DC25 = (int)next_next_block_row[2][0];
602
7.49M
        }
603
        /* If DC interpolation is enabled, compute coefficient estimates using
604
         * a Gaussian-like kernel, keeping the averages of the DC values.
605
         *
606
         * If DC interpolation is disabled, compute coefficient estimates using
607
         * an algorithm similar to the one described in Section K.8 of the JPEG
608
         * standard, except applied to a 5x5 window rather than a 3x3 window.
609
         *
610
         * An estimate is applied only if the coefficient is still zero and is
611
         * not known to be fully accurate.
612
         */
613
        /* AC01 */
614
9.28M
        if ((Al = coef_bits[1]) != 0 && workspace[1] == 0) {
615
8.92M
          num = Q00 * (change_dc ?
616
6.43M
                (-DC01 - DC02 + DC04 + DC05 - 3 * DC06 + 13 * DC07 -
617
6.43M
                 13 * DC09 + 3 * DC10 - 3 * DC11 + 38 * DC12 - 38 * DC14 +
618
6.43M
                 3 * DC15 - 3 * DC16 + 13 * DC17 - 13 * DC19 + 3 * DC20 -
619
6.43M
                 DC21 - DC22 + DC24 + DC25) :
620
8.92M
                (-7 * DC11 + 50 * DC12 - 50 * DC14 + 7 * DC15));
621
8.92M
          if (num >= 0) {
622
6.64M
            pred = (int)(((Q01 << 7) + num) / (Q01 << 8));
623
6.64M
            if (Al > 0 && pred >= (1 << Al))
624
409k
              pred = (1 << Al) - 1;
625
6.64M
          } else {
626
2.27M
            pred = (int)(((Q01 << 7) - num) / (Q01 << 8));
627
2.27M
            if (Al > 0 && pred >= (1 << Al))
628
353k
              pred = (1 << Al) - 1;
629
2.27M
            pred = -pred;
630
2.27M
          }
631
8.92M
          workspace[1] = (JCOEF)pred;
632
8.92M
        }
633
        /* AC10 */
634
9.28M
        if ((Al = coef_bits[2]) != 0 && workspace[8] == 0) {
635
8.95M
          num = Q00 * (change_dc ?
636
6.43M
                (-DC01 - 3 * DC02 - 3 * DC03 - 3 * DC04 - DC05 - DC06 +
637
6.43M
                 13 * DC07 + 38 * DC08 + 13 * DC09 - DC10 + DC16 -
638
6.43M
                 13 * DC17 - 38 * DC18 - 13 * DC19 + DC20 + DC21 +
639
6.43M
                 3 * DC22 + 3 * DC23 + 3 * DC24 + DC25) :
640
8.95M
                (-7 * DC03 + 50 * DC08 - 50 * DC18 + 7 * DC23));
641
8.95M
          if (num >= 0) {
642
6.18M
            pred = (int)(((Q10 << 7) + num) / (Q10 << 8));
643
6.18M
            if (Al > 0 && pred >= (1 << Al))
644
664k
              pred = (1 << Al) - 1;
645
6.18M
          } else {
646
2.76M
            pred = (int)(((Q10 << 7) - num) / (Q10 << 8));
647
2.76M
            if (Al > 0 && pred >= (1 << Al))
648
565k
              pred = (1 << Al) - 1;
649
2.76M
            pred = -pred;
650
2.76M
          }
651
8.95M
          workspace[8] = (JCOEF)pred;
652
8.95M
        }
653
        /* AC20 */
654
9.28M
        if ((Al = coef_bits[3]) != 0 && workspace[16] == 0) {
655
9.00M
          num = Q00 * (change_dc ?
656
6.43M
                (DC03 + 2 * DC07 + 7 * DC08 + 2 * DC09 - 5 * DC12 - 14 * DC13 -
657
6.43M
                 5 * DC14 + 2 * DC17 + 7 * DC18 + 2 * DC19 + DC23) :
658
9.00M
                (-DC03 + 13 * DC08 - 24 * DC13 + 13 * DC18 - DC23));
659
9.00M
          if (num >= 0) {
660
5.24M
            pred = (int)(((Q20 << 7) + num) / (Q20 << 8));
661
5.24M
            if (Al > 0 && pred >= (1 << Al))
662
655k
              pred = (1 << Al) - 1;
663
5.24M
          } else {
664
3.76M
            pred = (int)(((Q20 << 7) - num) / (Q20 << 8));
665
3.76M
            if (Al > 0 && pred >= (1 << Al))
666
666k
              pred = (1 << Al) - 1;
667
3.76M
            pred = -pred;
668
3.76M
          }
669
9.00M
          workspace[16] = (JCOEF)pred;
670
9.00M
        }
671
        /* AC11 */
672
9.28M
        if ((Al = coef_bits[4]) != 0 && workspace[9] == 0) {
673
8.98M
          num = Q00 * (change_dc ?
674
6.43M
                (-DC01 + DC05 + 9 * DC07 - 9 * DC09 - 9 * DC17 +
675
6.43M
                 9 * DC19 + DC21 - DC25) :
676
8.98M
                (DC10 + DC16 - 10 * DC17 + 10 * DC19 - DC02 - DC20 + DC22 -
677
2.54M
                 DC24 + DC04 - DC06 + 10 * DC07 - 10 * DC09));
678
8.98M
          if (num >= 0) {
679
6.84M
            pred = (int)(((Q11 << 7) + num) / (Q11 << 8));
680
6.84M
            if (Al > 0 && pred >= (1 << Al))
681
312k
              pred = (1 << Al) - 1;
682
6.84M
          } else {
683
2.13M
            pred = (int)(((Q11 << 7) - num) / (Q11 << 8));
684
2.13M
            if (Al > 0 && pred >= (1 << Al))
685
300k
              pred = (1 << Al) - 1;
686
2.13M
            pred = -pred;
687
2.13M
          }
688
8.98M
          workspace[9] = (JCOEF)pred;
689
8.98M
        }
690
        /* AC02 */
691
9.28M
        if ((Al = coef_bits[5]) != 0 && workspace[2] == 0) {
692
9.00M
          num = Q00 * (change_dc ?
693
6.43M
                (2 * DC07 - 5 * DC08 + 2 * DC09 + DC11 + 7 * DC12 - 14 * DC13 +
694
6.43M
                 7 * DC14 + DC15 + 2 * DC17 - 5 * DC18 + 2 * DC19) :
695
9.00M
                (-DC11 + 13 * DC12 - 24 * DC13 + 13 * DC14 - DC15));
696
9.00M
          if (num >= 0) {
697
5.29M
            pred = (int)(((Q02 << 7) + num) / (Q02 << 8));
698
5.29M
            if (Al > 0 && pred >= (1 << Al))
699
427k
              pred = (1 << Al) - 1;
700
5.29M
          } else {
701
3.71M
            pred = (int)(((Q02 << 7) - num) / (Q02 << 8));
702
3.71M
            if (Al > 0 && pred >= (1 << Al))
703
433k
              pred = (1 << Al) - 1;
704
3.71M
            pred = -pred;
705
3.71M
          }
706
9.00M
          workspace[2] = (JCOEF)pred;
707
9.00M
        }
708
9.28M
        if (change_dc) {
709
          /* AC03 */
710
6.43M
          if ((Al = coef_bits[6]) != 0 && workspace[3] == 0) {
711
6.43M
            num = Q00 * (DC07 - DC09 + 2 * DC12 - 2 * DC14 + DC17 - DC19);
712
6.43M
            if (num >= 0) {
713
5.09M
              pred = (int)(((Q03 << 7) + num) / (Q03 << 8));
714
5.09M
              if (Al > 0 && pred >= (1 << Al))
715
0
                pred = (1 << Al) - 1;
716
5.09M
            } else {
717
1.34M
              pred = (int)(((Q03 << 7) - num) / (Q03 << 8));
718
1.34M
              if (Al > 0 && pred >= (1 << Al))
719
0
                pred = (1 << Al) - 1;
720
1.34M
              pred = -pred;
721
1.34M
            }
722
6.43M
            workspace[3] = (JCOEF)pred;
723
6.43M
          }
724
          /* AC12 */
725
6.43M
          if ((Al = coef_bits[7]) != 0 && workspace[10] == 0) {
726
6.43M
            num = Q00 * (DC07 - 3 * DC08 + DC09 - DC17 + 3 * DC18 - DC19);
727
6.43M
            if (num >= 0) {
728
3.34M
              pred = (int)(((Q12 << 7) + num) / (Q12 << 8));
729
3.34M
              if (Al > 0 && pred >= (1 << Al))
730
0
                pred = (1 << Al) - 1;
731
3.34M
            } else {
732
3.08M
              pred = (int)(((Q12 << 7) - num) / (Q12 << 8));
733
3.08M
              if (Al > 0 && pred >= (1 << Al))
734
0
                pred = (1 << Al) - 1;
735
3.08M
              pred = -pred;
736
3.08M
            }
737
6.43M
            workspace[10] = (JCOEF)pred;
738
6.43M
          }
739
          /* AC21 */
740
6.43M
          if ((Al = coef_bits[8]) != 0 && workspace[17] == 0) {
741
6.43M
            num = Q00 * (DC07 - DC09 - 3 * DC12 + 3 * DC14 + DC17 - DC19);
742
6.43M
            if (num >= 0) {
743
3.05M
              pred = (int)(((Q21 << 7) + num) / (Q21 << 8));
744
3.05M
              if (Al > 0 && pred >= (1 << Al))
745
0
                pred = (1 << Al) - 1;
746
3.38M
            } else {
747
3.38M
              pred = (int)(((Q21 << 7) - num) / (Q21 << 8));
748
3.38M
              if (Al > 0 && pred >= (1 << Al))
749
0
                pred = (1 << Al) - 1;
750
3.38M
              pred = -pred;
751
3.38M
            }
752
6.43M
            workspace[17] = (JCOEF)pred;
753
6.43M
          }
754
          /* AC30 */
755
6.43M
          if ((Al = coef_bits[9]) != 0 && workspace[24] == 0) {
756
6.43M
            num = Q00 * (DC07 + 2 * DC08 + DC09 - DC17 - 2 * DC18 - DC19);
757
6.43M
            if (num >= 0) {
758
4.69M
              pred = (int)(((Q30 << 7) + num) / (Q30 << 8));
759
4.69M
              if (Al > 0 && pred >= (1 << Al))
760
0
                pred = (1 << Al) - 1;
761
4.69M
            } else {
762
1.74M
              pred = (int)(((Q30 << 7) - num) / (Q30 << 8));
763
1.74M
              if (Al > 0 && pred >= (1 << Al))
764
0
                pred = (1 << Al) - 1;
765
1.74M
              pred = -pred;
766
1.74M
            }
767
6.43M
            workspace[24] = (JCOEF)pred;
768
6.43M
          }
769
          /* coef_bits[0] is non-negative.  Otherwise this function would not
770
           * be called.
771
           */
772
6.43M
          num = Q00 *
773
6.43M
                (-2 * DC01 - 6 * DC02 - 8 * DC03 - 6 * DC04 - 2 * DC05 -
774
6.43M
                 6 * DC06 + 6 * DC07 + 42 * DC08 + 6 * DC09 - 6 * DC10 -
775
6.43M
                 8 * DC11 + 42 * DC12 + 152 * DC13 + 42 * DC14 - 8 * DC15 -
776
6.43M
                 6 * DC16 + 6 * DC17 + 42 * DC18 + 6 * DC19 - 6 * DC20 -
777
6.43M
                 2 * DC21 - 6 * DC22 - 8 * DC23 - 6 * DC24 - 2 * DC25);
778
6.43M
          if (num >= 0) {
779
3.28M
            pred = (int)(((Q00 << 7) + num) / (Q00 << 8));
780
3.28M
          } else {
781
3.15M
            pred = (int)(((Q00 << 7) - num) / (Q00 << 8));
782
3.15M
            pred = -pred;
783
3.15M
          }
784
6.43M
          workspace[0] = (JCOEF)pred;
785
6.43M
        }  /* change_dc */
786
787
        /* OK, do the IDCT */
788
9.28M
        (*inverse_DCT) (cinfo, compptr, (JCOEFPTR)workspace, output_ptr,
789
9.28M
                        output_col);
790
        /* Advance for next column */
791
9.28M
        DC01 = DC02;  DC02 = DC03;  DC03 = DC04;  DC04 = DC05;
792
9.28M
        DC06 = DC07;  DC07 = DC08;  DC08 = DC09;  DC09 = DC10;
793
9.28M
        DC11 = DC12;  DC12 = DC13;  DC13 = DC14;  DC14 = DC15;
794
9.28M
        DC16 = DC17;  DC17 = DC18;  DC18 = DC19;  DC19 = DC20;
795
9.28M
        DC21 = DC22;  DC22 = DC23;  DC23 = DC24;  DC24 = DC25;
796
9.28M
        buffer_ptr++, prev_block_row++, next_block_row++,
797
9.28M
          prev_prev_block_row++, next_next_block_row++;
798
9.28M
        output_col += compptr->_DCT_scaled_size;
799
9.28M
      }
800
1.18M
      output_ptr += compptr->_DCT_scaled_size;
801
1.18M
    }
802
774k
  }
803
804
545k
  if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows)
805
544k
    return JPEG_ROW_COMPLETED;
806
1.40k
  return JPEG_SCAN_COMPLETED;
807
545k
}
808
809
#endif /* BLOCK_SMOOTHING_SUPPORTED */
810
811
812
/*
813
 * Initialize coefficient buffer controller.
814
 */
815
816
GLOBAL(void)
817
_jinit_d_coef_controller(j_decompress_ptr cinfo, boolean need_full_buffer)
818
79.1k
{
819
79.1k
  my_coef_ptr coef;
820
821
79.1k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
20
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
79.1k
  coef = (my_coef_ptr)
825
79.1k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
79.1k
                                sizeof(my_coef_controller));
827
79.1k
  memset(coef, 0, sizeof(my_coef_controller));
828
79.1k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
79.1k
  coef->pub.start_input_pass = start_input_pass;
830
79.1k
  coef->pub.start_output_pass = start_output_pass;
831
79.1k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
79.1k
  coef->coef_bits_latch = NULL;
833
79.1k
#endif
834
835
  /* Create the coefficient buffer. */
836
79.1k
  if (need_full_buffer) {
837
71.0k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
71.0k
    int ci, access_rows;
842
71.0k
    jpeg_component_info *compptr;
843
844
201k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
130k
         ci++, compptr++) {
846
130k
      access_rows = compptr->v_samp_factor;
847
130k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
130k
      if (cinfo->progressive_mode)
850
59.5k
        access_rows *= 5;
851
130k
#endif
852
130k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
130k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
130k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
130k
                               (long)compptr->h_samp_factor),
856
130k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
130k
                               (long)compptr->v_samp_factor),
858
130k
         (JDIMENSION)access_rows);
859
130k
    }
860
71.0k
    coef->pub.consume_data = consume_data;
861
71.0k
    coef->pub._decompress_data = decompress_data;
862
71.0k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
71.0k
  } else {
867
    /* We only need a single-MCU buffer. */
868
8.06k
    JBLOCKROW buffer;
869
8.06k
    int i;
870
871
8.06k
    buffer = (JBLOCKROW)
872
8.06k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
8.06k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
88.5k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
80.4k
      coef->MCU_buffer[i] = buffer + i;
876
80.4k
    }
877
8.06k
    coef->pub.consume_data = dummy_consume_data;
878
8.06k
    coef->pub._decompress_data = decompress_onepass;
879
8.06k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
8.06k
  }
881
882
  /* Allocate the workspace buffer */
883
79.1k
  coef->workspace = (JCOEF *)
884
79.1k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
79.1k
                                sizeof(JCOEF) * DCTSIZE2);
886
79.1k
}
jinit_d_coef_controller
Line
Count
Source
818
61.8k
{
819
61.8k
  my_coef_ptr coef;
820
821
61.8k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
20
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
61.8k
  coef = (my_coef_ptr)
825
61.8k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
61.8k
                                sizeof(my_coef_controller));
827
61.8k
  memset(coef, 0, sizeof(my_coef_controller));
828
61.8k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
61.8k
  coef->pub.start_input_pass = start_input_pass;
830
61.8k
  coef->pub.start_output_pass = start_output_pass;
831
61.8k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
61.8k
  coef->coef_bits_latch = NULL;
833
61.8k
#endif
834
835
  /* Create the coefficient buffer. */
836
61.8k
  if (need_full_buffer) {
837
55.1k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
55.1k
    int ci, access_rows;
842
55.1k
    jpeg_component_info *compptr;
843
844
156k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
100k
         ci++, compptr++) {
846
100k
      access_rows = compptr->v_samp_factor;
847
100k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
100k
      if (cinfo->progressive_mode)
850
47.4k
        access_rows *= 5;
851
100k
#endif
852
100k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
100k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
100k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
100k
                               (long)compptr->h_samp_factor),
856
100k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
100k
                               (long)compptr->v_samp_factor),
858
100k
         (JDIMENSION)access_rows);
859
100k
    }
860
55.1k
    coef->pub.consume_data = consume_data;
861
55.1k
    coef->pub._decompress_data = decompress_data;
862
55.1k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
55.1k
  } else {
867
    /* We only need a single-MCU buffer. */
868
6.68k
    JBLOCKROW buffer;
869
6.68k
    int i;
870
871
6.68k
    buffer = (JBLOCKROW)
872
6.68k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
6.68k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
73.3k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
66.6k
      coef->MCU_buffer[i] = buffer + i;
876
66.6k
    }
877
6.68k
    coef->pub.consume_data = dummy_consume_data;
878
6.68k
    coef->pub._decompress_data = decompress_onepass;
879
6.68k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
6.68k
  }
881
882
  /* Allocate the workspace buffer */
883
61.8k
  coef->workspace = (JCOEF *)
884
61.8k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
61.8k
                                sizeof(JCOEF) * DCTSIZE2);
886
61.8k
}
j12init_d_coef_controller
Line
Count
Source
818
17.2k
{
819
17.2k
  my_coef_ptr coef;
820
821
17.2k
  if (cinfo->data_precision != BITS_IN_JSAMPLE)
822
0
    ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
823
824
17.2k
  coef = (my_coef_ptr)
825
17.2k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
826
17.2k
                                sizeof(my_coef_controller));
827
17.2k
  memset(coef, 0, sizeof(my_coef_controller));
828
17.2k
  cinfo->coef = (struct jpeg_d_coef_controller *)coef;
829
17.2k
  coef->pub.start_input_pass = start_input_pass;
830
17.2k
  coef->pub.start_output_pass = start_output_pass;
831
17.2k
#ifdef BLOCK_SMOOTHING_SUPPORTED
832
17.2k
  coef->coef_bits_latch = NULL;
833
17.2k
#endif
834
835
  /* Create the coefficient buffer. */
836
17.2k
  if (need_full_buffer) {
837
15.9k
#ifdef D_MULTISCAN_FILES_SUPPORTED
838
    /* Allocate a full-image virtual array for each component, */
839
    /* padded to a multiple of samp_factor DCT blocks in each direction. */
840
    /* Note we ask for a pre-zeroed array. */
841
15.9k
    int ci, access_rows;
842
15.9k
    jpeg_component_info *compptr;
843
844
45.2k
    for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
845
29.3k
         ci++, compptr++) {
846
29.3k
      access_rows = compptr->v_samp_factor;
847
29.3k
#ifdef BLOCK_SMOOTHING_SUPPORTED
848
      /* If block smoothing could be used, need a bigger window */
849
29.3k
      if (cinfo->progressive_mode)
850
12.0k
        access_rows *= 5;
851
29.3k
#endif
852
29.3k
      coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
853
29.3k
        ((j_common_ptr)cinfo, JPOOL_IMAGE, TRUE,
854
29.3k
         (JDIMENSION)jround_up((long)compptr->width_in_blocks,
855
29.3k
                               (long)compptr->h_samp_factor),
856
29.3k
         (JDIMENSION)jround_up((long)compptr->height_in_blocks,
857
29.3k
                               (long)compptr->v_samp_factor),
858
29.3k
         (JDIMENSION)access_rows);
859
29.3k
    }
860
15.9k
    coef->pub.consume_data = consume_data;
861
15.9k
    coef->pub._decompress_data = decompress_data;
862
15.9k
    coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */
863
#else
864
    ERREXIT(cinfo, JERR_NOT_COMPILED);
865
#endif
866
15.9k
  } else {
867
    /* We only need a single-MCU buffer. */
868
1.38k
    JBLOCKROW buffer;
869
1.38k
    int i;
870
871
1.38k
    buffer = (JBLOCKROW)
872
1.38k
      (*cinfo->mem->alloc_large) ((j_common_ptr)cinfo, JPOOL_IMAGE,
873
1.38k
                                  D_MAX_BLOCKS_IN_MCU * sizeof(JBLOCK));
874
15.2k
    for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
875
13.8k
      coef->MCU_buffer[i] = buffer + i;
876
13.8k
    }
877
1.38k
    coef->pub.consume_data = dummy_consume_data;
878
1.38k
    coef->pub._decompress_data = decompress_onepass;
879
1.38k
    coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */
880
1.38k
  }
881
882
  /* Allocate the workspace buffer */
883
17.2k
  coef->workspace = (JCOEF *)
884
17.2k
    (*cinfo->mem->alloc_small) ((j_common_ptr)cinfo, JPOOL_IMAGE,
885
17.2k
                                sizeof(JCOEF) * DCTSIZE2);
886
17.2k
}