| ;// |
| ;// 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: omxVCM4P2_DecodeVLCZigzag_IntraDCVLC_s.s |
| ; * OpenMAX DL: v1.0.2 |
| ; * Revision: 12290 |
| ; * Date: Wednesday, April 9, 2008 |
| ; * |
| ; * |
| ; * |
| ; * |
| ; * Description: |
| ; * Contains modules for zigzag scanning and VLC decoding |
| ; * for inter block. |
| ; * |
| ; * |
| ; * |
| ; * Function: omxVCM4P2_DecodeVLCZigzag_Inter |
| ; * |
| ; * Description: |
| ; * Performs VLC decoding and inverse zigzag scan for one intra coded block. |
| ; * |
| ; * Remarks: |
| ; * |
| ; * Parameters: |
| ; * [in] ppBitStream pointer to the pointer to the current byte in |
| ; * the bitstream buffer |
| ; * [in] pBitOffset pointer to the bit position in the byte pointed |
| ; * to by *ppBitStream. *pBitOffset is valid within [0-7]. |
| ; * [in] shortVideoHeader binary flag indicating presence of short_video_header; |
| ; * escape modes 0-3 are used if shortVideoHeader==0, |
| ; * and escape mode 4 is used when shortVideoHeader==1. |
| ; * [out] ppBitStream *ppBitStream is updated after the block is |
| ; * decoded, so that it points to the current byte |
| ; * in the bit stream buffer |
| ; * [out] pBitOffset *pBitOffset is updated so that it points to the |
| ; * current bit position in the byte pointed by |
| ; * *ppBitStream |
| ; * [out] pDst pointer to the coefficient buffer of current |
| ; * block. Must be 16-byte aligned |
| ; * |
| ; * Return Value: |
| ; * OMX_Sts_BadArgErr - bad arguments |
| ; * -At least one of the following pointers is NULL: ppBitStream, *ppBitStream, pBitOffset, pDst, or |
| ; * -pDst is not 16-byte aligned, or |
| ; * -*pBitOffset exceeds [0,7]. |
| ; * OMX_Sts_Err - status error |
| ; * -At least one mark bit is equal to zero |
| ; * -Encountered an illegal stream code that cannot be found in the VLC table |
| ; * -Encountered and illegal code in the VLC FLC table |
| ; * -The number of coefficients is greater than 64 |
| ; * |
| ; */ |
| |
| |
| INCLUDE omxtypes_s.h |
| INCLUDE armCOMM_s.h |
| INCLUDE armCOMM_BitDec_s.h |
| |
| |
| M_VARIANTS CortexA8 |
| |
| |
| |
| |
| |
| IF CortexA8 |
| |
| |
| ;// Import various tables needed for the function |
| |
| |
| IMPORT armVCM4P2_IntraVlcL0L1 ;// Contains optimized and packed VLC Tables for both Last =1 and last=0 |
| ;// Packed in Run:Level:Last format |
| IMPORT armVCM4P2_IntraL0L1LMAX ;// Contains LMAX table entries with both Last=0 and Last=1 |
| IMPORT armVCM4P2_IntraL0L1RMAX ;// Contains RMAX table entries with both Last=0 and Last=1 |
| IMPORT armVCM4P2_aClassicalZigzagScan ;// contains CLassical, Horizontal, Vertical Zigzag table entries with double the original values |
| IMPORT armVCM4P2_aIntraDCLumaChromaIndex ;// Contains Optimized DCLuma and DCChroma Index table Entries |
| |
| |
| IMPORT armVCM4P2_DecodeVLCZigzag_AC_unsafe |
| |
| ;//Input Arguments |
| |
| ppBitStream RN 0 |
| pBitOffset RN 1 |
| pDst RN 2 |
| PredDir RN 3 |
| shortVideoHeader RN 3 |
| videoComp RN 5 |
| ;//Local Variables |
| |
| Return RN 0 |
| |
| pDCLumaChromaIndex RN 4 |
| pDCChromaIndex RN 7 |
| pVlcTableL0L1 RN 4 |
| pLMAXTableL0L1 RN 4 |
| pRMAXTableL0L1 RN 4 |
| pZigzagTable RN 4 |
| Count RN 6 |
| DCValueSize RN 6 |
| powOfSize RN 7 |
| temp1 RN 5 |
| |
| |
| ;// Scratch Registers |
| |
| RBitStream RN 8 |
| RBitBuffer RN 9 |
| RBitCount RN 10 |
| |
| T1 RN 11 |
| T2 RN 12 |
| DCVal RN 14 |
| |
| |
| ;// Allocate stack memory to store optimized VLC,Zigzag, RMAX, LMAX Table Addresses |
| |
| M_ALLOC4 ppVlcTableL0L1,4 |
| M_ALLOC4 ppLMAXTableL0L1,4 |
| M_ALLOC4 ppRMAXTableL0L1,4 |
| M_ALLOC4 ppZigzagTable,4 |
| M_ALLOC4 pDCCoeff,4 |
| |
| |
| |
| M_START omxVCM4P2_DecodeVLCZigzag_IntraDCVLC,r12 |
| |
| M_ARG shortVideoHeaderonStack,4 ;// Pointer to argument on stack |
| M_ARG videoComponstack,4 ;// Pointer to argument on stack |
| |
| |
| ;// Decode DC Coefficient |
| |
| |
| LDR pDCLumaChromaIndex, =armVCM4P2_aIntraDCLumaChromaIndex ;// Load Optimized VLC Table for Luminance and Chrominance |
| |
| ;// Initializing the Bitstream Macro |
| |
| M_BD_INIT0 ppBitStream, pBitOffset, RBitStream, RBitBuffer, RBitCount |
| M_LDR videoComp,videoComponstack |
| M_BD_INIT1 T1, T2, T2 |
| ADD pDCLumaChromaIndex,pDCLumaChromaIndex,videoComp, LSL #6 |
| M_BD_INIT2 T1, T2, T2 |
| |
| |
| M_BD_VLD DCValueSize,T1,T2,pDCLumaChromaIndex,4,2 ;// VLC Decode using optimized Luminance and Chrominance VLC Table |
| |
| |
| |
| |
| DecodeDC |
| |
| CMP DCValueSize,#12 |
| BGT ExitError |
| |
| CMP DCValueSize,#0 |
| MOVEQ DCVal,#0 ;// If DCValueSize is zero then DC coeff =0 |
| BEQ ACDecode ;// Branch to perform AC Coeff Decoding |
| |
| M_BD_VREAD16 DCVal,DCValueSize,T1,T2 ;// Get DC Value From Bit stream |
| |
| |
| MOV powOfSize,#1 |
| LSL powOfSize,DCValueSize ;// powOfSize=pow(2,DCValueSize) |
| CMP DCVal,powOfSize,LSR #1 ;// Compare DCVal with powOfSize/2 |
| ADDLT DCVal,DCVal,#1 |
| SUBLT DCVal,DCVal,powOfSize ;// If Lessthan powOfSize/2 DCVal=DCVal-powOfSize+1 |
| ;// Else DCVal= fetchbits from bit stream |
| |
| CheckDCValueSize |
| |
| CMP DCValueSize,#8 ;// If DCValueSize greater than 8 check marker bit |
| |
| BLE ACDecode |
| |
| M_BD_READ8 temp1,1,T1 |
| TEQ temp1,#0 ;// If Marker bit is zero Exit with an Error Message |
| BEQ ExitError |
| |
| |
| |
| ;// Decode AC Coefficient |
| |
| ACDecode |
| |
| M_STR DCVal,pDCCoeff ;// Store Decoded DC Coeff on Stack |
| M_BD_FINI ppBitStream,pBitOffset ;// Terminating the Bit stream Macro |
| |
| LDR pZigzagTable, =armVCM4P2_aClassicalZigzagScan ;// Load Zigzag talbe address |
| ADD pZigzagTable, pZigzagTable, PredDir, LSL #6 ;// Modify the Zigzag table adress based on PredDir |
| |
| M_STR pZigzagTable,ppZigzagTable ;// Store zigzag table on stack |
| LDR pVlcTableL0L1, =armVCM4P2_IntraVlcL0L1 ;// Load Optimized VLC Table With both Last=0 and Last=1 Entries |
| M_STR pVlcTableL0L1,ppVlcTableL0L1 ;// Store Optimized VLC Table on stack |
| LDR pLMAXTableL0L1, =armVCM4P2_IntraL0L1LMAX ;// Load LMAX Table |
| M_STR pLMAXTableL0L1,ppLMAXTableL0L1 ;// Store LMAX table on stack |
| LDR pRMAXTableL0L1, =armVCM4P2_IntraL0L1RMAX ;// Load RMAX Table |
| MOV Count,#1 ;// Set Start =1 |
| |
| M_STR pRMAXTableL0L1,ppRMAXTableL0L1 ;// Store RMAX Table on Stack |
| |
| |
| M_LDR shortVideoHeader,shortVideoHeaderonStack ;// Load the Input Argument From Stack |
| |
| BL armVCM4P2_DecodeVLCZigzag_AC_unsafe ;// Call the Unsafe Function |
| |
| M_LDR DCVal,pDCCoeff ;// Get the Decoded DC Value From Stack |
| STRH DCVal,[pDst] ;// Store the DC Value |
| B ExitOK |
| |
| |
| |
| ExitError |
| |
| M_BD_FINI ppBitStream,pBitOffset ;// Terminating the Bit Stream Macro in case of an Error |
| MOV Return,#OMX_Sts_Err ;// Exit with an Error Message |
| ExitOK |
| |
| M_END |
| ENDIF |
| |
| END |