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

📄 mpa_layer2aug.s

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -