private int nextBufStop; /* downsample when we reach this index */ public JpegCPrepController(JpegCompressStruct cinfo) { this.cinfo = cinfo; /* Allocate the color conversion buffer. * We make the buffer wide enough to allow the downsampler to edge-expand * horizontally within the buffer, if it so chooses. */ if (cinfo.m_downsample.NeedContextRows()) { /* Set up to provide context rows */ CreateContextBuffer(); } else { /* No context, just make it tall enough for one row group */ for (var ci = 0; ci < cinfo.m_num_components; ci++) { colorBufRowsOffset = 0; colorBuf[ci] = JpegCommonStruct.AllocJpegSamples( (cinfo.Component_info[ci].Width_in_blocks * cinfo.min_DCT_h_scaled_size * cinfo.m_max_h_samp_factor) / cinfo.Component_info[ci].H_samp_factor, cinfo.m_max_v_samp_factor); } } }
private int m_scan_number; /* current index in scan_info[] */ public JpegCompMaster(JpegCompressStruct cinfo, bool transcode_only) { m_cinfo = cinfo; if (transcode_only) { /* no main pass in transcoding */ if (cinfo.optimizeEntropyCoding) { m_pass_type = PassType.HuffmanOptimization; } else { m_pass_type = PassType.Output; } } else { /* for normal compression, first pass is always this type: */ m_pass_type = PassType.Main; } if (cinfo.optimizeEntropyCoding) { m_total_passes = cinfo.m_num_scans * 2; } else { m_total_passes = cinfo.m_num_scans; } }
public JpegCMainController(JpegCompressStruct cinfo) { m_cinfo = cinfo; /* Allocate a strip buffer for each component */ for (var ci = 0; ci < cinfo.m_num_components; ci++) { var compptr = cinfo.Component_info[ci]; m_buffer[ci] = JpegCommonStruct.AllocJpegSamples( compptr.Width_in_blocks * compptr.DCT_h_scaled_size, compptr.V_samp_factor * compptr.DCT_v_scaled_size); } }
public MyCCoefController(JpegCompressStruct cinfo, bool need_full_buffer) { m_cinfo = cinfo; /* Create the coefficient buffer. */ if (need_full_buffer) { /* Allocate a full-image virtual array for each component, */ /* padded to a multiple of samp_factor DCT blocks in each direction. */ for (var ci = 0; ci < cinfo.m_num_components; ci++) { m_whole_image[ci] = JpegCommonStruct.CreateBlocksArray( JpegUtils.jround_up(cinfo.Component_info[ci].Width_in_blocks, cinfo.Component_info[ci].H_samp_factor), JpegUtils.jround_up(cinfo.Component_info[ci].height_in_blocks, cinfo.Component_info[ci].V_samp_factor)); m_whole_image[ci].ErrorProcessor = cinfo; } } else { /* We only need a single-MCU buffer. */ var buffer = new JBlock[JpegConstants.C_MAX_BLOCKS_IN_MCU]; for (var i = 0; i < JpegConstants.C_MAX_BLOCKS_IN_MCU; i++) { buffer[i] = new JBlock(); } for (var i = 0; i < JpegConstants.C_MAX_BLOCKS_IN_MCU; i++) { m_MCU_buffer[i] = new JBlock[JpegConstants.C_MAX_BLOCKS_IN_MCU - i]; for (var j = i; j < JpegConstants.C_MAX_BLOCKS_IN_MCU; j++) { m_MCU_buffer[i][j - i] = buffer[j]; } } /* flag for no virtual arrays */ m_whole_image[0] = null; } }
/// <summary> /// <para>Initialize coefficient buffer controller.</para> /// <para> /// Each passed coefficient array must be the right size for that /// coefficient: width_in_blocks wide and height_in_blocks high, /// with unit height at least v_samp_factor. /// </para> /// </summary> public MyTransCCoefController(JpegCompressStruct cinfo, JVirtArray <JBlock>[] coef_arrays) { m_cinfo = cinfo; /* Save pointer to virtual arrays */ m_whole_image = coef_arrays; /* Allocate and pre-zero space for dummy DCT blocks. */ var buffer = new JBlock[JpegConstants.C_MAX_BLOCKS_IN_MCU]; for (var i = 0; i < JpegConstants.C_MAX_BLOCKS_IN_MCU; i++) { buffer[i] = new JBlock(); } for (var i = 0; i < JpegConstants.C_MAX_BLOCKS_IN_MCU; i++) { m_dummy_buffer[i] = new JBlock[JpegConstants.C_MAX_BLOCKS_IN_MCU - i]; for (var j = i; j < JpegConstants.C_MAX_BLOCKS_IN_MCU; j++) { m_dummy_buffer[i][j - i] = buffer[j]; } } }
public ArithEntropyEncoder(JpegCompressStruct cinfo) { cinfo.ErrExit(JMessageCode.JERR_NOTIMPL); }
private readonly bool m_need_context_rows; /* true if need rows above & below */ public JpegDownsampler(JpegCompressStruct cinfo) { m_cinfo = cinfo; m_need_context_rows = false; if (cinfo.CIR601sampling) { cinfo.ErrExit(JMessageCode.JERR_CCIR601_NOTIMPL); } /* Verify we can handle the sampling factors, and set up method pointers */ var smoothok = true; for (var ci = 0; ci < cinfo.m_num_components; ci++) { var componentInfo = cinfo.Component_info[ci]; /* Compute size of an "output group" for DCT scaling. This many samples * are to be converted from max_h_samp_factor * max_v_samp_factor pixels. */ var h_out_group = (componentInfo.H_samp_factor * componentInfo.DCT_h_scaled_size) / m_cinfo.min_DCT_h_scaled_size; var v_out_group = (componentInfo.V_samp_factor * componentInfo.DCT_v_scaled_size) / m_cinfo.min_DCT_v_scaled_size; var h_in_group = m_cinfo.m_max_h_samp_factor; var v_in_group = m_cinfo.m_max_v_samp_factor; rowgroup_height[ci] = v_out_group; /* save for use later */ if (h_in_group == h_out_group && v_in_group == v_out_group) { if (cinfo.m_input_smoothing != 0) { m_downSamplers[ci] = DownSampleMethod.fullsize_smooth_downsampler; m_need_context_rows = true; } else { m_downSamplers[ci] = DownSampleMethod.fullsize_downsampler; } } else if (h_in_group == h_out_group * 2 && v_in_group == v_out_group) { smoothok = false; m_downSamplers[ci] = DownSampleMethod.h2v1_downsampler; } else if (h_in_group == h_out_group * 2 && v_in_group == v_out_group * 2) { if (cinfo.m_input_smoothing != 0) { m_downSamplers[ci] = DownSampleMethod.h2v2_smooth_downsampler; m_need_context_rows = true; } else { m_downSamplers[ci] = DownSampleMethod.h2v2_downsampler; } } else if ((h_in_group % h_out_group) == 0 && (v_in_group % v_out_group) == 0) { smoothok = false; m_downSamplers[ci] = DownSampleMethod.int_downsampler; h_expand[ci] = (byte)(h_in_group / h_out_group); v_expand[ci] = (byte)(v_in_group / v_out_group); } else { cinfo.ErrExit(JMessageCode.JERR_FRACT_SAMPLE_NOTIMPL); } } if (cinfo.m_input_smoothing != 0 && !smoothok) { cinfo.TraceMS(0, JMessageCode.JTRC_SMOOTH_NOTIMPL); } }
private byte[] m_buffer; /* start of buffer */ public MyDestinationManager(JpegCompressStruct cinfo, Stream alreadyOpenFile) { m_cinfo = cinfo; m_outfile = alreadyOpenFile; }
private int m_last_restart_interval; /* last DRI value emitted; 0 after SOI */ public JpegMarkerWriter(JpegCompressStruct cinfo) { m_cinfo = cinfo; }
public JpegColorConverter(JpegCompressStruct cinfo) { m_cinfo = cinfo; /* set start_pass to null method until we find out differently */ m_useNullStart = true; /* Make sure input_components agrees with in_color_space */ switch (cinfo.m_in_color_space) { case JColorSpace.JCS_GRAYSCALE: if (cinfo.m_input_components != 1) { cinfo.ErrExit(JMessageCode.JERR_BAD_IN_COLORSPACE); } break; case JColorSpace.JCS_RGB: case JColorSpace.JCS_BG_RGB: if (cinfo.m_input_components != JpegConstants.RGB_PIXELSIZE) { cinfo.ErrExit(JMessageCode.JERR_BAD_IN_COLORSPACE); } break; case JColorSpace.JCS_YCbCr: case JColorSpace.JCS_BG_YCC: if (cinfo.m_input_components != 3) { cinfo.ErrExit(JMessageCode.JERR_BAD_IN_COLORSPACE); } break; case JColorSpace.JCS_CMYK: case JColorSpace.JCS_YCCK: if (cinfo.m_input_components != 4) { cinfo.ErrExit(JMessageCode.JERR_BAD_IN_COLORSPACE); } break; default: /* JCS_UNKNOWN can be anything */ if (cinfo.m_input_components < 1) { cinfo.ErrExit(JMessageCode.JERR_BAD_IN_COLORSPACE); } break; } /* Support color transform only for RGB colorspaces */ if (cinfo.ColorTransform != JColorTransform.JCT_NONE && cinfo.Jpeg_color_space != JColorSpace.JCS_RGB && cinfo.Jpeg_color_space != JColorSpace.JCS_BG_RGB) { cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); } /* Check num_components, set conversion method based on requested space */ switch (cinfo.m_jpeg_color_space) { case JColorSpace.JCS_GRAYSCALE: if (cinfo.m_num_components != 1) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } switch (cinfo.m_in_color_space) { case JColorSpace.JCS_GRAYSCALE: case JColorSpace.JCS_YCbCr: case JColorSpace.JCS_BG_YCC: color_convert = GrayscaleConvert; break; case JColorSpace.JCS_RGB: m_useNullStart = false; // use rgb_ycc_start color_convert = RgbGrayConvert; break; default: cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); break; } break; case JColorSpace.JCS_RGB: case JColorSpace.JCS_BG_RGB: if (cinfo.m_num_components != 3) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } if (cinfo.m_in_color_space == cinfo.Jpeg_color_space) { switch (cinfo.ColorTransform) { case JColorTransform.JCT_NONE: color_convert = RgbConvert; break; case JColorTransform.JCT_SUBTRACT_GREEN: color_convert = RgbRgb1Convert; break; default: cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); break; } } else { cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); } break; case JColorSpace.JCS_YCbCr: if (cinfo.m_num_components != 3) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } switch (cinfo.m_in_color_space) { case JColorSpace.JCS_RGB: m_useNullStart = false; // use rgb_ycc_start color_convert = RgbYccConvert; break; case JColorSpace.JCS_YCbCr: color_convert = NullConvert; break; default: cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); break; } break; case JColorSpace.JCS_BG_YCC: if (cinfo.m_num_components != 3) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } switch (cinfo.m_in_color_space) { case JColorSpace.JCS_RGB: /* For conversion from normal RGB input to BG_YCC representation, * the Cb/Cr values are first computed as usual, and then * quantized further after DCT processing by a factor of * 2 in reference to the nominal quantization factor. */ /* need quantization scale by factor of 2 after DCT */ cinfo.Component_info[1].component_needed = true; cinfo.Component_info[2].component_needed = true; /* compute normal YCC first */ m_useNullStart = false; // use rgb_ycc_start color_convert = RgbYccConvert; break; case JColorSpace.JCS_YCbCr: /* need quantization scale by factor of 2 after DCT */ cinfo.Component_info[1].component_needed = true; cinfo.Component_info[2].component_needed = true; color_convert = NullConvert; break; case JColorSpace.JCS_BG_YCC: /* Pass through for BG_YCC input */ color_convert = NullConvert; break; default: cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); break; } break; case JColorSpace.JCS_CMYK: if (cinfo.m_num_components != 4) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } if (cinfo.m_in_color_space == JColorSpace.JCS_CMYK) { color_convert = NullConvert; } else { cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); } break; case JColorSpace.JCS_YCCK: if (cinfo.m_num_components != 4) { cinfo.ErrExit(JMessageCode.JERR_BAD_J_COLORSPACE); } switch (cinfo.m_in_color_space) { case JColorSpace.JCS_CMYK: m_useNullStart = false; // use rgb_ycc_start color_convert = CmykYcckConvert; break; case JColorSpace.JCS_YCCK: color_convert = NullConvert; break; default: cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); break; } break; default: /* allow null conversion of JCS_UNKNOWN */ if (cinfo.m_jpeg_color_space != cinfo.m_in_color_space || cinfo.m_num_components != cinfo.m_input_components) { cinfo.ErrExit(JMessageCode.JERR_CONVERSION_NOTIMPL); } color_convert = NullConvert; break; } }