10c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 20c1bc742181ded4930842b46e9507372f0b1b963James Dong * 30c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name: armVCM4P2_CheckVLCEscapeMode.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 * Description: 130c1bc742181ded4930842b46e9507372f0b1b963James Dong * Contains module for VLC escape mode check 140c1bc742181ded4930842b46e9507372f0b1b963James Dong * 150c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 160c1bc742181ded4930842b46e9507372f0b1b963James Dong 170c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h" 180c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h" 190c1bc742181ded4930842b46e9507372f0b1b963James Dong 200c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armVC.h" 210c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h" 220c1bc742181ded4930842b46e9507372f0b1b963James Dong 230c1bc742181ded4930842b46e9507372f0b1b963James Dong/** 240c1bc742181ded4930842b46e9507372f0b1b963James Dong * Function: armVCM4P2_CheckVLCEscapeMode 250c1bc742181ded4930842b46e9507372f0b1b963James Dong * 260c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description: 270c1bc742181ded4930842b46e9507372f0b1b963James Dong * Performs escape mode decision based on the run, run+, level, level+ and 280c1bc742181ded4930842b46e9507372f0b1b963James Dong * last combinations. 290c1bc742181ded4930842b46e9507372f0b1b963James Dong * 300c1bc742181ded4930842b46e9507372f0b1b963James Dong * Remarks: 310c1bc742181ded4930842b46e9507372f0b1b963James Dong * 320c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters: 330c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] run Run value (count of zeros) to be encoded 340c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] level Level value (non-zero value) to be encoded 350c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] runPlus Calculated as runPlus = run - (RMAX + 1) 360c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] levelPlus Calculated as 370c1bc742181ded4930842b46e9507372f0b1b963James Dong * levelPlus = sign(level)*[abs(level) - LMAX] 380c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] maxStoreRun Max store possible (considering last and inter/intra) 390c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] maxRunForMultipleEntries 400c1bc742181ded4930842b46e9507372f0b1b963James Dong * The run value after which level 410c1bc742181ded4930842b46e9507372f0b1b963James Dong * will be equal to 1: 420c1bc742181ded4930842b46e9507372f0b1b963James Dong * (considering last and inter/intra status) 430c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in] pRunIndexTable Run Index table defined in 440c1bc742181ded4930842b46e9507372f0b1b963James Dong * armVCM4P2_Huff_Tables_VLC.c 450c1bc742181ded4930842b46e9507372f0b1b963James Dong * (considering last and inter/intra status) 460c1bc742181ded4930842b46e9507372f0b1b963James Dong * 470c1bc742181ded4930842b46e9507372f0b1b963James Dong * 480c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value: 490c1bc742181ded4930842b46e9507372f0b1b963James Dong * Returns an Escape mode which can take values from 0 to 3 500c1bc742181ded4930842b46e9507372f0b1b963James Dong * 0 --> no escape mode, 1 --> escape type 1, 510c1bc742181ded4930842b46e9507372f0b1b963James Dong * 1 --> escape type 2, 3 --> escape type 3, check section 7.4.1.3 520c1bc742181ded4930842b46e9507372f0b1b963James Dong * in the MPEG ISO standard. 530c1bc742181ded4930842b46e9507372f0b1b963James Dong * 540c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 550c1bc742181ded4930842b46e9507372f0b1b963James Dong 560c1bc742181ded4930842b46e9507372f0b1b963James DongOMX_U8 armVCM4P2_CheckVLCEscapeMode( 570c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U32 run, 580c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U32 runPlus, 590c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 level, 600c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_S16 levelPlus, 610c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 maxStoreRun, 620c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 maxRunForMultipleEntries, 630c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_INT shortVideoHeader, 640c1bc742181ded4930842b46e9507372f0b1b963James Dong const OMX_U8 *pRunIndexTable 650c1bc742181ded4930842b46e9507372f0b1b963James Dong) 660c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 670c1bc742181ded4930842b46e9507372f0b1b963James Dong OMX_U8 escape = 0, fMode = 0, entries; 680c1bc742181ded4930842b46e9507372f0b1b963James Dong 690c1bc742181ded4930842b46e9507372f0b1b963James Dong level = armAbs (level); 700c1bc742181ded4930842b46e9507372f0b1b963James Dong levelPlus = armAbs (levelPlus); 710c1bc742181ded4930842b46e9507372f0b1b963James Dong 720c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Check for a valid entry with run, level and Last combination 730c1bc742181ded4930842b46e9507372f0b1b963James Dong Mode 0 check */ 740c1bc742181ded4930842b46e9507372f0b1b963James Dong if (run <= maxStoreRun) 750c1bc742181ded4930842b46e9507372f0b1b963James Dong { 760c1bc742181ded4930842b46e9507372f0b1b963James Dong entries = pRunIndexTable[run + 1] 770c1bc742181ded4930842b46e9507372f0b1b963James Dong - pRunIndexTable[run]; 780c1bc742181ded4930842b46e9507372f0b1b963James Dong if (run > maxRunForMultipleEntries) 790c1bc742181ded4930842b46e9507372f0b1b963James Dong { 800c1bc742181ded4930842b46e9507372f0b1b963James Dong entries = 1; 810c1bc742181ded4930842b46e9507372f0b1b963James Dong } 820c1bc742181ded4930842b46e9507372f0b1b963James Dong if (level > entries) 830c1bc742181ded4930842b46e9507372f0b1b963James Dong { 840c1bc742181ded4930842b46e9507372f0b1b963James Dong escape = 1; 850c1bc742181ded4930842b46e9507372f0b1b963James Dong } 860c1bc742181ded4930842b46e9507372f0b1b963James Dong } 870c1bc742181ded4930842b46e9507372f0b1b963James Dong else 880c1bc742181ded4930842b46e9507372f0b1b963James Dong { 890c1bc742181ded4930842b46e9507372f0b1b963James Dong escape = 1; 900c1bc742181ded4930842b46e9507372f0b1b963James Dong } 910c1bc742181ded4930842b46e9507372f0b1b963James Dong if(escape && shortVideoHeader) 920c1bc742181ded4930842b46e9507372f0b1b963James Dong { 930c1bc742181ded4930842b46e9507372f0b1b963James Dong escape = 0; 940c1bc742181ded4930842b46e9507372f0b1b963James Dong fMode = 4; 950c1bc742181ded4930842b46e9507372f0b1b963James Dong } 960c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Check for a valid entry with run, levelPlus and Last combination 970c1bc742181ded4930842b46e9507372f0b1b963James Dong Mode 1 check */ 980c1bc742181ded4930842b46e9507372f0b1b963James Dong if (escape) 990c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong escape = 0; 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong fMode = 1; 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong if (run <= maxStoreRun) 1030c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong entries = pRunIndexTable[run + 1] 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong - pRunIndexTable[run]; 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong if (run > maxRunForMultipleEntries) 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong entries = 1; 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong if (levelPlus > entries) 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong escape = 1; 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong escape = 1; 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong /* Check for a valid entry with runPlus, level and Last combination 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong Mode 2 check */ 1230c1bc742181ded4930842b46e9507372f0b1b963James Dong if (escape) 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong escape = 0; 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong fMode = 2; 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong if (runPlus <= maxStoreRun) 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong entries = pRunIndexTable[runPlus + 1] 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong - pRunIndexTable[runPlus]; 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong if (runPlus > maxRunForMultipleEntries) 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong entries = 1; 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1350c1bc742181ded4930842b46e9507372f0b1b963James Dong if (level > entries) 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong escape = 1; 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1390c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong escape = 1; 1430c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong /* select mode 3 --> FLC */ 1470c1bc742181ded4930842b46e9507372f0b1b963James Dong if (escape) 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong fMode = 3; 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1510c1bc742181ded4930842b46e9507372f0b1b963James Dong 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong return fMode; 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong} 1540c1bc742181ded4930842b46e9507372f0b1b963James Dong 1550c1bc742181ded4930842b46e9507372f0b1b963James Dong/*End of File*/ 1560c1bc742181ded4930842b46e9507372f0b1b963James Dong 157