| ;/** |
| ; * |
| ; * File Name: omxVCM4P2_QuantInvIntra_I_s.s |
| ; * OpenMAX DL: v1.0.2 |
| ; * Revision: 12290 |
| ; * Date: Wednesday, April 9, 2008 |
| ; * |
| ; * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. |
| ; * |
| ; * |
| ; * |
| ; * Description: |
| ; * Contains modules for inter reconstruction |
| ; * |
| ; * |
| ; * |
| ; * |
| ; * |
| ; * |
| ; * Function: omxVCM4P2_QuantInvIntra_I |
| ; * |
| ; * Description: |
| ; * Performs inverse quantization on intra/inter coded block. |
| ; * This function supports bits_per_pixel = 8. Mismatch control |
| ; * is performed for the first MPEG-4 mode inverse quantization method. |
| ; * The output coefficients are clipped to the range: [-2048, 2047]. |
| ; * Mismatch control is performed for the first inverse quantization method. |
| ; * |
| ; * Remarks: |
| ; * |
| ; * Parameters: |
| ; * [in] pSrcDst pointer to the input (quantized) intra/inter block. Must be 16-byte aligned. |
| ; * [in] QP quantization parameter (quantiser_scale) |
| ; * [in] videoComp (Intra version only.) Video component type of the |
| ; * current block. Takes one of the following flags: |
| ; * OMX_VC_LUMINANCE, OMX_VC_CHROMINANCE, |
| ; * OMX_VC_ALPHA. |
| ; * [in] shortVideoHeader a flag indicating presence of short_video_header; |
| ; * shortVideoHeader==1 selects linear intra DC mode, |
| ; * and shortVideoHeader==0 selects nonlinear intra DC mode. |
| ; * [out] pSrcDst pointer to the output (dequantized) intra/inter block. Must be 16-byte aligned. |
| ; * |
| ; * Return Value: |
| ; * OMX_Sts_NoErr - no error |
| ; * OMX_Sts_BadArgErr - bad arguments |
| ; * - If pSrcDst is NULL or is not 16-byte aligned. |
| ; * or |
| ; * - If QP <= 0. |
| ; * or |
| ; * - videoComp is none of OMX_VC_LUMINANCE, OMX_VC_CHROMINANCE and OMX_VC_ALPHA. |
| ; * |
| |
| |
| INCLUDE omxtypes_s.h |
| INCLUDE armCOMM_s.h |
| |
| M_VARIANTS CortexA8 |
| |
| |
| IMPORT armVCM4P2_DCScaler |
| |
| IF CortexA8 |
| |
| |
| ;//Input Arguments |
| pSrcDst RN 0 |
| QP RN 1 |
| videoComp RN 2 |
| shortVideoHeader RN 3 |
| |
| |
| ;//Local Variables |
| |
| dcScaler RN 4 |
| temp RN 14 |
| index RN 5 |
| |
| |
| Count RN 5 |
| doubleQP RN 4 |
| Return RN 0 |
| |
| |
| ;// Neon registers |
| |
| |
| dQP10 DN D0.S32[0] |
| qQP1 QN Q0.S32 |
| |
| dQP1 DN D0.S16 |
| dMinusQP1 DN D1.S16 |
| |
| dCoeff0 DN D2.S16 |
| dCoeff1 DN D3.S16 |
| |
| qResult0 QN Q3.S32 |
| dResult0 DN D7.S16 |
| qSign0 QN Q3.S32 |
| dSign0 DN D6.S16 |
| |
| qResult1 QN Q4.S32 |
| dResult1 DN D8.S16 |
| qSign1 QN Q4.S32 |
| dSign1 DN D8.S16 |
| |
| d2QP0 DN D10.S32[0] |
| q2QP0 QN Q5.S32 |
| d2QP DN D10.S16 |
| |
| dZero0 DN D11.S16 |
| dZero1 DN D4.S16 |
| dConst0 DN D5.S16 |
| |
| |
| |
| |
| |
| |
| M_START omxVCM4P2_QuantInvIntra_I,r5,d11 |
| |
| |
| ;// Perform Inverse Quantization for DC coefficient |
| |
| TEQ shortVideoHeader,#0 ;// Test if short Video Header flag =0 |
| MOVNE dcScaler,#8 ;// if shortVideoHeader is non zero dcScaler=8 |
| BNE calDCVal |
| |
| LDR index, =armVCM4P2_DCScaler |
| ADD index,index,videoComp,LSL #5 |
| LDRB dcScaler,[index,QP] |
| |
| ;//M_CalDCScalar shortVideoHeader,videoComp, QP |
| |
| calDCVal |
| |
| LDRH temp,[pSrcDst] |
| SMULBB temp,temp,dcScaler ;// dcCoeff = dcScaler * Quantized DC coefficient(from memory) |
| SSAT temp,#12,temp ;// Saturating to 12 bits |
| |
| |
| |
| ;// Perform Inverse Quantization for Ac Coefficients |
| |
| |
| |
| ADD doubleQP,QP,QP ;// doubleQP= 2*QP |
| VMOV d2QP0,doubleQP |
| VDUP q2QP0,d2QP0 ;// Move doubleQP in to a scalar |
| TST QP,#1 |
| VLD1 {dCoeff0,dCoeff1},[pSrcDst] ;// Load first 8 values to Coeff0,Coeff1 |
| SUBEQ QP,QP,#1 |
| VMOV dQP10,QP ;// If QP is even then QP1=QP-1 else QP1=QP |
| MOV Count,#64 |
| VDUP qQP1,dQP10 ;// Duplicate tempResult with QP1 |
| VSHRN d2QP,q2QP0,#0 |
| VEOR dConst0,dConst0,dConst0 |
| VSHRN dQP1,qQP1,#0 ;// QP1 truncated to 16 bits |
| VSUB dMinusQP1,dConst0,dQP1 ;// dMinusQP1=-QP1 |
| |
| Loop |
| |
| ;//Performing Inverse Quantization |
| |
| VCLT dSign0,dCoeff0, #0 ;// Compare Coefficient 0 against 0 |
| VCLT dSign1,dCoeff1, #0 ;// Compare Coefficient 1 against 0 |
| VCEQ dZero0,dCoeff0,#0 ;// Compare Coefficient 0 against zero |
| VBSL dSign0,dMinusQP1,dQP1 ;// dSign0 = -QP1 if Coeff0< 0 else QP1 |
| VCEQ dZero1,dCoeff1,#0 ;// Compare Coefficient 1 against zero |
| VBSL dSign1,dMinusQP1,dQP1 ;// dSign1 = -QP1 if Coeff1< 0 else QP1 |
| VMOVL qSign0,dSign0 ;// Sign extend qSign0 to 32 bits |
| VMOVL qSign1,dSign1 |
| VMLAL qResult0,dCoeff0,d2QP ;// qResult0[i]= qCoeff0[i]+qCoeff0[i]*(-2) if Coeff <0 |
| ;// qResult0[i]= qCoeff0[i] if Coeff >=0 |
| VMLAL qResult1,dCoeff1,d2QP ;// qResult1[i]= qCoeff1[i]+qCoeff1[i]*(-2) if Coeff <0 |
| ;// qResult1[i]= qCoeff1[i] if Coeff >=0 |
| ;// Clip Result to [-2048,2047] |
| |
| VQSHL qResult0,qResult0,#20 ;// clip to [-2048,2047] |
| VQSHL qResult1,qResult1,#20 |
| |
| VSHR qResult0,qResult0,#4 |
| VSHR qResult1,qResult1,#4 |
| VSHRN dResult0,qResult0,#16 ;// Narrow the clipped Value to Halfword |
| VSHRN dResult1,qResult1,#16 |
| VBIT dResult0,dConst0,dZero0 |
| VBIT dResult1,dConst0,dZero1 |
| |
| VST1 {dResult0,dResult1},[pSrcDst]! ;// Store the result |
| SUBS Count,Count,#8 |
| VLD1 {dCoeff0,dCoeff1},[pSrcDst] |
| |
| |
| BGT Loop |
| |
| SUB pSrcDst,pSrcDst,#128 |
| |
| ;// Store the Inverse quantized Dc coefficient |
| |
| STRH temp,[pSrcDst],#2 |
| |
| MOV Return,#OMX_Sts_NoErr |
| |
| |
| |
| M_END |
| ENDIF |
| |
| |
| END |
| |