blob: 96f5bedda5dcc2151286726396b3842c0c582811 [file] [log] [blame]
;//
;// Copyright (C) 2007-2008 ARM Limited
;//
;// Licensed under the Apache License, Version 2.0 (the "License");
;// you may not use this file except in compliance with the License.
;// You may obtain a copy of the License at
;//
;// http://www.apache.org/licenses/LICENSE-2.0
;//
;// Unless required by applicable law or agreed to in writing, software
;// distributed under the License is distributed on an "AS IS" BASIS,
;// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;// See the License for the specific language governing permissions and
;// limitations under the License.
;//
;/**
; *
; * File Name: armVCM4P2_DecodeVLCZigzag_AC_unsafe_s.s
; * OpenMAX DL: v1.0.2
; * Revision: 9641
; * Date: Thursday, February 7, 2008
; *
; *
; *
; *
; * Description:
; * Contains modules for zigzag scanning and VLC decoding
; * for inter, intra block.
; *
; *
; *
; * Function: omxVCM4P2_DecodeVLCZigzag_AC_unsafe
; *
; * Description:
; * Performs VLC decoding and inverse zigzag scan
; *
; *
; *
; *
; */
INCLUDE omxtypes_s.h
INCLUDE armCOMM_s.h
INCLUDE armCOMM_BitDec_s.h
M_VARIANTS ARM1136JS
IF ARM1136JS
;//Input Arguments
ppBitStream RN 0
pBitOffset RN 1
pDst RN 2
shortVideoHeader RN 3
;//Local Variables
Return RN 0
pVlcTableL0L1 RN 4
pLMAXTableL0L1 RN 4
pRMAXTableL0L1 RN 4
pZigzagTable RN 4
ftype RN 0
temp3 RN 4
temp RN 5
Count RN 6
Escape RN 5
;// armVCM4P2_FillVLDBuffer
zigzag RN 0
storeLevel RN 1
temp2 RN 4
temp1 RN 5
sign RN 5
Last RN 7
storeRun RN 14
packRetIndex RN 5
markerbit RN 5
;// Scratch Registers
RBitStream RN 8
RBitBuffer RN 9
RBitCount RN 10
T1 RN 11
T2 RN 12
LR RN 14
M_ALLOC4 pppBitStream,4
M_ALLOC4 ppOffset,4
M_ALLOC4 pLinkRegister,4
M_START armVCM4P2_DecodeVLCZigzag_AC_unsafe
;// get the table addresses from stack
M_ARG ppVlcTableL0L1,4
M_ARG ppLMAXTableL0L1,4
M_ARG ppRMAXTableL0L1,4
M_ARG ppZigzagTable,4
;// Store ALL zeros at pDst
MOV temp1,#0 ;// Initialize Count to zero
MOV Last,#0
M_STR LR,pLinkRegister ;// Store Link Register on Stack
MOV temp2,#0
MOV LR,#0
;// Initialize the Macro and Store all zeros to pDst
STM pDst!,{temp2,temp1,Last,LR}
M_BD_INIT0 ppBitStream, pBitOffset, RBitStream, RBitBuffer, RBitCount
STM pDst!,{temp2,temp1,Last,LR}
M_BD_INIT1 T1, T2, T2
STM pDst!,{temp2,temp1,Last,LR}
M_BD_INIT2 T1, T2, T2
STM pDst!,{temp2,temp1,Last,LR}
M_STR ppBitStream,pppBitStream ;// Store ppBitstream on stack
STM pDst!,{temp2,temp1,Last,LR}
M_STR pBitOffset,ppOffset ;// Store pBitOffset on stack
STM pDst!,{temp2,temp1,Last,LR}
STM pDst!,{temp2,temp1,Last,LR}
STM pDst!,{temp2,temp1,Last,LR}
SUB pDst,pDst,#128 ;// Restore pDst
;// The armVCM4P2_GetVLCBits begins
getVLCbits
M_BD_LOOK8 Escape,7 ;// Load Escape Value
LSR Escape,Escape,#25
CMP Escape,#3 ;// check for escape mode
MOVNE ftype,#0
BNE notEscapemode ;// Branch if not in Escape mode 3
M_BD_VSKIP8 #7,T1
CMP shortVideoHeader,#0 ;// Check shortVideoHeader flag to know the type of Escape mode
BEQ endFillVLD
;// Escape Mode 4
M_BD_READ8 Last,1,T1
M_BD_READ8 storeRun,6,T1
M_BD_READ8 storeLevel,8,T1
;// Check whether the Reserved values for Level are used and Exit with an Error Message if it is so
TEQ storeLevel,#0
TEQNE storeLevel,#128
BEQ ExitError
ADD temp2,storeRun,Count
CMP temp2,#64
BGE ExitError ;// error if Count+storeRun >= 64
;// Load address of zigzagTable
M_LDR pZigzagTable,ppZigzagTable ;// Loading the Address of Zigzag table
;// armVCM4P2_FillVLDBuffer
SXTB storeLevel,storeLevel ;// Sign Extend storeLevel to 32 bits
;// To Reflect Runlength
ADD Count,Count,storeRun
LDRB zigzag,[pZigzagTable,Count]
ADD Count,Count,#1
STRH storeLevel,[pDst,zigzag] ;// store Level
B ExitOk
endFillVLD
;// Load Ftype( Escape Mode) value based on the two successive bits in the bitstream
M_BD_READ8 temp1,1,T1
CMP temp1,#0
MOVEQ ftype,#1
BEQ notEscapemode
M_BD_READ8 temp1,1,T1
CMP temp1,#1
MOVEQ ftype,#3
MOVNE ftype,#2
notEscapemode
;// Load optimized packed VLC table with last=0 and Last=1
M_LDR pVlcTableL0L1,ppVlcTableL0L1 ;// Load Combined VLC Table
CMP ftype,#3 ;// If ftype >=3 get perform Fixed Length Decoding (Escape Mode 3)
BGE EscapeMode3 ;// Else continue normal VLC Decoding
;// Variable lengh decoding, "armUnPackVLC32"
M_BD_VLD packRetIndex,T1,T2,pVlcTableL0L1,4,2
LDR temp3,=0xFFF
CMP packRetIndex,temp3 ;// Check for invalid symbol
BEQ ExitError ;// if invalid symbol occurs exit with an error message
AND Last,packRetIndex,#2 ;// Get Last from packed Index
LSR storeRun,packRetIndex,#7 ;// Get Run Value from Packed index
AND storeLevel,packRetIndex,#0x7c ;// storeLevel=packRetIndex[2-6],storeLevel[0-1]=0
M_LDR pLMAXTableL0L1,ppLMAXTableL0L1 ;// Load LMAX table
LSR storeLevel,storeLevel,#2 ;// Level value
CMP ftype,#1
BNE ftype2
;// ftype==1; Escape mode =1
ADD temp1, pLMAXTableL0L1, Last, LSL#4 ;// If the Last=1 add 32 to table address
LDRB temp1,[temp1,storeRun]
ADD storeLevel,temp1,storeLevel
ftype2
;// ftype =2; Escape mode =2
M_LDR pRMAXTableL0L1,ppRMAXTableL0L1 ;// Load RMAX Table
CMP ftype,#2
BNE FillVLDL1
ADD temp1, pRMAXTableL0L1, Last, LSL#4 ;// If Last=1 add 32 to table address
SUB temp2,storeLevel,#1
LDRB temp1,[temp1,temp2]
ADD storeRun,storeRun,#1
ADD storeRun,temp1
FillVLDL1
;// armVCM4P2_FillVLDBuffer
M_LDR pZigzagTable,ppZigzagTable ;// Load address of zigzagTable
M_BD_READ8 sign,1,T1
CMP sign,#1
RSBEQ storeLevel,storeLevel,#0
ADD temp1,storeRun,Count ;// Exit with an error message if Run + Count exceeds 63
CMP temp1,#64
BGE ExitError
;// To Reflect Runlenght
ADD Count,Count,storeRun
storeLevelL1
LDRB zigzag,[pZigzagTable,Count]
CMP Last,#2 ;// Check if the Level val is Last non zero val
ADD Count,Count,#1
LSR Last,Last,#1
STRH storeLevel,[pDst,zigzag]
BNE end
B ExitOk
;// Fixed Lengh Decoding Escape Mode 3
EscapeMode3
M_BD_READ8 Last,1,T1
M_BD_READ8 storeRun,6,T1
ADD temp2,storeRun,Count ;// Exit with an error message if Run + Count exceeds 63
CMP temp2,#64
BGE ExitError
M_BD_READ8 markerbit,1,T1
TEQ markerbit,#0 ;// Exit with an error message if marker bit is zero
BEQ ExitError
M_BD_READ16 storeLevel,12,T1
TST storeLevel,#0x800 ;// test if the level is negative
SUBNE storeLevel,storeLevel,#4096
CMP storeLevel,#0
CMPNE storeLevel,#-2048
BEQ ExitError ;// Exit with an error message if Level==0 or -2048
M_LDR pZigzagTable,ppZigzagTable ;// Load address of zigzagTable
M_BD_READ8 markerbit,1,T1
;// armVCM4P2_FillVLDBuffer ( Sign not used as storeLevel is preprocessed)
;// To Reflect Run Length
ADD Count,Count,storeRun
storeLevelLast
LDRB zigzag,[pZigzagTable,Count]
CMP Last,#1
ADD Count,Count,#1
STRH storeLevel,[pDst,zigzag]
BNE end
B ExitOk
end
CMP Count,#64 ;//Run the Loop untill Count reaches 64
BLT getVLCbits
ExitOk
;// Exit When VLC Decoding is done Successfully
;// Loading ppBitStream and pBitOffset from stack
CMP Last,#1
M_LDR ppBitStream,pppBitStream
M_LDR pBitOffset,ppOffset
;//Ending the macro
M_BD_FINI ppBitStream,pBitOffset
MOVEQ Return,#OMX_Sts_NoErr
MOVNE Return,#OMX_Sts_Err
M_LDR LR,pLinkRegister ;// Load the Link Register Back
B exit2
ExitError
;// Exit When an Error occurs
M_LDR ppBitStream,pppBitStream
M_LDR pBitOffset,ppOffset
;//Ending the macro
M_BD_FINI ppBitStream,pBitOffset
M_LDR LR,pLinkRegister
MOV Return,#OMX_Sts_Err
exit2
M_END
ENDIF
END