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

📄 cabacmodelupdate.sa

📁 实现了h.264中的cabac模式更新的ti平台优化
💻 SA
字号:
;=========================================================
;函数名:		CabacModelUpdate
;功能:			更新熵编解码上下文模型
;参数:			pvCabacInfo CABAC结构指针[in/out]
;				l32SliceType : Slice 类型[in]
;				l32Qp : 量化值[in]
;返回值:		无
;---------------------------------------------------------
;修改日期				创建人					版本
;2006/09/21				王立军					1.0
;=========================================================
			.global			_as8H264CabacCtxInitPB
			.global			_au8H264CabacProbability
			.global			_al32H264CabacEntropy
			.def			_CabacModelUpdate_ti
_CabacModelUpdate_ti:	.cproc	pvCabacInfo, l32SliceType, l32Qp
			.no_mdep
			.reg			ptCabacInfo, l32Index, l32Ctx, l32Cost0, l32Cost1, l32Cost2
			.reg			Rg1, Rg0, Rg3, Rg2, Rg5, Rg4, Rg7, Rg6, atSlice, atCtxState
			.reg			RgB, RgA, RgD, RgC, RgF, RgE, RgH, RgG
			.reg			constNum0, constNum1, constNum2, constNum3, constNum4, constNum5, constNum6
			.reg			u16Count, u8Mps, u8State
			.reg			au8Probability, al32Entropy
			.reg			as8CtxInitPB0, as8CtxInitPB1, as8CtxInitPB2, StrideInitPB, Mask0, Mask1
			.reg			l32Weight, l32ModelState0, l32ModelState1, l32ModelState2, l32CtxState
			.reg			offSetR0, offSetR1, offSetR2, offSetRA					
			
			
			MVK				2, Rg0
			MVK				5, Rg1
			CMPEQ			l32SliceType, Rg0, Rg0
			CMPEQ			l32SliceType, Rg1, Rg1
			OR				Rg0, Rg1, Rg0
[Rg0]		B				End

			MV				pvCabacInfo, ptCabacInfo			
			MVKL			399, l32Ctx
			MVKH			399, l32Ctx
			OR				0, ptCabacInfo, atSlice
			ADD				ptCabacInfo, 24, atCtxState
			MVKL			_as8H264CabacCtxInitPB, as8CtxInitPB0
			MVKH			_as8H264CabacCtxInitPB, as8CtxInitPB0
			MVKL			_au8H264CabacProbability, au8Probability
			MVKH			_au8H264CabacProbability, au8Probability
			MVKL			_al32H264CabacEntropy, al32Entropy
			MVKH			_al32H264CabacEntropy, al32Entropy
			ZERO			l32Cost0
			ZERO			l32Cost1
			ZERO			l32Cost2
			MVKL			798, StrideInitPB
			MVKH			798, StrideInitPB
			ADD				as8CtxInitPB0, StrideInitPB, as8CtxInitPB1
			ADD				as8CtxInitPB1, StrideInitPB, as8CtxInitPB2
 
			;计算循环
			MVK				256, constNum0						
			SHR				constNum0, 2, constNum1			
			SUB				constNum1, 1, constNum2
			ZERO			constNum3
			MVK				127, constNum4
			MVK				0xff, constNum5
			MVK				0xff, constNum6

loop:		.trip	399, 399 			
			LDNW			*atCtxState++, RgA
			CLR				RgA, 16, 31, u16Count
			;AND				RgA, constNum5, u16Count			
			UNPKHU4			RgA, Rg2
			SHRU			Rg2, 16, u8Mps
			;CLR				Rg2, 8, 31, u8State
			AND				Rg2, constNum6, u8State
			
			SHL				u16Count, 3, Rg1			
			CMPLT			Rg1, constNum0, Mask0
			EXT				Mask0, 31, 31, Mask0
			AND				Rg1, Mask0, Rg1
			ANDN			constNum0, Mask0, Rg0
			ADD				Rg1, Rg0, l32Weight								
			
			;Index = 0 ===== 计算出l32ModelState0并为后面的数表中取数做准备 ====
			LDH				*as8CtxInitPB0++, RgC
			SHR				RgC, 8, RgD
			;CLR				RgC, 8, 31, RgC
			AND				RgC, constNum6, RgC
			;CLR				RgD, 8, 31, RgD
			AND				RgD, constNum5, RgD
			MPY				RgC, l32Qp, Rg3			
			SHR				Rg3, 4, Rg2	
			ADD				RgD, Rg2, RgD
			CMPLT			RgD, constNum3, Mask0
			EXT				Mask0,31, 31, Mask0			
			ANDN			RgD, Mask0, RgC
			CMPGT			RgC, constNum4, Mask1
			EXT				Mask1, 31, 31, Mask1
			AND				constNum4, Mask1, Rg2
			ANDN			RgC, Mask1, Rg1
			ADD				Rg1, Rg2, l32ModelState0										
			SUB				constNum4, l32ModelState0, Rg1
			SHR				l32ModelState0, 2, l32ModelState0
			SHR				Rg1, 2, offSetR0
			
			;Index = 1 *******计算出l32ModelState1并为后面的数表中取数做准备******
			LDH				*as8CtxInitPB1++, RgE
			SHR				RgE, 8, RgF
			;CLR				RgE, 8, 31, RgE
			AND				RgE, constNum6, RgE
			;CLR				RgF, 8, 31, RgF
			AND				RgF, constNum5, RgF
			MPY				RgE, l32Qp, Rg4			
			SHR				Rg4, 4, Rg4	
			ADD				RgF, Rg4, RgF
			CMPLT			RgF, constNum3, Mask0
			EXT				Mask0,31, 31, Mask0			
			ANDN			RgF, Mask0, RgF
			CMPGT			RgF, constNum4, Mask1
			EXT				Mask1, 31, 31, Mask1
			AND				constNum4, Mask1, Rg4
			ANDN			RgF, Mask1, Rg5
			ADD				Rg4, Rg5, l32ModelState1										
			SUB				constNum4, l32ModelState1, Rg4
			SHR				l32ModelState1, 2, l32ModelState1
			SHR				Rg4, 2, offSetR1
			
			;Index = 2 *******计算出l32ModelState2并为后面的数表中取数做准备******
			LDH				*as8CtxInitPB2++, RgG
			SHR				RgG, 8, RgH
			;CLR				RgG, 8, 31, RgG
			AND				RgG, constNum6, RgG
			;CLR				RgH, 8, 31, RgH
			AND				RgH, constNum5, RgH
			MPY				RgG, l32Qp, Rg6			
			SHR				Rg6, 4, Rg6	
			ADD				RgH, Rg6, RgH
			CMPLT			RgH, constNum3, Mask0
			EXT				Mask0,31, 31, Mask0			
			ANDN			RgH, Mask0, RgG
			CMPGT			RgG, constNum4, Mask1
			EXT				Mask1, 31, 31, Mask1
			AND				constNum4, Mask1, Rg6
			ANDN			RgG, Mask1, Rg7
			ADD				Rg6, Rg7, l32ModelState2										
			SUB				constNum4, l32ModelState2, Rg6
			SHR				l32ModelState2, 2, l32ModelState2
			SHR				Rg6, 2, offSetR2
			
			;计算出l32CtxState并为后面的数表中取数做准备
			ADD				u8State, constNum1, Rg1
			SUB				constNum2, u8State, Rg0
			CMPGT			u8Mps, constNum3, Mask0
			EXT				Mask0, 31, 31, Mask0			
			AND				Rg1, Mask0, Rg1
			ANDN			Rg0, Mask0, Rg0
			ADD				Rg0, Rg1, l32CtxState
			SUB				constNum4, l32CtxState, offSetRA
			
			;开始从数表中取数来运算l32Cost0
			LDBU			*+au8Probability[l32CtxState], Rg0
			LDBU			*+au8Probability[offSetRA], Rg1			
			LDNW			*+al32Entropy[l32ModelState0], Rg2
			LDNW			*+al32Entropy[offSetR0], Rg3
			
			MPY				Rg0, Rg2, Rg2
			MPY				Rg1, Rg3, Rg3
			ADD				Rg2, Rg3, Rg2
			SHR				Rg2, 8, Rg2
			
			MPY				l32Weight, Rg2, Rg2
			SHR				Rg2, 8, Rg2
			ADD				l32Cost0, Rg2, l32Cost0
			
				
			;LDBU			*+au8Probability[l32CtxState], Rg0
			;LDBU			*+au8Probability[offSetRA], Rg1			
			LDNW			*+al32Entropy[l32ModelState1], Rg4
			LDNW			*+al32Entropy[offSetR1], Rg5
			
			MPY				Rg0, Rg4, Rg4
			MPY				Rg1, Rg5, Rg5
			ADD				Rg5, Rg4, Rg4
			SHR				Rg4, 8, Rg4
			
			MPY				l32Weight, Rg4, Rg4
			SHR				Rg4, 8, Rg4
			ADD				l32Cost1, Rg4, l32Cost1
			
			LDNW			*+al32Entropy[l32ModelState2], Rg6
			LDNW			*+al32Entropy[offSetR2], Rg7
			
			MPY				Rg0, Rg6, Rg6
			MPY				Rg1, Rg7, Rg7
			ADD				Rg7, Rg6, Rg6
			SHR				Rg6, 8, Rg6
			
			MPY				l32Weight, Rg6, Rg6
			SHR				Rg6, 8, Rg6
			ADD				l32Cost2, Rg6, l32Cost2
			
			SUB				l32Ctx, 1, l32Ctx
[l32Ctx]	B				loop			
			
			ZERO			constNum0
			ADD				constNum0, 1, constNum1
			ADD				constNum1, 1, constNum2	
			
			SHL				l32SliceType, 1, offSetR0
			ZERO			Mask0
			ZERO			Mask1	
			
			CMPLT			l32Cost0, l32Cost1, Mask0
[Mask0]		CMPLT			l32Cost0, l32Cost2, Mask1
[Mask1]		STNW			constNum0, *++atSlice[offSetR0]
[Mask1]		STNW			l32Cost0, *++atSlice
						
			CMPLT			l32Cost1, l32Cost0, Mask0
[Mask0]		CMPLT			l32Cost1, l32Cost2, Mask1
[Mask1]		STNW			constNum1, *++atSlice[offSetR0]
[Mask1]		STNW			l32Cost1, *++atSlice


			CMPLT			l32Cost2, l32Cost1, Mask0
[Mask0]		CMPLT			l32Cost2, l32Cost0, Mask1
[Mask1]		STNW			constNum2, *++atSlice[offSetR0]
[Mask1]		STNW			l32Cost2, *++atSlice


End:		
			.return
			.endproc			



⌨️ 快捷键说明

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