?? mpa_layer2aug.s
字號(hào):
/*
* mpa_layer2aug.s
*
* MPEG/audio multichannel decoder.
* Copyright (C) 2003 Optical Player P/J, Samsung Electronics.
*
*/
.include "mpa.h"
.if( _DECODER_TYPE == MPEG_2_71CH )
.extern MPG_II_decode_sample
.extern MC_II_denormalize_sample
.secFILE_mpa_layer2aug
/********************************************************************
Function: AUG_layer_II_decode
Description:
********************************************************************/
AUG_layer_II_decode::
push a10, a14
ebk #0000b
er xsd
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Decode aug composite status information ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; index registers
; @bank0
; d1 d0 s1 s0
; ---------------------------------------
; sd0: x 1 x x
; sd1: x 1 x x
; sd2: x 1 x x
;
AUG_composite_status_info
esd0 d0, #1
esd1 d0, #1
esd2 d0, #1
eld a, #2
jsr getbits
eld rpd1.aug_mtx_proc, d
ecld r0, d
eld a, #1
jsr getbits
eld rpd1.aug_dyn_cross_on, d
ecld r1, d
eld a, #1
jsr getbits
eld rpd1.aug_future_ext, d
ecld r2, d
aug_transmission_channel_info
eld rp0, #aug_tc_alloc
ld r7, #GRANULES-1
cmp eq, r0, #0
brtd %f0
ld r3, #3
cmp eq, r0, #1
brtd %f0
ld r3, #2
eld d, #0
bnzd r7, $
eld @rp0+d0, d
bra aug_dynamic_crosstalk_info
%0 ecld a, r3
jsr getbits
bnzd r7, %b0
eld @rp0+d0, d
aug_dynamic_crosstalk_info
eld rp1, #aug_dyn_cross_mode
cmp eq, r1, #TRUE
brtd %f1
ld r7, #GRANULES-1
eld d, #0
bnzd r7, $
eld @rp1+d0, d
bra get_aug_crc_value
%1 eld a, #5
jsr getbits
bnzd r7, %b1
eld @rp1+d0, d
get_aug_crc_value
eld a, #CRC_WORD_LENGTH
jsr getbits
eld rpd0.aug_crc_val, d
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Decode aug bit allocations ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; index registers
; @bank0
; d1 d0 s1 s0
; ---------------------------------------
; sd0: x 1 x x
; sd1: x x 0 1
;
AUG_II_decode_bit_alloc
er xsd
eld sd0, #0x0100
eld sd1, #0x0001
eld rp0, #bit_alloc+64+96
eld rp1, #nbal_table
eld a, rpd1.sblimit_mc
ecld r6, a
dec r6
ld r10, r6 ; backup mc_sblimit
cmp eq, r1, #TRUE ; r1 = aug_dyn_cross_on
brt aug_dyn_cross_mode_on
aug_dyn_cross_mode_off
eld a, @rp1+s1 ; nbal_table[sb]
jsr getbits
eld @rp0+d0, d
eld a, @rp1+s0 ; nbal_table[sb]
jsr getbits
bnzd r6, aug_dyn_cross_mode_off
eld @rp0+d0, d
bra AUG_II_decode_scfsi
aug_dyn_cross_mode_on
jsr AUG_II_dyncross_bitalloc
cmp eq, r2, #_DECODE_OK
brf end_of_aug_layer_II_decoding
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Decode scalefactor selection information ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; index registers
; @bank0
; d1 d0 s1 s0
; ---------------------------------------
; sd0: x x x 1
; sd1: x 1 x x
;
AUG_II_decode_scfsi
er xsd
esd0 s0, #1
esd1 d0, #1
eld rp0, #bit_alloc+64+96
eld rp1, #scfsi
inc r10
ld r6, r10 ; mc_sblimit
ld r4, #2 ; aug_channels
mul uu, r6, r4 ; sblimit x nmch
dec r6
ld r7, r6
%0 eld a, @rp0+s0
ecp a, #0
ebrad ec0, %f1
eld d, #4 ; default 4
eld a, #2
jsr getbits
%1 bnzd r6, %b0
eld @rp1+d0, d
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Decode scalefactors ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; index registers
; @bank0
; d1 d0 s1 s0
; ---------------------------------------
; sd0: x x x 1
; sd1: x x x 1
; sd2: x 1 x x
;
AUG_II_decode_scalefactor
er xsd
esd0 s0, #1
esd1 s0, #1
esd2 d0, #1
eld rp0, #bit_alloc+64+96
eld rp1, #scfsi
eld rp2, #scale_index+(NCH+NMCH)*PARTS*SBLIMIT
decode_aug_scalefactor
eld a, @rp0+s0 ; bit_alloc[sb][ch]
ecp a, #0
ebra ec0, aug_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, aug_scale_one
ecld r5, b
ecp b, #0
ebra ec0, aug_scale_all
brad aug_scale_1_3
ecld r4, d
aug_scale_one brad %f1
eld @rp2+d0, d
aug_scale_all eld a, #6
jsr getbits
eld @rp2+d0, d
aug_scale_1_3
aug_scale_1_2 eld a, #6
jsr getbits
sr r5
brf %f1
sr r5
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 r7, decode_aug_scalefactor
eld @rp2+d0, d ; scale_index[sb][ch][2]
bra mc_aug_error_check
aug_default_scalefactor
eld d, #63
erps rp1+s0
eld @rp2+d0, d
brad %b1
eld @rp2+d0, d
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Aug CRC check ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; mandatory CRC check
mc_aug_error_check
eld a, rpd1.mandatory_crc_check
ecp a, #TRUE
ebra ec1, AUG_II_decode_subband_sample
jsr AUG_error_check
eld a, rpd0.aug_crc_val
ecp a, c
ebra ec0, AUG_II_decode_subband_sample
.ifdef _DEBUG_
/** debug **/ bra $
.endif
eld b, rpd1.error_count
eadd b, #1
eld rpd1.error_count, b
brad end_of_aug_layer_II_decoding
mRETURN (_AUG_CRC_ERROR)
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Decode aug samples ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; fraction buffer structure
; gr0 ch5 0x21e0 :<--- 96 --->:
; ch6 0x2240 :<--- 96 --->:
;
; index registers
; @bank0
; d1 d0 s1 s0
; ---------------------------------------
; sd0: +32 1 -96 -95
; sd1: x x x 1
; sd2: x x 0 x
;
; @bank1 (aug_dyn_cross_on == 1)
; d1 d0 s1 s0
; ---------------------------------------
; sd0: x x x 20
; sd1: x x x x
; sd2: x x x 1
; sd3: -96 x 32 17
;
AUG_II_decode_subband_sample
es psh1
es usm
es op
es opm
ebk #1111b
er xsd
eld sd0, #0x0004
eld sd3, #0x0001
es xsd
eld sd0, #0x0001
eld sd3, #0xa021
eld sd1, #0x0000
eld sd2, #0x0001
ebk #0000b
er xsd
eld sd0, #0x0101
es xsd
eld sd0, #0x20aa
eld sd1, #0x0001
eld sd2, #0x0000
eld a, rpd1.aug_dyn_cross_on
ecld r1, a
ld r9, r1
eld a, rpd1.dyn_cross_LR
ecld r1, a
ld r12, r1
eld a, rpd1.alloc_tbl_ptr ; allocation table pointer
eld rp0, #fraction+96*(STEREO+NMCH)
eld b, rpd1.sblimit_mc
eld rpd1, a
ecld r6, b
ld r10, r6
ld r13, #2 ; r13 => aug channels
ld r11, #7 ; r11 => total channels
dec r11
ld r0, #0x80 ; high word of -1.0
ld r8, #0 ; granule count
eld mc1, #aug_dyn_cross_mode
aug_gr_loop_start
eld rp1, #bit_alloc+64+96
eld rp2, rpd1
ebk #0110b
eld rp1, #aug_tc_table
eld rp2, #sbgr_table
ebk #0000b
ld r6, #0 ; subband count
ld r7, #5 ; start channel
aug_sb_loop_start
; search the valid transmission channel
ebk #1111b
eld b, @rp2+s0 ; the number of sbgr.
eld rp3, mc1 ; aug_dyn_cross_mode
erpn rp3, b
eld c, @rp3 ; aug_dyn_cross_mode[sbgr]
eld rp0, rp1
erpn rp0, c
ebk #0000b
aug_ch_loop_start
eld a, @rp1+s0 ; bit_alloc[sb][ch]
ecp a, #0
ebra ec0, aug_ch_not_transmitted
cmp eq, r9, #TRUE ; if (aug_dyn_cross_on == 1)
brf aug_decode_sample
aug_dyn_mode_transmitted_ch
ebk #0001b
eld d, @rp0+s0 ; aug_tc_table[aug_dyn_cross_mode[sbgr]]
ecp d, #7
ebra ec1, aug_channel_copied
ebk #0000b
aug_decode_sample
bsrd MPG_II_decode_sample
eld mc0, rp2
eld rp2, mc0
aug_ch_loop_check
cmp eq, r7, r11
brfd aug_ch_loop_start
inc r7
aug_sb_loop_check
inc r6 ; sb increase
erpn rp2, #16
erps rp0+s0
erps rp0+s1
%1 cmp ge, r6, r10
brfd aug_sb_loop_start
ld r7, #5 ; start channel
aug_rest_subband_sample
; remain subband samples are zero in each granule
ld r2, r10 ; mc_sblimit
ld r3, r13 ; aug_channel
ecld a, r2
ld r6, #SBLIMIT-1
sub r6, r10
ld r2, r6
ld r7, #PARTS
mul uu, r7, r3
dec r7
eld d, #0
%2 bnzd r6, $
eld @rp0+d0, d
erpn rp0, a
bnzd r7, %b2
ld r6, r2
aug_gr_loop_check
ld r2, #MAX_CHANNEL
sub r2, r13
ld r1, #PARTS*SBLIMIT
mul uu, r2, r1
sub r2, r10
ecld a, r2
erpn rp0, a
cmp eq, r8, #GRANULES-1
brfd aug_gr_loop_start
inc r8
eld rpd1, #layer_info
bra aug_denormalize_sample
aug_ch_not_transmitted
eld d, #0
eld @rp0+d1, d
eld @rp0+d1, d
eld @rp0+d1, d
ebk #0001b
erps rp0+s0
brad aug_ch_loop_check
ebk #0000b
aug_channel_copied
ebk #1000b
eld rp3, rp0
ecp d, #1
ebra ec2, aug_copy_from_T01
ecp d, #2
ebra ec0, aug_copy_from_T2
ecp d, #3
ebra ec0, aug_copy_from_T3
ecp d, #4
ebra ec0, aug_copy_from_T4
ecp d, #5
ebra ec0, aug_copy_from_T5
.ifdef _DEBUG_
/** debug **/ bra $
.endif
aug_copy_from_T0
ld r1, r7
sub r7, #1
bnzd r7, $
erpd rp3+d1
brad aug_copy_sample
ld r7, r1
aug_copy_from_T1
ld r1, r7
sub r7, #2
bnzd r7, $
erpd rp3+d1
brad aug_copy_sample
ld r7, r1
aug_copy_from_T2
ld r1, r7
sub r7, #3
bnzd r7, $
erpd rp3+d1
brad aug_copy_sample
ld r7, r1
aug_copy_from_T3
ld r1, r7
sub r7, #4
bnzd r7, $
erpd rp3+d1
brad aug_copy_sample
ld r7, r1
aug_copy_from_T4
ld r1, r7
sub r7, #5
bnzd r7, $
erpd rp3+d1
brad aug_copy_sample
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -