?? mpa_frame.s
字號:
/*
* mpa_frame.s
*
* MPEG/audio multichannel decoder.
* Copyright (C) 2003 Optical Player P/J, Samsung Electronics.
*
*/
.defvar _MPA_MEMALLOC
.include "mpa.h"
.include "mpa_table.h"
.extern MPG_II_denormalize_sample
.extern MC_II_denormalize_sample
/* Section definition: MPEG Audio Decoder Main */
.secFILE_mpa_frame
/********************************************************************
Function: _MPADecoder
Description: MPEG/audio layer I, II multichannel decoder
main procedure.
Prototype: int MPADecoder(MainCodecShared_t *)
********************************************************************/
/* S5H5002 DVD Player function name */
_MPADecoder::
push a14
jsr __pushRegs
; Check first time initialization
ldb r0, @[a10+_CodecStartFlag]
cmp eq, r0, #TRUE
jpf initialize_mpeg_audio
START_DECODE: ; start MPEG audio multichannel decoding
.if( _CACHE_SIMULATION == TRUE )
jsr __cache_simul_on
.endif
esec0 #ECP_Z
esec1 #ECP_nZ
esec2 #ECP_LE
eld c, #0 ; zero register
es xsd ; default ext index register
ebk #1001b
eld sd0, c
eld sd3, c
ebk #0000b
eld sd0, c
eld sd3, c
er xsd
ebk #1111b
eld sd0, c
eld sd1, c
eld sd2, c
eld sd3, c
ebk #0000b
eld sd0, c
eld sd1, c
eld sd2, c
eld sd3, c
er psh1
er usm
er op
er opm
er xsd
; configuration of SBF0, SBF1 read/write mode
; SBF0: r, MAC[23:8] <= EMEM[15:0], MAC[7:0] <= 0
; SBF1: w, MAC[23:8] => EMEM[15:0]
ld a8, #SFR_BASE /* sbl0off or sbl1off */
ld a9, #0
ldw r0, @[a8+rCONFIG0]
and r0, #0x00ff
or r0, #0x6600
ldw @[a8+rCONFIG0], r0
ldw @[a8+rSBL0OFF], a9
; global variable pointer
eld rpd0, #header_info
eld rpd1, #layer_info
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: MPEG-1 Layer I, II decoding ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; 3.8mips
__decoding_I_II_base_channel__
.if( _DEBUG_BITS == TRUE )
ld a11, #_bit_pos
ld r0, #0
ldw @[a11], r0
.endif
; search sync word and header parsing
jsr MPG_seek_sync_base ; return R2
cmp eq, r2, #_DECODE_OK
brf error___MpegAudioDecode
; header parsing
jsr MPG_parse_base_header
; check main audio data is present or not
eld a, rpd1.frame_size
ecld r0, a
cmp gt, r0, #BASE_HEADER_SIZE
brfd error___MpegAudioDecode
mRETURN (_NO_MAIN_AUDIO_DATA)
; check protection and get CRC value if protection enable
eld a, rpd0.protection_bit
ecp a, #ERROR_PROTECT_NONE
ebrad ec0, crc_none
eld d, #-1
eld a, #CRC_WORD_LENGTH
jsr getbits
crc_none eld rpd0.crc_val, d
; do decode mpeg-1 stream
eld a, rpd0.layer
ecp a, #LAYER_I
ebra ec0, do_decode_layer_I
ecp a, #LAYER_II
ebra ec0, do_decode_layer_II
brad error___MpegAudioDecode
mRETURN (_ILLEGAL_LAYER)
do_decode_layer_I
jsr MPG_layer_I_decode
.ifdef _DEBUG_
;/** debug **/ jsr print_fraction
.endif
bra decode_done
do_decode_layer_II
jsr MPG_layer_II_decode
.ifdef _DEBUG_
;/** debug **/ jsr print_fraction
.endif
decode_done cmp eq, r2, #_DECODE_OK
brf error___MpegAudioDecode
; detect for start position of MPEG-1 ancillary data field
eld a, rpd0.layer
eld b, rpd1.mpeg_version
ecp a, #LAYER_I
ebra ec1, check_offset
ecp b, #_MPEG_1_AUDIO
ebra ec1, __decoding_II_mc_channel__
check_offset ld a8, #SFR_BASE
ldw r1, @[a8+rSBL0OFF+0]
ldw r0, @[a8+rSBL0OFF+2]
; ld r3, #^(BS_MAIN-SB0_BASE)
; ld r2, #>(BS_MAIN-SB0_BASE)
ld a11, #_buffer_ptr
ldw r3, @[a11+_BS_MAIN+0]
ldw r2, @[a11+_BS_MAIN+2]
sub r2, #>SB0_BASE
sbc r3, #^SB0_BASE
sub r0, r2
sbc r1, r3
cmp eq, r1, #0
brfd error___MpegAudioDecode
mRETURN (_STREAM_IS_BROKEN)
ecld a, r0
efz8 a
eld rpd1.base_last_pos, a
eld b, rpd1.frame_size
eld c, b
esra c
etst c, t
eincct b
ecld r1, b
compare_offset cmp gt, r0, r1
brtd error___MpegAudioDecode
mRETURN (_STREAM_IS_BROKEN)
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: MPEG-2 Multichannel decoding ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; routine for MPEG-2 multichannel part
; parsing mc header and search extension sync word
; 7.7mips
__decoding_II_mc_channel__
.if( _DECODER_TYPE != MPEG_1_AUDIO )
.if( _DEBUG_BITS == TRUE )
ld a11, #_bit_pos
ld r0, #0
ldw @[a11], r0
.endif
eld a, rpd1.mpeg_version
ecld r0, a
cmp eq, r0, #_MPEG_1_AUDIO
brt __synthesis_subband__
eld b, rpd0.layer
ecld r0, b
cmp eq, r0, #LAYER_I
brt decode_multichannel
; MC header parsing
jsr MC_parse_mc_header
; Default decoder is MPEG 2 decoder, following codes are
; detecting MPEG 1 stream.
ld a8, #SFR_BASE
ldw r1, @[a8+rSBL0OFF+0]
ldw r0, @[a8+rSBL0OFF+2]
; ld r3, #^(BS_MAIN-SB0_BASE)
; ld r2, #>(BS_MAIN-SB0_BASE)
ld a11, #_buffer_ptr
ldw r3, @[a11+_BS_MAIN+0]
ldw r2, @[a11+_BS_MAIN+2]
sub r2, #>SB0_BASE
sbc r3, #^SB0_BASE
sub r0, r2
sbc r1, r3
cmp eq, r1, #0
brfd error___MpegAudioDecode
mRETURN (_STREAM_IS_BROKEN)
ecld a, r0
efz8 a
eld rpd1.base_last_pos, a
eld b, rpd1.frame_size
ecld r1, b
cmp gt, r0, r1
brt mc_error
eld a, rpd1.mc_channel
ecp a, #0
ebra ec1, prepare_ext_stream
mc_error eld a, #_MPEG_1_AUDIO
eld rpd1.mpeg_version, a
eld b, #_MPEG1_STEREO
eld rpd1.channel_config, b
jsr MPG_II_denormalize_sample
bra __synthesis_subband__
prepare_ext_stream
eld a, rpd0.ext_stream_present
ecp a, #TRUE
ebra ec1, decode_multichannel
; move remained main frame data to mc buffer and
; remove MPEG1 ancillary data field
ld a8, #SFR_BASE
ld r0, #SB0_FLUSH
ldw @[a8+rSBFCON], r0
; ld a11, #BS_MAIN
; ld a12, #BS_MULTICHANNEL
ld a12, #_buffer_ptr
ldw a11, @[a12+_BS_MAIN]
ldw a12, @[a12+_BS_MULTICHANNEL]
eld a, rpd1.frame_size
eld b, rpd1.base_last_pos
eld c, rpd0.n_ad_bytes
esub a, b
esub a, c
ecld r6, a
cmp gt, r6, #0
/* debug */ brfd search_ext_syncword
eld rpd1.mc_bs_size, a
dec r6
ecld r1, b
add a11, r1
copy_mpeg1 ldb r0, @[a11]
add a11, #1
ldb @[a12], r0
bnzd r6, copy_mpeg1
add a12, #1
; search extension frame header
search_ext_syncword
jsr EXT_seek_sync_ext
cmp eq, r2, #_DECODE_OK
brf error___MpegAudioDecode
decode_multichannel
eld a, #CRC_WORD_LENGTH
jsr getbits
eld rpd0.mc_crc_val, d
jsr MC_layer_II_decode
.ifdef _DEBUG_
;/** debug **/ jsr print_fraction
.endif
cmp eq, r2, #_DECODE_OK
brf error___MpegAudioDecode
check_offset_mc ld a8, #SFR_BASE
ldw r1, @[a8+rSBL0OFF+0]
ldw r0, @[a8+rSBL0OFF+2]
; ld r3, #^(BS_MULTICHANNEL-SB0_BASE)
; ld r2, #>(BS_MULTICHANNEL-SB0_BASE)
ld a9, #_buffer_ptr
ldw r3, @[a9+_BS_MULTICHANNEL+0]
ldw r2, @[a9+_BS_MULTICHANNEL+2]
sub r2, #>SB0_BASE
sbc r3, #^SB0_BASE
sub r0, r2
sbc r1, r3
ecld a, r0
efz8 a
eld rpd1.mc_last_pos, a
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: MPEG-2 LFE Dequantization ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
eld a, rpd0.lfe
ecp a, #TRUE
ebra ec1, __decoding_II_aug_channel__
jsr MC_II_lfe_dequantize
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: MPEG-2 Augmentation part decoding ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; 4.35mips
__decoding_II_aug_channel__
.if( _DECODER_TYPE == MPEG_2_71CH )
eld rpd1, #layer_info
eld a, rpd1.mpeg_version
eld b, #0
ecp a, #_MPEG_1_AUDIO
ebrad ec0, __synthesis_subband__
eld rpd1.aug_channel, b
ecp a, #_MPEG_2_AUG_AUDIO
ebra ec1, __mc_dematrixing__
eld a, rpd1.stereo
ecp a, #STEREO
ebra ec1, aug_error
eld b, rpd0.surround
ecp b, #STEREO_SURROUND
ebra ec1, aug_error
eld c, rpd0.center
ecp c, #CENTER_NONE
ebra ec1, chk_mc_offset
aug_error eld a, #_MPEG_2_AUDIO ; mpeg default decoder
eld rpd1.mpeg_version, a
eld b, #_MPEG2_5CH
eld rpd1.channel_config, b
jsr MC_II_denormalize_sample
bra __mc_dematrixing__
chk_mc_offset eld a, rpd1.mc_last_pos
eld b, rpd1.mc_bs_size
eld c, b
esra c
etst c, t
eincct b
ecld r0, a
ecld r1, b
cmpu ge, r0, r1
brt correct_aug_stream
decode_aug_part eld a, #2
eld rpd1.aug_channel, a
jsr AUG_layer_II_decode
.ifdef _DEBUG_
;/** debug **/ jsr print_fraction
.endif
cmp eq, r2, #_DECODE_OK
brt __mc_dematrixing__
bra error___MpegAudioDecode
correct_aug_stream
eld a, #_MPEG_2_AUDIO ; mpeg default decoder
eld rpd1.mpeg_version, a
eld b, #_MPEG2_5CH
eld rpd1.channel_config, b
jsr MC_II_denormalize_sample
bra __mc_dematrixing__
.endif /* .if( _DECODER_TYPE == MPEG_2_71CH ) */
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: MC prediction coding mode ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
prediction_buffering
; mc prediction mode is not supported.
; eld a, rpd1.mc_prediction_on
; ecp a, #TRUE
; ebra ec1, __mc_dematrixing__
; jsr MC_II_prediction
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Multichannel dematrix and denormalization ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; 3.86mips
__mc_dematrixing__
.if( _DECODER_TYPE != MPEG_1_AUDIO )
jsr MC_II_dematricing
.ifdef _DEBUG_
;/** debug **/ jsr print_fraction
.endif
eld a, rpd1.mpeg_version
ecp a, #_MPEG_2_AUG_AUDIO
ebra ec0, __aug_dematrixing__
jsr MC_II_denormalizing
.ifdef _DEBUG_
;/** debug **/ jsr print_fraction
.endif
bra __synthesis_subband__
__aug_dematrixing__
.if( _DECODER_TYPE == MPEG_2_71CH )
jsr MC_AUG_dematricing
.ifdef _DEBUG_
;/** debug **/ jsr print_fraction
.endif
jsr MC_AUG_denormalizing
.ifdef _DEBUG_
;/** debug **/ jsr print_fraction
.endif
.endif /* .if( _DECODER_TYPE == MPEG_2_71CH ) */
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
;:: ::;
;:: Subband synthesis processing ::;
;:: ::;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;
; index registers:
; @bank0
; d1 d0 s1 s0
; ---------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -