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