?? mpa_downmix.s
字號(hào):
/*
* 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
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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -