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

📄 mpa_downmix.s

📁 samsung 9908DVD源代码,
💻 S
字号:
/*
 *  mpa_downmix.s
 *
 *  MPEG/audio multichannel decoder.
 *	Copyright (C) 2003 Optical Player P/J, Samsung Electronics.
 *
 *  PCM channel buffer structure (max 7 channels)
 *
 *		<------------  sample per each channel ------------>
 *		+----+----+----+----+----+----+----+------------------+
 *		|  L |  R |  C | Ls | Rs | Lc | Rc |  ... next sample |
 *		+----+----+----+----+----+----+----+------------------+
 *
 */

.include	"mpa.h"

.if( _DECODER_TYPE != MPEG_1_AUDIO )

.secFILE_mpa_downmix



/********************************************************************

 Function:		MC_II_downmix_5ch_to_2ch

 Description:	downmix 5.1 multichannel to 2-ch stereo
 
 Downmix equations: ISO/IEC 13818-3:1997
 
       dematrix procedure 0:
 		Lo = L + 1/2*sqrt(2)*C + 1/2*sqrt(2)*Ls		--- (1)
 		Ro = R + 1/2*sqrt(2)*C + 1/2*sqrt(2)*Rs		--- (2) 
 
       dematrix procedure 1:
 		Lo = L + 1/2*sqrt(2)*C + 1/2*Ls		        --- (3)
 		Ro = R + 1/2*sqrt(2)*C + 1/2*Rs		        --- (4) 
 
       dematrix procedure 3:
 		Lo = L 		                                --- (5)
 		Ro = R                                      --- (6)
 
       dematrix procedure 2:
 		Lo = L + 1/2*sqrt(2)*C - 1/2*sqrt(2)*jS     --- (7)
 		Ro = R + 1/2*sqrt(2)*C + 1/2*sqrt(2)*jS     --- (8)

		jS = 0.5 * (Ls + Rs)
		
 Arguments:		
				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0: 	 x	     x		 3		 1
				sd1:	 x	     1		 x		 x
				sd3:	 x	     x		 x		 1

********************************************************************/
MC_II_downmix_5ch_to_2ch::
				es			psh1
				er			usm
				es			op
				es			opm

				er			xsd
				eld			sd0, #0x6131
				eld			sd1, #0x0100
				eld			sd3, #0x0001
				
				eld			rp0, #pcm_ch_buffer
				eld			rp1, #pcm_dm_buffer
				eld			rp3, #downmix_factor
				eld			y0, @rp3+s0
				eld			y1, @rp3+s0
				
				ld			r6, #SAMPLES_PER_FRAME-1

				eld			a, rpd0.dematrix_procedure
				ecp			a, #MC_MATRIX_MODE_0
				ebra		ec0, downmix_mtx_proc_0
				ecp			a, #MC_MATRIX_MODE_1
				ebra		ec0, downmix_mtx_proc_1
				ecp			a, #MC_MATRIX_MODE_2
				ebra		ec0, downmix_mtx_proc_2
				ecp			a, #MC_MATRIX_MODE_3
				ebrad		ec0, downmix_mtx_proc_3
				esd0		s1, #6

/** debug **/	bra			error_mc_downmix
				
downmix_mtx_proc_0
				eld			ma0, @rp0+s0			; L
				eld			ma1, @rp0+s0			; R
				eld			x1, @rp0+s0				; C
				eld			x0, @rp0+s0				; Ls
				emul		x0y0, x0, @rp0+s1		; Rs
				emad		ma0, x0y0
				emad		ma1, x1y0
				emad		ma0, x1y0
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma0
.endif
				eadd		ma1, p, @rp1+d0, ma0	; Lo
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma1
.endif
				bnzd		r6, downmix_mtx_proc_0
				eld			@rp1+d0, ma1			; Ro
				bra			end_mc_downmix

downmix_mtx_proc_1
				eld			ma0, @rp0+s0			; L
				eld			ma1, @rp0+s0			; R
				eld			x1, @rp0+s0				; C
				eld			x0, @rp0+s0				; Ls
				emul		x0y1, x0, @rp0+s1		; Rs
				emad		ma0, x0y1
				emad		ma1, x1y0
				emad		ma0, x1y0
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma0
.endif
				eadd		ma1, p, @rp1+d0, ma0	; Lo
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma1
.endif
				bnzd		r6, downmix_mtx_proc_1
				eld			@rp1+d0, ma1			; Ro
				bra			end_mc_downmix

downmix_mtx_proc_2
				eld			ma0, @rp0+s0			; L
				eld			ma1, @rp0+s0			; R
				eld			x0, @rp0+s0				; C				
				eld			a, @rp0+s0				; Ls
				eld			b, @rp0+s1				; Rs				
				eadd		a, b
				esra		a
				eincc		a
				eld			x1, a					; jS				
				emul		x0y0
				emad		ma0, x0y0
				emad		ma1, x1y0
				emsb		ma0, x1y0
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma0
.endif
				eadd		ma1, p, @rp1+d0, ma0	; Lo
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma1
.endif
				bnzd		r6, downmix_mtx_proc_2
				eld			@rp1+d0, ma1			; Ro
				bra			end_mc_downmix

downmix_mtx_proc_3
				eld			a, @rp0+s0
				eld			b, @rp0+s1
				eld			@rp1+d0, a
				bnzd		r6, downmix_mtx_proc_3
				eld			@rp1+d0, b
				bra			end_mc_downmix

end_mc_downmix
				mRETURN		(_DECODE_OK)
				er			psh1
				er			op
				er			opm
				er			xsd
				ret				

error_mc_downmix:
				mRETURN		(_ILLEGAL_MTX_MODE)
				er			psh1
				er			op
				er			opm
				er			xsd
				ret				



/********************************************************************

 Function:		AUG_II_downmix_7ch_to_2ch

 Description:	downmix 7.1-channel to 2-channel 
 
 Downmix equations:
       			
       			step 1:	downmix 7.1-channel to 5.1-channel
       					(as described in DVD Specification Part 2.)
       			
       			step 2:	downmix 5.1-channel to 2-channel 
       					(as described in ISO/IEC 13818-3:1997)
 
 Arguments:		
				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0: 	-2	     2	    -3		 1
				sd1: 	 x	     1	     x		 x
				sd3:	 x	     x	    -3		 1

********************************************************************/
downmix_5to2_procedure:
				dl			aug_dm_mtx_proc_0
				dl			aug_dm_mtx_proc_1
				dl			aug_dm_mtx_proc_2
				dl			aug_dm_mtx_proc_3
				
AUG_II_downmix_7ch_to_2ch::
				push		a14

				es			psh1
				er			usm
				es			op
				es			opm

				er			xsd
				eld			sd0, #0xe2d1
				eld			sd1, #0x0100
				eld			sd3, #0x00d1
				
				eld			rp0, #pcm_ch_buffer
				eld			rp1, #pcm_dm_buffer
				eld			rp3, #aug_downmix_factor
				
				ld			r6, #SAMPLES_PER_FRAME

				eld			a, rpd1.aug_mtx_proc
				eld			b, rpd0.dematrix_procedure

mc_downmix_procedure
				ld			a12, #downmix_5to2_procedure
				ecld		r1, b
				ld			r2, #4
				mul			uu, r1, r2
				add			a12, r1
				ldc			r2, @a12
				add			a12, #2
				ldc			r12, @a12
				ld			e12, r2

aug_downmix_procedure
				ld			a13, #aug_dm_aug_mtx_proc_0
				ecp			a, #0
				ebra		ec0, aug_dm_aug_mtx_proc_0
				
				ld			a13, #aug_dm_aug_mtx_proc_1
				ecp			a, #1
				ebra		ec0, aug_dm_aug_mtx_proc_1
				
/** debug **/	bra			error_aug_downmix

aug_dm_aug_mtx_proc_0
; result: ma0=>L, ma1=>R, x0=>C
				eld			ma0, @rp0+s0					; LL
				eld			ma1, @rp0+s0					; RR
				eld			a, @rp0+s0						; CC
				erpn		rp0, #2                         ; skip LS, RS
				eld			x0, @rp0+s0, y0, @rp3+s0		; LC, c0=0.75
				emul		x0y0, x1, @rp0+s1, y1, @rp3+s0	; RC, c1=0.25
				emad		ma0, x1y0
				emad		ma1, x0y1
				eld			b, ma0
				emld		ma0, x1y1
				eadd		ma0, p
				eadd		a, ma0
				eld			ma0, b
				eld			x0, a				
				jmp			a12

aug_dm_aug_mtx_proc_1
; result: ma0=>L, ma1=>R, x0=>C
				eld			ma0, @rp0+s0					; LL
				eld			ma1, @rp0+s0					; RR
				eld			x0, @rp0+s0, y0, @rp3+s0		; CC, c0(not used but increase offset)
				erpn		rp0, #2                      	; skip LS, RS
				eld			p, @rp0+s0						; LC
				eadd		ma0, p, a, @rp0+s1				; RC
				eadd		a, ma1, y1, @rp3+s0				; c1(not used but increase offset)
				eld			ma1, a
				jmp			a12
				
				
aug_dm_mtx_proc_0
				eld			x1, @rp0+s0, y0, @rp3+s0		; LS, c0
				emul		x1y0, x1, @rp0+s0, y1, @rp3+s1	; RS, c1(not used)
				emad		ma0, x1y0
				emad		ma1, x0y0
				eadd		ma0, p
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma0
.endif
				eadd		ma1, p, @rp1+d0, ma0			; Lo
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma1
.endif
				eld			@rp1+d0, ma1					; Ro
				erpd		rp0+d0
				dt			r6
				jpf			a13
				bra			end_aug_downmix
				
aug_dm_mtx_proc_1
				eld			y0, @rp3+s0						; c0 
				eld			x1, @rp0+s0, y1, @rp3+s1		; LS, c1
				emul		x1y1, x1, @rp0+s0				; RS
				emad		ma0, x1y1
				emad		ma1, x0y0
				eadd		ma0, p
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma0
.endif
				eadd		ma1, p, @rp1+d0, ma0			; Lo
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma1
.endif
				eld			@rp1+d0, ma1					; Ro
				erpd		rp0+d0
				dt			r6
				jpf			a13
				bra			end_aug_downmix
				
aug_dm_mtx_proc_2
				eld			y0, @rp3+s0						; c0
				eld			x1, @rp0+s0, y1, @rp3+s1		; LS, c1
				emul		x1y1, x1, @rp0+s0				; RS
				erpd		rp0+d1
				emsb		ma0, x1y1, x1, @rp0+s0			; LS
				emsb		ma0, x1y1, x1, @rp0+s0			; RS
				emad		ma1, x1y1
				emad		ma1, x0y0
				eadd		ma0, p
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma0
.endif
				eadd		ma1, p, @rp1+d0, ma0			; Lo
.if( _DOWNMIX_SCALEDOWN == TRUE )
				esra		ma1
.endif
				eld			@rp1+d0, ma1					; Ro
				erpd		rp0+d0
				dt			r6
				jpf			a13
				bra			end_aug_downmix

aug_dm_mtx_proc_3
				; bypass Lo=L, Ro=R
				eld			@rp1+d0, ma0
				eld			@rp1+d0, ma1
				erpn		rp0, #4
				dt			r6
				jpf			a13
				bra			end_aug_downmix

		
end_aug_downmix
				mRETURN		(_DECODE_OK)
				er			psh1
				er			op
				er			opm
				er			xsd
				pop			a14
				ret				

error_aug_downmix:
				ecld		r0, b
				cmp			gt, r0, #MC_MATRIX_MODE_3
				brtd		%f1
				mRETURN		(_ILLEGAL_DOWNMIX_MODE)

				jsr			MC_II_downmix_5ch_to_2ch

%1				er			psh1
				er			op
				er			opm
				er			xsd
				pop			a14
				ret				



/********************************************************************

 Function:		AUG_II_downmix_7ch_to_5ch

 Description:	downmix 7.1-channel to 5.1-channel with 2-ch dowmix
 
 Downmix equations:	in DVD Specification Part 2
       
       aug_mtx proc == 0: 		L = LL + 0.75*LC
                        		C = CC + 0.25*(LC+RC)
                        		R = RR + 0.75*RC
 
       aug_mtx proc == 1:		L = LL + LC
                        		C = CC
                        		R = RR + RC 
 Arguments:		
				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0: 	 5	     1	    -6		 1
				sd3: 	 x	     x	     x		 1

********************************************************************/
AUG_II_downmix_7ch_to_5ch::
				push		a14

				es			psh1
				er			usm
				es			op
				es			opm

				er			xsd
				eld			sd0, #0x51a1
				eld			sd3, #0x0001
				
				eld			rp0, #pcm_ch_buffer
				eld			rp3, #aug_downmix_factor
				eld			y0, @rp3+s0					; 0.75
				eld			y1, @rp3+s0					; 0.25
				
				ld			r6, #SAMPLES_PER_FRAME-1
				
				eld			a, rpd1.aug_mtx_proc				
				ecp			a, #0
				ebra		ec0, downmix_aug_mtx_proc_0
				ecp			a, #1
				ebra		ec0, downmix_aug_mtx_proc_1
				
/** debug **/	bra			cascade_downmix_2ch


; 1. downmix 7-ch to 5-ch
downmix_aug_mtx_proc_0
				eld			ma0, @rp0+s0				; LL
				eld			ma1, @rp0+s0				; RR
				eld			a, @rp0+s0					; CC
				erpn		rp0, #2                     ; skip LS, RS
				eld			x0, @rp0+s0					; LC
				emul		x0y0, x1, @rp0+s1			; RC
				emad		ma0, x1y0
				emad		ma1, x0y1
				eld			@rp0+d0, ma0				; L
				emld		ma0, x1y1
				eadd		ma0, p, @rp0+d0, ma1		; R
				eadd		a, ma0	
				bnzd		r6, downmix_aug_mtx_proc_0
				eld			@rp0+d1, a					; C
				bra			cascade_downmix_2ch

downmix_aug_mtx_proc_1
				eld			ma0, @rp0+s0				; LL
				eld			ma1, @rp0+s0				; RR
				erpn		rp0, #3                     ; skip LS, RS, CC
				eld			p, @rp0+s0					; LC
				eadd		ma0, p, a, @rp0+s1			; RC
				eadd		a, ma1
				eld			@rp0+d0, ma0				; L
				eld			@rp0+d1, a					; R
				bnzd		r6, downmix_aug_mtx_proc_1
				erpd		rp0+d0


; 2. downmix 5-ch to 2-ch
cascade_downmix_2ch
				jsr			MC_II_downmix_5ch_to_2ch
				er			psh1
				er			op
				er			opm
				er			xsd
				pop			a14
				ret				



/********************************************************************

 Function:		MC_II_downmix_bypass

 Description:	No downmix 
 
 Arguments:		
				index registers:
				@bank0
						d1		d0		s1		s0
				---------------------------------------
				sd0: 	 x	     5	     6		 1
				sd1: 	 x	     1	     x		 x

********************************************************************/
.if( 0 )
MC_II_downmix_bypass::
				er			xsd
				eld			sd0, #0x0661
				eld			sd1, #0x0100
				
				eld			rp0, #pcm_ch_buffer
				eld			rp1, #pcm_dm_buffer
				
				ld			r6, #SAMPLES_PER_FRAME-1
								
				eld			a, rpd1.stereo
				ecp			a, #MONO
				ebra		ec0, mono_to_2ch
				
				cmp			eq, r1, #_MPEG1_MONO
				brt			mono_to_2ch
				
; if base is stereo
stereo_LR		eld			a, @rp0+s0			; L
				eld			b, @rp0+s1			; R

				eld			@rp1+d0, a			; copyed Lo
				bnzd		r6, stereo_LR
				eld			@rp1+d0, b			; copyed Ro
				mRETURN		(_DECODE_OK)
				ret

; if base is mono or 1/0 + 1/0
mono_to_2ch
				ldw			a9, @[a10+_pParameter]
				ldb			r2, @[a9+_CH_Content]
				cmp			eq, r2, #1
				brt			%f2

; copy L -> R
%1				eld			a, @rp0+s0			; L
				eld			@rp0+d0, a			; copyed R
				
				eld			@rp1+d0, a			; copyed Lo
				bnzd		r6, %b1
				eld			@rp1+d0, a			; copyed Ro
				mRETURN		(_DECODE_OK)
				ret

; copy R -> L
%2				er			xsd
				eld			sd0, #0x080F
				es			xsd
				eld			sd0, #0x000F
				erpn		rp0, #1

%3				eld			a, @rp0+s0			; R
				eld			@rp0+d0, a			; copyed L
				
				eld			@rp1+d0, a			; copyed Lo
				bnzd		r6, %b3
				eld			@rp1+d0, a			; copyed Ro
				mRETURN		(_DECODE_OK)
				ret
.endif

.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */

.end		

⌨️ 快捷键说明

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