コード例 #1
0
        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);
                }
            }
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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;
            }
        }
コード例 #5
0
        /// <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];
                }
            }
        }
コード例 #6
0
 public ArithEntropyEncoder(JpegCompressStruct cinfo)
 {
     cinfo.ErrExit(JMessageCode.JERR_NOTIMPL);
 }
コード例 #7
0
ファイル: JpegDownsampler.cs プロジェクト: Chapmania/Juniper
        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);
            }
        }
コード例 #8
0
        private byte[] m_buffer;           /* start of buffer */

        public MyDestinationManager(JpegCompressStruct cinfo, Stream alreadyOpenFile)
        {
            m_cinfo   = cinfo;
            m_outfile = alreadyOpenFile;
        }
コード例 #9
0
        private int m_last_restart_interval; /* last DRI value emitted; 0 after SOI */

        public JpegMarkerWriter(JpegCompressStruct cinfo)
        {
            m_cinfo = cinfo;
        }
コード例 #10
0
        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;
            }
        }