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

📄 mmxmad.asm

📁 这是G.723和G.729的音频编解码的源代码
💻 ASM
字号:
.nolist
INCLUDE iammx.inc                   ; IAMMX Emulator Macros
.list

.586p
.model FLAT

.data
ALIGN 8

BitMask DQ 0ff00ff00ff00ffh

.const


.code

COMMENT ^
int CalMADLast (
    BYTE *RefFrame,
	BYTE *CurFrame,
	int CurPixels
	)
^

CalMADLast PROC NEAR C USES esi,
            RefFrame:PTR BYTE, CurFrame:PTR BYTE,
            CurPixels:DWORD

	push edx
	push edi
	push ebx
	mov esi,RefFrame
	mov edi,CurFrame
	mov ebx,CurPixels
	mov edx,ebx
	add edx,ebx
	add edx,ebx
	pxor		mm7,mm7

	movq		mm0,[esi]
	pxor		mm6,mm6
	movq		mm1,[edi]
	movq		mm2,mm0
	movq		mm3,8[esi]
	psubusb		mm0,mm1
	movq		mm4,8[edi]
	psubusb		mm1,mm2
	por			mm0,mm1
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4

	movq		mm2,16[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[ebx+edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2

	movq		mm3,24[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+ebx+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,32[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[2*ebx+edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2

	movq		mm3,40[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+2*ebx+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	add edi,edx
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4

	movq		mm2,48[esi]
	movq		mm4,mm3

	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1

	movq		mm5,[edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2

	movq		mm3,56[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4

	movq		mm2,64[esi]
	movq		mm4,mm3

	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	
	movq		mm5,[ebx+edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2

	movq		mm3,72[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+ebx+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	
	movq		mm2,80[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1

	movq		mm5,[2*ebx+edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2

	movq		mm3,88[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+2*ebx+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	add edi,edx
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,96[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2
	movq		mm3,104[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,112[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[ebx+edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2
	movq		mm3,120[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+ebx+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,128[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[2*ebx+edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2
	movq		mm3,136[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+2*ebx+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	add edi,edx
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,144[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2
	movq		mm3,152[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,160[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[ebx+edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2
	movq		mm3,168[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+ebx+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,176[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[2*ebx+edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2
	movq		mm3,184[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+2*ebx+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	add edi,edx
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,192[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2
	movq		mm3,200[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,208[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[ebx+edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2
	movq		mm3,216[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+ebx+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,224[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[2*ebx+edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2
	movq		mm3,232[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+2*ebx+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	add edi,edx
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	movq		mm2,240[esi]
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	movq		mm5,[edi]
	paddusw		mm7,mm3

	paddusw		mm7,mm4	
	movq		mm0,mm2
	movq		mm3,248[esi]
	psubusb		mm0,mm5
	movq		mm4,[8+edi]
	psubusb		mm5,mm2
	por			mm0,mm5
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	por			mm3,mm4
	
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	paddusw		mm7,mm0
	punpckhbw	mm4,mm6
	paddusw		mm7,mm1
	paddusw		mm7,mm3
	pop ebx
	paddusw		mm7,mm4	

	movq		mm0,mm7
	psrlq		mm7,32
	paddusw		mm7,mm0
	pop edi
	punpcklwd	mm7,mm6
	pop edx
	movq		mm1,mm7
	psrlq		mm7, 32
	paddd		mm7,mm1

	movd		eax,mm7
	
	emms
    ret

CalMADLast ENDP


COMMENT ^
int CalMADSub (
    BYTE *RefFrame,
	BYTE *CurFrame,
	int RefSubPixels,
	int CurSubPixels
	)
^
CalMADSub  PROC NEAR C USES esi edi, 
            RefFrame:PTR BYTE, CurFrame:PTR BYTE,
            RefSubPixels:DWORD, CurSubPixels:DWORD
;           LOCAL   src:PTR SWORD, num:PTR SDWORD
; above (commented) line is an example of declaring local parameters

	push ebx
	mov esi,RefFrame
	mov edi,CurFrame
	mov eax,RefSubPixels
	mov ebx,CurSubPixels
	pxor		mm7,mm7

	movq		mm0,[esi]
	pxor		mm6,mm6
	movq		mm1,[edi]
	movq		mm2,mm0
	add esi,eax
	psubusb		mm0,mm1
	add edi,ebx
	psubusb		mm1,mm2

	movq		mm3,[esi]
	por			mm0,mm1
	movq		mm4,[edi]
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	add esi,eax
	add edi,ebx
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	paddusw		mm7,mm0
	por			mm3,mm4
	paddusw		mm7,mm1

	movq		mm0,[esi]
	movq		mm4,mm3
	movq		mm1,[edi]
	punpcklbw	mm3,mm6
	punpckhbw	mm4,mm6
	paddusw     mm7,mm3
	add esi,eax
	paddusw		mm7,mm4
	add edi,ebx
	movq		mm2,mm0

	movq		mm3,[esi]
	psubusb		mm0,mm1
	movq		mm4,[edi]
	psubusb		mm1,mm2
	por			mm0,mm1
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	add esi,eax
	add edi,ebx
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	paddusw		mm7,mm0
	por			mm3,mm4
	paddusw		mm7,mm1

	movq		mm0,[esi]
	movq		mm4,mm3
	movq		mm1,[edi]
	punpcklbw	mm3,mm6
	punpckhbw	mm4,mm6
	paddusw     mm7,mm3
	add esi,eax
	paddusw		mm7,mm4
	add edi,ebx
	movq		mm2,mm0

	movq		mm3,[esi]
	psubusb		mm0,mm1
	movq		mm4,[edi]
	psubusb		mm1,mm2
	por			mm0,mm1
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	add esi,eax
	add edi,ebx
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	paddusw		mm7,mm0
	por			mm3,mm4
	paddusw		mm7,mm1

	movq		mm0,[esi]
	movq		mm4,mm3
	movq		mm1,[edi]
	punpcklbw	mm3,mm6
	punpckhbw	mm4,mm6
	paddusw     mm7,mm3
	add esi,eax
	paddusw		mm7,mm4
	add edi,ebx
	movq		mm2,mm0

	movq		mm3,[esi]
	psubusb		mm0,mm1
	movq		mm4,[edi]
	psubusb		mm1,mm2
	por			mm0,mm1
	movq		mm5,mm3
	movq		mm1,mm0
	psubusb		mm3,mm4
	punpcklbw	mm0,mm6
	psubusb		mm4,mm5
	punpckhbw	mm1,mm6
	paddusw		mm7,mm0
	por			mm3,mm4
	paddusw		mm7,mm1
	movq		mm4,mm3
	punpcklbw	mm3,mm6
	punpckhbw	mm4,mm6
	paddusw		mm7,mm3

	paddusw		mm7,mm4
	movq		mm0,mm7
	psrlq		mm7,32
	paddusw		mm7,mm0
	punpcklwd	mm7,mm6
	movq		mm1,mm7
	psrlq		mm7, 32
	paddd		mm7,mm1

	pop			ebx
	movd		eax,mm7
	
	emms
    ret

CalMADSub ENDP


COMMENT ^
void GetSub1(
	BYTE * RF,
	BYTE *pSubR,
	int pixels,
	int lines);
^


GetSub1 PROC NEAR C USES esi edi ecx eax ebx edx,
            RF:PTR BYTE, pSubR:PTR DWORD,
            pixels:DWORD, lines:DWORD

	mov ecx,lines
	sar ecx,1
	mov eax,pixels
	sar eax,4
	mov esi,RF
	mov edi,pSubR
	pxor	 mm7,mm7
	movq	 mm6,DWORD PTR BitMask

loopline:
	mov ebx,eax
perline:
	movq	 mm0,[esi]
	movq	 mm1,[esi+8]
	pand	 mm0,mm6
	pand	 mm1,mm6
	packuswb mm0,mm7
	packuswb mm1,mm7
	psllq	 mm1,32
	por		 mm0,mm1
	add esi,16
	movq	 [edi],mm0
	add edi,8
	dec ebx
	jnz perline

	add esi,pixels
	dec ecx
	jnz loopline

	emms
	ret

GetSub1 ENDP

END

⌨️ 快捷键说明

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