Home | History | Annotate | Download | only in src
      1 /**
      2  *
      3  * File Name:  armVCM4P2_EncodeVLCZigzag_intra.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 zigzag scanning and VLC encoding
     14  * for intra block.
     15  *
     16  */
     17 
     18 #include "omxtypes.h"
     19 #include "armOMX.h"
     20 #include "omxVC.h"
     21 
     22 #include "armVC.h"
     23 #include "armCOMM_Bitstream.h"
     24 #include "armCOMM.h"
     25 #include "armVCM4P2_Huff_Tables_VLC.h"
     26 #include "armVCM4P2_ZigZag_Tables.h"
     27 
     28 
     29 
     30 /**
     31  * Function: armVCM4P2_EncodeVLCZigzag_Intra
     32  *
     33  * Description:
     34  * Performs zigzag scanning and VLC encoding for one intra block.
     35  *
     36  * Remarks:
     37  *
     38  * Parameters:
     39  * [in] ppBitStream     pointer to the pointer to the current byte in
     40  *                              the bit stream
     41  * [in] pBitOffset      pointer to the bit position in the byte pointed
     42  *                              by *ppBitStream. Valid within 0 to 7.
     43  * [in] pQDctBlkCoef    pointer to the quantized DCT coefficient
     44  * [in] predDir         AC prediction direction, which is used to decide
     45  *                              the zigzag scan pattern. This takes one of the
     46  *                              following values:
     47  *                              OMX_VC_NONE          AC prediction not used.
     48  *                                                      Performs classical zigzag
     49  *                                                      scan.
     50  *                              OMX_VC_HORIZONTAL    Horizontal prediction.
     51  *                                                      Performs alternate-vertical
     52  *                                                      zigzag scan.
     53  *                              OMX_VC_VERTICAL      Vertical prediction.
     54  *                                                      Performs alternate-horizontal
     55  *                                                      zigzag scan.
     56  * [in] pattern         block pattern which is used to decide whether
     57  *                              this block is encoded
     58  * [in] start           start indicates whether the encoding begins with 0th element
     59  *                      or 1st.
     60  * [out]    ppBitStream     *ppBitStream is updated after the block is encoded,
     61  *                              so that it points to the current byte in the bit
     62  *                              stream buffer.
     63  * [out]    pBitOffset      *pBitOffset is updated so that it points to the
     64  *                              current bit position in the byte pointed by
     65  *                              *ppBitStream.
     66  *
     67  * Return Value:
     68  * Standard OMXResult result. See enumeration for possible result codes.
     69  *
     70  */
     71 
     72 OMXResult armVCM4P2_EncodeVLCZigzag_Intra(
     73      OMX_U8 **ppBitStream,
     74      OMX_INT *pBitOffset,
     75      const OMX_S16 *pQDctBlkCoef,
     76      OMX_U8 predDir,
     77      OMX_U8 pattern,
     78      OMX_INT shortVideoHeader,
     79      OMX_U8 start
     80 )
     81 {
     82     const OMX_U8  *pZigzagTable = armVCM4P2_aClassicalZigzagScan;
     83     OMXResult errorCode;
     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(pQDctBlkCoef == NULL, OMX_Sts_BadArgErr);
     90     armRetArgErrIf((*pBitOffset < 0) || (*pBitOffset >7), OMX_Sts_BadArgErr);
     91     armRetArgErrIf(start > 1, OMX_Sts_BadArgErr);
     92     armRetArgErrIf(predDir > 2, OMX_Sts_BadArgErr);
     93 
     94     if (pattern)
     95     {
     96         switch (predDir)
     97         {
     98             case OMX_VC_NONE:
     99             {
    100                 pZigzagTable = armVCM4P2_aClassicalZigzagScan;
    101                 break;
    102             }
    103 
    104             case OMX_VC_HORIZONTAL:
    105             {
    106                 pZigzagTable = armVCM4P2_aVerticalZigzagScan;
    107                 break;
    108             }
    109 
    110             case OMX_VC_VERTICAL:
    111             {
    112                 pZigzagTable = armVCM4P2_aHorizontalZigzagScan;
    113                 break;
    114             }
    115         }
    116 
    117         errorCode = armVCM4P2_PutVLCBits (
    118               ppBitStream,
    119               pBitOffset,
    120               pQDctBlkCoef,
    121               shortVideoHeader,
    122               start,
    123               14,
    124               20,
    125               9,
    126               6,
    127               armVCM4P2_IntraL0RunIdx,
    128               armVCM4P2_IntraVlcL0,
    129 			  armVCM4P2_IntraL1RunIdx,
    130               armVCM4P2_IntraVlcL1,
    131               armVCM4P2_IntraL0LMAX,
    132               armVCM4P2_IntraL1LMAX,
    133               armVCM4P2_IntraL0RMAX,
    134               armVCM4P2_IntraL1RMAX,
    135               pZigzagTable
    136         );
    137         armRetDataErrIf((errorCode != OMX_Sts_NoErr), errorCode);
    138 
    139     } /* Pattern check ends*/
    140 
    141     return (OMX_Sts_NoErr);
    142 
    143 }
    144 
    145 /* End of file */
    146