private void initial_setup(bool transcode_only)
{
if (transcode_only)
jpeg_calc_trans_dimensions();
else
jpeg_calc_jpeg_dimensions();
/* Sanity check on block_size */
if (block_size < 1 || block_size > 16)
ERREXIT(J_MESSAGE_CODE.JERR_BAD_DCTSIZE, block_size, block_size);
/* Derive natural_order from block_size */
switch (block_size)
{
case 2:
natural_order = JpegUtils.jpeg_natural_order2;
break;
case 3:
natural_order = JpegUtils.jpeg_natural_order3;
break;
case 4:
natural_order = JpegUtils.jpeg_natural_order4;
break;
case 5:
natural_order = JpegUtils.jpeg_natural_order5;
break;
case 6:
natural_order = JpegUtils.jpeg_natural_order6;
break;
case 7:
natural_order = JpegUtils.jpeg_natural_order7;
break;
default:
natural_order = JpegUtils.jpeg_natural_order;
break;
}
/* Derive lim_Se from block_size */
lim_Se = block_size < JpegConstants.DCTSIZE ?
block_size * block_size - 1 : JpegConstants.DCTSIZE2 - 1;
/* Sanity check on image dimensions */
if (jpeg_height <= 0 || jpeg_width <= 0 || m_num_components <= 0)
ERREXIT(J_MESSAGE_CODE.JERR_EMPTY_IMAGE);
/* Make sure image isn't bigger than I can handle */
if (jpeg_height > JpegConstants.JPEG_MAX_DIMENSION ||
jpeg_width > JpegConstants.JPEG_MAX_DIMENSION)
{
ERREXIT(J_MESSAGE_CODE.JERR_IMAGE_TOO_BIG, (uint)JpegConstants.JPEG_MAX_DIMENSION);
}
/* Only 8 to 12 bits data precision are supported for DCT based JPEG */
if (m_data_precision < 8 || m_data_precision > 12)
ERREXIT(J_MESSAGE_CODE.JERR_BAD_PRECISION, m_data_precision);
/* Check that number of components won't exceed internal array sizes */
if (m_num_components > JpegConstants.MAX_COMPONENTS)
ERREXIT(J_MESSAGE_CODE.JERR_COMPONENT_COUNT, m_num_components, JpegConstants.MAX_COMPONENTS);
/* Compute maximum sampling factors; check factor validity */
m_max_h_samp_factor = 1;
m_max_v_samp_factor = 1;
for (int ci = 0; ci < m_num_components; ci++)
{
if (m_comp_info[ci].H_samp_factor <= 0 || m_comp_info[ci].H_samp_factor > JpegConstants.MAX_SAMP_FACTOR ||
m_comp_info[ci].V_samp_factor <= 0 || m_comp_info[ci].V_samp_factor > JpegConstants.MAX_SAMP_FACTOR)
{
ERREXIT(J_MESSAGE_CODE.JERR_BAD_SAMPLING);
}
m_max_h_samp_factor = Math.Max(m_max_h_samp_factor, m_comp_info[ci].H_samp_factor);
m_max_v_samp_factor = Math.Max(m_max_v_samp_factor, m_comp_info[ci].V_samp_factor);
}
/* Compute dimensions of components */
for (int ci = 0; ci < m_num_components; ci++)
{
jpeg_component_info compptr = m_comp_info[ci];
/* Fill in the correct component_index value; don't rely on application */
compptr.Component_index = ci;
/* In selecting the actual DCT scaling for each component, we try to
* scale down the chroma components via DCT scaling rather than downsampling.
* This saves time if the downsampler gets to use 1:1 scaling.
* Note this code adapts subsampling ratios which are powers of 2.
*/
int ssize = 1;
while (min_DCT_h_scaled_size * ssize <=
(do_fancy_downsampling ? JpegConstants.DCTSIZE : JpegConstants.DCTSIZE / 2) &&
(m_max_h_samp_factor % (compptr.H_samp_factor * ssize * 2)) == 0)
{
ssize = ssize * 2;
}
compptr.DCT_h_scaled_size = min_DCT_h_scaled_size * ssize;
ssize = 1;
while (min_DCT_v_scaled_size * ssize <=
(do_fancy_downsampling ? JpegConstants.DCTSIZE : JpegConstants.DCTSIZE / 2) &&
(m_max_v_samp_factor % (compptr.V_samp_factor * ssize * 2)) == 0)
{
ssize = ssize * 2;
}
compptr.DCT_v_scaled_size = min_DCT_v_scaled_size * ssize;
/* We don't support DCT ratios larger than 2. */
if (compptr.DCT_h_scaled_size > compptr.DCT_v_scaled_size * 2)
compptr.DCT_h_scaled_size = compptr.DCT_v_scaled_size * 2;
else if (compptr.DCT_v_scaled_size > compptr.DCT_h_scaled_size * 2)
compptr.DCT_v_scaled_size = compptr.DCT_h_scaled_size * 2;
/* Size in DCT blocks */
compptr.Width_in_blocks = (int)JpegUtils.jdiv_round_up(
(long)jpeg_width * compptr.H_samp_factor, (long)m_max_h_samp_factor * block_size);
compptr.height_in_blocks = (int)JpegUtils.jdiv_round_up(
(long)jpeg_height * compptr.V_samp_factor, (long)m_max_v_samp_factor * block_size);
/* Size in samples */
compptr.downsampled_width = (int)JpegUtils.jdiv_round_up(
(long)jpeg_width * compptr.H_samp_factor * compptr.DCT_h_scaled_size,
(long)m_max_h_samp_factor * block_size);
compptr.downsampled_height = (int)JpegUtils.jdiv_round_up(
(long)jpeg_height * compptr.V_samp_factor * compptr.DCT_v_scaled_size,
(long)m_max_v_samp_factor * block_size);
/* Don't need quantization scale after DCT,
* until color conversion says otherwise.
*/
compptr.component_needed = false;
}
/* Compute number of fully interleaved MCU rows (number of times that
* main controller will call coefficient controller).
*/
m_total_iMCU_rows = (int)JpegUtils.jdiv_round_up(
jpeg_height, (long)m_max_v_samp_factor * block_size);
}