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