| ;// |
| ;// 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 |