Home | History | Annotate | Download | only in src
      1 /**
      2  *
      3  * File Name:  omxVCM4P2_DecodeBlockCoef_Inter.c
      4  * OpenMAX DL: v1.0.2
      5  * Revision:   9641
      6  * Date:       Thursday, February 7, 2008
      7  *
      8  * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
      9  *
     10  *
     11  *
     12  * Description:
     13  * Contains modules for inter reconstruction
     14  *
     15  */
     16 
     17 
     18 #include "omxtypes.h"
     19 #include "armOMX.h"
     20 #include "omxVC.h"
     21 
     22 #include "armCOMM.h"
     23 
     24 
     25 /**
     26  * Function:  omxVCM4P2_DecodeBlockCoef_Inter   (6.2.5.4.2)
     27  *
     28  * Description:
     29  * Decodes the INTER block coefficients. This function performs inverse
     30  * quantization, inverse zigzag positioning, and IDCT (with appropriate
     31  * clipping on each step) on the coefficients. The results (residuals) are
     32  * placed in a contiguous array of 64 elements. For INTER block, the output
     33  * buffer holds the residuals for further reconstruction.
     34  *
     35  * Input Arguments:
     36  *
     37  *   ppBitStream - pointer to the pointer to the current byte in the bit
     38  *            stream buffer. There is no boundary check for the bit stream
     39  *            buffer.
     40  *   pBitOffset - pointer to the bit position in the byte pointed to by
     41  *            *ppBitStream. *pBitOffset is valid within [0-7]
     42  *   QP - quantization parameter
     43  *   shortVideoHeader - binary flag indicating presence of
     44  *            short_video_header; shortVideoHeader==1 selects linear intra DC
     45  *            mode, and shortVideoHeader==0 selects non linear intra DC mode.
     46  *
     47  * Output Arguments:
     48  *
     49  *   ppBitStream - *ppBitStream is updated after the block is decoded, so
     50  *            that it points to the current byte in the bit stream buffer
     51  *   pBitOffset - *pBitOffset is updated so that it points to the current bit
     52  *            position in the byte pointed by *ppBitStream
     53  *   pDst - pointer to the decoded residual buffer (a contiguous array of 64
     54  *            elements of OMX_S16 data type); must be aligned on a 16-byte
     55  *            boundary.
     56  *
     57  * Return Value:
     58  *
     59  *    OMX_Sts_NoErr - no error
     60  *    OMX_Sts_BadArgErr - bad arguments, if:
     61  *    -    At least one of the following pointers is Null:
     62  *         ppBitStream, *ppBitStream, pBitOffset , pDst
     63  *    -    *pBitOffset exceeds [0,7]
     64  *    -    QP <= 0.
     65  *    -    pDst is not 16-byte aligned
     66  *    OMX_Sts_Err - status error. Refer to OMX_Sts_Err of DecodeVLCZigzag_Inter .
     67  *
     68  */
     69 OMXResult omxVCM4P2_DecodeBlockCoef_Inter(
     70      const OMX_U8 ** ppBitStream,
     71      OMX_INT * pBitOffset,
     72      OMX_S16 * pDst,
     73      OMX_INT QP,
     74      OMX_INT shortVideoHeader
     75 )
     76 {
     77     /* 64 elements are needed but to align it to 16 bytes need
     78     15 more elements of padding */
     79     OMX_S16 tempBuf[79];
     80     OMX_S16 *pTempBuf1;
     81     OMXResult errorCode;
     82     /* Aligning the local buffers */
     83     pTempBuf1 = armAlignTo16Bytes(tempBuf);
     84 
     85     /* Argument error checks */
     86     armRetArgErrIf(ppBitStream == NULL, OMX_Sts_BadArgErr);
     87     armRetArgErrIf(*ppBitStream == NULL, OMX_Sts_BadArgErr);
     88     armRetArgErrIf(pBitOffset == NULL, OMX_Sts_BadArgErr);
     89     armRetArgErrIf(pDst == NULL, OMX_Sts_BadArgErr);
     90     armRetArgErrIf(!armIs16ByteAligned(pDst), OMX_Sts_BadArgErr);
     91     armRetArgErrIf(((QP <= 0) || (QP >= 32)), OMX_Sts_BadArgErr);
     92 	armRetArgErrIf(((*pBitOffset < 0) || (*pBitOffset > 7)), OMX_Sts_BadArgErr);
     93 
     94 
     95     /* VLD and zigzag */
     96     errorCode = omxVCM4P2_DecodeVLCZigzag_Inter(ppBitStream, pBitOffset,
     97                                         pTempBuf1,shortVideoHeader);
     98     armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
     99 
    100     /* Dequantization */
    101     errorCode = omxVCM4P2_QuantInvInter_I(
    102      pTempBuf1,
    103      QP);
    104     armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
    105 
    106     /* Inverse transform */
    107     errorCode = omxVCM4P2_IDCT8x8blk(pTempBuf1, pDst);
    108     armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
    109 
    110     return OMX_Sts_NoErr;
    111 }
    112 
    113 /* End of file */
    114 
    115 
    116