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

📄 output.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
	"movd (%0), %%mm0;\n"          /* Load y   0x00000000000000yy */	"psubsw mpeg3_MMX_601_Y_DIFF, %%mm0;\n"      /* Subtract 16 from y */	"movd (%1), %%mm1;\n"          /* Load v    0x00000000000000vv */	"movq %%mm0, %%mm3;\n"         /* Copy y to temp */	"psllq $16, %%mm1;\n"          /* Shift v   0x0000000000vv0000 */	"movd (%2), %%mm2;\n"          /* Load u    0x00000000000000uu */	"psllq $16, %%mm3;\n"          /* Shift y */	"movq %%mm1, %%mm4;\n"         /* Copy v to temp */	"por %%mm3, %%mm0;\n"          /* Overlay new y byte 0x0000000000yy00yy */	"psllq $16, %%mm4;\n"          /* Shift v */	"movq %%mm2, %%mm5;\n"         /* Copy u to temp */	"psllq $16, %%mm3;\n"          /* Shift y  */	"por %%mm4, %%mm1;\n"          /* Overlay new v byte 0x000000vv00vv0000 */	"psllq $16, %%mm5;\n"          /* Shift u  */	"por %%mm3, %%mm0;\n"          /* Overlay new y byte 0x000000yy00yy00yy */	"por %%mm5, %%mm2;\n"          /* Overlay new u byte 0x0000000000uu00uu *//* mm0: 0x000000yy00yy00yy     mm1: 0x000000vv00vv0000     mm2: 0x0000000000uu00uu */	"pmullw mpeg3_MMX_601_Y_COEF, %%mm0;\n"     /* Scale y coeffs */ 	"psubw mpeg3_MMX_V_80_RGB, %%mm1;\n"    /* Subtract 128 from v 0x000000vv00vv0000 */ 	"pmullw mpeg3_MMX_V_COEF_RGB, %%mm1;\n" /* Multiply v coeffs 0x0000vvvvvvvv0000 */ 	"psubw mpeg3_MMX_U_80_RGB, %%mm2;\n"    /* Subtract 128 from u 0x0000000000uu00uu */ 	"pmullw mpeg3_MMX_U_COEF_RGB, %%mm2;\n" /* Multiply u coeffs 0x0000uuuuuuuuuuuu *//* mm0: 0x000000yy00yy00yy mm1: 0x0000vvvvvvvv0000 mm2: 0x00000000uuuuuuuu */	"paddsw %%mm1, %%mm0;\n"        /* Add v to result */	"paddsw %%mm2, %%mm0;\n"        /* Add u to result 0x0000bbbbggggrrrr */	"psraw $6, %%mm0;\n"           /* Demote precision */	"packuswb %%mm0, %%mm0;\n"     /* Pack into RGBA 0x0000000000bbggrr */	"movd %%mm0, (%3);\n"          /* Store output */:: "r" (&y), "r" (&v), "r" (&u), "r" (output));}#endif#define DITHER_ROW_HEAD \	for(h = 0; h < video->out_h; h++) \	{ \		y_in = &src[0][(video->y_table[h] + video->in_y) * \			video->coded_picture_width] + \			video->in_x; \		if(video->chroma_format == CHROMA420) \		{ \			cb_in = &src[1][((video->y_table[h] + video->in_y) >> 1) * \				video->chrom_width] + \				(video->in_x >> 1); \			cr_in = &src[2][((video->y_table[h] + video->in_y) >> 1) * \				video->chrom_width] + \				(video->in_x >> 1); \		} \		else \		{ \			cb_in = &src[1][(video->y_table[h] + video->in_y) * \				video->chrom_width] + \				(video->in_x >> 1); \			cr_in = &src[2][(video->y_table[h] + video->in_y) * \				video->chrom_width] + \				(video->in_x >> 1); \		} \		data = output_rows[h];#define DITHER_ROW_TAIL \	}#define DITHER_SCALE_HEAD \	for(w = 0; w < video->out_w; w++) \	{ \		uv_subscript = video->x_table[w] / 2; \		y_l = y_in[video->x_table[w]]; \		y_l <<= 16; \		r_l = (y_l + video->cr_to_r[cr_in[uv_subscript]]) >> 16; \		g_l = (y_l + video->cr_to_g[cr_in[uv_subscript]] + video->cb_to_g[cb_in[uv_subscript]]) >> 16; \		b_l = (y_l + video->cb_to_b[cb_in[uv_subscript]]) >> 16;#define DITHER_SCALE_601_HEAD \	for(w = 0; w < video->out_w; w++) \	{ \		uv_subscript = video->x_table[w] / 2; \		y_l = mpeg3_601_to_rgb[y_in[video->x_table[w]]]; \		y_l <<= 16; \		r_l = (y_l + video->cr_to_r[cr_in[uv_subscript]]) >> 16; \		g_l = (y_l + video->cr_to_g[cr_in[uv_subscript]] + video->cb_to_g[cb_in[uv_subscript]]) >> 16; \		b_l = (y_l + video->cb_to_b[cb_in[uv_subscript]]) >> 16;#define DITHER_SCALE_TAIL \	}#define DITHER_MMX_SCALE_HEAD \	for(w = 0; w < video->out_w; w++) \	{ \		uv_subscript = video->x_table[w] / 2;#define DITHER_MMX_SCALE_TAIL \		data += step; \	}#define DITHER_MMX_HEAD \	for(w = 0; w < video->out_w; w += 2) \	{#define DITHER_MMX_TAIL \		data += step; \        cr_in++; \        cb_in++; \	}#define DITHER_HEAD \    for(w = 0; w < video->horizontal_size; w++) \	{ \		y_l = *y_in++; \		y_l <<= 16; \		r_l = (y_l + video->cr_to_r[*cr_in]) >> 16; \		g_l = (y_l + video->cr_to_g[*cr_in] + video->cb_to_g[*cb_in]) >> 16; \		b_l = (y_l + video->cb_to_b[*cb_in]) >> 16;#define DITHER_601_HEAD \    for(w = 0; w < video->horizontal_size; w++) \	{ \		y_l = mpeg3_601_to_rgb[*y_in++]; \		y_l <<= 16; \		r_l = (y_l + video->cr_to_r[*cr_in]) >> 16; \		g_l = (y_l + video->cr_to_g[*cr_in] + video->cb_to_g[*cb_in]) >> 16; \		b_l = (y_l + video->cb_to_b[*cb_in]) >> 16;#define DITHER_TAIL \    	if(w & 1) \		{ \        	cr_in++; \        	cb_in++; \    	} \    }#define STORE_PIXEL_BGR888 \	*data++ = CLIP(b_l); \	*data++ = CLIP(g_l); \	*data++ = CLIP(r_l);#define STORE_PIXEL_BGRA8888 \	*data++ = CLIP(b_l); \	*data++ = CLIP(g_l); \	*data++ = CLIP(r_l); \	*data++ = 0;#define STORE_PIXEL_RGB565 \	*((unsigned short*)data)++ = \		((CLIP(r_l) & 0xf8) << 8) | \		((CLIP(g_l) & 0xfc) << 3) | \		((CLIP(b_l) & 0xf8) >> 3);#define STORE_PIXEL_RGB888 \	*data++ = CLIP(r_l); \	*data++ = CLIP(g_l); \	*data++ = CLIP(b_l);#define STORE_PIXEL_RGBA8888 \	*data++ = CLIP(r_l); \	*data++ = CLIP(g_l); \	*data++ = CLIP(b_l); \	*data++ = 0;#define STORE_PIXEL_RGBA16161616 \	*data_s++ = CLIP(r_l); \	*data_s++ = CLIP(g_l); \	*data_s++ = CLIP(b_l); \	*data_s++ = 0;/* Only good for YUV 4:2:0 */int mpeg3video_ditherframe(mpeg3video_t *video, 	unsigned char **src, 	unsigned char **output_rows){	int h = 0;	register unsigned char *y_in, *cb_in, *cr_in;	long y_l, r_l, b_l, g_l;	register unsigned char *data;	register int uv_subscript, step, w = -1;#ifdef HAVE_MMX/* =================================== MMX ===================================== */	if(/* video->have_mmx */ 1 &&		video->out_w == video->horizontal_size &&		video->out_h == video->vertical_size &&		video->in_w == video->out_w &&		video->in_h == video->out_h &&		video->in_x == 0 &&		video->in_y == 0 &&		(video->color_model == MPEG3_RGB565 || 			video->color_model == MPEG3_601_RGB565) && 		video->chroma_format == CHROMA420)	{/* Unscaled 16 bit from NIST */		mpeg3video_rgb16_mmx(src[0], 			src[2], 			src[1], 			output_rows[0], 			video->out_h, 			video->out_w, 			(output_rows[1] - output_rows[0]) / 2 - video->out_w);	}	else	if(/* video->have_mmx */ 1 && 		(video->color_model == MPEG3_BGRA8888 || 		video->color_model == MPEG3_BGR888 ||/*		video->color_model == MPEG3_RGB888 || */		video->color_model == MPEG3_RGBA8888 ||		video->color_model == MPEG3_601_BGR888 ||		video->color_model == MPEG3_601_BGRA8888 ||		video->color_model == MPEG3_601_RGB888 ||		video->color_model == MPEG3_601_RGBA8888))	{/* Original MMX */		if(video->color_model == MPEG3_BGRA8888 ||			video->color_model == MPEG3_RGBA8888 ||			video->color_model == MPEG3_601_BGRA8888 ||			video->color_model == MPEG3_601_RGBA8888) step = 4;		else		if(video->color_model == MPEG3_BGR888 ||			video->color_model == MPEG3_RGB888 ||			video->color_model == MPEG3_601_BGR888 ||			video->color_model == MPEG3_601_RGB888) step = 3;		DITHER_ROW_HEAD/* Transfer row with scaling */			if(video->out_w != video->horizontal_size)			{				switch(video->color_model)				{					case MPEG3_BGRA8888:					case MPEG3_BGR888:						DITHER_MMX_SCALE_HEAD							mpeg3_bgra32_mmx(y_in[video->x_table[w]], 								cr_in[uv_subscript], 								cb_in[uv_subscript], 								(unsigned long*)data);						DITHER_MMX_SCALE_TAIL						break;										case MPEG3_601_BGRA8888:					case MPEG3_601_BGR888:						DITHER_MMX_SCALE_HEAD							mpeg3_601_bgra32_mmx(y_in[video->x_table[w]], 								cr_in[uv_subscript], 								cb_in[uv_subscript], 								(unsigned long*)data);						DITHER_MMX_SCALE_TAIL						break;					case MPEG3_RGBA8888:					case MPEG3_RGB888:						DITHER_MMX_SCALE_HEAD							mpeg3_rgba32_mmx(y_in[video->x_table[w]], 								cr_in[uv_subscript], 								cb_in[uv_subscript], 								(unsigned long*)data);						DITHER_MMX_SCALE_TAIL						break;					case MPEG3_601_RGBA8888:					case MPEG3_601_RGB888:						DITHER_MMX_SCALE_HEAD							mpeg3_601_rgba32_mmx(y_in[video->x_table[w]], 								cr_in[uv_subscript], 								cb_in[uv_subscript], 								(unsigned long*)data);						DITHER_MMX_SCALE_TAIL						break;				}			}			else/* Transfer row unscaled */			{				switch(video->color_model)				{/* MMX byte swap 24 and 32 bit */					case MPEG3_BGRA8888:					case MPEG3_BGR888:						DITHER_MMX_HEAD							mpeg3_bgra32_mmx(*y_in++, 								*cr_in, 								*cb_in, 								(unsigned long*)data);							data += step;							mpeg3_bgra32_mmx(*y_in++, 								*cr_in, 								*cb_in, 								(unsigned long*)data);						DITHER_MMX_TAIL						break;/* MMX 601 byte swap 24 and 32 bit */					case MPEG3_601_BGRA8888:					case MPEG3_601_BGR888:						DITHER_MMX_HEAD							mpeg3_601_bgra32_mmx(*y_in++, 								*cr_in, 								*cb_in, 								(unsigned long*)data);							data += step;							mpeg3_601_bgra32_mmx(*y_in++, 								*cr_in, 								*cb_in, 								(unsigned long*)data);						DITHER_MMX_TAIL						break;/* MMX 24 and 32 bit no byte swap */					case MPEG3_RGBA8888:					case MPEG3_RGB888:						DITHER_MMX_HEAD							mpeg3_rgba32_mmx(*y_in++, 								*cr_in, 								*cb_in, 								(unsigned long*)data);							data += step;							mpeg3_rgba32_mmx(*y_in++, 								*cr_in, 								*cb_in, 								(unsigned long*)data);						DITHER_MMX_TAIL						break;/* MMX 601 24 and 32 bit no byte swap */					case MPEG3_601_RGBA8888:					case MPEG3_601_RGB888:						DITHER_MMX_HEAD							mpeg3_601_rgba32_mmx(*y_in++, 								*cr_in, 								*cb_in, 								(unsigned long*)data);							data += step;							mpeg3_601_rgba32_mmx(*y_in++, 								*cr_in, 								*cb_in, 								(unsigned long*)data);						DITHER_MMX_TAIL						break;				}			}		DITHER_ROW_TAIL	}	else#endif/* ================================== NO MMX ==================================== */	{		DITHER_ROW_HEAD/* Transfer row with scaling */			if(video->out_w != video->horizontal_size)			{				switch(video->color_model)				{					case MPEG3_BGR888:

⌨️ 快捷键说明

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