📄 mpa_crc.s
字号:
ecld r3, a
ecld r4, b
ecld r5, d ; start_ch
add r4, r5 ; channels
ld r7, r5 ; ch count
cmp eq, r6, #TRUE
brtd crc_dyn_cross
ld r6, #0 ; sb count
crc_no_dyn_cross
;if((sblimit < 12) || (ch != 2) || (center != 3))
cmp ge, r6, #12
brf %f8
cmp eq, r7, #2
brf %f8
cmp eq, r9, #PHANTOM_CENTER
brf %f8
brtd %f9
erps rp0+s0
%8 eld d, @rp0+s0
bsrd update_CRC
eld b, @rp1+s1
%9 inc r7
cmp eq, r7, r4
brf crc_no_dyn_cross
erps rp1+s0
inc r6
cmp eq, r6, r3
brfd crc_no_dyn_cross
ld r7, r5
bra crc_scfsi
crc_dyn_cross
eld mc0, #dyn_cross_mode
eld mc1, #sbgr_table
eld a, rpd1.dyn_cross_bits
ecld r0, a
ld r8, r0
crc_dyn_bitalloc_loop
; search the valid sbgr & dyn_cross_mode[sbgr]
eld rp2, mc1 ; sbgr_table
ecld a, r6
erpn rp2, a
eld b, @rp2 ; sbgr No.
eld rp2, mc0 ; dyn_cross_mode
erpn rp2, b
eld d, @rp2 ; dyn_cross_mode[sbgr]
ecp d, #0
ebra ec0, _crc_dyn_cross_mode_0_
cmp eq, r8, #4
brt _crc_dyn_cross_bits_4_
cmp eq, r8, #3
brt _crc_dyn_cross_bits_3_
cmp eq, r8, #1
brt _crc_dyn_cross_bits_1_
.ifdef _DEBUG_
/** debug **/ bra $
.endif
_crc_dyn_cross_mode_0_
cmp eq, r9, #PHANTOM_CENTER
brf %f0
cmp ge, r6, #12
brf %f0
cmp eq, r7, #2
brt %f3
%0 cmp eq, r11, #SECOND_STEREO
brf %f2
eld rp2, #dyn_second_stereo
erpn rp2, b
eld b, @rp2
ecp b, #1
ebra ec1, %f2
cmp eq, r9, #CENTER_NONE
brt %f1
cmp eq, r7, #4
brt %f3
%1 cmp eq, r9, #CENTER_NONE
brf %f2
cmp eq, r7, #3 ; <=: ch != (ch_start+1)
brt %f3
%2 eld b, @rp1+s1
bsrd update_CRC
%3 eld d, @rp0+s0
inc r7
cmp eq, r7, r4
brf _crc_dyn_cross_mode_0_
bra crc_dyn_bitalloc_loop_check
_crc_dyn_cross_bits_4_
ecld r7, d
/* T2 */ cmp eq, r9, #3
brf %f4
cmp ge, r6, #12
brt %f6
%4
cmp gt, r7, #2
brf %f5
cmp eq, r7, #4
brt %f5
cmp ge, r7, #8
brf %f6
cmp gt, r7, #12
brf %f5
cmp eq, r7, #14
brf %f6
%5 eld b, @rp1+s1
bsrd update_CRC
%6 eld d, @rp0+s0
/* T3 */ cmp eq, r7, #1
brt %f7
cmp eq, r7, #3
brt %f7
cmp eq, r7, #5
brt %f7
cmp eq, r7, #8
brt %f7
cmp eq, r7, #10
brt %f7
cmp eq, r7, #13
brf %f8
%7 eld b, @rp1+s1
bsrd update_CRC
%8 eld d, @rp0+s0
/* T4 */ cmp eq, r7, #2
brt %f9
cmp eq, r7, #3
brt %f9
cmp eq, r7, #6
brt %f9
cmp eq, r7, #9
brf %f10
%9 eld b, @rp1+s1
bsrd update_CRC
%10 eld d, @rp0+s0
bra crc_dyn_bitalloc_loop_check
_crc_dyn_cross_bits_3_
ecld r7, d
cmp eq, r9, #3
brf %f12
cmp ge, r6, #12
brt %f14
%12 cmp eq, r7, #1
brt %f13
cmp eq, r7, #4
brf %f14
%13 eld b, @rp1+s1
bsrd update_CRC
%14 eld d, @rp0+s0
cmp eq, r7, #2
brfd crc_dyn_bitalloc_loop_check
eld d, @rp0+s0
bsrd update_CRC
eld b, @rp1+s1
bra crc_dyn_bitalloc_loop_check
_crc_dyn_cross_bits_1_
cmp eq, r11, #3
brfd crc_dyn_bitalloc_loop_check
erps rp0+s0
eld rp2, #dyn_second_stereo
erpn rp2, b
eld b, @rp1+s1
bsrd update_CRC
eld d, @rp0+s0
eld a, @rp2
ecp a, #0
ebrad ec1, crc_dyn_bitalloc_loop_check
eld d, @rp0+s0
bsrd update_CRC
eld b, @rp1+s1
crc_dyn_bitalloc_loop_check
erps rp1+s0
inc r6
cmp eq, r6, r3
brfd crc_dyn_bitalloc_loop
ld r7, r5
; 5. scalefactor selection information
crc_scfsi eld rp0, #bit_alloc+64
eld rp1, #scfsi
sub r4, r5
mul uu, r3, r4
ld r6, r3
dec r6
eld a, @rp0+s0
%0
ecp a, #0
ebra ec0, %f1
eld b, #2
bsrd update_CRC
%1 eld d, @rp1+s0
bnzd r6, %b0
eld a, @rp0+s0
eld sr, si ; restore bit_buffer
pop a14
ret
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */
/********************************************************************
Function: AUG_error_check
Description: Check CRC of MC augmentation stream.
This is mandatory option.
Check item:
1. AUG composite status information
2. bit allocation
3. scalefactor selection information
********************************************************************/
.if( _DECODER_TYPE == MPEG_2_71CH )
AUG_error_check::
push a14
eld si, sr ; backup bit_buffer
; 1. AUG composite status information
eld c, #-1
efz8 c
eld d, rpd1.aug_mtx_proc
bsrd update_CRC
eld b, #2
eld d, rpd1.aug_dyn_cross_on
bsrd update_CRC
eld b, #1
eld d, rpd1.aug_future_ext
bsrd update_CRC
eld b, #1
eld a, rpd1.aug_mtx_proc
ecp a, #0
ebrad ec0, %f1
eld b, #3
ecp a, #1
ebrad ec0, %f1
eld b, #2
bra %f3
%1 eld rp0, #aug_tc_alloc
ld r6, #GRANULES-1
eld x0, b
%2 bsrd update_CRC
eld d, @rp0+s0
bnzd r6, %b2
eld b, x0
%3
eld a, rpd1.aug_dyn_cross_on
ecp a, #0
ebra ec0, %f5
eld rp1, #aug_dyn_cross_mode
ld r6, #GRANULES-1
eld b, #5
%4 bsrd update_CRC
eld d, @rp1+s0
bnzd r6, %b4
eld b, #5
; 2. bit allocation
%5
ld r6, #0 ; sb count
eld rp0, #bit_alloc+32*5
eld rp1, #nbal_table
eld mc0, #aug_dyn_cross_mode
eld mc1, #sbgr_table
eld a, rpd1.sblimit_mc
ecld r4, a
crc_aug_bitalloc_loop
; search the valid sbgr & dyn_cross_mode[sbgr]
eld rp2, mc1 ; sbgr_table
ecld a, r6
erpn rp2, a
eld b, @rp2 ; sbgr No.
eld rp2, mc0 ; dyn_cross_mode
erpn rp2, b
eld a, @rp2 ; dyn_cross_mode[sbgr]
ecld r3, a
%6 cmp gt, r3, #4 ; dyn_cross_mode[sbgr] = 0,1,2,3,4
brt %f7
eld d, @rp0+s0
bsrd update_CRC
eld b, @rp1+s1
cmp eq, r3, #0 ; dyn_cross_mode[sbgr] = 0,1,2,3,4
brfd crc_aug_bitalloc_loop_check
eld d, @rp0+s0
bsrd update_CRC
eld b, @rp1+s1
bra crc_aug_bitalloc_loop_check
%7 cmp eq, r3, #5 ; dyn_cross_mode[sbgr] = 5,10,14
brt %f8
cmp eq, r3, #10
brt %f8
cmp eq, r3, #14
brfd %f9
%8 erps rp0+s0
eld b, @rp1+s1
bsrd update_CRC
%9 eld d, @rp0+s0
crc_aug_bitalloc_loop_check
erps rp1+s0
inc r6
cmp eq, r6, r4
brf crc_aug_bitalloc_loop
; 3. scalefactor selection information
eld rp0, #bit_alloc+32*5
eld rp1, #scfsi
ld r6, #STEREO
mul uu, r6, r4
dec r6
eld b, #2
eld a, @rp0+s0
%10
ecp a, #0
ebra ec0, %f11
eld b, #2
bsrd update_CRC
%11 eld d, @rp1+s0
bnzd r6, %b10
eld a, @rp0+s0
eld sr, si ; restore bit_buffer
pop a14
ret
.endif /* .if( _DECODER_TYPE == MPEG_2_71CH ) */
/********************************************************************
Function: MC_EXT_error_check
Description: Check CRC of extension stream.
This is mandatory option.
Arguments: a12: extension stream start point
Check item:
1. Header
update_CRC (ext_length, 11, crc);
update_CRC (ext_ID, 1, crc);
2. 128 bits of stream
********************************************************************/
.if( _DECODER_TYPE != MPEG_1_AUDIO )
MC_EXT_error_check::
push a14
eld si, sr ; backup bit_buffer
ld r4, #0
eld c, #-1
efz8 c
eld d, rpd0.ext_length
bsrd update_CRC
eld b, #11
eld d, rpd0.ext_ID
bsrd update_CRC
eld b, #1
; ext_length * 8 - 28;
eld a, rpd0.ext_length
esla a
esla a
esla a
esub a, #28
; if (a > 128) a = 128;
ecp a, #128
ebra ec2, 4
eld a, #128
; la_bytes = (a - 12) / 8;
; la_bits = (a - 12) % 8;
esub a, #12
er nq
ecr ma0
eld p, #8 ; divisor
eld ma0l, a ; dividend
esla ma0
ld r7, #23
bnzd r7, $
edivq ma0, p
eresr ma0, p
eld a, ma0l ; quotient:= la_bytes
esra ma0
eld b, ma0 ; remainder:= la_bits
ecld r6, a
ecld r7, b
ld r5, #0 ; count la_bytes
%1 cmp gt, r6, r5
brf %f2
ldb r3, @[a12+r4]
inc r4
eld b, #8
bsrd update_CRC
ecld d, r3
brad %b1
inc r5
%2 cmp gt, r7, #0
brf end_ext_error_check
ld r5, r7
sub r7, #8
com2 r7
dec r7
ldb r3, @[a12+r4]
bnzd r7, $
sr r3
ecld d, r3
bsrd update_CRC
ecld b, r5
end_ext_error_check
eld sr, si ; restore bit_buffer
pop a14
ret
.endif /* .if( _DECODER_TYPE != MPEG_1_AUDIO ) */
/********************************************************************
Function: recover_CRC_error
Description: Recover CRC error.
In ISO/IEC 11172-3, to avoid annoying distortions,
application of a concealment technique, such as
muting of the actual frame or repetition of the
previous frame, is recommended.
********************************************************************/
recover_CRC_error::
push a14
ldw a9, @[a10+_pParameter]
ldb r4, @[a9+_CH_Mode]
ldb r5, @[a10+_OutPCMSize]
ldw a9, @[a10+_OutputBufferOffset]
ld a11, #SB1_BASE+s1mem_PCM_BUF
ld a12, a11
ld r0, r11
ld r1, e11
ld r2, r9
ld r3, e9
add r0, r2
adc r1, r3
ld r11, r0
ld e11, r1
ld r6, #SAMPLES_PER_FRAME*8*2
cmp eq, r4, #_MPEG2_7CH
brf %f1
ld r6, #SAMPLES_PER_FRAME*10*2
%1 cmp eq, r5, #PCM_SAMPLE_16BITS
brt %2
sl r6
%2 cmp eq, a9, #0
brf %f3
add a12, r6
%3 sr r6
dec r6
eld a, rpd1.error_count
ecp a, #1
ebrad ec1, mute_cur_frame
ld r3, #0
; 1. replicate previous error_free frame
copy_pre_frame
ldw r3, @[a12]
add a12, #2
ldw @[a11], r3
bnzd r6, copy_pre_frame
add a11, #2
bra end_recover_CRC_error
; 2. mute the frame
mute_cur_frame
ldw @[a11], r3
bnzd r6, mute_cur_frame
add a11, #2
end_recover_CRC_error
pop a14
ret
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -