示例#1
0
        // Do downsampling for a whole row group (all components).
        // In this version we simply downsample each component independently.
        static void sep_downsample(jpeg_compress cinfo, byte[][][] input_buf, uint in_row_index, byte[][][] output_buf, uint out_row_group_index)
        {
            my_downsampler downsample = (my_downsampler)cinfo.downsample;

            for (int ci = 0; ci < cinfo.num_components; ci++)
            {
                downsample.methods[ci](cinfo, cinfo.comp_info[ci], input_buf[ci], in_row_index, output_buf[ci], (uint)(out_row_group_index * cinfo.comp_info[ci].v_samp_factor));
            }
        }
示例#2
0
        // Module initialization routine for downsampling.
        // Note that we must select a routine for each component.
        static void jinit_downsampler(jpeg_compress cinfo)
        {
            my_downsampler downsample = null;

            try
            {
                downsample = new my_downsampler();
            }
            catch
            {
                ERREXIT1(cinfo, J_MESSAGE_CODE.JERR_OUT_OF_MEMORY, 4);
            }

            cinfo.downsample             = downsample;
            downsample.start_pass        = start_pass_downsample;
            downsample.downsample        = sep_downsample;
            downsample.need_context_rows = false;

            if (cinfo.CCIR601_sampling)
            {
                ERREXIT(cinfo, J_MESSAGE_CODE.JERR_CCIR601_NOTIMPL);
            }

            bool smoothok = true;

            // Verify we can handle the sampling factors, and set up method pointers
            for (int ci = 0; ci < cinfo.num_components; ci++)
            {
                jpeg_component_info compptr = cinfo.comp_info[ci];
                if (compptr.h_samp_factor == cinfo.max_h_samp_factor && compptr.v_samp_factor == cinfo.max_v_samp_factor)
                {
#if INPUT_SMOOTHING_SUPPORTED
                    if (cinfo.smoothing_factor != 0)
                    {
                        downsample.methods[ci]       = fullsize_smooth_downsample;
                        downsample.need_context_rows = true;
                    }
                    else
#endif
                    downsample.methods[ci] = fullsize_downsample;
                }
                else if (compptr.h_samp_factor * 2 == cinfo.max_h_samp_factor && compptr.v_samp_factor == cinfo.max_v_samp_factor)
                {
                    smoothok = false;
                    downsample.methods[ci] = h2v1_downsample;
                }
                else if (compptr.h_samp_factor * 2 == cinfo.max_h_samp_factor && compptr.v_samp_factor * 2 == cinfo.max_v_samp_factor)
                {
#if INPUT_SMOOTHING_SUPPORTED
                    if (cinfo.smoothing_factor != 0)
                    {
                        downsample.methods[ci]       = h2v2_smooth_downsample;
                        downsample.need_context_rows = true;
                    }
                    else
#endif
                    downsample.methods[ci] = h2v2_downsample;
                }
                else if ((cinfo.max_h_samp_factor % compptr.h_samp_factor) == 0 && (cinfo.max_v_samp_factor % compptr.v_samp_factor) == 0)
                {
                    smoothok = false;
                    downsample.methods[ci] = int_downsample;
                }
                else
                {
                    ERREXIT(cinfo, J_MESSAGE_CODE.JERR_FRACT_SAMPLE_NOTIMPL);
                }
            }

#if INPUT_SMOOTHING_SUPPORTED
            if (cinfo.smoothing_factor != 0 && !smoothok)
            {
                TRACEMS(cinfo, 0, J_MESSAGE_CODE.JTRC_SMOOTH_NOTIMPL);
            }
#endif
        }
示例#3
0
		// Module initialization routine for downsampling.
		// Note that we must select a routine for each component.
		static void jinit_downsampler(jpeg_compress cinfo)
		{
			my_downsampler downsample=null;

			try
			{
				downsample=new my_downsampler();
			}
			catch
			{
				ERREXIT1(cinfo, J_MESSAGE_CODE.JERR_OUT_OF_MEMORY, 4);
			}

			cinfo.downsample=downsample;
			downsample.start_pass=start_pass_downsample;
			downsample.downsample=sep_downsample;
			downsample.need_context_rows=false;

			if(cinfo.CCIR601_sampling) ERREXIT(cinfo, J_MESSAGE_CODE.JERR_CCIR601_NOTIMPL);

			bool smoothok=true;

			// Verify we can handle the sampling factors, and set up method pointers
			for(int ci=0; ci<cinfo.num_components; ci++)
			{
				jpeg_component_info compptr=cinfo.comp_info[ci];
				if(compptr.h_samp_factor==cinfo.max_h_samp_factor&&compptr.v_samp_factor==cinfo.max_v_samp_factor)
				{
#if INPUT_SMOOTHING_SUPPORTED
					if(cinfo.smoothing_factor!=0)
					{
						downsample.methods[ci]=fullsize_smooth_downsample;
						downsample.need_context_rows=true;
					}
					else
#endif
						downsample.methods[ci]=fullsize_downsample;
				}
				else if(compptr.h_samp_factor*2==cinfo.max_h_samp_factor&&compptr.v_samp_factor==cinfo.max_v_samp_factor)
				{
					smoothok=false;
					downsample.methods[ci]=h2v1_downsample;
				}
				else if(compptr.h_samp_factor*2==cinfo.max_h_samp_factor&&compptr.v_samp_factor*2==cinfo.max_v_samp_factor)
				{
#if INPUT_SMOOTHING_SUPPORTED
					if(cinfo.smoothing_factor!=0)
					{
						downsample.methods[ci]=h2v2_smooth_downsample;
						downsample.need_context_rows=true;
					}
					else
#endif
						downsample.methods[ci]=h2v2_downsample;
				}
				else if((cinfo.max_h_samp_factor%compptr.h_samp_factor)==0&&(cinfo.max_v_samp_factor%compptr.v_samp_factor)==0)
				{
					smoothok=false;
					downsample.methods[ci]=int_downsample;
				}
				else ERREXIT(cinfo, J_MESSAGE_CODE.JERR_FRACT_SAMPLE_NOTIMPL);
			}

#if INPUT_SMOOTHING_SUPPORTED
			if(cinfo.smoothing_factor!=0&&!smoothok) TRACEMS(cinfo, 0, J_MESSAGE_CODE.JTRC_SMOOTH_NOTIMPL);
#endif
		}