⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resize.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					sp += src_pitch;					filt_tab_ptr += filt_tab_inc;				}				tmp *= filt_scale;				tmp += (source_level << (FILT_COEFF_BITS + FILT_SCALE_BITS));				tmp += (1U << (FILT_COEFF_BITS + FILT_SCALE_BITS - 1));				tmp >>= (FILT_COEFF_BITS + FILT_SCALE_BITS);				*tp = tmp;								tp += src_pitch;				pos += pos_inc;				pos_int = pos >> POS_SCALE_BITS;				line++;			}		}	}	if (dest_width == src_width)	{		// no horizontal resizing		for (line = 0; line < dest_height; line++)		{			tp = buff + line * src_pitch;			dp = dest + line * dest_pitch;			for (pel = 0; pel < dest_width - 3; pel += 4)			{				dp[0] = CLIP_PEL(tp[0]);				dp[1] = CLIP_PEL(tp[1]);				dp[2] = CLIP_PEL(tp[2]);				dp[3] = CLIP_PEL(tp[3]);				dp += 4;				tp += 4;			}			for (; pel < dest_width; pel++)			{				*dp = CLIP_PEL(*tp);				dp ++;				tp ++;			}		}	}	else if (dest_width == (src_width >> 1))	{		// decimate horizontally by 2		int src_skip = src_pitch - src_width + 2;		int dest_skip = dest_pitch - dest_width + 1;		int a, b, c, d;		tp = buff;		dp = dest;		for (line = 0; line < dest_height; line ++)		{			a = tp[0];			b = a;			c = tp[1];			d = tp[2];			b += c;			a += d;			b *= 9;			b -= a;			b += 7;			b >>= 4;			*dp = CLIP_PEL(b);			tp += 2;			dp ++;			for (pel = 1; pel < dest_width - 1; pel++)			{				a = c;				b = d;				c = tp[1];				d = tp[2];				b += c;				a += d;				b *= 9;				b -= a;				b += 7;				b >>= 4;				*dp = CLIP_PEL(b);				tp += 2;				dp ++;			}			a = c;			b = d;			c = tp[1];			d = c;			b += c;			a += d;			b *= 9;			b -= a;			b += 7;			b >>= 4;			*dp = CLIP_PEL(b);			tp += src_skip;			dp += dest_skip;		}	}	else	{		// horizonal filtering		pos_inc = ((src_width << POS_SCALE_BITS) + (dest_width >> 1)) / (dest_width);		pos_bgn = (pos_inc - (1 << POS_SCALE_BITS)) >> 1;		filt_tab_inc = (FULL_PEL_INC * dest_width + (src_width >> 1)) / (src_width);		if (filt_tab_inc > FULL_PEL_INC)			filt_tab_inc = FULL_PEL_INC;		filt_tap_num = (INT_FILT_SIZE - 1) / (filt_tab_inc << 1);		filt_scale = ((dest_width << FILT_SCALE_BITS) + (src_width >> 1)) / (src_width);		for (line = 0; line < dest_height; line++)		{			dp = dest + line * dest_pitch;						pel = 0;			pos = pos_bgn;			pos_int = pos >> POS_SCALE_BITS;			// Left edge pels			while (pos_int < filt_tap_num)			{				tp = buff + line * src_pitch + pos_int;#if USE_SOURCE_LEVEL				source_level = *tp;#endif				tp -= filt_tap_num;				filt_tab_ptr = int_filt_tab;				filt_tab_ptr -= (filt_tab_inc * (pos & ((1L << POS_SCALE_BITS) - 1))) >> POS_SCALE_BITS;				filt_tab_ptr += INT_FILT_CENTER - (filt_tap_num * filt_tab_inc);				if (filt_tab_ptr < int_filt_tab)				{					tp ++;					filt_tab_ptr += filt_tab_inc;				}				tmp = 0;				while (filt_tab_ptr < int_filt_tab + INT_FILT_SIZE)				{					if (tp < buff)						tmp += (*filt_tab_ptr) * (buff[line * src_pitch] - source_level);					else						tmp += (*filt_tab_ptr) * (*tp - source_level);					tp++;					filt_tab_ptr += filt_tab_inc;				}				tmp *= filt_scale;				tmp += (source_level << (FILT_COEFF_BITS + FILT_SCALE_BITS));				tmp += (1U << (FILT_COEFF_BITS + FILT_SCALE_BITS - 1));				tmp >>= (FILT_COEFF_BITS + FILT_SCALE_BITS);				*dp = CLIP_PEL(tmp);				dp++;				pos += pos_inc;				pos_int = pos >> POS_SCALE_BITS;				pel++;			}			// Center pels			while (pos_int < src_width - filt_tap_num - 1)			{				tp = buff + line * src_pitch + pos_int;#if USE_SOURCE_LEVEL				source_level = *tp;#endif				tp -= filt_tap_num;				filt_tab_ptr = int_filt_tab;				filt_tab_ptr -= (filt_tab_inc * (pos & ((1L << POS_SCALE_BITS) - 1))) >> POS_SCALE_BITS;				filt_tab_ptr += INT_FILT_CENTER - (filt_tap_num * filt_tab_inc);				if (filt_tab_ptr < int_filt_tab)				{					tp ++;					filt_tab_ptr += filt_tab_inc;				}				// There are at least 4 taps...				tmp = (*filt_tab_ptr) * (tp[0] - source_level);				filt_tab_ptr += filt_tab_inc;				tmp += (*filt_tab_ptr) * (tp[1] - source_level);				filt_tab_ptr += filt_tab_inc;				tmp += (*filt_tab_ptr) * (tp[2] - source_level);				filt_tab_ptr += filt_tab_inc;				tmp += (*filt_tab_ptr) * (tp[3] - source_level);				filt_tab_ptr += filt_tab_inc;				tp += 4;								// Remaining taps...				while (filt_tab_ptr < int_filt_tab + INT_FILT_SIZE)				{					tmp += (*filt_tab_ptr) * (*tp - source_level);					tp++;					filt_tab_ptr += filt_tab_inc;				}				tmp *= filt_scale;				tmp += (source_level << (FILT_COEFF_BITS + FILT_SCALE_BITS));				tmp += (1U << (FILT_COEFF_BITS + FILT_SCALE_BITS - 1));				tmp >>= (FILT_COEFF_BITS + FILT_SCALE_BITS);				*dp = CLIP_PEL(tmp);				dp++;				pos += pos_inc;				pos_int = pos >> POS_SCALE_BITS;				pel++;			}			// Right edge pels			while (pel < dest_width)			{				tp = buff + line * src_pitch + pos_int;#if USE_SOURCE_LEVEL				source_level = *tp;#endif				tp -= filt_tap_num;				filt_tab_ptr = int_filt_tab;				filt_tab_ptr -= (filt_tab_inc * (pos & ((1L << POS_SCALE_BITS) - 1))) >> POS_SCALE_BITS;				filt_tab_ptr += INT_FILT_CENTER - (filt_tap_num * filt_tab_inc);				if (filt_tab_ptr < int_filt_tab)				{					tp ++;					filt_tab_ptr += filt_tab_inc;				}				tmp = 0;				while (filt_tab_ptr < int_filt_tab + INT_FILT_SIZE)				{					if (tp >= buff + line * src_pitch + src_width)						tmp += (*filt_tab_ptr) * (buff[line * src_pitch + src_width - 1] - source_level);					else						tmp += (*filt_tab_ptr) * (*tp - source_level);					tp++;					filt_tab_ptr += filt_tab_inc;				}				tmp *= filt_scale;				tmp += (source_level << (FILT_COEFF_BITS + FILT_SCALE_BITS));				tmp += (1U << (FILT_COEFF_BITS + FILT_SCALE_BITS - 1));				tmp >>= (FILT_COEFF_BITS + FILT_SCALE_BITS);				*dp = CLIP_PEL(tmp);				dp++;				pos += pos_inc;				pos_int = pos >> POS_SCALE_BITS;				pel++;			}		}	}}	/* 12-19-98 02:36am, written by Yuriy A. Reznik, yreznik@real.com */#define TOTAL_SCALE_BITS    16  /* precision of inverse coordinate mapping */#define COEF_SCALE_BITS     3   /* actual grid used to select scale coeffs *//* * Interpolate image. * Use: *  void interpolate_x ( *       unsigned char *dest, int dest_width, int dest_height, int dest_pitch, *       unsigned char *src,  int src_width,  int src_height,  int src_pitch); */static void  /** G2H263Codec:: NEVER make this function a class method!!!! */interpolate_ii (    unsigned char *dest, int dest_width, int dest_height, int dest_pitch,    unsigned char *src,  int src_width,  int src_height,  int src_pitch){    /* scaled row/column counters, limits, & increment values: */    int src_x, src_y;    int src_x_inc = ((src_width << TOTAL_SCALE_BITS) + dest_width / 2) / dest_width;    int src_y_inc = ((src_height << TOTAL_SCALE_BITS) + dest_height / 2) / dest_height;    int src_x_max = (src_width - 1) << TOTAL_SCALE_BITS;    int src_y_max = (src_height - 1) << TOTAL_SCALE_BITS;    int src_x_end = src_x_inc * dest_width;    int src_y_end = src_y_inc * dest_height;	int src_x_bgn = (src_width < dest_width)?(0):((src_x_inc  - (1 << TOTAL_SCALE_BITS)) >> 1);	int src_y_bgn = (src_height < dest_height)?(0):((src_y_inc - (1 << TOTAL_SCALE_BITS)) >> 1);	src_x_bgn = 0;	src_y_bgn = 0;    /* source/destination pointers: */    unsigned char *s1, *s2, *d1 = dest;    /* perform interpolation by inverse mapping from destination to source: */    for (src_y = src_y_bgn; src_y < src_y_max; src_y += src_y_inc) {        /* map row: */        int src_y_i = src_y >> TOTAL_SCALE_BITS;        int q       = (src_y >> (TOTAL_SCALE_BITS - COEF_SCALE_BITS)) & ((1U << COEF_SCALE_BITS) - 1);        /* get source row pointers: */        s1 = src + src_y_i * src_pitch;        s2 = s1 + src_pitch;        src_x = src_x_bgn;        do {            register int src_x_i, p;            register unsigned int a, b, c;            /* get first pixel: */            src_x_i = src_x >> TOTAL_SCALE_BITS;            p = (src_x >> (TOTAL_SCALE_BITS - COEF_SCALE_BITS)) & ((1U << COEF_SCALE_BITS) - 1);            /* load 4 pixels in 2 registers: */            a = (s2 [src_x_i] << 16) + s1 [src_x_i];             c = (s2 [src_x_i + 1] << 16) + s1 [src_x_i + 1];             /* perform 1st horisontal projection: */            a = (a << COEF_SCALE_BITS) + p * (c - a);            src_x  += src_x_inc;	/* 1! */            /* get second pixel: */            src_x_i = src_x >> TOTAL_SCALE_BITS;            p = (src_x >> (TOTAL_SCALE_BITS - COEF_SCALE_BITS)) & ((1U << COEF_SCALE_BITS) - 1);            /* load 4 pixels in 2 registers: */            b = (s2 [src_x_i] << 16) + s1 [src_x_i];             c = (s2 [src_x_i + 1] << 16) + s1 [src_x_i + 1];             /* perform 2nd horisontal projection: */            b = (b << COEF_SCALE_BITS) + p * (c - b);            /* repack & perform vertical projection: */            c = a;            a = (a & 0xFFFF) + (b << 16);            b = (b & 0xFFFF0000) + ((unsigned int)c >> 16);            a = (a << COEF_SCALE_BITS) + q * (b - a);                        /* store pixels: */            *d1++ = (unsigned int)a >> 2 * COEF_SCALE_BITS;            *d1++ = (unsigned int)a >> (16 + 2 * COEF_SCALE_BITS);            src_x  += src_x_inc;	/* 2! */        } while (src_x < src_x_max);        /* last pixels: */        {            int a = s1 [src_width - 1];            int c = s2 [src_width - 1];            a = (unsigned int)((a << COEF_SCALE_BITS) + q * (c - a)) >> COEF_SCALE_BITS;            for (; src_x < src_x_end; src_x += src_x_inc)                *d1++ = a;        }        d1 = (dest += dest_pitch);    }    /* last rows: */    for (; src_y < src_y_end; src_y += src_y_inc) {        s1 = src + (src_height-1) * src_pitch;        for (src_x = 0; src_x < src_x_max; src_x += src_x_inc) {            int src_x_i = src_x >> TOTAL_SCALE_BITS;            int p       = (src_x >> (TOTAL_SCALE_BITS - COEF_SCALE_BITS)) & ((1U << COEF_SCALE_BITS) - 1);            /* get four pixels: */            int a = s1 [src_x_i];            int b = s1 [src_x_i + 1];            /* compute the interpolated pixel value: */            a = (a << COEF_SCALE_BITS) + p * (b - a);            *d1++ = (unsigned int)a >> COEF_SCALE_BITS;        }        /* last delta_x pixels: */        for (; src_x < src_x_end; src_x += src_x_inc)            *d1++ = s1 [src_width - 1];        d1 = (dest += dest_pitch);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -