亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? yuv2rgb_mmx.c

?? 本程序介紹MPEG-4解碼技術
?? C
?? 第 1 頁 / 共 2 頁
字號:



#include <memory.h> 


#include "portab.h"
#include "yuv2rgb.h"



#define MAXIMUM_Y_WIDTH 800


#define _USE_PREFETCH



static uint64_t mmw_mult_Y    = 0x2568256825682568;
static uint64_t mmw_mult_U_G  = 0xf36ef36ef36ef36e;
static uint64_t mmw_mult_U_B  = 0x40cf40cf40cf40cf;
static uint64_t mmw_mult_V_R  = 0x3343334333433343;
static uint64_t mmw_mult_V_G  = 0xe5e2e5e2e5e2e5e2;


static uint64_t mmb_0x10      = 0x1010101010101010;
static uint64_t mmw_0x0080    = 0x0080008000800080;
static uint64_t mmw_0x00ff    = 0x00ff00ff00ff00ff;

static uint64_t mmw_cut_red   = 0x7c007c007c007c00;
static uint64_t mmw_cut_green = 0x03e003e003e003e0;
static uint64_t mmw_cut_blue  = 0x001f001f001f001f;



void yuv2rgb_32(uint8_t *puc_y, int stride_y, 
                uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
                uint8_t *puc_out, int width_y, int height_y,
								unsigned int _stride_out) {

	int y, horiz_count;
	int stride_out = width_y * 4;

	if (height_y < 0) {

		height_y  = -height_y;
		puc_y     += (height_y   - 1) * stride_y ;
		puc_u     += (height_y/2 - 1) * stride_uv;
		puc_v     += (height_y/2 - 1) * stride_uv;
		stride_y  = -stride_y;
		stride_uv = -stride_uv;
	}

	horiz_count = -(width_y >> 3);

	for (y=0; y<height_y; y++) {
	
		_asm {
			push eax
			push ebx
			push ecx
			push edx
			push edi

			mov eax, puc_out       
			mov ebx, puc_y       
			mov ecx, puc_u       
			mov edx, puc_v
			mov edi, horiz_count
			
		horiz_loop:

			movd mm2, [ecx]
			pxor mm7, mm7

			movd mm3, [edx]
			punpcklbw mm2, mm7       ; mm2 = __u3__u2__u1__u0

			movq mm0, [ebx]          ; mm0 = y7y6y5y4y3y2y1y0  
			punpcklbw mm3, mm7       ; mm3 = __v3__v2__v1__v0

			movq mm1, mmw_0x00ff     ; mm1 = 00ff00ff00ff00ff 

			psubusb mm0, mmb_0x10    ; mm0 -= 16

			psubw mm2, mmw_0x0080    ; mm2 -= 128
			pand mm1, mm0            ; mm1 = __y6__y4__y2__y0

			psubw mm3, mmw_0x0080    ; mm3 -= 128
			psllw mm1, 3             ; mm1 *= 8

			psrlw mm0, 8             ; mm0 = __y7__y5__y3__y1
			psllw mm2, 3             ; mm2 *= 8

			pmulhw mm1, mmw_mult_Y   ; mm1 *= luma coeff 
			psllw mm0, 3             ; mm0 *= 8

			psllw mm3, 3             ; mm3 *= 8
			movq mm5, mm3            ; mm5 = mm3 = v

			pmulhw mm5, mmw_mult_V_R ; mm5 = red chroma
			movq mm4, mm2            ; mm4 = mm2 = u

			pmulhw mm0, mmw_mult_Y   ; mm0 *= luma coeff 
			movq mm7, mm1            ; even luma part

			pmulhw mm2, mmw_mult_U_G ; mm2 *= u green coeff 
			paddsw mm7, mm5          ; mm7 = luma + chroma    __r6__r4__r2__r0

			pmulhw mm3, mmw_mult_V_G ; mm3 *= v green coeff  
			packuswb mm7, mm7        ; mm7 = r6r4r2r0r6r4r2r0

			pmulhw mm4, mmw_mult_U_B ; mm4 = blue chroma
			paddsw mm5, mm0          ; mm5 = luma + chroma    __r7__r5__r3__r1

			packuswb mm5, mm5        ; mm6 = r7r5r3r1r7r5r3r1
			paddsw mm2, mm3          ; mm2 = green chroma

			movq mm3, mm1            ; mm3 = __y6__y4__y2__y0
			movq mm6, mm1            ; mm6 = __y6__y4__y2__y0

			paddsw mm3, mm4          ; mm3 = luma + chroma    __b6__b4__b2__b0
			paddsw mm6, mm2          ; mm6 = luma + chroma    __g6__g4__g2__g0
			
			punpcklbw mm7, mm5       ; mm7 = r7r6r5r4r3r2r1r0
			paddsw mm2, mm0          ; odd luma part plus chroma part    __g7__g5__g3__g1

			packuswb mm6, mm6        ; mm2 = g6g4g2g0g6g4g2g0
			packuswb mm2, mm2        ; mm2 = g7g5g3g1g7g5g3g1

			packuswb mm3, mm3        ; mm3 = b6b4b2b0b6b4b2b0
			paddsw mm4, mm0          ; odd luma part plus chroma part    __b7__b5__b3__b1

			packuswb mm4, mm4        ; mm4 = b7b5b3b1b7b5b3b1
			punpcklbw mm6, mm2       ; mm6 = g7g6g5g4g3g2g1g0

			punpcklbw mm3, mm4       ; mm3 = b7b6b5b4b3b2b1b0

			/* 32-bit shuffle.... */
			pxor mm0, mm0            ; is this needed?

			movq mm1, mm6            ; mm1 = g7g6g5g4g3g2g1g0
			punpcklbw mm1, mm0       ; mm1 = __g3__g2__g1__g0

			movq mm0, mm3            ; mm0 = b7b6b5b4b3b2b1b0
			punpcklbw mm0, mm7       ; mm0 = r3b3r2b2r1b1r0b0

			movq mm2, mm0            ; mm2 = r3b3r2b2r1b1r0b0

			punpcklbw mm0, mm1       ; mm0 = __r1g1b1__r0g0b0
			punpckhbw mm2, mm1       ; mm2 = __r3g3b3__r2g2b2


			movq  [eax], mm0         ; eax[0] = __r1g1b1__r0g0b0
			movq mm1, mm6            ; mm1 = g7g6g5g4g3g2g1g0

			movq 8[eax], mm2         ; eax[8] = __r3g3b3__r2g2b2


			pxor mm0, mm0            ; is this needed?

			punpckhbw mm1, mm0       ; mm1 = __g7__g6__g5__g4

			movq mm0, mm3            ; mm0 = b7b6b5b4b3b2b1b0
			punpckhbw mm0, mm7       ; mm0 = r7b7r6b6r5b5r4b4

			movq mm2, mm0            ; mm2 = r7b7r6b6r5b5r4b4

			punpcklbw mm0, mm1       ; mm0 = __r5g5b5__r4g4b4
			punpckhbw mm2, mm1       ; mm2 = __r7g7b7__r6g6b6


			add ebx, 8               ; puc_y   += 8;
			add ecx, 4               ; puc_u   += 4;

			movq 16[eax], mm0        ; eax[16] = __r5g5b5__r4g4b4
			add edx, 4               ; puc_v   += 4;

			movq 24[eax], mm2        ; eax[24] = __r7g7b7__r6g6b6
			

			add eax, 32              ; puc_out += 32

			inc edi
			jne horiz_loop			

			pop edi 
			pop edx 
			pop ecx
			pop ebx 
			pop eax

			emms
						
		}
		puc_y   += stride_y;
		if (y%2) {
			puc_u   += stride_uv;
			puc_v   += stride_uv;
		}
		puc_out += stride_out;
	}
}






void yuv2rgb_24(uint8_t *puc_y, int stride_y, 
                uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
                uint8_t *puc_out, int width_y, int height_y,
								unsigned int _stride_out) {

	int y, horiz_count;
	uint8_t *puc_out_remembered;
	int stride_out = width_y * 3;

	if (height_y < 0) {

		height_y  = -height_y;
		puc_y     += (height_y   - 1) * stride_y ;
		puc_u     += (height_y/2 - 1) * stride_uv;
		puc_v     += (height_y/2 - 1) * stride_uv;
		stride_y  = -stride_y;
		stride_uv = -stride_uv;
	}

	horiz_count = -(width_y >> 3);

	for (y=0; y<height_y; y++) {

		if (y == height_y-1) {
			uint8_t temp_buff[3*MAXIMUM_Y_WIDTH+1];
			puc_out_remembered = puc_out;
			puc_out = temp_buff; 
		}

		_asm {
			push eax
			push ebx
			push ecx
			push edx
			push edi

			mov eax, puc_out       
			mov ebx, puc_y       
			mov ecx, puc_u       
			mov edx, puc_v
			mov edi, horiz_count
			
		horiz_loop:

			movd mm2, [ecx]
			pxor mm7, mm7

			movd mm3, [edx]
			punpcklbw mm2, mm7       ; mm2 = __u3__u2__u1__u0

			movq mm0, [ebx]          ; mm0 = y7y6y5y4y3y2y1y0  
			punpcklbw mm3, mm7       ; mm3 = __v3__v2__v1__v0

			movq mm1, mmw_0x00ff     ; mm1 = 00ff00ff00ff00ff 

			psubusb mm0, mmb_0x10    ; mm0 -= 16

			psubw mm2, mmw_0x0080    ; mm2 -= 128
			pand mm1, mm0            ; mm1 = __y6__y4__y2__y0

			psubw mm3, mmw_0x0080    ; mm3 -= 128
			psllw mm1, 3             ; mm1 *= 8

			psrlw mm0, 8             ; mm0 = __y7__y5__y3__y1
			psllw mm2, 3             ; mm2 *= 8

			pmulhw mm1, mmw_mult_Y   ; mm1 *= luma coeff 
			psllw mm0, 3             ; mm0 *= 8

			psllw mm3, 3             ; mm3 *= 8
			movq mm5, mm3            ; mm5 = mm3 = v

			pmulhw mm5, mmw_mult_V_R ; mm5 = red chroma
			movq mm4, mm2            ; mm4 = mm2 = u

			pmulhw mm0, mmw_mult_Y   ; mm0 *= luma coeff 
			movq mm7, mm1            ; even luma part

			pmulhw mm2, mmw_mult_U_G ; mm2 *= u green coeff 
			paddsw mm7, mm5          ; mm7 = luma + chroma    __r6__r4__r2__r0

			pmulhw mm3, mmw_mult_V_G ; mm3 *= v green coeff  
			packuswb mm7, mm7        ; mm7 = r6r4r2r0r6r4r2r0

			pmulhw mm4, mmw_mult_U_B ; mm4 = blue chroma
			paddsw mm5, mm0          ; mm5 = luma + chroma    __r7__r5__r3__r1

			packuswb mm5, mm5        ; mm6 = r7r5r3r1r7r5r3r1
			paddsw mm2, mm3          ; mm2 = green chroma

			movq mm3, mm1            ; mm3 = __y6__y4__y2__y0
			movq mm6, mm1            ; mm6 = __y6__y4__y2__y0

			paddsw mm3, mm4          ; mm3 = luma + chroma    __b6__b4__b2__b0
			paddsw mm6, mm2          ; mm6 = luma + chroma    __g6__g4__g2__g0
			
			punpcklbw mm7, mm5       ; mm7 = r7r6r5r4r3r2r1r0
			paddsw mm2, mm0          ; odd luma part plus chroma part    __g7__g5__g3__g1

			packuswb mm6, mm6        ; mm2 = g6g4g2g0g6g4g2g0
			packuswb mm2, mm2        ; mm2 = g7g5g3g1g7g5g3g1

			packuswb mm3, mm3        ; mm3 = b6b4b2b0b6b4b2b0
			paddsw mm4, mm0          ; odd luma part plus chroma part    __b7__b5__b3__b1

			packuswb mm4, mm4        ; mm4 = b7b5b3b1b7b5b3b1
			punpcklbw mm6, mm2       ; mm6 = g7g6g5g4g3g2g1g0

			punpcklbw mm3, mm4       ; mm3 = b7b6b5b4b3b2b1b0

			pxor mm0, mm0            ; is this needed?

			movq mm1, mm6            ; mm1 = g7g6g5g4g3g2g1g0
			punpcklbw mm1, mm0       ; mm1 = __g3__g2__g1__g0

			movq mm0, mm3            ; mm0 = b7b6b5b4b3b2b1b0
			punpcklbw mm0, mm7       ; mm0 = r3b3r2b2r1b1r0b0

			movq mm2, mm0            ; mm2 = r3b3r2b2r1b1r0b0

			punpcklbw mm0, mm1       ; mm0 = __r1g1b1__r0g0b0
			punpckhbw mm2, mm1       ; mm2 = __r3g3b3__r2g2b2

			movd   [eax], mm0        ; eax[0] = __r0g0b0
			psrlq mm0, 32            ; mm0 = __r1g1b1

			movd  3[eax], mm0        ; eax[3] = __r1g1b1

			movd  6[eax], mm2        ; eax[6] = __r2g2b2
			

			psrlq mm2, 32            ; mm2 = __r3g3b3
	
			movd  9[eax], mm2        ; eax[9] = __r3g3b3

			pxor mm0, mm0            ; is this needed?

			movq mm1, mm6            ; mm1 = g7g6g5g4g3g2g1g0
			punpckhbw mm1, mm0       ; mm1 = __g7__g6__g5__g4

			movq mm0, mm3            ; mm0 = b7b6b5b4b3b2b1b0
			punpckhbw mm0, mm7       ; mm0 = r7b7r6b6r5b5r4b4

			movq mm2, mm0            ; mm2 = r7b7r6b6r5b5r4b4

			punpcklbw mm0, mm1       ; mm0 = __r5g5b5__r4g4b4
			punpckhbw mm2, mm1       ; mm2 = __r7g7b7__r6g6b6


			movd 12[eax], mm0        ; eax[12] = __r4g4b4
			psrlq mm0, 32            ; mm0 = __r5g5b5
			
			movd 15[eax], mm0        ; eax[15] = __r5g5b5
			add ebx, 8               ; puc_y   += 8;

			movd 18[eax], mm2        ; eax[18] = __r6g6b6
			psrlq mm2, 32            ; mm2 = __r7g7b7
			
			add ecx, 4               ; puc_u   += 4;
			add edx, 4               ; puc_v   += 4;

			movd 21[eax], mm2        ; eax[21] = __r7g7b7
			add eax, 24              ; puc_out += 24

			inc edi
			jne horiz_loop			

			pop edi 
			pop edx 
			pop ecx
			pop ebx 
			pop eax

			emms
						
		}


		if (y == height_y-1) {
			int x = 3 * width_y;                  
			uint8_t *ps = puc_out;                
			uint8_t *pd = puc_out_remembered;    
			while (x--) *(pd++) = *(ps++);	     
		}

		puc_y   += stride_y;
		if (y%2) {
			puc_u   += stride_uv;
			puc_v   += stride_uv;
		}
		puc_out += stride_out; 

	}
}






static uint64_t mask_5		= 0xf8f8f8f8f8f8f8f8;
static uint64_t mask_6		= 0xfcfcfcfcfcfcfcfc;

static uint64_t mask_blue	= 0x1f1f1f1f1f1f1f1f;


void yuv2rgb_555(uint8_t *puc_y, int stride_y, 
                 uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
                 uint8_t *puc_out,	int width_y, int height_y,
				 unsigned int _stride_out) {


	int y, horiz_count;
	int stride_out = width_y * 2;

	if (height_y < 0) {

		height_y  = -height_y;
		puc_y     += (height_y   - 1) * stride_y ;
		puc_u     += (height_y/2 - 1) * stride_uv;
		puc_v     += (height_y/2 - 1) * stride_uv;
		stride_y  = -stride_y;
		stride_uv = -stride_uv;
	}

	horiz_count = -(width_y >> 3);

	for (y=0; y<height_y; y++) {
	
		_asm {
			push eax
			push ebx
			push ecx
			push edx
			push edi

			mov eax, puc_out       
			mov ebx, puc_y       
			mov ecx, puc_u       
			mov edx, puc_v

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区日韩在线观看| 精品国产免费一区二区三区四区 | 免费观看成人鲁鲁鲁鲁鲁视频| 日本精品视频一区二区三区| 亚洲最大成人综合| 欧美日韩国产免费| 狠狠色丁香久久婷婷综| 国产欧美日韩综合| 色呦呦国产精品| 日韩二区三区四区| 欧美精品一区二区三区高清aⅴ | 精品国产人成亚洲区| 国产精选一区二区三区| 国产精品国产馆在线真实露脸| 日本韩国一区二区| 人人超碰91尤物精品国产| 精品电影一区二区| av在线不卡网| 天天av天天翘天天综合网| 日韩午夜在线影院| 久久只精品国产| 91麻豆国产自产在线观看| 亚洲高清不卡在线观看| 久久一留热品黄| 91年精品国产| 美腿丝袜亚洲一区| 亚洲欧洲无码一区二区三区| 制服丝袜中文字幕一区| 国产91色综合久久免费分享| 一区二区三区四区国产精品| 日韩欧美aaaaaa| 91在线精品一区二区| 日韩av网站在线观看| 国产精品无码永久免费888| 欧美视频一区二区在线观看| 韩国三级电影一区二区| 亚洲久本草在线中文字幕| 日韩欧美色综合网站| 日本高清不卡aⅴ免费网站| 蜜臀av一区二区| 亚洲免费视频中文字幕| 欧美精品一区二区高清在线观看| 色乱码一区二区三区88| 国产成人在线电影| 日本午夜一区二区| 亚洲精品国产第一综合99久久| 久久亚洲欧美国产精品乐播| 欧洲一区二区三区免费视频| 高清视频一区二区| 麻豆成人免费电影| 亚洲一区在线观看视频| 中文字幕精品三区| 欧美大片在线观看一区二区| 欧美色综合网站| 91在线视频18| 成人三级在线视频| 国产精品1区2区3区| 美女一区二区三区在线观看| 亚洲一区二三区| 成人免费小视频| 国产午夜亚洲精品羞羞网站| xfplay精品久久| 欧美一区二区在线视频| 51精品国自产在线| 欧美日韩1区2区| 欧美视频一区在线| 欧美图片一区二区三区| 色综合久久88色综合天天 | 日本精品一区二区三区高清| 波波电影院一区二区三区| 国产一区二区三区日韩| 国产一区二区网址| 国产美女一区二区| 国产福利精品一区| 国产精品夜夜爽| 国产在线播放一区二区三区| 久久成人免费日本黄色| 欧美日韩免费观看一区二区三区| 在线看国产日韩| 欧美性xxxxx极品少妇| 在线免费观看日本欧美| 色伊人久久综合中文字幕| 色噜噜狠狠成人中文综合| 色欧美乱欧美15图片| 欧美综合天天夜夜久久| 欧美精品丝袜中出| 日韩欧美国产wwwww| 精品国产露脸精彩对白 | gogo大胆日本视频一区| 9久草视频在线视频精品| 91免费版pro下载短视频| 在线精品亚洲一区二区不卡| 欧美在线不卡一区| 欧美精品日日鲁夜夜添| 精品成人一区二区三区四区| 国产精品视频一二三区| 夜夜精品浪潮av一区二区三区| 亚洲第一综合色| 久久精品国产99国产| 狠狠色综合色综合网络| 波波电影院一区二区三区| 欧美三级韩国三级日本三斤| 欧美mv和日韩mv国产网站| 亚洲国产精品成人综合| 亚洲一区二区欧美| 免费在线视频一区| 成人av午夜电影| 欧美精品在线观看播放| 久久久美女艺术照精彩视频福利播放| 国产精品伦理在线| 亚洲第一福利一区| 国产成人在线视频播放| 欧美色综合久久| 国产视频一区二区在线| 午夜视频在线观看一区二区三区| 国产一区视频网站| 欧美性色欧美a在线播放| 精品少妇一区二区三区视频免付费| 国产精品久久久久久久久免费相片| 午夜精品久久久久久久久久久| 国产一区视频网站| 欧美精品电影在线播放| 紧缚奴在线一区二区三区| 91在线精品一区二区| 欧美mv日韩mv国产网站app| 亚洲精品福利视频网站| 国产精品白丝jk黑袜喷水| 欧美日韩另类一区| 中文字幕一区二区在线观看| 看片的网站亚洲| 欧美色网一区二区| 自拍偷拍亚洲综合| 国产一区二区美女诱惑| 欧美日韩国产综合视频在线观看| 国产精品传媒入口麻豆| 毛片一区二区三区| 欧美三级一区二区| 亚洲美女屁股眼交| 粉嫩av一区二区三区粉嫩| 正在播放一区二区| 亚洲在线免费播放| 色综合色狠狠天天综合色| 欧美国产1区2区| 精品一区二区免费在线观看| 欧美日韩国产高清一区二区三区| 中文字幕中文字幕一区二区| 国产成a人无v码亚洲福利| 91精品国产综合久久精品| 亚洲精品国产视频| 97久久久精品综合88久久| 欧美高清一级片在线观看| 日韩视频免费观看高清在线视频| 亚洲少妇最新在线视频| 国产**成人网毛片九色 | 国产在线视视频有精品| 欧美日韩高清在线| 亚洲成av人片一区二区三区| 欧洲视频一区二区| 亚洲黄色小说网站| 91黄色小视频| 亚洲在线视频网站| 在线免费观看日本一区| 亚洲自拍偷拍九九九| 色素色在线综合| 亚洲一区二区三区爽爽爽爽爽 | 亚洲欧美成aⅴ人在线观看| 国产精品一二三四五| 国产日韩亚洲欧美综合| 九色|91porny| 久久久久国产精品人| 国产福利精品导航| 国产精品视频yy9299一区| 91在线一区二区| 亚洲综合色成人| 91精品久久久久久蜜臀| 青青青伊人色综合久久| www日韩大片| 99热在这里有精品免费| 依依成人综合视频| 91精品一区二区三区久久久久久 | 精品视频在线视频| 美女久久久精品| 久久精品亚洲精品国产欧美| 成人一区二区三区视频在线观看| 国产精品乱码人人做人人爱| 色天使色偷偷av一区二区| 婷婷久久综合九色综合绿巨人| 欧美一区二区在线不卡| 黄色成人免费在线| 欧美影视一区在线| 91麻豆精品91久久久久同性| 国产日产精品1区| 美国一区二区三区在线播放| 午夜av电影一区| 日本美女一区二区| 午夜视黄欧洲亚洲| 国产suv精品一区二区三区| 在线免费观看不卡av| 久久久久久久久久久电影| 一区二区不卡在线播放 |