⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpa_common.s

📁 samsung 9908DVD源代码,
💻 S
📖 第 1 页 / 共 2 页
字号:
/*
 *  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 + -