📄 mpa_layer2.s
字号:
/*
* mpa_layer2.s
*
* MPEG/audio multichannel decoder.
* Copyright (C) 2003 Optical Player P/J, Samsung Electronics.
*
*/
.include "mpa.h"
.include "mpa_reg.h"
.secFILE_mpa_layer2
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:::::::::::::::::::::::[ Layer II stuff ]:::::::::::::::::::::::::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
MPG_layer_II_decode::
push a10, a14
eld a, #3
eld rpd1.layer_I_frames, a
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Decode bit allocations & ::;
;:: scalefactor selection information ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; index registers
; @bank0
; d1 d0 s1 s0
; ---------------------------------------
; sd0: x x 0 1
; sd1: x 1 x x
;
er xsd
ebk #0000b
eld sd0, #0x0001
eld sd1, #0x0100
eld rp0, #nbal_table
eld rp1, #bit_alloc ; L,R,L,R,L,R ...
eld a, rpd1.tbl_num ; select nbal table
ecp a, #1 ; table number 0/1 or 2/3
ebra ec2, 4
erpn rp0, #9 ; alloc_tbl 2,3 start offset
II_decode_bitalloc
eld a, rpd1.jsbound
eld b, rpd1.stereo
ecld r6, a
ecld r7, b
dec r6 ; bound
dec r7 ; nch
ld r1, r7
%0 eld a, @rp0+s1
jsr getbits
bnzd r7, %b0
eld @rp1+d0, d
erps rp0+s0
bnzd r6, %b0
ld r7, r1
eld a, rpd1.jsbound
eld b, rpd1.sblimit
ecld r2, a ; jsbound
ecld r3, b ; sblimit
%1 cmp ge, r2, r3
brt II_decode_scfsi
eld a, @rp0+s0
jsr getbits
eld @rp1+d0, d
eld @rp1+d0, d
brad %b1
inc r2
II_decode_scfsi
eld rp0, #bit_alloc
eld rp1, #scfsi
inc r1
mul uu, r3, r1 ; sblimit x nch
dec r3
ld r6, r3
%2 eld a, @rp0+s0
ecp a, #0
ebrad ec0, %f3
eld d, #4 ; default 4
eld a, #2
jsr getbits
%3 bnzd r6, %b2
eld @rp1+d0, d
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: CRC check ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
II_check_CRC_word
eld a, rpd0.protection_bit
ecp a, #ERROR_PROTECT_NONE
ebra ec0, II_decode_scalefactor
jsr MPG_II_CRC_calc
eld a, rpd0.crc_val
ecp a, c
ebra ec0, II_decode_scalefactor
.ifdef _DEBUG_
/** debug **/ bra $
.endif
eld b, rpd1.error_count
eadd b, #1
eld rpd1.error_count, b
jsr recover_CRC_error
brad end_of_layer_II_decoding
mRETURN (_BASE_CRC_ERROR)
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Decode scalefactors ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; index registers @bank0
;
; d1 d0 s1 s0
; ---------------------------------------
; sd0: x x x 1
; sd1: x x x 1
; sd2: x 1 x x
;
II_decode_scalefactor
er xsd
ebk #0000b
eld sd0, #0x0001
eld sd1, #0x0001
eld sd2, #0x0100
eld rp0, #bit_alloc
eld rp1, #scfsi
eld rp2, #scale_index
ld r6, r3
decode_scalefactor
eld a, @rp0+s0 ; bit_alloc[sb][ch]
ecp a, #0
ebra ec0, default_scalefactor
eld a, #6
jsr getbits
eld @rp2+d0, d ; scale_index[sb][ch][0]
eld b, @rp1+s0 ; scfsi[sb][ch]
ecp b, #2
ebrad ec0, scale_one
ecld r3, b
ecp b, #0
ebra ec0, scale_all
brad scale_1_3
ecld r4, d
scale_one brad %f1
eld @rp2+d0, d
scale_all eld a, #6
jsr getbits
eld @rp2+d0, d
scale_1_3
scale_1_2 eld a, #6
jsr getbits
sr r3
brf %f1
sr r3
brf %f0
brad %f1
eld @rp2+d0, d ; scale_index[sb][ch][1] = scale_index[sb][ch][2]
%0 ecld c, r4 ; scale_index[sb][ch][1] = scale_index[sb][ch][0]
eld @rp2+d0, c
%1 bnzd r6, decode_scalefactor
eld @rp2+d0, d ; scale_index[sb][ch][2]
bra II_decode_subband_sample
default_scalefactor
erps rp1+s0
eld d, #SCALE_RANGE-1
eld @rp2+d0, d
brad %b1
eld @rp2+d0, d
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Decode samples ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; fraction buffer structure
; gr0 ch0 0x2000 :<--- 96 --->:
; ch1 0x2060 :<--- 96 --->:
;
; index registers
; @bank0
; d1 d0 s1 s0
; ---------------------------------------
; sd0: +32 1 -96 -95
; sd1: x x x 1
; sd2: x x 0 x
;
; @bank1 (dequantize process)
; d1 d0 s1 s0
; ---------------------------------------
; sd3: x x 0 17
;
II_decode_subband_sample
es psh1
es usm
es op
es opm
ebk #1000b
er xsd
eld sd3, #0x0001
es xsd
eld sd3, #0x0001
ebk #0000b
er xsd
eld sd0, #0x0101
es xsd
eld sd0, #0x20aa
eld sd1, #0x0001
eld sd2, #0x0000
eld a, rpd1.jsbound
eld b, rpd1.stereo
eld c, rpd1.sblimit
ecld r6, a
ecld r7, b
ecld r4, c
ld r10, r6
ld r11, r7
ld r5, r7
dec r5
ld r8, #0 ; granule count
ld r0, #0x80 ; high word of -1.0
eld a, rpd1.alloc_tbl_ptr ; allocation table pointer
eld rpd1, a
eld rp0, #fraction
gr_loop_start
eld rp1, #bit_alloc
eld rp2, rpd1 ; allocation_table# ptr
ld r6, #0 ; jsbound
ld r7, #0 ; nch
ld a13, #ch_loop_check
sb_loop_start
ch_loop_start
eld a, @rp1+s0 ; bit_alloc[sb][ch]
ecp a, #0
ebra ec0, sample_not_transfered
bsrd MPG_II_decode_sample
eld mc0, rp2
eld rp2, mc0
ch_loop_check
inc r7
cmp ge, r7, r11
brf ch_loop_start
erpn rp2, #16
erps rp0+s0
tst r5, r5 ; if T=1, mono
brt 2
erps rp0+s1
sb_loop_check
inc r6
cmp ge, r6, r10
brfd sb_loop_start
ld r7, #0
; if joint stereo mode
cmp ge, r10, r4 ; if (sblimit > jsbound)
brt rest_subband_sample
ld r9, r10
ld a13, #js_sample_none
esd0 s1, #0x2
esd1 s0, #2
eld a, @rp1+s0 ; bit_alloc[sb][ch]
js_loop_start
ecp a, #0
ebra ec0, sample_not_transfered
bsrd MPG_II_decode_sample
eld mc0, rp2
eld rp2, mc0
erpn rp0, #-96
eld a, @rp0+s1
eld b, @rp0+s1
eld c, @rp0+s1
eld @rp0+d1, a
eld @rp0+d1, b
brad js_loop_check
eld @rp0+d1, c
js_sample_none
eld @rp0+d1, a
eld @rp0+d1, a
eld @rp0+d1, a
js_loop_check
erpn rp2, #16
erpn rp0, #-(0xc0-1)
inc r10
cmp ge, r10, r4
brfd js_loop_start
eld a, @rp1+s0 ; bit_alloc[sb][ch]
esd0 s1, #0xa
esd1 s0, #1
brad rest_subband_sample
ld r10, r9
sample_not_transfered
eld @rp0+d1, a
eld @rp0+d1, a
eld @rp0+d1, a
jmp a13
rest_subband_sample
; remain subband samples are zero
ld r1, r11 ; stereo
ld r2, r4 ; sblimit
ecld a, r2
ld r6, #SBLIMIT-1
sub r6, r2
ld r2, r6
ld r7, #PARTS
mul uu, r7, r1
dec r7
eld d, #0
%0 bnzd r6, $
eld @rp0+d0, d
erpn rp0, a
bnzd r7, %b0
ld r6, r2
gr_loop_check
ld r2, #MAX_CHANNEL
sub r2, r11
ld r1, #PARTS*SBLIMIT
mul uu, r2, r1
sub r2, r4
ecld a, r2
erpn rp0, a
cmp eq, r8, #GRANULES-1
brfd gr_loop_start
inc r8
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Denormalize samples ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; multiply scalefactors
denormalize_sample
eld rpd1, #layer_info
eld a, rpd1.mpeg_version
ecp a, #_MPEG_1_AUDIO
ebrad ec1, end_of_layer_II_decoding
mRETURN (_DECODE_OK)
jsr MPG_II_denormalize_sample
mRETURN (_DECODE_OK)
end_of_layer_II_decoding
er xsd
er psh1
er usm
er op
er opm
pop a14, a10
ret
/********************************************************************
END of MPG_layer_II_decode
********************************************************************/
/************ Subroutines of MPG_layer_II_decode part **************/
/********************************************************************
Function: MPG_II_decode_sample
Description: Decode subband sample code from bit stream and
degouping. When bit allocation is 3, 5 and 9, grouped
sample. Lookup table at code memory by "ldc" must be
under 64KB boundary.
1. Decode sample
-. Grouped sample: Used table method.
for (i=0; i<3; i++) {
s[i] = c % nlevels
c = c / nlevels
}
-. Ungrouped sample:
for (i=0; i<3; i++) {
s[i] = getbits(bits)
}
2. Dequantize sample
Restore the compressed sample to a factional number.
first complement the MSB of the sample
for Layer II :
Use the formula s" = C * (s"' + D)
where C and D at Table B.4 Layer II classes of
quantization.
Arguments: rp0 sample buffer (fraction) pointer.
rp2 allocation table pointer of current sb.
a bit_alloc[sb][ch]
index registers:
@bank0
d1 d0 s1 s0
---------------------------------------
sd0: 32 x x x
sd2: x x 0 x
@bank1
d1 d0 s1 s0
---------------------------------------
sd3: x x 0 17
********************************************************************/
MPG_II_decode_sample::
push a14
erpn rp2, a
eld c, @rp2 ; index 0 ... 16
eld rp2, #bits_table
erpn rp2, c
ecld r2, c ; if mode 1, enable
eld b, @rp2+s1 ; bits
eld rp2, #II_MSB_position
erpn rp2, c
eld a, b
; jsr getbits
GETBITS
cmp gt, r2, #1
brf grouped_sample
cmp eq, r2, #3
brt grouped_sample
ungrouped_sample
ecld r1, d
eld a, b
; jsr getbits
GETBITS
ecld r2, d
eld a, b
; jsr getbits
GETBITS
ecld r3, d
ebk #1000b
eld c, sr
ecld b, r1
mDEQUANT_SAMPLE
ecld b, r2
mDEQUANT_SAMPLE
ecld b, r3
mDEQUANT_SAMPLE
eld sr, c
ebk #0000b
pop a14
ret
grouped_sample ; bit allocation is 3, 5, 9 (index 0,1,3)
ebk #1000b
eld b, d
eld d, sr
eld rp3, #separate_codes ; separate_code table
erpn rp3, c
eld a, @rp3+s1
eld rp3, a
esra b
erpn rp3, b ; nlevels value
etst nc, ec3
brad ec3, %f1
eld sr, @rp3+s1 ; code
eld a, #12 ; lower code
esft sr, a
%1 eld b, #4
esft sr, b
eld si, sr
eld b, sg
mDEQUANT_SAMPLE
eld b, #4
esft si, b
eld si, sr
eld b, sg
mDEQUANT_SAMPLE
eld b, #4
esft si, b
eld si, sr
eld b, sg
mDEQUANT_SAMPLE
eld sr, d
ebk #0000b
pop a14
ret
/********************************************************************
Function: MPG_II_denormalize_sample
Description: Denormalize sample.
The requantized values have to be rescaled.
The multiplication factors in Table B.1 "Layer I,II
scalefactors", ISO/IEC 11172-3: 1993
Next the dequantized values have to be rescaled
s' = scalefactor * s"
where s' is denormalized sample, s" is dequantized
sample value.
Arguments: - rp0 fraction buffer pointer.
- rp1 scale_index buffer pointer.
- rp3 scalefactor table pointer
NOTE!
x0 (fraction -1 ~ 1, 1.23 integer format) is signed and
y1 (scalefactor 0 ~ 1, 0.24 integer format) is unsigned number.
xsd, psh1, usm flags must be set to 1.
index registers:
@bank1
d1 d0 s1 s0
---------------------------------------
sd0: x 32 -64 32
sd1: x x x 3
sd3: x x x 0
********************************************************************/
MPG_II_denormalize_sample::
es psh1
er usm
es opm
ebk #1011b
er xsd
eld sd0, #0x0000
eld sd3, #0x0000
es xsd
eld sd0, #0x02c2
eld sd3, #0x0000
eld sd1, #0x0003
eld a, rpd1.sblimit
eld b, rpd1.stereo
ecld r6, a ; sblimit
ecld r7, b ; channels
dec r6
dec r7
ld r2, r6
ld r3, r7
ld r8, #0
eld rp0, #fraction
eld c, #scalefactor
eld d, #MAX_CHANNEL*PARTS*SBLIMIT
esub d, a
eld b, #-(PARTS*SBLIMIT*STEREO-1)
cmp eq, r3, #STEREO-1
brt denorm_gr_loop_start
eld b, #-(PARTS*SBLIMIT*MONO-1)
denorm_gr_loop_start
ld r1, r8 ; No. granule
sr r1
sr r1
ecld a, r1
eld rp1, #scale_index
erpn rp1, a
denorm_sb_loop_start
denorm_ch_loop_start
eld rp3, c
eld a, @rp1+s0 ; scale_index[sb][ch][part]
erpn rp3, a
eld x0, @rp0+s0, y1, @rp3
emul x0y1, x0, @rp0+s0
emld ma0, x0y1, x0, @rp0+s1
emld ma1, x0y1
; esla ma0
; esla ma1
eld @rp0+d0, ma0
eld ma0, p, @rp0+d0, ma1
; esla ma0
bnzd r7, denorm_ch_loop_start
eld @rp0+d0, ma0
erpn rp0, b
bnzd r6, denorm_sb_loop_start
ld r7, r3
denorm_gr_loop_check
erpn rp0, d
inc r8
cmp eq, r8, #GRANULES
brfd denorm_gr_loop_start
ld r6, r2
ebk #0000b
ret
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -