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: armVCM4P2_FillVLCBuffer.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 * Description: 280c1bc742181ded4930842b46e9507372f0b1b963James Dong * Contains module for putting VLC bits 290c1bc742181ded4930842b46e9507372f0b1b963James Dong * 300c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 310c1bc742181ded4930842b46e9507372f0b1b963James Dong 320c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h" 330c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h" 340c1bc742181ded4930842b46e9507372f0b1b963James Dong 350c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armVC.h" 360c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h" 370c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM_Bitstream.h" 380c1bc742181ded4930842b46e9507372f0b1b963James Dong 390c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 400c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: armVCM4P2_FillVLCBuffer 410c1bc742181ded4930842b46e9507372f0b1b963James Dong * 420c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 430c1bc742181ded4930842b46e9507372f0b1b963James Dong * Performs calculating the VLC bits depending on the escape type and insert 440c1bc742181ded4930842b46e9507372f0b1b963James Dong * the same in the bitstream 450c1bc742181ded4930842b46e9507372f0b1b963James Dong * 460c1bc742181ded4930842b46e9507372f0b1b963James Dong * Remarks: 470c1bc742181ded4930842b46e9507372f0b1b963James Dong * 480c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters: 490c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] ppBitStream pointer to the pointer to the current byte in 500c1bc742181ded4930842b46e9507372f0b1b963James Dong * the bit stream 510c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] pBitOffset pointer to the bit position in the byte pointed 520c1bc742181ded4930842b46e9507372f0b1b963James Dong * by *ppBitStream. Valid within 0 to 7 530c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] run Run value (count of zeros) to be encoded 540c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] level Level value (non-zero value) to be encoded 550c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] runPlus Calculated as runPlus = run - (RMAX + 1) 560c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] levelPlus Calculated as 570c1bc742181ded4930842b46e9507372f0b1b963James Dong * levelPlus = sign(level)*[abs(level) - LMAX] 580c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] fMode Flag indicating the escape modes 590c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] last status of the last flag 600c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] maxRunForMultipleEntries 610c1bc742181ded4930842b46e9507372f0b1b963James Dong * The run value after which level will be equal to 1: 620c1bc742181ded4930842b46e9507372f0b1b963James Dong * (considering last and inter/intra status) 630c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] pRunIndexTable Run Index table defined in 640c1bc742181ded4930842b46e9507372f0b1b963James Dong * armVCM4P2_Huff_Tables_VLC.h 650c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] pVlcTable VLC table defined in armVCM4P2_Huff_Tables_VLC.h 660c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] ppBitStream *ppBitStream is updated after the block is encoded 670c1bc742181ded4930842b46e9507372f0b1b963James Dong * so that it points to the current byte in the bit 680c1bc742181ded4930842b46e9507372f0b1b963James Dong * stream buffer. 690c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out] pBitOffset *pBitOffset is updated so that it points to the 700c1bc742181ded4930842b46e9507372f0b1b963James Dong * current bit position in the byte pointed by 710c1bc742181ded4930842b46e9507372f0b1b963James Dong * *ppBitStream. 720c1bc742181ded4930842b46e9507372f0b1b963James Dong * 730c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value: 740c1bc742181ded4930842b46e9507372f0b1b963James Dong * Standard OMXResult result. See enumeration for possible result codes. 750c1bc742181ded4930842b46e9507372f0b1b963James Dong * 760c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 770c1bc742181ded4930842b46e9507372f0b1b963James Dong 780c1bc742181ded4930842b46e9507372f0b1b963James DongOMXResult armVCM4P2_FillVLCBuffer ( 790c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 **ppBitStream, 800c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT * pBitOffset, 810c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U32 run, 820c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 level, 830c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U32 runPlus, 840c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 levelPlus, 850c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 fMode, 860c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 last, 870c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 maxRunForMultipleEntries, 880c1bc742181ded4930842b46e9507372f0b1b963James Dong const OMX_U8 *pRunIndexTable, 890c1bc742181ded4930842b46e9507372f0b1b963James Dong const ARM_VLC32 *pVlcTable 900c1bc742181ded4930842b46e9507372f0b1b963James Dong) 910c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 920c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT tempIndex; 930c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U32 tempRun = run, sign = 0; 940c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 tempLevel = level; 950c1bc742181ded4930842b46e9507372f0b1b963James Dong 960c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Escape sequence addition */ 970c1bc742181ded4930842b46e9507372f0b1b963James Dong if (fMode == 1) 980c1bc742181ded4930842b46e9507372f0b1b963James Dong { 990c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 3, 7); 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 0, 1); 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong tempLevel = levelPlus; 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong else if(fMode == 2) 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 3, 7); 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 2, 2); 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong tempRun = runPlus; 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (fMode == 3) 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 3, 7); 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 3, 2); 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (fMode == 4) 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 3, 7); 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, (OMX_U32)last, 1); 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, tempRun, 6); 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong if((tempLevel != 0) && (tempLevel != -128)) 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 1230c1bc742181ded4930842b46e9507372f0b1b963James Dong (OMX_U32) tempLevel, 8); 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong return OMX_Sts_NoErr; 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tempLevel < 0) 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong sign = 1; 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong tempLevel = armAbs(tempLevel); 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Putting VLC bits in the stream */ 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong if (fMode < 3) 1350c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong if (tempRun > maxRunForMultipleEntries) 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong tempIndex = pRunIndexTable [maxRunForMultipleEntries + 1] + 1390c1bc742181ded4930842b46e9507372f0b1b963James Dong (tempRun - maxRunForMultipleEntries - 1); 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1430c1bc742181ded4930842b46e9507372f0b1b963James Dong tempIndex = pRunIndexTable [tempRun] + (tempLevel -1); 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackVLC32 (ppBitStream, pBitOffset, 1470c1bc742181ded4930842b46e9507372f0b1b963James Dong pVlcTable [tempIndex]); 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, (OMX_U32)sign, 1); 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1510c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong if (sign) 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1540c1bc742181ded4930842b46e9507372f0b1b963James Dong tempLevel = -tempLevel; 1550c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1560c1bc742181ded4930842b46e9507372f0b1b963James Dong tempRun = run; 1570c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, (OMX_U32)last, 1); 1580c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, tempRun, 6); 1590c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 1, 1); 1600c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 1610c1bc742181ded4930842b46e9507372f0b1b963James Dong (OMX_U32) tempLevel, 12); 1620c1bc742181ded4930842b46e9507372f0b1b963James Dong armPackBits(ppBitStream, pBitOffset, 1, 1); 1630c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1640c1bc742181ded4930842b46e9507372f0b1b963James Dong return OMX_Sts_NoErr; 1650c1bc742181ded4930842b46e9507372f0b1b963James Dong} 1660c1bc742181ded4930842b46e9507372f0b1b963James Dong 1670c1bc742181ded4930842b46e9507372f0b1b963James Dong/*End of File*/ 1680c1bc742181ded4930842b46e9507372f0b1b963James Dong 169