178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar/*
278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Copyright (C) 2007-2008 ARM Limited
378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * you may not use this file except in compliance with the License.
678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * You may obtain a copy of the License at
778e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
878e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
978e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
1078e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * Unless required by applicable law or agreed to in writing, software
1178e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
1278e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1378e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * See the License for the specific language governing permissions and
1478e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar * limitations under the License.
1578e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar *
1678e52bfac041d71ce53b5b13c2abf78af742b09dLajos Molnar */
170c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
180c1bc742181ded4930842b46e9507372f0b1b963James Dong *
190c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name:  armCOMM_Bitstream.c
200c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2
210c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision:   9641
220c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date:       Thursday, February 7, 2008
230c1bc742181ded4930842b46e9507372f0b1b963James Dong *
240c1bc742181ded4930842b46e9507372f0b1b963James Dong *
250c1bc742181ded4930842b46e9507372f0b1b963James Dong *
260c1bc742181ded4930842b46e9507372f0b1b963James Dong *
270c1bc742181ded4930842b46e9507372f0b1b963James Dong * Defines bitstream encode and decode functions common to all codecs
280c1bc742181ded4930842b46e9507372f0b1b963James Dong */
290c1bc742181ded4930842b46e9507372f0b1b963James Dong
300c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h"
310c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h"
320c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM_Bitstream.h"
330c1bc742181ded4930842b46e9507372f0b1b963James Dong
340c1bc742181ded4930842b46e9507372f0b1b963James Dong/***************************************
350c1bc742181ded4930842b46e9507372f0b1b963James Dong * Fixed bit length Decode
360c1bc742181ded4930842b46e9507372f0b1b963James Dong ***************************************/
370c1bc742181ded4930842b46e9507372f0b1b963James Dong
380c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
390c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: armLookAheadBits()
400c1bc742181ded4930842b46e9507372f0b1b963James Dong *
410c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
420c1bc742181ded4930842b46e9507372f0b1b963James Dong * Get the next N bits from the bitstream without advancing the bitstream pointer
430c1bc742181ded4930842b46e9507372f0b1b963James Dong *
440c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
450c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     **ppBitStream
460c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     *pOffset
470c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     N=1...32
480c1bc742181ded4930842b46e9507372f0b1b963James Dong *
490c1bc742181ded4930842b46e9507372f0b1b963James Dong * Returns  Value
500c1bc742181ded4930842b46e9507372f0b1b963James Dong */
510c1bc742181ded4930842b46e9507372f0b1b963James Dong
520c1bc742181ded4930842b46e9507372f0b1b963James DongOMX_U32 armLookAheadBits(const OMX_U8 **ppBitStream, OMX_INT *pOffset, OMX_INT N)
530c1bc742181ded4930842b46e9507372f0b1b963James Dong{
540c1bc742181ded4930842b46e9507372f0b1b963James Dong    const OMX_U8 *pBitStream = *ppBitStream;
550c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_INT Offset = *pOffset;
560c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_U32 Value;
570c1bc742181ded4930842b46e9507372f0b1b963James Dong
580c1bc742181ded4930842b46e9507372f0b1b963James Dong    armAssert(Offset>=0 && Offset<=7);
590c1bc742181ded4930842b46e9507372f0b1b963James Dong    armAssert(N>=1 && N<=32);
600c1bc742181ded4930842b46e9507372f0b1b963James Dong
610c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Read next 32 bits from stream */
620c1bc742181ded4930842b46e9507372f0b1b963James Dong    Value = (pBitStream[0] << 24 ) | ( pBitStream[1] << 16)  | (pBitStream[2] << 8 ) | (pBitStream[3]) ;
630c1bc742181ded4930842b46e9507372f0b1b963James Dong    Value = (Value << Offset ) | (pBitStream[4] >> (8-Offset));
640c1bc742181ded4930842b46e9507372f0b1b963James Dong
650c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Return N bits */
660c1bc742181ded4930842b46e9507372f0b1b963James Dong    return Value >> (32-N);
670c1bc742181ded4930842b46e9507372f0b1b963James Dong}
680c1bc742181ded4930842b46e9507372f0b1b963James Dong
690c1bc742181ded4930842b46e9507372f0b1b963James Dong
700c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
710c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: armGetBits()
720c1bc742181ded4930842b46e9507372f0b1b963James Dong *
730c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
740c1bc742181ded4930842b46e9507372f0b1b963James Dong * Read N bits from the bitstream
750c1bc742181ded4930842b46e9507372f0b1b963James Dong *
760c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
770c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     *ppBitStream
780c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     *pOffset
790c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     N=1..32
800c1bc742181ded4930842b46e9507372f0b1b963James Dong *
810c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]    *ppBitStream
820c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]    *pOffset
830c1bc742181ded4930842b46e9507372f0b1b963James Dong * Returns  Value
840c1bc742181ded4930842b46e9507372f0b1b963James Dong */
850c1bc742181ded4930842b46e9507372f0b1b963James Dong
860c1bc742181ded4930842b46e9507372f0b1b963James Dong
870c1bc742181ded4930842b46e9507372f0b1b963James DongOMX_U32 armGetBits(const OMX_U8 **ppBitStream, OMX_INT *pOffset, OMX_INT N)
880c1bc742181ded4930842b46e9507372f0b1b963James Dong{
890c1bc742181ded4930842b46e9507372f0b1b963James Dong    const OMX_U8 *pBitStream = *ppBitStream;
900c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_INT Offset = *pOffset;
910c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_U32 Value;
920c1bc742181ded4930842b46e9507372f0b1b963James Dong
930c1bc742181ded4930842b46e9507372f0b1b963James Dong    if(N == 0)
940c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
950c1bc742181ded4930842b46e9507372f0b1b963James Dong      return 0;
960c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
970c1bc742181ded4930842b46e9507372f0b1b963James Dong
980c1bc742181ded4930842b46e9507372f0b1b963James Dong    armAssert(Offset>=0 && Offset<=7);
990c1bc742181ded4930842b46e9507372f0b1b963James Dong    armAssert(N>=1 && N<=32);
1000c1bc742181ded4930842b46e9507372f0b1b963James Dong
1010c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Read next 32 bits from stream */
1020c1bc742181ded4930842b46e9507372f0b1b963James Dong    Value = (pBitStream[0] << 24 ) | ( pBitStream[1] << 16)  | (pBitStream[2] << 8 ) | (pBitStream[3]) ;
1030c1bc742181ded4930842b46e9507372f0b1b963James Dong    Value = (Value << Offset ) | (pBitStream[4] >> (8-Offset));
1040c1bc742181ded4930842b46e9507372f0b1b963James Dong
1050c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Advance bitstream pointer by N bits */
1060c1bc742181ded4930842b46e9507372f0b1b963James Dong    Offset += N;
1070c1bc742181ded4930842b46e9507372f0b1b963James Dong    *ppBitStream = pBitStream + (Offset>>3);
1080c1bc742181ded4930842b46e9507372f0b1b963James Dong    *pOffset = Offset & 7;
1090c1bc742181ded4930842b46e9507372f0b1b963James Dong
1100c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Return N bits */
1110c1bc742181ded4930842b46e9507372f0b1b963James Dong    return Value >> (32-N);
1120c1bc742181ded4930842b46e9507372f0b1b963James Dong}
1130c1bc742181ded4930842b46e9507372f0b1b963James Dong
1140c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
1150c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: armByteAlign()
1160c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1170c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
1180c1bc742181ded4930842b46e9507372f0b1b963James Dong * Align the pointer *ppBitStream to the next byte boundary
1190c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1200c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
1210c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     *ppBitStream
1220c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     *pOffset
1230c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1240c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]    *ppBitStream
1250c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]    *pOffset
1260c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1270c1bc742181ded4930842b46e9507372f0b1b963James Dong **/
1280c1bc742181ded4930842b46e9507372f0b1b963James Dong
1290c1bc742181ded4930842b46e9507372f0b1b963James DongOMXVoid armByteAlign(const OMX_U8 **ppBitStream,OMX_INT *pOffset)
1300c1bc742181ded4930842b46e9507372f0b1b963James Dong{
1310c1bc742181ded4930842b46e9507372f0b1b963James Dong    if(*pOffset > 0)
1320c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
1330c1bc742181ded4930842b46e9507372f0b1b963James Dong        *ppBitStream += 1;
1340c1bc742181ded4930842b46e9507372f0b1b963James Dong        *pOffset = 0;
1350c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
1360c1bc742181ded4930842b46e9507372f0b1b963James Dong}
1370c1bc742181ded4930842b46e9507372f0b1b963James Dong
1380c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
1390c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: armSkipBits()
1400c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1410c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
1420c1bc742181ded4930842b46e9507372f0b1b963James Dong * Skip N bits from the value at *ppBitStream
1430c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1440c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
1450c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     *ppBitStream
1460c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     *pOffset
1470c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     N
1480c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1490c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]    *ppBitStream
1500c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]    *pOffset
1510c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1520c1bc742181ded4930842b46e9507372f0b1b963James Dong **/
1530c1bc742181ded4930842b46e9507372f0b1b963James Dong
1540c1bc742181ded4930842b46e9507372f0b1b963James Dong
1550c1bc742181ded4930842b46e9507372f0b1b963James DongOMXVoid armSkipBits(const OMX_U8 **ppBitStream,OMX_INT *pOffset,OMX_INT N)
1560c1bc742181ded4930842b46e9507372f0b1b963James Dong{
1570c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_INT Offset = *pOffset;
1580c1bc742181ded4930842b46e9507372f0b1b963James Dong    const OMX_U8 *pBitStream = *ppBitStream;
1590c1bc742181ded4930842b46e9507372f0b1b963James Dong
1600c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Advance bitstream pointer by N bits */
1610c1bc742181ded4930842b46e9507372f0b1b963James Dong    Offset += N;
1620c1bc742181ded4930842b46e9507372f0b1b963James Dong    *ppBitStream = pBitStream + (Offset>>3);
1630c1bc742181ded4930842b46e9507372f0b1b963James Dong    *pOffset = Offset & 7;
1640c1bc742181ded4930842b46e9507372f0b1b963James Dong}
1650c1bc742181ded4930842b46e9507372f0b1b963James Dong
1660c1bc742181ded4930842b46e9507372f0b1b963James Dong/***************************************
1670c1bc742181ded4930842b46e9507372f0b1b963James Dong * Variable bit length Decode
1680c1bc742181ded4930842b46e9507372f0b1b963James Dong ***************************************/
1690c1bc742181ded4930842b46e9507372f0b1b963James Dong
1700c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
1710c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: armUnPackVLC32()
1720c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1730c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
1740c1bc742181ded4930842b46e9507372f0b1b963James Dong * Variable length decode of variable length symbol (max size 32 bits) read from
1750c1bc742181ded4930842b46e9507372f0b1b963James Dong * the bit stream pointed by *ppBitStream at *pOffset by using the table
1760c1bc742181ded4930842b46e9507372f0b1b963James Dong * pointed by pCodeBook
1770c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1780c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
1790c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     *pBitStream
1800c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     *pOffset
1810c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]     pCodeBook
1820c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1830c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]    *pBitStream
1840c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]    *pOffset
1850c1bc742181ded4930842b46e9507372f0b1b963James Dong *
1860c1bc742181ded4930842b46e9507372f0b1b963James Dong * Returns : Code Book Index if successfull.
1870c1bc742181ded4930842b46e9507372f0b1b963James Dong *         : ARM_NO_CODEBOOK_INDEX = -1 if search fails.
1880c1bc742181ded4930842b46e9507372f0b1b963James Dong **/
1890c1bc742181ded4930842b46e9507372f0b1b963James Dong#ifndef C_OPTIMIZED_IMPLEMENTATION
1900c1bc742181ded4930842b46e9507372f0b1b963James Dong
1910c1bc742181ded4930842b46e9507372f0b1b963James DongOMX_U16 armUnPackVLC32(
1920c1bc742181ded4930842b46e9507372f0b1b963James Dong    const OMX_U8 **ppBitStream,
1930c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_INT *pOffset,
1940c1bc742181ded4930842b46e9507372f0b1b963James Dong    const ARM_VLC32 *pCodeBook
1950c1bc742181ded4930842b46e9507372f0b1b963James Dong)
1960c1bc742181ded4930842b46e9507372f0b1b963James Dong{
1970c1bc742181ded4930842b46e9507372f0b1b963James Dong    const OMX_U8 *pBitStream = *ppBitStream;
1980c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_INT Offset = *pOffset;
1990c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_U32 Value;
2000c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_INT Index;
2010c1bc742181ded4930842b46e9507372f0b1b963James Dong
2020c1bc742181ded4930842b46e9507372f0b1b963James Dong    armAssert(Offset>=0 && Offset<=7);
2030c1bc742181ded4930842b46e9507372f0b1b963James Dong
2040c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Read next 32 bits from stream */
2050c1bc742181ded4930842b46e9507372f0b1b963James Dong    Value = (pBitStream[0] << 24 ) | ( pBitStream[1] << 16)  | (pBitStream[2] << 8 ) | (pBitStream[3]) ;
2060c1bc742181ded4930842b46e9507372f0b1b963James Dong    Value = (Value << Offset ) | (pBitStream[4] >> (8-Offset));
2070c1bc742181ded4930842b46e9507372f0b1b963James Dong
2080c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Search through the codebook */
2090c1bc742181ded4930842b46e9507372f0b1b963James Dong    for (Index=0; pCodeBook->codeLen != 0; Index++)
2100c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
2110c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (pCodeBook->codeWord == (Value >> (32 - pCodeBook->codeLen)))
2120c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
2130c1bc742181ded4930842b46e9507372f0b1b963James Dong            Offset       = Offset + pCodeBook->codeLen;
2140c1bc742181ded4930842b46e9507372f0b1b963James Dong            *ppBitStream = pBitStream + (Offset >> 3) ;
2150c1bc742181ded4930842b46e9507372f0b1b963James Dong            *pOffset     = Offset & 7;
2160c1bc742181ded4930842b46e9507372f0b1b963James Dong
2170c1bc742181ded4930842b46e9507372f0b1b963James Dong            return Index;
2180c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
2190c1bc742181ded4930842b46e9507372f0b1b963James Dong        pCodeBook++;
2200c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
2210c1bc742181ded4930842b46e9507372f0b1b963James Dong
2220c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* No code match found */
2230c1bc742181ded4930842b46e9507372f0b1b963James Dong    return ARM_NO_CODEBOOK_INDEX;
2240c1bc742181ded4930842b46e9507372f0b1b963James Dong}
2250c1bc742181ded4930842b46e9507372f0b1b963James Dong
2260c1bc742181ded4930842b46e9507372f0b1b963James Dong#endif
2270c1bc742181ded4930842b46e9507372f0b1b963James Dong
2280c1bc742181ded4930842b46e9507372f0b1b963James Dong/***************************************
2290c1bc742181ded4930842b46e9507372f0b1b963James Dong * Fixed bit length Encode
2300c1bc742181ded4930842b46e9507372f0b1b963James Dong ***************************************/
2310c1bc742181ded4930842b46e9507372f0b1b963James Dong
2320c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
2330c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: armPackBits
2340c1bc742181ded4930842b46e9507372f0b1b963James Dong *
2350c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
2360c1bc742181ded4930842b46e9507372f0b1b963James Dong * Pack a VLC code word into the bitstream
2370c1bc742181ded4930842b46e9507372f0b1b963James Dong *
2380c1bc742181ded4930842b46e9507372f0b1b963James Dong * Remarks:
2390c1bc742181ded4930842b46e9507372f0b1b963James Dong *
2400c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
2410c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] ppBitStream     pointer to the pointer to the current byte
2420c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      in the bit stream.
2430c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] pOffset         pointer to the bit position in the byte
2440c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      pointed by *ppBitStream. Valid within 0
2450c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      to 7.
2460c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] codeWord        Code word that need to be inserted in to the
2470c1bc742181ded4930842b46e9507372f0b1b963James Dong *                          bitstream
2480c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] codeLength      Length of the code word valid range 1...32
2490c1bc742181ded4930842b46e9507372f0b1b963James Dong *
2500c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] ppBitStream    *ppBitStream is updated after the block is encoded,
2510c1bc742181ded4930842b46e9507372f0b1b963James Dong *                          so that it points to the current byte in the bit
2520c1bc742181ded4930842b46e9507372f0b1b963James Dong *                          stream buffer.
2530c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] pBitOffset     *pBitOffset is updated so that it points to the
2540c1bc742181ded4930842b46e9507372f0b1b963James Dong *                          current bit position in the byte pointed by
2550c1bc742181ded4930842b46e9507372f0b1b963James Dong *                          *ppBitStream.
2560c1bc742181ded4930842b46e9507372f0b1b963James Dong *
2570c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value:
2580c1bc742181ded4930842b46e9507372f0b1b963James Dong * Standard OMX_RESULT result. See enumeration for possible result codes.
2590c1bc742181ded4930842b46e9507372f0b1b963James Dong *
2600c1bc742181ded4930842b46e9507372f0b1b963James Dong */
2610c1bc742181ded4930842b46e9507372f0b1b963James Dong
2620c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult armPackBits (
2630c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_U8  **ppBitStream,
2640c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_INT *pOffset,
2650c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_U32 codeWord,
2660c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_INT codeLength
2670c1bc742181ded4930842b46e9507372f0b1b963James Dong)
2680c1bc742181ded4930842b46e9507372f0b1b963James Dong{
2690c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_U8  *pBitStream = *ppBitStream;
2700c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_INT Offset = *pOffset;
2710c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_U32 Value;
2720c1bc742181ded4930842b46e9507372f0b1b963James Dong
2730c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* checking argument validity */
2740c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(Offset < 0, OMX_Sts_BadArgErr);
2750c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(Offset > 7, OMX_Sts_BadArgErr);
2760c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(codeLength < 1, OMX_Sts_BadArgErr);
2770c1bc742181ded4930842b46e9507372f0b1b963James Dong    armRetArgErrIf(codeLength > 32, OMX_Sts_BadArgErr);
2780c1bc742181ded4930842b46e9507372f0b1b963James Dong
2790c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Prepare the first byte */
2800c1bc742181ded4930842b46e9507372f0b1b963James Dong    codeWord = codeWord << (32-codeLength);
2810c1bc742181ded4930842b46e9507372f0b1b963James Dong    Value = (pBitStream[0] >> (8-Offset)) << (8-Offset);
2820c1bc742181ded4930842b46e9507372f0b1b963James Dong    Value = Value | (codeWord >> (24+Offset));
2830c1bc742181ded4930842b46e9507372f0b1b963James Dong
2840c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Write out whole bytes */
2850c1bc742181ded4930842b46e9507372f0b1b963James Dong    while (8-Offset <= codeLength)
2860c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
2870c1bc742181ded4930842b46e9507372f0b1b963James Dong        *pBitStream++ = (OMX_U8)Value;
2880c1bc742181ded4930842b46e9507372f0b1b963James Dong        codeWord   = codeWord  << (8-Offset);
2890c1bc742181ded4930842b46e9507372f0b1b963James Dong        codeLength = codeLength - (8-Offset);
2900c1bc742181ded4930842b46e9507372f0b1b963James Dong        Offset = 0;
2910c1bc742181ded4930842b46e9507372f0b1b963James Dong        Value = codeWord >> 24;
2920c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
2930c1bc742181ded4930842b46e9507372f0b1b963James Dong
2940c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* Write out final partial byte */
2950c1bc742181ded4930842b46e9507372f0b1b963James Dong    *pBitStream  = (OMX_U8)Value;
2960c1bc742181ded4930842b46e9507372f0b1b963James Dong    *ppBitStream = pBitStream;
2970c1bc742181ded4930842b46e9507372f0b1b963James Dong    *pOffset = Offset + codeLength;
2980c1bc742181ded4930842b46e9507372f0b1b963James Dong
2990c1bc742181ded4930842b46e9507372f0b1b963James Dong    return  OMX_Sts_NoErr;
3000c1bc742181ded4930842b46e9507372f0b1b963James Dong}
3010c1bc742181ded4930842b46e9507372f0b1b963James Dong
3020c1bc742181ded4930842b46e9507372f0b1b963James Dong/***************************************
3030c1bc742181ded4930842b46e9507372f0b1b963James Dong * Variable bit length Encode
3040c1bc742181ded4930842b46e9507372f0b1b963James Dong ***************************************/
3050c1bc742181ded4930842b46e9507372f0b1b963James Dong
3060c1bc742181ded4930842b46e9507372f0b1b963James Dong/**
3070c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: armPackVLC32
3080c1bc742181ded4930842b46e9507372f0b1b963James Dong *
3090c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
3100c1bc742181ded4930842b46e9507372f0b1b963James Dong * Pack a VLC code word into the bitstream
3110c1bc742181ded4930842b46e9507372f0b1b963James Dong *
3120c1bc742181ded4930842b46e9507372f0b1b963James Dong * Remarks:
3130c1bc742181ded4930842b46e9507372f0b1b963James Dong *
3140c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
3150c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	ppBitStream		pointer to the pointer to the current byte
3160c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      in the bit stream.
3170c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pBitOffset	    pointer to the bit position in the byte
3180c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      pointed by *ppBitStream. Valid within 0
3190c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      to 7.
3200c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	 code     		VLC code word that need to be inserted in to the
3210c1bc742181ded4930842b46e9507372f0b1b963James Dong *                      bitstream
3220c1bc742181ded4930842b46e9507372f0b1b963James Dong *
3230c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] ppBitStream	*ppBitStream is updated after the block is encoded,
3240c1bc742181ded4930842b46e9507372f0b1b963James Dong *	                    so that it points to the current byte in the bit
3250c1bc742181ded4930842b46e9507372f0b1b963James Dong *						stream buffer.
3260c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] pBitOffset		*pBitOffset is updated so that it points to the
3270c1bc742181ded4930842b46e9507372f0b1b963James Dong *						current bit position in the byte pointed by
3280c1bc742181ded4930842b46e9507372f0b1b963James Dong *						*ppBitStream.
3290c1bc742181ded4930842b46e9507372f0b1b963James Dong *
3300c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value:
3310c1bc742181ded4930842b46e9507372f0b1b963James Dong * Standard OMX_RESULT result. See enumeration for possible result codes.
3320c1bc742181ded4930842b46e9507372f0b1b963James Dong *
3330c1bc742181ded4930842b46e9507372f0b1b963James Dong */
3340c1bc742181ded4930842b46e9507372f0b1b963James Dong
3350c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult armPackVLC32 (
3360c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_U8 **ppBitStream,
3370c1bc742181ded4930842b46e9507372f0b1b963James Dong    OMX_INT *pBitOffset,
3380c1bc742181ded4930842b46e9507372f0b1b963James Dong    ARM_VLC32 code
3390c1bc742181ded4930842b46e9507372f0b1b963James Dong)
3400c1bc742181ded4930842b46e9507372f0b1b963James Dong{
3410c1bc742181ded4930842b46e9507372f0b1b963James Dong    return (armPackBits(ppBitStream, pBitOffset, code.codeWord, code.codeLen));
3420c1bc742181ded4930842b46e9507372f0b1b963James Dong}
3430c1bc742181ded4930842b46e9507372f0b1b963James Dong
3440c1bc742181ded4930842b46e9507372f0b1b963James Dong/*End of File*/
345