Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2007-2008 ARM Limited
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  *
     16  */
     17 /**
     18  *
     19  * File Name:  armVCM4P2_PutVLCBits.c
     20  * OpenMAX DL: v1.0.2
     21  * Revision:   9641
     22  * Date:       Thursday, February 7, 2008
     23  *
     24  *
     25  *
     26  *
     27  * Description:
     28  * Contains module for VLC put bits to bitstream
     29  *
     30  */
     31 
     32 #include "omxtypes.h"
     33 #include "armOMX.h"
     34 
     35 #include "armVC.h"
     36 #include "armCOMM.h"
     37 #include "armCOMM_Bitstream.h"
     38 #include "armVCM4P2_ZigZag_Tables.h"
     39 #include "armVCM4P2_Huff_Tables_VLC.h"
     40 
     41 
     42 /**
     43  * Function: armVCM4P2_PutVLCBits
     44  *
     45  * Description:
     46  * Checks the type of Escape Mode and put encoded bits for
     47  * quantized DCT coefficients.
     48  *
     49  * Remarks:
     50  *
     51  * Parameters:
     52  * [in]	 ppBitStream      pointer to the pointer to the current byte in
     53  *						  the bit stream
     54  * [in]	 pBitOffset       pointer to the bit position in the byte pointed
     55  *                        by *ppBitStream. Valid within 0 to 7
     56  * [in] shortVideoHeader binary flag indicating presence of short_video_header; escape modes 0-3 are used if shortVideoHeader==0,
     57  *                           and escape mode 4 is used when shortVideoHeader==1.
     58  * [in]  start            start indicates whether the encoding begins with
     59  *                        0th element or 1st.
     60  * [in]  maxStoreRunL0    Max store possible (considering last and inter/intra)
     61  *                        for last = 0
     62  * [in]  maxStoreRunL1    Max store possible (considering last and inter/intra)
     63  *                        for last = 1
     64  * [in]  maxRunForMultipleEntriesL0
     65  *                        The run value after which level
     66  *                        will be equal to 1:
     67  *                        (considering last and inter/intra status) for last = 0
     68  * [in]  maxRunForMultipleEntriesL1
     69  *                        The run value after which level
     70  *                        will be equal to 1:
     71  *                        (considering last and inter/intra status) for last = 1
     72  * [in]  pRunIndexTableL0 Run Index table defined in
     73  *                        armVCM4P2_Huff_Tables_VLC.c for last == 0
     74  * [in]  pVlcTableL0      VLC table for last == 0
     75  * [in]  pRunIndexTableL1 Run Index table defined in
     76  *                        armVCM4P2_Huff_Tables_VLC.c for last == 1
     77  * [in]  pVlcTableL1      VLC table for last == 1
     78  * [in]  pLMAXTableL0     Level MAX table defined in
     79  *                        armVCM4P2_Huff_Tables_VLC.c for last == 0
     80  * [in]  pLMAXTableL1     Level MAX table defined in
     81  *                        armVCM4P2_Huff_Tables_VLC.c for last == 1
     82  * [in]  pRMAXTableL0     Run MAX table defined in
     83  *                        armVCM4P2_Huff_Tables_VLC.c for last == 0
     84  * [in]  pRMAXTableL1     Run MAX table defined in
     85  *                        armVCM4P2_Huff_Tables_VLC.c for last == 1
     86  * [out] pQDctBlkCoef     pointer to the quantized DCT coefficient
     87  * [out] ppBitStream      *ppBitStream is updated after the block is encoded
     88  *                        so that it points to the current byte in the bit
     89  *                        stream buffer.
     90  * [out] pBitOffset       *pBitOffset is updated so that it points to the
     91  *                        current bit position in the byte pointed by
     92  *                        *ppBitStream.
     93  *
     94  * Return Value:
     95  * Standard OMXResult result. See enumeration for possible result codes.
     96  *
     97  */
     98 
     99 
    100 OMXResult armVCM4P2_PutVLCBits (
    101               OMX_U8 **ppBitStream,
    102               OMX_INT * pBitOffset,
    103               const OMX_S16 *pQDctBlkCoef,
    104               OMX_INT shortVideoHeader,
    105               OMX_U8 start,
    106               OMX_U8 maxStoreRunL0,
    107               OMX_U8 maxStoreRunL1,
    108               OMX_U8  maxRunForMultipleEntriesL0,
    109               OMX_U8  maxRunForMultipleEntriesL1,
    110               const OMX_U8  * pRunIndexTableL0,
    111               const ARM_VLC32 *pVlcTableL0,
    112 			  const OMX_U8  * pRunIndexTableL1,
    113               const ARM_VLC32 *pVlcTableL1,
    114               const OMX_U8  * pLMAXTableL0,
    115               const OMX_U8  * pLMAXTableL1,
    116               const OMX_U8  * pRMAXTableL0,
    117               const OMX_U8  * pRMAXTableL1,
    118               const OMX_U8  * pZigzagTable
    119 )
    120 {
    121 
    122     OMX_U32 storeRun = 0, run, storeRunPlus;
    123     OMX_U8  last = 0, first = 1, fMode;
    124     OMX_S16 level, storeLevel = 0, storeLevelPlus;
    125     OMX_INT i;
    126 
    127         /* RLE encoding and packing the bits into the streams */
    128         for (i = start, run=0; i < 64; i++)
    129         {
    130             level   = pQDctBlkCoef[pZigzagTable[i]];
    131 
    132             /* Counting the run */
    133             if (level == 0)
    134             {
    135                 run++;
    136             }
    137 
    138             /* Found a non-zero coeff */
    139             else
    140             {
    141                 if (first == 0)
    142                 {
    143                     last = 0;
    144 
    145                     /* Check for a valid entry in the VLC table */
    146                     storeLevelPlus = armSignCheck(storeLevel) *
    147                       (armAbs(storeLevel) - pLMAXTableL0[storeRun]);
    148                     storeRunPlus = storeRun -
    149                                   (pRMAXTableL0[armAbs(storeLevel) - 1] + 1);
    150 
    151                     fMode = armVCM4P2_CheckVLCEscapeMode(
    152                                              storeRun,
    153                                              storeRunPlus,
    154                                              storeLevel,
    155                                              storeLevelPlus,
    156                                              maxStoreRunL0,
    157                                              maxRunForMultipleEntriesL0,
    158                                              shortVideoHeader,
    159                                              pRunIndexTableL0);
    160 
    161                     armVCM4P2_FillVLCBuffer (
    162                                       ppBitStream,
    163                                       pBitOffset,
    164                                       storeRun,
    165                                       storeLevel,
    166 									  storeRunPlus,
    167                                       storeLevelPlus,
    168                                       fMode,
    169 									  last,
    170                                       maxRunForMultipleEntriesL0,
    171                                       pRunIndexTableL0,
    172                                       pVlcTableL0);
    173                 }
    174                 storeLevel = level;
    175                 storeRun   = run;
    176                 first = 0;
    177                 run = 0;
    178             }
    179 
    180         } /* end of for loop for 64 elements */
    181 
    182         /* writing the last element */
    183         last = 1;
    184 
    185         /* Check for a valid entry in the VLC table */
    186         storeLevelPlus = armSignCheck(storeLevel) *
    187                         (armAbs(storeLevel) - pLMAXTableL1[run]);
    188         storeRunPlus = storeRun -
    189                       (pRMAXTableL1[armAbs(storeLevel) - 1] + 1);
    190         fMode = armVCM4P2_CheckVLCEscapeMode(
    191                                  storeRun,
    192                                  storeRunPlus,
    193                                  storeLevel,
    194                                  storeLevelPlus,
    195                                  maxStoreRunL1,
    196                                  maxRunForMultipleEntriesL1,
    197                                  shortVideoHeader,
    198                                  pRunIndexTableL1);
    199 
    200         armVCM4P2_FillVLCBuffer (
    201                           ppBitStream,
    202                           pBitOffset,
    203                           storeRun,
    204                           storeLevel,
    205 						  storeRunPlus,
    206                           storeLevelPlus,
    207                           fMode,
    208 						  last,
    209                           maxRunForMultipleEntriesL1,
    210                           pRunIndexTableL1,
    211                           pVlcTableL1);
    212 	return OMX_Sts_NoErr;
    213 }
    214 
    215 /* End of File */
    216