?? mpa_common.s
字號:
/*
* mpa_common.s
*
* MPEG/audio multichannel decoder.
* Copyright (C) 2003 Optical Player P/J, Samsung Electronics.
*
*/
.include "mpa.h"
.secFILE_mpa_common
/********************************************************************
calculate slots and frame size
slots: layer I - bitrate * 12 / sampling_freq
layer II - bitrate * 144 / sampling_freq
frame size: layer I - (slots + pad_slot) * 4
layer II - slots + pad_slot
********************************************************************/
slots_table_I:
/* Layer I */
dw 0, 8, 17, 26, 34, 43, 52, 60, 69, 78, 87, 95, 104, 113, 121, -1
dw 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, -1
dw 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 168, -1
slots_table_II:
/* Layer II */
dw 0, 104, 156, 182, 208, 261, 313, 365, 417, 522, 626, 731, 835, 1044, 1253, -1
dw 0, 96, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960, 1152, -1
dw 0, 144, 216, 252, 288, 360, 432, 504, 576, 720, 864, 1008, 1152, 1440, 1728, -1
/********************************************************************
sampling frequency table scaled /100
********************************************************************/
samplerate_table:
dw 441, 480, 320
/********************************************************************
bitrate table - bitrate / 100
********************************************************************/
L1_bitrate_table:
dw 0, 320, 640, 960, 1280, 1600, 1920, 2240
dw 2560, 2880, 3200, 3520, 3840, 4160, 4480
L2_bitrate_table:
dw 0, 320, 480, 560, 640, 800, 960, 1120
dw 1280, 1600, 1920, 2240, 2560, 3200, 3840
/********************************************************************
Multi-channel configuration set table.
index AAB (3 bits)
AA - surround mode
B - center channel present
mc configuration table
1'st nibble: mc_channel
2'nd nibble: tc_alloc_bits
3'rd nibble: dyn_cross_bits
4'th nibble: not used
********************************************************************/
mc_config_table:
dw 0x0000, 0x1210, 0x1210, 0x2330
dw 0x2230, 0x3340, 0x2000, 0x3210
/********************************************************************
Function: getbits
Description: get bits from bit buffer (16-bit bit buffer).
NOTE: - Check S0 of SD3 is zero
- SR, SA is global register
- RP3 @bank0 is bit stream buffer (SBF0 16-bit read mode)
Example: bsrd getbits ; return d
eld a, #{bits}
********************************************************************/
mDEBUG_BITS .macro
push a8
push r0, r1
ecld r1, a
ld a8, #_bit_pos
ldw r0, @[a8]
add r0, r1
ldw @[a8], r0
pop r1, r0
pop a8
.endm
getbits::
.if( _DEBUG_BITS == TRUE )
mDEBUG_BITS
.endif
esft sr, a
esub a, sa
ecp a, #0
ebrad ec2, %f0
eld d, sg
eld sr, @rp3 ; no delay in SB
esft sr, a
eadd d, sg
esub a, #BITS_PER_WORD ; 16
%0 eneg a
retd
eld sa, a
/********************************************************************
Function: MPG_seek_sync_base
Description:
- seek syncword of base bit stream.
- decode header information of base stream.
********************************************************************/
MPG_seek_sync_base::
push a14
ldw a11, @[a10+_InputBufferOffset]
ld r0, e11
add r0, #^MPG_BUF_BASE
ld e11, r0
ld a12, a11
; ld a13, #MPG_BUF_LIMIT
ld a13, #_buffer_ptr
ldw a13, @[a13+_MPG_BUF_LIMIT]
eld c, #0 ; error count
; search mpg sync word
_1_byte_mpg ldb r0, @[a11]
add a11, #1
cmp eq, a11, a13
brf _2_byte_mpg
ld a11, #MPG_BUF_BASE
_2_byte_mpg ldb r1, @[a11]
add a11, #1
cmp eq, a11, a13
brf check_mpg_sync
ld a11, #MPG_BUF_BASE
check_mpg_sync
slb r0
or r0, r1
and r0, #0xfff0
cmp eq, r0, #BASE_SYNC_WORD<<4
brf search_base_sync
success_sync_found
sr r1
and r1, #11b
ld r0, #4
sub r0, r1 ; r0 := layer
ldb r2, @[a11] ; _3_byte_mpg
get_frame_size
ld r3, r2
ld r4, r2
sl r3
sl r3
and r3, #110000b
sr r2
sr r2
sr r2
sr r2
or r3, r2
add r3, r3 ; r3 := table offset
sr r4
and r4, #1b ; r4 := pad_slot
cmp eq, r0, #LAYER_I
brt get_frame_size_I
cmp eq, r0, #LAYER_II
brt get_frame_size_II
brf error_try_again
get_frame_size_II
ld a9, #slots_table_II
add a9, r3
ldc r6, @a9
cmpu gt, r6, #MAX_MPG_FRAME_SIZE
brt error_try_again
add r6, r4
bra search_next_syncword
get_frame_size_I
ld a9, #slots_table_I
add a9, r3
ldc r6, @a9
cmpu gt, r6, #168
brt error_try_again
add r6, r4
sl r6
sl r6
;========================================================================;
; LKT: 肋給等 sync word甫 茫疽闌 錠 積扁綽 滾弊 薦瀝, 2003.10.9
; sync-word甫 茫疽闌 錠 促瀾 frame狼 sync-word啊 瀝惑牢 瘤 八葷.
search_next_syncword
.if( 1 )
push a13, a12
add a12, r6
ld r1, e12
ld r0, r12
; ld r3, #^MPG_BUF_LIMIT
; ld r2, #>MPG_BUF_LIMIT
ld a13, #_buffer_ptr
ldw r3, @[a13+_MPG_BUF_LIMIT+0]
ldw r2, @[a13+_MPG_BUF_LIMIT+2]
sub r0, r2
sbc r1, r3
cmp eq, r1, #0
brf %f0
ld r1, e12
ld r0, r12
; ld r3, #^(MPG_BUF_LIMIT-SB0_BASE)
; ld r2, #>(MPG_BUF_LIMIT-SB0_BASE)
ldw r3, @[a10+_InputBufferSize+0] //MPG_BUF_LIMIT-SB0_BASE == InputBufferSize
ldw r2, @[a10+_InputBufferSize+2]
sub r0, r2
sbc r1, r3
ld e12, r1
ld r12, r0
%0 ldb r0, @[a12+0]
ldb r1, @[a12+1]
slb r0
or r0, r1
and r0, #0xfff0
pop a12, a13
cmp eq, r0, #0xfff0
brf search_base_sync
.endif
;========================================================================;
copy_to_frame_buffer
ecld a, r6
efz8 a
eld rpd1.frame_size, a
; check main audio data is present or not
cmp gt, r6, #BASE_HEADER_SIZE
brfd search_base_sync
eld c, #0 ; error count
; ld a11, #BS_MAIN
ld a11, #_buffer_ptr
ldw a11, @[a11+_BS_MAIN]
ld a14, a12
dec r6
;=============================================================
; CLRSR IE
;=============================================================
%1 ldb r0, @[a12]
add a12, #1
cmp eq, a12, a13
brfd %f2
ldb @[a11], r0
ld a12, #MPG_BUF_BASE
%2 bnzd r6, %b1
add a11, #1
ld r0, e12
sub r0, #^SB0_BASE ;0x24
ld e12, r0
ldw @[a10+_InputBufferOffset], a12
ld r0, #0
ldb @[a11+0], r0
ldb @[a11+1], r0
ldb @[a11+2], r0
ldb @[a11+3], r0
;=============================================================
; SETSR IE
;=============================================================
; initialize getbits()
; clear rp3=bs_ptr, SR=bit_buffer, SA=bit_count
eld rp3, #SBF0_PTR
eld sr, #0
eld sa, #0
; initialize sequential buffer
ld a8, #SFR_BASE
; ld a9, #BS_MAIN-SB0_BASE
; ldw @[a8+rSBL0OFF], a9
ld a9, #_buffer_ptr
ldw r1, @[a9+_BS_MAIN+0]
ldw r0, @[a9+_BS_MAIN+2]
sub r0, #>SB0_BASE
sbc r1, #^SB0_BASE
ldw @[a8+rSBL0OFF+0], r1
ldw @[a8+rSBL0OFF+2], r0
ld r1, #SB0_RD /* fill command */
ldw @[a8+rSBFCON], r1
mRETURN (_DECODE_OK)
end_of_seek_base_sync
pop a14
ret
;========================================================================;
search_base_sync:
.ifdef _DEBUG_
/** debug **/ bra mpg_sync_not_found
.endif
ld a9, #MPG_BUF_BASE
cmp eq, a11, a9
brfd _first_byte
sub a11, #1
; ld a11, #MPG_BUF_LIMIT-1
ld a11, #_buffer_ptr
ldw a11, @[a11+_MPG_BUF_LIMIT]
sub a11, #1
; search mpg sync word
_first_byte ld a12, a11
ldb r0, @[a11]
add a11, #1
cmp eq, a11, a13
brf _second_byte
ld a11, #MPG_BUF_BASE
_second_byte ldb r1, @[a11]
add a11, #1
cmp eq, a11, a13
brf check_sync_word
ld a11, #MPG_BUF_BASE
check_sync_word
slb r0
or r0, r1
and r0, #0xFFF0
cmp eq, r0, #0xFFF0
brf search_base_sync
bra success_sync_found
error_try_again eadd c, #1 ; error count
ecp c, #MAX_ERROR_COUNT
bra ec1, search_base_sync
mpg_sync_not_found
mRETURN (_MPG_SYNC_NOT_FOUND)
pop a14
ret
;========================================================================;
/********************************************************************
Function: EXT_seek_sync_ext
Description: seek syncword of base bit stream.
********************************************************************/
.if( _DECODER_TYPE != MPEG_1_AUDIO )
EXT_seek_sync_ext::
push a14
ldw a11, @[a10+_ExtInputBufferOffset]
ld r0, e11
add r0, #^SB0_BASE
ld e11, r0
ld a13, a12
; ld a14, #EXT_BUF_LIMIT
ld a14, #_buffer_ptr
ldw a14, @[a14+_EXT_BUF_LIMIT]
; search mpg sync word
_1_byte_ext ldb r0, @[a11]
add a11, #1
cmp eq, a11, a14
brf _2_byte_ext
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
_2_byte_ext ldb r1, @[a11]
add a11, #1
cmp eq, a11, a14
brf check_ext_sync
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
check_ext_sync
slb r0
or r0, r1
and r0, #0x7ff0
cmp eq, r0, #EXT_SYNC_WORD<<4
brf search_ext_sync
success_ext_found
_3_byte_ext ldb r2, @[a11]
add a11, #1
cmp eq, a11, a14
brf _4_byte_ext
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
_4_byte_ext ldb r3, @[a11]
add a11, #1
cmp eq, a11, a14
brf get_ext_crc
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
get_ext_crc eld a, #0
eld b, #0
slb r1
or r1, r2
sl r1
sl r1
sl r1
sl r1
ld r6, r3
sr r3
sr r3
sr r3
sr r3
or r1, r3
ecld a, r1
eld rpd0.ext_crc_val, a
_5_byte_ext ldb r1, @[a11]
add a11, #1
cmp eq, a11, a14
brf get_ext_length
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
get_ext_length
ld r2, #0
slb r6
or r6, r1
sr r6
incc r2
and r6, #0x7ff
ecld a, r6
ecld b, r2
eld rpd0.ext_length, a
eld rpd0.ext_ID, b
;========================================================================;
; LKT: 肋給等 ext sync word甫 茫疽闌 版快甫 措厚 竊. 2003.10.22
search_next_ext_sync
.if( 1 )
push a12, a11
add a11, r6
sub a11, #EXT_HEADER_SIZE
ld r1, e11
ld r0, r11
; ld r3, #^EXT_BUF_LIMIT
; ld r2, #>EXT_BUF_LIMIT
ld a12, #_buffer_ptr
ldw r3, @[a12+_EXT_BUF_LIMIT+0]
ldw r2, @[a12+_EXT_BUF_LIMIT+2]
sub r0, r2
sbc r1, r3
cmp eq, r1, #0
brf %f0
ld r1, e11
ld r0, r11
; ld r3, #^(EXT_BUF_BASE-SB0_BASE)
; ld r2, #>(EXT_BUF_BASE-SB0_BASE)
ldw r3, @[a12+_EXT_BUF_BASE+0]
ldw r2, @[a12+_EXT_BUF_BASE+2]
sub r2, #>SB0_BASE
sbc r3, #^SB0_BASE
sub r0, r2
sbc r1, r3
ld e11, r1
ld r11, r0
%0 ldb r0, @[a11+0]
ldb r1, @[a11+1]
slb r0
or r0, r1
and r0, #0x7ff0
cmp eq, r0, #0x7ff0
brfd search_ext_sync
pop a11, a12
.endif
;========================================================================;
; paste extension frame to mc buffer
cmp gt, r6, #EXT_HEADER_SIZE
brfd end_seek_sync_ext
mRETURN (_DECODE_OK)
sub r6, #EXT_HEADER_SIZE+1
%1 ldb r0, @[a11]
add a11, #1
cmp eq, a11, a14
brfd %f2
ldb @[a12], r0
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
%2 bnzd r6, %b1
add a12, #1
ld r0, e11
sub r0, #^SB0_BASE ;0x24
ld e11, r0
ldw @[a10+_ExtInputBufferOffset], a11
ld r0, #0
ldb @[a12+0], r0
ldb @[a12+1], r0
ldb @[a12+2], r0
ldb @[a12+3], r0
; reset getbits()
; retain rp3=bs_ptr, SR=bit_buffer, SA=bit_count
ld a8, #SFR_BASE
; ld a9, #BS_MULTICHANNEL-SB0_BASE
; ldw @[a8+rSBL0OFF], a9
ld a9, #_buffer_ptr
ldw r1, @[a9+_BS_MULTICHANNEL+0]
ldw r0, @[a9+_BS_MULTICHANNEL+2]
sub r1, #^SB0_BASE ;0x24
ldw @[a8+rSBL0OFF+0], r1
ldw @[a8+rSBL0OFF+2], r0
ld r1, #SB0_RD /* fill command */
ldw @[a8+rSBFCON], r1
; for detect broken stream
eld b, rpd1.mc_bs_size
esub a, #EXT_HEADER_SIZE
eadd a, b
eld rpd1.mc_bs_size, a
; mandatory extension CRC check
eld a, rpd1.mandatory_crc_check
ecp a, #TRUE
ebra ec1, end_seek_sync_ext
; extension bs info
ld a12, a13 ; position of extension stream
jsr MC_EXT_error_check
eld a, rpd0.ext_crc_val
ecp c, a
ebra ec1, error_crc_ext
end_seek_sync_ext
mRETURN (_DECODE_OK)
pop a14
ret
;========================================================================;
error_crc_ext:
.ifdef _DEBUG_
/** debug **/ bra $
.endif
eld b, rpd1.error_count
eadd b, #1
eld rpd1.error_count, b
mRETURN (_EXT_CRC_ERROR)
pop a14
ret
;========================================================================;
;;; LKT: 2003.10.22 added
search_ext_sync:
.ifdef _DEBUG_
/** debug **/ bra ext_sync_not_found
.endif
; ld a9, #EXT_BUF_BASE
ld a9, #_buffer_ptr
ldw a9, @[a9+_EXT_BUF_BASE]
cmp eq, a11, a9
brfd _1st_byte_ext
sub a11, #1
; ld a11, #EXT_BUF_LIMIT-1
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_LIMIT]
sub a11, #1
; search extension sync word
_1st_byte_ext ldb r0, @[a11]
add a11, #1
cmp eq, a11, a14
brf _2nd_byte_ext
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
_2nd_byte_ext ldb r1, @[a11]
add a11, #1
cmp eq, a11, a14
brf recheck_ext_sync
; ld a11, #EXT_BUF_BASE
ld a11, #_buffer_ptr
ldw a11, @[a11+_EXT_BUF_BASE]
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -