diff --git a/dl/api/armCOMM.h b/dl/api/armCOMM.h
deleted file mode 100644
index de46c65..0000000
--- a/dl/api/armCOMM.h
+++ /dev/null
@@ -1,778 +0,0 @@
-/*
- *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- *
- *  This file was originally licensed as follows. It has been
- *  relicensed with permission from the copyright holders.
- */
-
-/**
- * 
- * File Name:  armCOMM.h
- * OpenMAX DL: v1.0.2
- * Last Modified Revision:   15331
- * Last Modified Date:       Fri, 24 Oct 2008
- * 
- * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
- * 
- * 
- *   
- * File: armCOMM.h
- * Brief: Declares Common APIs/Data Types used across OpenMAX API's
- *
- */
- 
-  
-#ifndef _armCOMM_H_
-#define _armCOMM_H_
-
-#include "omxtypes.h"
-
-/* Used by both IP and IC domains for 8x8 JPEG blocks. */
-typedef OMX_S16 ARM_BLOCK8x8[64];
-
-
-#include "armOMX.h"
-
-#define  armPI (OMX_F64)(3.1415926535897932384626433832795)
-
-/***********************************************************************/
-
-/* Compiler extensions */
-#ifdef ARM_DEBUG
-/* debug version */
-#include <stdlib.h>
-#include <assert.h>
-#include <stdio.h>
-#define armError(str) {printf((str)); printf("\n"); exit(-1);}
-#define armWarn(str) {printf((str)); printf("\n");}
-#define armIgnore(a) ((void)a)
-#define armAssert(a) assert(a)
-#else 
-/* release version */
-#define armError(str) ((void) (str))
-#define armWarn(str)  ((void) (str))
-#define armIgnore(a)  ((void) (a))
-#define armAssert(a)  ((void) (a))
-#endif /* ARM_DEBUG */
-
-/* Arithmetic operations */
-
-#define armMin(a,b)             ( (a) > (b) ?  (b):(a) )
-#define armMax(a,b)             ( (a) > (b) ?  (a):(b) )
-#define armAbs(a)               ( (a) <  0  ? -(a):(a) )
-
-/* Alignment operation */
-
-#define armAlignToBytes(Ptr,N)      (Ptr + ( ((N-(int)Ptr)&(N-1)) / sizeof(*Ptr) ))
-#define armAlignTo2Bytes(Ptr)       armAlignToBytes(Ptr,2)
-#define armAlignTo4Bytes(Ptr)       armAlignToBytes(Ptr,4)
-#define armAlignTo8Bytes(Ptr)       armAlignToBytes(Ptr,8)
-#define armAlignTo16Bytes(Ptr)      armAlignToBytes(Ptr,16)
-
-/* Error and Alignment check */
-
-#define armRetArgErrIf(condition, code)  if(condition) { return (code); }
-#define armRetDataErrIf(condition, code) if(condition) { return (code); }
-
-#define armIsByteAligned(Ptr,N)     ((((int)(Ptr)) % N)==0)
-#define armNotByteAligned(Ptr,N)    ((((int)(Ptr)) % N)!=0)
-
-#define armIs2ByteAligned(Ptr)      armIsByteAligned(Ptr,2)
-#define armIs4ByteAligned(Ptr)      armIsByteAligned(Ptr,4)
-#define armIs8ByteAligned(Ptr)      armIsByteAligned(Ptr,8)
-#define armIs16ByteAligned(Ptr)     armIsByteAligned(Ptr,16)
-
-#define armNot2ByteAligned(Ptr)     armNotByteAligned(Ptr,2)
-#define armNot4ByteAligned(Ptr)     armNotByteAligned(Ptr,4)
-#define armNot8ByteAligned(Ptr)     armNotByteAligned(Ptr,8)
-#define armNot16ByteAligned(Ptr)    armNotByteAligned(Ptr,16)
-#define armNot32ByteAligned(Ptr)    armNotByteAligned(Ptr,32)
-
-/**
- * Function: armRoundFloatToS16_ref/armRoundFloatToS32_ref/armRoundFloatToS64
- *
- * Description:
- * Converts a double precision value into a short int/int after rounding
- *
- * Parameters:
- * [in]  Value                 Float value to be converted
- *
- * Return Value:
- * [out] converted value in OMX_S16/OMX_S32 format
- *
- */
-
-OMX_S16 armRoundFloatToS16 (OMX_F64 Value);
-OMX_S32 armRoundFloatToS32 (OMX_F64 Value);
-OMX_S64 armRoundFloatToS64 (OMX_F64 Value);
-
-/**
- * Function: armSatRoundFloatToS16_ref/armSatRoundFloatToS32
- *
- * Description:
- * Converts a double precision value into a short int/int after rounding and saturation
- *
- * Parameters:
- * [in]  Value                 Float value to be converted
- *
- * Return Value:
- * [out] converted value in OMX_S16/OMX_S32 format
- *
- */
-
-OMX_S16 armSatRoundFloatToS16 (OMX_F64 Value);
-OMX_S32 armSatRoundFloatToS32 (OMX_F64 Value);
-
-/**
- * Function: armSatRoundFloatToU16_ref/armSatRoundFloatToU32
- *
- * Description:
- * Converts a double precision value into a unsigned short int/int after rounding and saturation
- *
- * Parameters:
- * [in]  Value                 Float value to be converted
- *
- * Return Value:
- * [out] converted value in OMX_U16/OMX_U32 format
- *
- */
-
-OMX_U16 armSatRoundFloatToU16 (OMX_F64 Value);
-OMX_U32 armSatRoundFloatToU32 (OMX_F64 Value);
-
-/**
- * Function: armSignCheck
- *
- * Description:
- * Checks the sign of a variable:
- * returns 1 if it is Positive
- * returns 0 if it is 0
- * returns -1 if it is Negative 
- *
- * Remarks:
- *
- * Parameters:
- * [in]	    var     Variable to be checked
- *
- * Return Value:
- * OMX_INT --   returns 1 if it is Positive
- *              returns 0 if it is 0
- *              returns -1 if it is Negative 
- */ 
- 
-OMX_INT armSignCheck (OMX_S16 var);
-
-/**
- * Function: armClip
- *
- * Description: Clips the input between MAX and MIN value
- * 
- *
- * Remarks:
- *
- * Parameters:
- * [in] Min     lower bound
- * [in] Max     upper bound
- * [in] src     variable to the clipped
- *
- * Return Value:
- * OMX_S32 --   returns clipped value
- */ 
- 
-OMX_S32 armClip (
-        OMX_INT min,
-        OMX_INT max, 
-        OMX_S32 src
-        );
-
-/**
- * Function: armClip_F32
- *
- * Description: Clips the input between MAX and MIN value
- * 
- *
- * Remarks:
- *
- * Parameters:
- * [in] Min     lower bound
- * [in] Max     upper bound
- * [in] src     variable to the clipped
- *
- * Return Value:
- * OMX_F32 --   returns clipped value
- */ 
- 
-OMX_F32 armClip_F32 (
-        OMX_F32 min,
-        OMX_F32 max, 
-        OMX_F32 src
-        );
-
-/**
- * Function: armShiftSat_F32
- *
- * Description: Divides a float value by 2^shift and 
- * saturates it for unsigned value range for satBits.
- * Second parameter is like "shifting" the corresponding 
- * integer value. Takes care of rounding while clipping the final 
- * value.
- *
- * Parameters:
- * [in] v          Number to be operated upon
- * [in] shift      Divides the input "v" by "2^shift"
- * [in] satBits    Final range is [0, 2^satBits)
- *
- * Return Value:
- * OMX_S32 --   returns "shifted" saturated value
- */ 
- 
-OMX_U32 armShiftSat_F32(
-        OMX_F32 v, 
-        OMX_INT shift, 
-        OMX_INT satBits
-        );
-
-/**
- * Functions: armSwapElem
- *
- * Description:
- * This function swaps two elements at the specified pointer locations.
- * The size of each element could be anything as specified by <elemSize>
- *
- * Return Value:
- * OMXResult -- Error status from the function
- */
-OMXResult armSwapElem(OMX_U8 *pBuf1, OMX_U8 *pBuf2, OMX_INT elemSize);
-
-
-/**
- * Function: armMedianOf3
- *
- * Description: Finds the median of three numbers
- * 
- * Remarks:
- *
- * Parameters:
- * [in] fEntry     First entry
- * [in] sEntry     second entry
- * [in] tEntry     Third entry
- *
- * Return Value:
- * OMX_S32 --   returns the median value
- */ 
- 
-OMX_S32 armMedianOf3 (
-    OMX_S32 fEntry,
-    OMX_S32 sEntry, 
-    OMX_S32 tEntry 
-    );
-
-/**
- * Function: armLogSize
- *
- * Description: Finds the size of a positive value and returns the same
- * 
- * Remarks:
- *
- * Parameters:
- * [in] value    Positive value
- *
- * Return Value:
- * OMX_U8 --   returns the size of the positive value
- */ 
- 
-OMX_U8 armLogSize (
-    OMX_U16 value 
-    );    
-
-/***********************************************************************/
-                /* Saturating Arithmetic operations */
-
-/**
- * Function :armSatAdd_S32()
- *
- * Description :
- *   Returns the result of saturated addition of the two inputs Value1, Value2
- *
- * Parametrs:
- * [in] Value1       First Operand
- * [in] Value2       Second Operand
- *
- * Return:
- * [out]             Result of operation
- * 
- *    
- **/
-
-OMX_S32 armSatAdd_S32(
-                OMX_S32 Value1,
-                OMX_S32 Value2
-                );
-
-/**
- * Function :armSatAdd_S64()
- *
- * Description :
- *   Returns the result of saturated addition of the two inputs Value1, Value2
- *
- * Parametrs:
- * [in] Value1       First Operand
- * [in] Value2       Second Operand
- *
- * Return:
- * [out]             Result of operation
- * 
- *    
- **/
-
-OMX_S64 armSatAdd_S64(
-                OMX_S64 Value1,
-                OMX_S64 Value2
-                );
-
-/** Function :armSatSub_S32()
- * 
- * Description :
- *     Returns the result of saturated substraction of the two inputs Value1, Value2
- *
- * Parametrs:
- * [in] Value1       First Operand
- * [in] Value2       Second Operand
- *
- * Return:
- * [out]             Result of operation
- * 
- **/
-
-OMX_S32 armSatSub_S32(
-                    OMX_S32 Value1,
-                    OMX_S32 Value2
-                    );
-
-/**
- * Function :armSatMac_S32()
- *
- * Description :
- *     Returns the result of Multiplication of Value1 and Value2 and subesquent saturated
- *     accumulation with Mac
- *
- * Parametrs:
- * [in] Value1       First Operand
- * [in] Value2       Second Operand
- * [in] Mac          Accumulator
- *
- * Return:
- * [out]             Result of operation
- **/
-
-OMX_S32 armSatMac_S32(
-                    OMX_S32 Mac,
-                    OMX_S16 Value1,
-                    OMX_S16 Value2
-                    );
-
-/**
- * Function :armSatMac_S16S32_S32
- *
- * Description :
- *   Returns the result of saturated MAC operation of the three inputs delayElem, filTap , mac
- *
- *   mac = mac + Saturate_in_32Bits(delayElem * filTap)
- *
- * Parametrs:
- * [in] delayElem    First 32 bit Operand
- * [in] filTap       Second 16 bit Operand
- * [in] mac          Result of MAC operation
- *
- * Return:
- * [out]  mac        Result of operation
- *    
- **/
- 
-OMX_S32 armSatMac_S16S32_S32(
-                        OMX_S32 mac, 
-                        OMX_S32 delayElem, 
-                        OMX_S16 filTap );
-
-/**
- * Function :armSatRoundRightShift_S32_S16
- *
- * Description :
- *   Returns the result of rounded right shift operation of input by the scalefactor
- *
- *   output = Saturate_in_16Bits( ( RightShift( (Round(input) , scaleFactor ) )
- *
- * Parametrs:
- * [in] input       The input to be operated on
- * [in] scaleFactor The shift number
- *
- * Return:
- * [out]            Result of operation
- *    
- **/
-
-
-OMX_S16 armSatRoundRightShift_S32_S16(
-                        OMX_S32 input, 
-                        OMX_INT scaleFactor);
-
-/**
- * Function :armSatRoundLeftShift_S32()
- *
- * Description :
- *     Returns the result of saturating left-shift operation on input
- *     Or rounded Right shift if the input Shift is negative.
- *
- * Parametrs:
- * [in] Value        Operand
- * [in] shift        Operand for shift operation
- *
- * Return:
- * [out]             Result of operation
- *    
- **/
- 
-OMX_S32 armSatRoundLeftShift_S32(
-                        OMX_S32 Value,
-                        OMX_INT shift
-                        );
-
-/**
- * Function :armSatRoundLeftShift_S64()
- *
- * Description :
- *     Returns the result of saturating left-shift operation on input
- *     Or rounded Right shift if the input Shift is negative.
- *
- * Parametrs:
- * [in] Value        Operand
- * [in] shift        Operand for shift operation
- *
- * Return:
- * [out]             Result of operation
- *    
- **/
- 
-OMX_S64 armSatRoundLeftShift_S64(
-                        OMX_S64 Value,
-                        OMX_INT shift
-                        );
-
-/**
- * Function :armSatMulS16S32_S32()
- *
- * Description :
- *     Returns the result of a S16 data type multiplied with an S32 data type
- *     in a S32 container
- *
- * Parametrs:
- * [in] input1       Operand 1
- * [in] input2       Operand 2
- *
- * Return:
- * [out]             Result of operation
- *    
- **/
-
-
-OMX_S32 armSatMulS16S32_S32(
-                    OMX_S16 input1,
-                    OMX_S32 input2);
-
-/**
- * Function :armSatMulS32S32_S32()
- *
- * Description :
- *     Returns the result of a S32 data type multiplied with an S32 data type
- *     in a S32 container
- *
- * Parametrs:
- * [in] input1       Operand 1
- * [in] input2       Operand 2
- *
- * Return:
- * [out]             Result of operation
- *    
- **/
-
-OMX_S32 armSatMulS32S32_S32(
-                    OMX_S32 input1,
-                    OMX_S32 input2);
-
-
-/**
- * Function :armIntDivAwayFromZero()
- *
- * Description : Integer division with rounding to the nearest integer. 
- *               Half-integer values are rounded away from zero
- *               unless otherwise specified. For example 3/2 is rounded 
- *               to 2, and -3/2 is rounded to -2.
- *
- * Parametrs:
- * [in] Num        Operand 1
- * [in] Deno       Operand 2
- *
- * Return:
- * [out]             Result of operation input1/input2
- *    
- **/
-
-OMX_S32 armIntDivAwayFromZero (OMX_S32 Num, OMX_S32 Deno);
-
-
-/***********************************************************************/
-/*
- * Debugging macros
- *
- */
-
-
-/*
- * Definition of output stream - change to stderr if necessary
- */
-#define DEBUG_STREAM stdout
-
-/*
- * Debug printf macros, one for each argument count.
- * Add more if needed.
- */
-#ifdef DEBUG_ON
-#include <stdio.h>
-
-#define DEBUG_PRINTF_0(a)                                               fprintf(DEBUG_STREAM, a)
-#define DEBUG_PRINTF_1(a, b)                                            fprintf(DEBUG_STREAM, a, b)
-#define DEBUG_PRINTF_2(a, b, c)                                         fprintf(DEBUG_STREAM, a, b, c)
-#define DEBUG_PRINTF_3(a, b, c, d)                                      fprintf(DEBUG_STREAM, a, b, c, d)
-#define DEBUG_PRINTF_4(a, b, c, d, e)                                   fprintf(DEBUG_STREAM, a, b, c, d, e)
-#define DEBUG_PRINTF_5(a, b, c, d, e, f)                                fprintf(DEBUG_STREAM, a, b, c, d, e, f)
-#define DEBUG_PRINTF_6(a, b, c, d, e, f, g)                             fprintf(DEBUG_STREAM, a, b, c, d, e, f, g)
-#define DEBUG_PRINTF_7(a, b, c, d, e, f, g, h)                          fprintf(DEBUG_STREAM, a, b, c, d, e, f, g, h)
-#define DEBUG_PRINTF_8(a, b, c, d, e, f, g, h, i)                       fprintf(DEBUG_STREAM, a, b, c, d, e, f, g, h, i)
-#define DEBUG_PRINTF_9(a, b, c, d, e, f, g, h, i, j)                    fprintf(DEBUG_STREAM, a, b, c, d, e, f, g, h, i, j)
-#define DEBUG_PRINTF_10(a, b, c, d, e, f, g, h, i, j, k)                fprintf(DEBUG_STREAM, a, b, c, d, e, f, g, h, i, j, k)
-#define DEBUG_PRINTF_11(a, b, c, d, e, f, g, h, i, j, k, l)             fprintf(DEBUG_STREAM, a, b, c, d, e, f, g, h, i, j, k, l)
-#define DEBUG_PRINTF_12(a, b, c, d, e, f, g, h, i, j, k, l, m)          fprintf(DEBUG_STREAM, a, b, c, d, e, f, g, h, i, j, k, l, m)
-#define DEBUG_PRINTF_13(a, b, c, d, e, f, g, h, i, j, k, l, m, n)       fprintf(DEBUG_STREAM, a, b, c, d, e, f, g, h, i, j, k, l, m, n)
-#define DEBUG_PRINTF_14(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)    fprintf(DEBUG_STREAM, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
-#else /* DEBUG_ON */
-#define DEBUG_PRINTF_0(a)                                  
-#define DEBUG_PRINTF_1(a, b)                               
-#define DEBUG_PRINTF_2(a, b, c)                            
-#define DEBUG_PRINTF_3(a, b, c, d)                         
-#define DEBUG_PRINTF_4(a, b, c, d, e)                      
-#define DEBUG_PRINTF_5(a, b, c, d, e, f)                   
-#define DEBUG_PRINTF_6(a, b, c, d, e, f, g)                
-#define DEBUG_PRINTF_7(a, b, c, d, e, f, g, h)             
-#define DEBUG_PRINTF_8(a, b, c, d, e, f, g, h, i)          
-#define DEBUG_PRINTF_9(a, b, c, d, e, f, g, h, i, j)       
-#define DEBUG_PRINTF_10(a, b, c, d, e, f, g, h, i, j, k)    
-#define DEBUG_PRINTF_11(a, b, c, d, e, f, g, h, i, j, k, l)             
-#define DEBUG_PRINTF_12(a, b, c, d, e, f, g, h, i, j, k, l, m)          
-#define DEBUG_PRINTF_13(a, b, c, d, e, f, g, h, i, j, k, l, m, n)      
-#define DEBUG_PRINTF_14(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)   
-#endif /* DEBUG_ON */
-
-
-/*
- * Domain and sub domain definitions
- *
- * In order to turn on debug for an entire domain or sub-domain
- * at compile time, one of the DEBUG_DOMAIN_* below may be defined,
- * which will activate debug in all of the defines it contains.
- */
-
-#ifdef DEBUG_DOMAIN_AC
-#define DEBUG_OMXACAAC_DECODECHANPAIRELT_MPEG4
-#define DEBUG_OMXACAAC_DECODECHANPAIRELT
-#define DEBUG_OMXACAAC_DECODEDATSTRELT
-#define DEBUG_OMXACAAC_DECODEFILLELT
-#define DEBUG_OMXACAAC_DECODEISSTEREO_S32
-#define DEBUG_OMXACAAC_DECODEMSPNS_S32
-#define DEBUG_OMXACAAC_DECODEMSSTEREO_S32_I
-#define DEBUG_OMXACAAC_DECODEPRGCFGELT
-#define DEBUG_OMXACAAC_DECODETNS_S32_I
-#define DEBUG_OMXACAAC_DEINTERLEAVESPECTRUM_S32
-#define DEBUG_OMXACAAC_ENCODETNS_S32_I
-#define DEBUG_OMXACAAC_LONGTERMPREDICT_S32
-#define DEBUG_OMXACAAC_LONGTERMRECONSTRUCT_S32
-#define DEBUG_OMXACAAC_MDCTFWD_S32
-#define DEBUG_OMXACAAC_MDCTINV_S32_S16
-#define DEBUG_OMXACAAC_NOISELESSDECODE
-#define DEBUG_OMXACAAC_QUANTINV_S32_I
-#define DEBUG_OMXACAAC_UNPACKADIFHEADER
-#define DEBUG_OMXACAAC_UNPACKADTSFRAMEHEADER
-#define DEBUG_OMXACMP3_HUFFMANDECODESFBMBP_S32
-#define DEBUG_OMXACMP3_HUFFMANDECODESFB_S32
-#define DEBUG_OMXACMP3_HUFFMANDECODE_S32
-#define DEBUG_OMXACMP3_MDCTINV_S32
-#define DEBUG_OMXACMP3_REQUANTIZESFB_S32_I
-#define DEBUG_OMXACMP3_REQUANTIZE_S32_I
-#define DEBUG_OMXACMP3_SYNTHPQMF_S32_S16
-#define DEBUG_OMXACMP3_UNPACKFRAMEHEADER
-#define DEBUG_OMXACMP3_UNPACKSCALEFACTORS_S8
-#define DEBUG_OMXACMP3_UNPACKSIDEINFO
-#endif /* DEBUG_DOMAIN_AC */
-
-
-#ifdef DEBUG_DOMAIN_VC
-#define DEBUG_OMXVCM4P10_AVERAGE_16X
-#define DEBUG_OMXVCM4P10_AVERAGE_4X
-#define DEBUG_OMXVCM4P10_AVERAGE_8X
-#define DEBUG_OMXVCM4P10_DEBLOCKCHROMA_U8_C1IR
-#define DEBUG_OMXVCM4P10_DEBLOCKLUMA_U8_C1IR
-#define DEBUG_OMXVCM4P10_DECODECHROMADCCOEFFSTOPAIRCAVLC_U8
-#define DEBUG_OMXVCM4P10_DECODECOEFFSTOPAIRCAVLC_U8
-#define DEBUG_OMXVCM4P10_DEQUANTTRANSFORMACFROMPAIR_U8_S16_C1_DLX
-#define DEBUG_OMXVCM4P10_EXPANDFRAME
-#define DEBUG_OMXVCM4P10_FILTERDEBLOCKINGCHROMA_HOREDGE_U8_C1IR
-#define DEBUG_OMXVCM4P10_FILTERDEBLOCKINGCHROMA_VEREDGE_U8_C1IR
-#define DEBUG_OMXVCM4P10_FILTERDEBLOCKINGLUMA_HOREDGE_U8_C1IR
-#define DEBUG_OMXVCM4P10_FILTERDEBLOCKINGLUMA_VEREDGE_U8_C1IR
-#define DEBUG_OMXVCM4P10_PREDICTINTRACHROMA8X8_U8_C1R
-#define DEBUG_OMXVCM4P10_PREDICTINTRA_16X16_U8_C1R
-#define DEBUG_OMXVCM4P10_PREDICTINTRA_4X4_U8_C1R
-#define DEBUG_OMXVCM4P10_SADQUAR_16X
-#define DEBUG_OMXVCM4P10_SADQUAR_4X
-#define DEBUG_OMXVCM4P10_SADQUAR_8X
-#define DEBUG_OMXVCM4P10_SAD_16X
-#define DEBUG_OMXVCM4P10_SAD_4X
-#define DEBUG_OMXVCM4P10_SAD_8X
-#define DEBUG_OMXVCM4P10_SATD_4X4
-#define DEBUG_OMXVCM4P10_TRANSFORMDEQUANTCHROMADCFROMPAIR_U8_S16_C1
-#define DEBUG_OMXVCM4P10_TRANSFORMDEQUANTLUMADCFROMPAIR_U8_S16_C1
-#define DEBUG_OMXVCM4P10_TRANSFORMQUANT_CHROMADC
-#define DEBUG_OMXVCM4P10_TRANSFORMQUANT_LUMADC
-#define DEBUG_OMXVCM4P2_BLOCKMATCH_HALF_16X16
-#define DEBUG_OMXVCM4P2_BLOCKMATCH_HALF_8X8
-#define DEBUG_OMXVCM4P2_BLOCKMATCH_INTEGER_16X16
-#define DEBUG_OMXVCM4P2_BLOCKMATCH_INTEGER_8X8
-#define DEBUG_OMXVCM4P2_COMPUTETEXTUREERRORBLOCK_SAD_U8_S16
-#define DEBUG_OMXVCM4P2_COMPUTETEXTUREERRORBLOCK_U8_S16
-#define DEBUG_OMXVCM4P2_DCT8X8BLKDLX
-#define DEBUG_OMXVCM4P2_DECODEBLOCKCOEF_INTER_S16
-#define DEBUG_OMXVCM4P2_DECODEPADMV_PVOP
-#define DEBUG_OMXVCM4P2_DECODEVLCZIGZAG_INTER_S16
-#define DEBUG_OMXVCM4P2_DECODEVLCZIGZAG_INTRAACVLC_S16
-#define DEBUG_OMXVCM4P2_DECODEVLCZIGZAG_INTRADCVLC_S16
-#define DEBUG_OMXVCM4P2_ENCODEMV_U8_S16
-#define DEBUG_OMXVCM4P2_ENCODEVLCZIGZAG_INTER_S16
-#define DEBUG_OMXVCM4P2_ENCODEVLCZIGZAG_INTRAACVLC_S16
-#define DEBUG_OMXVCM4P2_ENCODEVLCZIGZAG_INTRADCVLC_S16
-#define DEBUG_OMXVCM4P2_FINDMVPRED
-#define DEBUG_OMXVCM4P2_IDCT8X8BLKDLX
-#define DEBUG_OMXVCM4P2_LIMITMVTORECT
-#define DEBUG_OMXVCM4P2_MOTIONESTIMATIONMB
-#define DEBUG_OMXVCM4P2_PADMBGRAY_U8
-#define DEBUG_OMXVCM4P2_PADMBHORIZONTAL_U8
-#define DEBUG_OMXVCM4P2_PADMBVERTICAL_U8
-#define DEBUG_OMXVCM4P2_PADMV
-#define DEBUG_OMXVCM4P2_QUANTINTER_S16_I
-#define DEBUG_OMXVCM4P2_QUANTINTRA_S16_I
-#define DEBUG_OMXVCM4P2_QUANTINVINTER_S16_I
-#define DEBUG_OMXVCM4P2_QUANTINVINTRA_S16_I
-#define DEBUG_OMXVCM4P2_TRANSRECBLOCKCEOF_INTER
-#define DEBUG_OMXVCM4P2_TRANSRECBLOCKCEOF_INTRA
-#endif /* DEBUG_DOMAIN_VC */
-
-
-#ifdef DEBUG_DOMAIN_IC
-/* To be filled in */
-#endif /* DEBUG_DOMAIN_IC */
-
-
-#ifdef DEBUG_DOMAIN_SP
-#define DEBUG_OMXACSP_DOTPROD_S16
-#define DEBUG_OMXACSP_BLOCKEXP_S16
-#define DEBUG_OMXACSP_BLOCKEXP_S32
-#define DEBUG_OMXACSP_COPY_S16
-#define DEBUG_OMXACSP_DOTPROD_S16
-#define DEBUG_OMXACSP_DOTPROD_S16_SFS
-#define DEBUG_OMXACSP_FFTFWD_CTOC_SC16_SFS
-#define DEBUG_OMXACSP_FFTFWD_CTOC_SC32_SFS
-#define DEBUG_OMXACSP_FFTFWD_RTOCCS_S16S32_SFS
-#define DEBUG_OMXACSP_FFTFWD_RTOCCS_S32_SFS
-#define DEBUG_OMXACSP_FFTGETBUFSIZE_C_SC16
-#define DEBUG_OMXACSP_FFTGETBUFSIZE_C_SC32
-#define DEBUG_OMXACSP_FFTGETBUFSIZE_R_S16_S32
-#define DEBUG_OMXACSP_FFTGETBUFSIZE_R_S32
-#define DEBUG_OMXACSP_FFTINIT_C_SC16
-#define DEBUG_OMXACSP_FFTINIT_C_SC32
-#define DEBUG_OMXACSP_FFTINIT_R_S16_S32
-#define DEBUG_OMXACSP_FFTINIT_R_S32
-#define DEBUG_OMXACSP_FFTINV_CCSTOR_S32S16_SFS
-#define DEBUG_OMXACSP_FFTINV_CCSTOR_S32_SFS
-#define DEBUG_OMXACSP_FFTINV_CTOC_SC16_SFS
-#define DEBUG_OMXACSP_FFTINV_CTOC_SC32_SFS
-#define DEBUG_OMXACSP_FILTERMEDIAN_S32_I
-#define DEBUG_OMXACSP_FILTERMEDIAN_S32
-#define DEBUG_OMXACSP_FIRONE_DIRECT_S16_ISFS
-#define DEBUG_OMXACSP_FIRONE_DIRECT_S16_I
-#define DEBUG_OMXACSP_FIRONE_DIRECT_S16
-#define DEBUG_OMXACSP_FIRONE_DIRECT_S16_SFS
-#define DEBUG_OMXACSP_FIR_DIRECT_S16_ISFS
-#define DEBUG_OMXACSP_FIR_DIRECT_S16_I
-#define DEBUG_OMXACSP_FIR_DIRECT_S16
-#define DEBUG_OMXACSP_FIR_DIRECT_S16_SFS
-#define DEBUG_OMXACSP_IIRONE_BIQUADDIRECT_S16_I
-#define DEBUG_OMXACSP_IIRONE_BIQUADDIRECT_S16
-#define DEBUG_OMXACSP_IIRONE_DIRECT_S16_I
-#define DEBUG_OMXACSP_IIRONE_DIRECT_S16
-#define DEBUG_OMXACSP_IIR_BIQUADDIRECT_S16_I
-#define DEBUG_OMXACSP_IIR_BIQUADDIRECT_S16
-#define DEBUG_OMXACSP_IIR_DIRECT_S16_I
-#define DEBUG_OMXACSP_IIR_DIRECT_S16
-#endif /* DEBUG_DOMAIN_SP */
-
-
-#ifdef DEBUG_DOMAIN_IP
-#define DEBUG_OMXIPBM_ADDC_U8_C1R_SFS
-#define DEBUG_OMXIPBM_COPY_U8_C1R
-#define DEBUG_OMXIPBM_COPY_U8_C3R
-#define DEBUG_OMXIPBM_MIRROR_U8_C1R
-#define DEBUG_OMXIPBM_MULC_U8_C1R_SFS
-#define DEBUG_OMXIPCS_COLORTWISTQ14_U8_C3R
-#define DEBUG_OMXIPCS_RGB565TOYCBCR420LS_MCU_U16_S16_C3P3R
-#define DEBUG_OMXIPCS_RGB565TOYCBCR422LS_MCU_U16_S16_C3P3R
-#define DEBUG_OMXIPCS_RGB565TOYCBCR444LS_MCU_U16_S16_C3P3R
-#define DEBUG_OMXIPCS_RGBTOYCBCR420LS_MCU_U8_S16_C3P3R
-#define DEBUG_OMXIPCS_RGBTOYCBCR422LS_MCU_U8_S16_C3P3R
-#define DEBUG_OMXIPCS_RGBTOYCBCR444LS_MCU_U8_S16_C3P3R
-#define DEBUG_OMXIPCS_YCBCR420RSZROT_U8_P3R
-#define DEBUG_OMXIPCS_YCBCR420TORGB565LS_MCU_S16_U16_P3C3R
-#define DEBUG_OMXIPCS_YCBCR420TORGB565_U8_U16_P3C3R
-#define DEBUG_OMXIPCS_YCBCR420TORGBLS_MCU_S16_U8_P3C3R
-#define DEBUG_OMXIPCS_YCBCR422RSZCSCROTRGB_U8_C2R
-#define DEBUG_OMXIPCS_YCBCR422RSZROT_U8_P3R
-#define DEBUG_OMXIPCS_YCBCR422TORGB565LS_MCU_S16_U16_P3C3R
-#define DEBUG_OMXIPCS_YCBCR422TORGB565_U8_U16_C2C3R
-#define DEBUG_OMXIPCS_YCBCR422TORGBLS_MCU_S16_U8_P3C3R
-#define DEBUG_OMXIPCS_YCBCR422TORGB_U8_C2C3R
-#define DEBUG_OMXIPCS_YCBCR422TOYCBCR420ROTATE_U8_C2P3R
-#define DEBUG_OMXIPCS_YCBCR422TOYCBCR420ROTATE_U8_P3R
-#define DEBUG_OMXIPCS_YCBCR444TORGB565LS_MCU_S16_U16_P3C3R
-#define DEBUG_OMXIPCS_YCBCR444TORGBLS_MCU_S16_U8_P3C3R
-#define DEBUG_OMXIPCS_YCBCRTORGB565_U8_U16_C3R
-#define DEBUG_OMXIPCS_YCBCRTORGB565_U8_U16_P3C3R
-#define DEBUG_OMXIPCS_YCBCRTORGB_U8_C3R
-#define DEBUG_OMXIPPP_GETCENTRALMOMENT_S64
-#define DEBUG_OMXIPPP_GETSPATIALMOMENT_S64
-#define DEBUG_OMXIPPP_MOMENTGETSTATESIZE_S64
-#define DEBUG_OMXIPPP_MOMENTINIT_S64
-#define DEBUG_OMXIPPP_MOMENTS64S_U8_C1R
-#define DEBUG_OMXIPPP_MOMENTS64S_U8_C3R
-#endif /* DEBUG_DOMAIN_IP */
-
-
-#endif /* _armCOMM_H_ */
-
-/*End of File*/
-
-
-
-
diff --git a/dl/api/armCOMM_s.h b/dl/api/armCOMM_s.h
index 3020894..6b0d2be 100644
--- a/dl/api/armCOMM_s.h
+++ b/dl/api/armCOMM_s.h
@@ -25,7 +25,6 @@
 @// ARM optimized OpenMAX common header file
 @//
 
-	.set	_RBytes, 0	@ Number of register bytes on stack
 	.set	_SBytes, 0	@ Number of scratch bytes on stack
 	.set	_Workspace, 0	@ Stack offset of scratch workspace
 
@@ -43,61 +42,51 @@
 	@ If rreg is lr or r4, save lr and r4
 	.ifeqs "\rreg", "lr"
 	.set	_RRegList, 4
-	.set	_RBytes, _RBytes + 8
 	.exitm
 	.endif
 
 	.ifeqs "\rreg", "r4"
 	.set	_RRegList, 4
-	.set	_RBytes, _RBytes + 8
 	.exitm
 	.endif
 
 	@ If rreg = r5 or r6, save up to register r6
 	.ifeqs "\rreg", "r5"
 	.set	_RRegList, 6
-	.set	_RBytes, _RBytes + 16
 	.exitm
 	.endif
 	.ifeqs "\rreg", "r6"
 	.set	_RRegList, 6
-	.set	_RBytes, _RBytes + 16
 	.exitm
 	.endif
 
 	@ If rreg = r7 or r8, save up to register r8
 	.ifeqs "\rreg", "r7"
 	.set	_RRegList, 8
-	.set	_RBytes, _RBytes + 24
 	.exitm
 	.endif
 	.ifeqs "\rreg", "r8"
 	.set	_RRegList, 8
-	.set	_RBytes, _RBytes + 24
 	.exitm
 	.endif
 
 	@ If rreg = r9 or r10, save up to register r10
 	.ifeqs "\rreg", "r9"
 	.set	_RRegList, 10
-	.set	_RBytes, _RBytes + 32
 	.exitm
 	.endif
 	.ifeqs "\rreg", "r10"
 	.set	_RRegList, 10
-	.set	_RBytes, _RBytes + 32
 	.exitm
 	.endif
 
 	@ If rreg = r11 or r12, save up to register r12
 	.ifeqs "\rreg", "r11"
 	.set	_RRegList, 12
-	.set	_RBytes, _RBytes + 40
 	.exitm
 	.endif
 	.ifeqs "\rreg", "r12"
 	.set	_RRegList, 12
-	.set	_RBytes, _RBytes + 40
 	.exitm
 	.endif
 
@@ -113,49 +102,41 @@
 
 	.ifeqs "\dreg", "d8"
 	.set	_DRegList, 8
-	.set	_RBytes, _RBytes + 8
 	.exitm
 	.endif
 
 	.ifeqs "\dreg", "d9"
 	.set	_DRegList, 9
-	.set	_RBytes, _RBytes + 16
 	.exitm
 	.endif
 
 	.ifeqs "\dreg", "d10"
 	.set	_DRegList, 10
-	.set	_RBytes, _RBytes + 24
 	.exitm
 	.endif
 
 	.ifeqs "\dreg", "d11"
 	.set	_DRegList, 11
-	.set	_RBytes, _RBytes + 32
 	.exitm
 	.endif
 
 	.ifeqs "\dreg", "d12"
 	.set	_DRegList, 12
-	.set	_RBytes, _RBytes + 40
 	.exitm
 	.endif
 
 	.ifeqs "\dreg", "d13"
 	.set	_DRegList, 13
-	.set	_RBytes, _RBytes + 48
 	.exitm
 	.endif
 
 	.ifeqs "\dreg", "d14"
 	.set	_DRegList, 14
-	.set	_RBytes, _RBytes + 56
 	.exitm
 	.endif
 
 	.ifeqs "\dreg", "d15"
 	.set	_DRegList, 15
-	.set	_RBytes, _RBytes + 64
 	.exitm
 	.endif
 
@@ -183,7 +164,6 @@
         @ states that r4-r11, sp, d8-d15 must be preserved by
         @ a compliant function.
 	.macro	M_START name, rreg, dreg
-	.set	_RBytes, 0
 	.set	_Workspace, 0
 
 	@ Define the function and make it external.
diff --git a/dl/dl.gyp b/dl/dl.gyp
index ae3eade..9fd09b8 100644
--- a/dl/dl.gyp
+++ b/dl/dl.gyp
@@ -19,7 +19,6 @@
         '../',
       ],
       'sources': [
-        'api/armCOMM.h',
         'api/armCOMM_s.h',
         'api/armOMX.h',
         'api/omxtypes.h',
diff --git a/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_fs_unsafe_s.S b/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_fs_unsafe_s.S
index a463a10..ff62dd1 100644
--- a/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_fs_unsafe_s.S
+++ b/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_fs_unsafe_s.S
@@ -176,8 +176,12 @@
             VLD2    {dXr1,dXi1},[pSrc :128],step1          @//  data[1]
             VADD    qZ0,qY0,qY1
 
-            @//  data[3] & update pSrc for the next set
+            @//  data[3] & update pSrc for the next set, but not if it's the
+            @//  last iteration so that we don't read past the end of the 
+            @//  input array.
+            BEQ     radix4SkipLastUpdateInv\name
             VLD2    {dXr3,dXi3},[pSrc :128],setStep
+radix4SkipLastUpdateInv\name:
             VSUB    dZr3,dYr2,dYi3
 
             VST2    {dZr0,dZi0},[pDst :128],outPointStep
@@ -199,8 +203,12 @@
             VLD2    {dXr1,dXi1},[pSrc :128],step1          @//  data[1]
             VADD    qZ0,qY0,qY1
 
-            @//  data[3] & update pSrc for the next set
+            @//  data[3] & update pSrc for the next set, but not if it's the
+            @//  last iteration so that we don't read past the end of the 
+            @//  input array.
+            BEQ     radix4SkipLastUpdateFwd\name
             VLD2    {dXr3,dXi3},[pSrc :128],setStep
+radix4SkipLastUpdateFwd\name:
             VADD    dZr2,dYr2,dYi3
 
             VST2    {dZr0,dZi0},[pDst :128],outPointStep
diff --git a/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_ls_unsafe_s.S b/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_ls_unsafe_s.S
index 091f600..9d2e4ab 100644
--- a/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_ls_unsafe_s.S
+++ b/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_ls_unsafe_s.S
@@ -228,9 +228,6 @@
 
         @// move qX0 so as to load for the next iteration
         VMOV     qZ0,qX0
-        @// AC.r AC.i BD.r BD.i
-        VLD4     {dButterfly1Real02,dButterfly1Imag02,dButterfly1Real13,dButterfly1Imag13},[pSrc :256]!
-
 
         .ifeqs  "\inverse", "TRUE"
             VMUL   dZr3,dW3r,dXr3
@@ -251,9 +248,16 @@
 
         VLD1    dW3i,[pTwiddle :64],grpTwStep           @// [wi|wr]
 
+        @// Don't do the load on the last iteration so we don't read past the end
+        @// of pSrc.
+        addeq   pSrc, pSrc, #64
+        beq     radix4lsSkipRead\name
+        @// AC.r AC.i BD.r BD.i
+        VLD4     {dButterfly1Real02,dButterfly1Imag02,dButterfly1Real13,dButterfly1Imag13},[pSrc :256]!
+
         @// AC.r AC.i BD.r BD.i
         VLD4     {dButterfly2Real02,dButterfly2Imag02,dButterfly2Real13,dButterfly2Imag13},[pSrc :256]!
-
+radix4lsSkipRead\name:
 
         @// finish first stage of 4 point FFT
 
diff --git a/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_unsafe_s.S b/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_unsafe_s.S
index 355fa0f..ae450c5 100644
--- a/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_unsafe_s.S
+++ b/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_unsafe_s.S
@@ -187,8 +187,6 @@
 
 
 
-        SUBS    setCount,setCount,#2
-
         .ifeqs  "\inverse", "TRUE"
             VMUL   dZr1,dXr1,dW1[0]
             VMUL   dZi1,dXi1,dW1[0]
@@ -236,7 +234,16 @@
         .endif
 
         @//  data[3] & update pSrc to data[0]
+        @// But don't read on the very last iteration because that reads past 
+	@// the end of pSrc. The last iteration is grpCount = 4, setCount = 2.
+        cmp     grpCount, #4
+        cmpeq   setCount, #2                      @// Test setCount if grpCount = 4
+        @// These are executed only if both grpCount = 4 and setCount = 2       
+        addeq   pSrc, pSrc, setStep
+        beq     radix4SkipRead\name
         VLD2    {dXr3,dXi3},[pSrc],setStep
+radix4SkipRead\name:
+        SUBS    setCount,setCount,#2
 
         @// finish first stage of 4 point FFT
         VADD    qY0,qX0,qZ2
diff --git a/dl/sp/src/armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.S b/dl/sp/src/armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.S
index 72a0c8f..3e36093 100644
--- a/dl/sp/src/armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.S
+++ b/dl/sp/src/armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.S
@@ -332,8 +332,11 @@
             VSUB    dVi7,dVi7,dT1
             SUB     pDst, pDst, step2                 @// set pDst to y1
 
+            @// On the last iteration,  this will read past the end of pSrc, 
+            @// so skip this read.
+            BEQ     radix8SkipLastUpdateInv\name
             VLD2    {dXr7,dXi7},[pSrc :128],setStep   @//  data[7]
-
+radix8SkipLastUpdateInv\name:
 
             VSUB    dYr3,dVr3,dVr7
             VSUB    dYi3,dVi3,dVi7
@@ -370,7 +373,12 @@
 
             VSUB    dVr5,dT1,dVi5                     @// a * V5
             VADD    dVi5,dT1,dVi5
+
+            @// On the last iteration,  this will read past the end of pSrc, 
+            @// so skip this read.
+            BEQ     radix8SkipLastUpdateFwd\name
             VLD2    {dXr7,dXi7},[pSrc :128],setStep   @//  data[7]
+radix8SkipLastUpdateFwd\name:
 
             VSUB    qY5,qV1,qV5
 
diff --git a/dl/sp/src/omxSP_FFTGetBufSize_C_FC32.c b/dl/sp/src/omxSP_FFTGetBufSize_C_FC32.c
index a513d1b..081f237 100644
--- a/dl/sp/src/omxSP_FFTGetBufSize_C_FC32.c
+++ b/dl/sp/src/omxSP_FFTGetBufSize_C_FC32.c
@@ -26,7 +26,7 @@
  * Input Arguments:
  *
  *   order - base-2 logarithm of the desired block length; valid in the range
- *            [0,12] ([0,15] if BIG_FFT_TABLE is defined.)
+ *            [1,12] ([1,15] if BIG_FFT_TABLE is defined.)
  *
  * Output Arguments:
  *
@@ -41,7 +41,7 @@
  */
 
 OMXResult omxSP_FFTGetBufSize_C_FC32(OMX_INT order, OMX_INT *pSize) {
-  if (!pSize || (order < 0) || (order > TWIDDLE_TABLE_ORDER))
+  if (!pSize || (order < 1) || (order > TWIDDLE_TABLE_ORDER))
     return OMX_Sts_BadArgErr;
   /*
    * The required size is the same as for C_SC32, because the
diff --git a/dl/sp/src/omxSP_FFTGetBufSize_C_SC16.c b/dl/sp/src/omxSP_FFTGetBufSize_C_SC16.c
index ce87d1f..288c76c 100644
--- a/dl/sp/src/omxSP_FFTGetBufSize_C_SC16.c
+++ b/dl/sp/src/omxSP_FFTGetBufSize_C_SC16.c
@@ -25,7 +25,6 @@
  * Compute the size of the specification structure required
  */
 
-#include "dl/api/armCOMM.h"
 #include "dl/api/armOMX.h"
 #include "dl/api/omxtypes.h"
 #include "dl/sp/api/armSP.h"
diff --git a/dl/sp/src/omxSP_FFTGetBufSize_R_F32.c b/dl/sp/src/omxSP_FFTGetBufSize_R_F32.c
index d98995d..19b16bb 100644
--- a/dl/sp/src/omxSP_FFTGetBufSize_R_F32.c
+++ b/dl/sp/src/omxSP_FFTGetBufSize_R_F32.c
@@ -9,7 +9,6 @@
  *
  */
 
-#include "dl/api/armCOMM.h"
 #include "dl/api/armOMX.h"
 #include "dl/api/omxtypes.h"
 #include "dl/sp/api/armSP.h"
@@ -28,7 +27,7 @@
  *
  * Parameters:
  * [in]  order       base-2 logarithm of the length; valid in the range
- *                    [0,12]. ([0,15] if BIG_FFT_TABLE is defined.)
+ *                    [1,12]. ([1,15] if BIG_FFT_TABLE is defined.)
  * [out] pSize	   pointer to the number of bytes required for the
  *			   specification structure.
  *
@@ -38,7 +37,7 @@
  */
 
 OMXResult omxSP_FFTGetBufSize_R_F32(OMX_INT order, OMX_INT *pSize) {
-  if (!pSize || (order < 0) || (order > TWIDDLE_TABLE_ORDER))
+  if (!pSize || (order < 1) || (order > TWIDDLE_TABLE_ORDER))
     return OMX_Sts_BadArgErr;
 
   /*
diff --git a/dl/sp/src/omxSP_FFTGetBufSize_R_S16S32.c b/dl/sp/src/omxSP_FFTGetBufSize_R_S16S32.c
index 9512e92..8465363 100644
--- a/dl/sp/src/omxSP_FFTGetBufSize_R_S16S32.c
+++ b/dl/sp/src/omxSP_FFTGetBufSize_R_S16S32.c
@@ -25,7 +25,6 @@
  * Computes the size of the specification structure required.
  */
 
-#include "dl/api/armCOMM.h"
 #include "dl/api/armOMX.h"
 #include "dl/api/omxtypes.h"
 #include "dl/sp/api/armSP.h"
diff --git a/dl/sp/src/omxSP_FFTGetBufSize_R_S32.c b/dl/sp/src/omxSP_FFTGetBufSize_R_S32.c
index bedf677..d572947 100644
--- a/dl/sp/src/omxSP_FFTGetBufSize_R_S32.c
+++ b/dl/sp/src/omxSP_FFTGetBufSize_R_S32.c
@@ -25,7 +25,6 @@
  * Computes the size of the specification structure required.
  */
 
-#include "dl/api/armCOMM.h"
 #include "dl/api/armOMX.h"
 #include "dl/api/omxtypes.h"
 #include "dl/sp/api/armSP.h"
diff --git a/dl/sp/src/omxSP_FFTInit_C_FC32.c b/dl/sp/src/omxSP_FFTInit_C_FC32.c
index ce81b9a..cc53c59 100644
--- a/dl/sp/src/omxSP_FFTInit_C_FC32.c
+++ b/dl/sp/src/omxSP_FFTInit_C_FC32.c
@@ -11,7 +11,6 @@
  *  complex float instead of SC32.
  */
 
-#include "dl/api/armCOMM.h"
 #include "dl/api/armOMX.h"
 #include "dl/api/omxtypes.h"
 #include "dl/sp/api/armSP.h"
@@ -34,7 +33,8 @@
  *
  * Parameters:
  * [in]  order       base-2 logarithm of the desired block length;
- *                     valid in the range [0,12].
+ *                     valid in the range [1,12]. ([1,15] if
+ *                     BIG_FFT_TABLE is defined.)
  * [out] pFFTSpec    pointer to initialized specification structure.
  *
  * Return Value:
@@ -61,14 +61,8 @@
 
   pFFTStruct = (ARMsFFTSpec_FC32 *) pFFTSpec;
 
-  /* if order zero no init is needed */
-  if (order == 0) {
-    pFFTStruct->N = 1;
-    return OMX_Sts_NoErr;
-  }
-
   /* Validate args */
-  if (!pFFTSpec || (order < 0) || (order > TWIDDLE_TABLE_ORDER))
+  if (!pFFTSpec || (order < 1) || (order > TWIDDLE_TABLE_ORDER))
     return OMX_Sts_BadArgErr;
 
   /* Do the initializations */
diff --git a/dl/sp/src/omxSP_FFTInit_C_SC16.c b/dl/sp/src/omxSP_FFTInit_C_SC16.c
index fdab9b0..f8248bb 100644
--- a/dl/sp/src/omxSP_FFTInit_C_SC16.c
+++ b/dl/sp/src/omxSP_FFTInit_C_SC16.c
@@ -25,7 +25,6 @@
  * Initializes the specification structures required
  */
 
-#include "dl/api/armCOMM.h"
 #include "dl/api/armOMX.h"
 #include "dl/api/omxtypes.h"
 #include "dl/sp/api/armSP.h"
diff --git a/dl/sp/src/omxSP_FFTInit_C_SC32.c b/dl/sp/src/omxSP_FFTInit_C_SC32.c
index 9231d8f..9ea103f 100644
--- a/dl/sp/src/omxSP_FFTInit_C_SC32.c
+++ b/dl/sp/src/omxSP_FFTInit_C_SC32.c
@@ -25,7 +25,6 @@
  * Initializes the specification structures required
  */
 
-#include "dl/api/armCOMM.h"
 #include "dl/api/armOMX.h"
 #include "dl/api/omxtypes.h"
 #include "dl/sp/api/armSP.h"
diff --git a/dl/sp/src/omxSP_FFTInit_R_F32.c b/dl/sp/src/omxSP_FFTInit_R_F32.c
index e5c69fb..32d2223 100644
--- a/dl/sp/src/omxSP_FFTInit_R_F32.c
+++ b/dl/sp/src/omxSP_FFTInit_R_F32.c
@@ -11,7 +11,6 @@
  *  instead of S32.
  */
 
-#include "dl/api/armCOMM.h"
 #include "dl/api/armOMX.h"
 #include "dl/api/omxtypes.h"
 #include "dl/sp/api/armSP.h"
@@ -33,7 +32,8 @@
  *
  * Parameters:
  * [in]  order       base-2 logarithm of the desired block length;
- *                         valid in the range [0,12].
+ *                         valid in the range [1,12].  ([1,15] if
+ *                         BIG_FFT_TABLE is defined.)
  * [out] pFFTFwdSpec pointer to the initialized specification structure.
  *
  * Return Value:
@@ -63,18 +63,8 @@
 
   pFFTStruct = (ARMsFFTSpec_R_FC32 *) pFFTSpec;
 
-  /* if order zero no init is needed */
-  if (order == 0) {
-    pFFTStruct->N = 1;
-    pFFTStruct->pTwiddle = NULL;
-    pFFTStruct->pBuf = (OMX_F32 *)
-        (sizeof(ARMsFFTSpec_R_SC32) + (OMX_S8*) pFFTSpec);
-
-    return OMX_Sts_NoErr;
-  }
-
   /* Validate args */
-  if (!pFFTSpec || (order < 0) || (order > TWIDDLE_TABLE_ORDER))
+  if (!pFFTSpec || (order < 1) || (order > TWIDDLE_TABLE_ORDER))
     return OMX_Sts_BadArgErr;
 
   /* Do the initializations */
diff --git a/dl/sp/src/omxSP_FFTInit_R_S16S32.c b/dl/sp/src/omxSP_FFTInit_R_S16S32.c
index 34e44c7..d157b34 100644
--- a/dl/sp/src/omxSP_FFTInit_R_S16S32.c
+++ b/dl/sp/src/omxSP_FFTInit_R_S16S32.c
@@ -25,7 +25,6 @@
  * Initialize the real forward-FFT specification information struct.
  */
 
-#include "dl/api/armCOMM.h"
 #include "dl/api/armOMX.h"
 #include "dl/api/omxtypes.h"
 #include "dl/sp/api/armSP.h"
diff --git a/dl/sp/src/omxSP_FFTInit_R_S32.c b/dl/sp/src/omxSP_FFTInit_R_S32.c
index e4f0357..337f2a2 100644
--- a/dl/sp/src/omxSP_FFTInit_R_S32.c
+++ b/dl/sp/src/omxSP_FFTInit_R_S32.c
@@ -25,7 +25,6 @@
  * Initialize the real forward-FFT specification information struct.
  */
 
-#include "dl/api/armCOMM.h"
 #include "dl/api/armOMX.h"
 #include "dl/api/omxtypes.h"
 #include "dl/sp/api/armSP.h"
diff --git a/dl/src/armCOMM.c b/dl/src/armCOMM.c
deleted file mode 100644
index 1118744..0000000
--- a/dl/src/armCOMM.c
+++ /dev/null
@@ -1,949 +0,0 @@
-/*
- *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- *
- *  This file was originally licensed as follows. It has been
- *  relicensed with permission from the copyright holders.
- */
-
-/**
- * 
- * File Name:  armCOMM.c
- * OpenMAX DL: v1.0.2
- * Revision:   10586
- * Date:       Wednesday, March 5, 2008
- * 
- * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
- * 
- * 
- *
- * Defines Common APIs used across OpenMAX API's
- */
-
-#include "omxtypes.h"
-#include "armCOMM.h"
-
-/***********************************************************************/
-                /* Miscellaneous Arithmetic operations */
-
-/**
- * Function: armRoundFloatToS16
- *
- * Description:
- * Converts a double precision value into a short int after rounding
- *
- * Parameters:
- * [in]  Value                 Float value to be converted
- *
- * Return Value:
- * [out] converted value in OMX_S16 format
- *
- */
-
-OMX_S16 armRoundFloatToS16 (OMX_F64 Value)
-{
-    if (Value > 0)
-    {
-        return (OMX_S16)(Value + .5);
-    }
-    else
-    {
-        return (OMX_S16)(Value - .5);
-    }
-}
-
-/**
- * Function: armRoundFloatToS32
- *
- * Description:
- * Converts a double precision value into a int after rounding
- *
- * Parameters:
- * [in]  Value                 Float value to be converted
- *
- * Return Value:
- * [out] converted value in OMX_S32 format
- *
- */
-
-OMX_S32 armRoundFloatToS32 (OMX_F64 Value)
-{
-    if (Value > 0)
-    {
-        return (OMX_S32)(Value + .5);
-    }
-    else
-    {
-        return (OMX_S32)(Value - .5);
-    }
-}
-/**
- * Function: armSatRoundFloatToS16
- *
- * Description:
- * Converts a double precision value into a short int after rounding and saturation
- *
- * Parameters:
- * [in]  Value                 Float value to be converted
- *
- * Return Value:
- * [out] converted value in OMX_S16 format
- *
- */
-
-OMX_S16 armSatRoundFloatToS16 (OMX_F64 Value)
-{
-    if (Value > 0)
-    {
-        Value += 0.5;
-        
-        if(Value > (OMX_S16)OMX_MAX_S16 )
-        {
-            return (OMX_S16)OMX_MAX_S16;
-        }
-        else
-        {
-            return (OMX_S16)Value;
-        }
-    }
-    else
-    {
-        Value -= 0.5;
-
-        if(Value < (OMX_S16)OMX_MIN_S16 )
-        {
-            return (OMX_S16)OMX_MIN_S16;
-        }
-        else
-        {
-            return (OMX_S16)Value;
-        }
-    }
-}
-
-/**
- * Function: armSatRoundFloatToS32
- *
- * Description:
- * Converts a double precision value into a int after rounding and saturation
- *
- * Parameters:
- * [in]  Value                 Float value to be converted
- *
- * Return Value:
- * [out] converted value in OMX_S32 format
- *
- */
-
-OMX_S32 armSatRoundFloatToS32 (OMX_F64 Value)
-{
-    if (Value > 0)
-    {
-        Value += 0.5;
-        
-        if(Value > (OMX_S32)OMX_MAX_S32 )
-        {
-            return (OMX_S32)OMX_MAX_S32;
-        }
-        else
-        {
-            return (OMX_S32)Value;
-        }
-    }
-    else
-    {
-        Value -= 0.5;
-
-        if(Value < (OMX_S32)OMX_MIN_S32 )
-        {
-            return (OMX_S32)OMX_MIN_S32;
-        }
-        else
-        {
-            return (OMX_S32)Value;
-        }
-    }
-}
-
-/**
- * Function: armSatRoundFloatToU16
- *
- * Description:
- * Converts a double precision value into a unsigned short int after rounding and saturation
- *
- * Parameters:
- * [in]  Value                 Float value to be converted
- *
- * Return Value:
- * [out] converted value in OMX_U16 format
- *
- */
-
-OMX_U16 armSatRoundFloatToU16 (OMX_F64 Value)
-{
-    Value += 0.5;
-    
-    if(Value > (OMX_U16)OMX_MAX_U16 )
-    {
-        return (OMX_U16)OMX_MAX_U16;
-    }
-    else
-    {
-        return (OMX_U16)Value;
-    }
-}
-
-/**
- * Function: armSatRoundFloatToU32
- *
- * Description:
- * Converts a double precision value into a unsigned int after rounding and saturation
- *
- * Parameters:
- * [in]  Value                 Float value to be converted
- *
- * Return Value:
- * [out] converted value in OMX_U32 format
- *
- */
-
-OMX_U32 armSatRoundFloatToU32 (OMX_F64 Value)
-{
-    Value += 0.5;
-    
-    if(Value > (OMX_U32)OMX_MAX_U32 )
-    {
-        return (OMX_U32)OMX_MAX_U32;
-    }
-    else
-    {
-        return (OMX_U32)Value;
-    }
-}
-
-/**
- * Function: armRoundFloatToS64
- *
- * Description:
- * Converts a double precision value into a 64 bit int after rounding
- *
- * Parameters:
- * [in]  Value                 Float value to be converted
- *
- * Return Value:
- * [out] converted value in OMX_S64 format
- *
- */
-
-OMX_S64 armRoundFloatToS64 (OMX_F64 Value)
-{
-    if (Value > 0)
-    {
-        return (OMX_S64)(Value + .5);
-    }
-    else
-    {
-        return (OMX_S64)(Value - .5);
-    }
-}
-
-/**
- * Function: armSignCheck
- *
- * Description:
- * Checks the sign of a variable:
- * returns 1 if it is Positive
- * returns 0 if it is 0
- * returns -1 if it is Negative 
- *
- * Remarks:
- *
- * Parameters:
- * [in]	    var     Variable to be checked
- *
- * Return Value:
- * OMX_INT --   returns 1 if it is Positive
- *              returns 0 if it is 0
- *              returns -1 if it is Negative 
- */ 
-
-OMX_INT armSignCheck (
-    OMX_S16 var
-)
-
-{
-    OMX_INT Sign;
-    
-    if (var < 0)
-    {
-        Sign = -1;
-    }
-    else if ( var > 0)
-    {
-        Sign = 1;
-    }
-    else
-    {
-        Sign = 0;
-    }
-    
-    return Sign;
-}
-
-/**
- * Function: armClip
- *
- * Description: Clips the input between MAX and MIN value
- * 
- *
- * Remarks:
- *
- * Parameters:
- * [in] Min     lower bound
- * [in] Max     upper bound
- * [in] src     variable to the clipped
- *
- * Return Value:
- * OMX_S32 --   returns clipped value
- */ 
- 
-OMX_S32 armClip (
-    OMX_INT min,
-    OMX_INT max, 
-    OMX_S32 src 
-)
- 
-{
-    if (src > max)
-    {
-        src = max;
-    }
-    else if (src < min)
-    {
-        src = min;
-    }
-    
-    return src;
-}
-
-/**
- * Function: armClip_F32
- *
- * Description: Clips the input between MAX and MIN value
- * 
- *
- * Remarks:
- *
- * Parameters:
- * [in] Min     lower bound
- * [in] Max     upper bound
- * [in] src     variable to the clipped
- *
- * Return Value:
- * OMX_F32 --   returns clipped value
- */ 
- 
-OMX_F32 armClip_F32 (
-    OMX_F32 min,
-    OMX_F32 max, 
-    OMX_F32 src 
-)
- 
-{
-    if (src > max)
-    {
-        src = max;
-    }
-    else if (src < min)
-    {
-        src = min;
-    }
-    
-    return src;
-}
-
-/**
- * Function: armShiftSat_F32
- *
- * Description: Divides a float value by 2^shift and 
- * saturates it for unsigned value range for satBits.
- * Second parameter is like "shifting" the corresponding 
- * integer value. Takes care of rounding while clipping the final 
- * value.
- *
- * Parameters:
- * [in] v          Number to be operated upon
- * [in] shift      Divides the input "v" by "2^shift"
- * [in] satBits    Final range is [0, 2^satBits)
- *
- * Return Value:
- * OMX_S32 --   returns "shifted" saturated value
- */ 
- 
-OMX_U32 armShiftSat_F32(OMX_F32 v, OMX_INT shift, OMX_INT satBits) 
-{
-    OMX_U32 allOnes = (OMX_U32)(-1);
-    OMX_U32 maxV = allOnes >> (32-satBits);
-    OMX_F32 vShifted, vRounded, shiftDiv = (OMX_F32)(1 << shift);
-    OMX_U32 vInt;
-    OMX_U32 vIntSat;
-    
-    if(v <= 0)
-        return 0;
-    
-    vShifted = v / shiftDiv;
-    vRounded = (OMX_F32)(vShifted + 0.5);
-    vInt = (OMX_U32)vRounded;
-    vIntSat = vInt;
-    if(vIntSat > maxV) 
-        vIntSat = maxV;
-    return vIntSat;
-}
-
-/**
- * Functions: armSwapElem
- *
- * Description:
- * These function swaps two elements at the specified pointer locations.
- * The size of each element could be anything as specified by <elemSize>
- *
- * Return Value:
- * OMXResult -- Error status from the function
- */
-OMXResult armSwapElem(
-        OMX_U8 *pBuf1,
-        OMX_U8 *pBuf2,
-        OMX_INT elemSize
-       )
-{
-    OMX_INT i;
-    OMX_U8 temp;
-    armRetArgErrIf(!pBuf1 || !pBuf2, OMX_Sts_BadArgErr);
-    
-    for(i = 0; i < elemSize; i++)
-    {
-        temp = *(pBuf1 + i);
-        *(pBuf1 + i) = *(pBuf2 + i);
-        *(pBuf2 + i) = temp;
-    }
-    return OMX_Sts_NoErr;
-}
-
-/**
- * Function: armMedianOf3
- *
- * Description: Finds the median of three numbers
- * 
- * Remarks:
- *
- * Parameters:
- * [in] fEntry     First entry
- * [in] sEntry     second entry
- * [in] tEntry     Third entry
- *
- * Return Value:
- * OMX_S32 --   returns the median value
- */ 
- 
-OMX_S32 armMedianOf3 (
-    OMX_S32 fEntry,
-    OMX_S32 sEntry, 
-    OMX_S32 tEntry 
-)
-{
-    OMX_S32 a, b, c;
-    
-    a = armMin (fEntry, sEntry);
-    b = armMax (fEntry, sEntry);
-    c = armMin (b, tEntry);
-    return (armMax (a, c));
-}
-
-/**
- * Function: armLogSize
- *
- * Description: Finds the size of a positive value and returns the same
- * 
- * Remarks:
- *
- * Parameters:
- * [in] value    Positive value
- *
- * Return Value:
- * OMX_U8 --     Returns the minimum number of bits required to represent the positive value. 
-                 This is the smallest k>=0 such that that value is less than (1<<k).
- */ 
- 
-OMX_U8 armLogSize (
-    OMX_U16 value 
-)
-{
-    OMX_U8 i;    
-    for ( i = 0; value > 0; value = value >> 1) 
-    {
-        i++;
-    }
-    return i;
-}
-
-/***********************************************************************/
-                /* Saturating Arithmetic operations */
-
-/**
- * Function :armSatAdd_S32()
- *
- * Description :
- *   Returns the result of saturated addition of the two inputs Value1, Value2
- *
- * Parametrs:
- * [in] Value1       First Operand
- * [in] Value2       Second Operand
- *
- * Return:
- * [out]             Result of operation
- * 
- *    
- **/
- 
-OMX_S32 armSatAdd_S32(OMX_S32 Value1,OMX_S32 Value2)
-{
-    OMX_S32 Result;
-    
-    Result = Value1 + Value2;
-
-    if( (Value1^Value2) >= 0)
-    {
-        /*Same sign*/
-        if( (Result^Value1) >= 0)
-        {
-            /*Result has not saturated*/
-            return Result;
-        }
-        else
-        {
-            if(Value1 >= 0)
-            {
-                /*Result has saturated in positive side*/
-                return OMX_MAX_S32;
-            }
-            else
-            {
-                /*Result has saturated in negative side*/
-                return OMX_MIN_S32;
-            }
-        
-        }
-   
-    }
-    else
-    {
-        return Result;
-    }
-    
-}
-
-/**
- * Function :armSatAdd_S64()
- *
- * Description :
- *   Returns the result of saturated addition of the two inputs Value1, Value2
- *
- * Parametrs:
- * [in] Value1       First Operand
- * [in] Value2       Second Operand
- *
- * Return:
- * [out]             Result of operation
- * 
- *    
- **/
- 
-OMX_S64 armSatAdd_S64(OMX_S64 Value1,OMX_S64 Value2)
-{
-    OMX_S64 Result;
-    
-    Result = Value1 + Value2;
-
-    if( (Value1^Value2) >= 0)
-    {
-        /*Same sign*/
-        if( (Result^Value1) >= 0)
-        {
-            /*Result has not saturated*/
-            return Result;
-        }
-        else
-        {
-            if(Value1 >= 0)
-            {
-                /*Result has saturated in positive side*/
-                Result = OMX_MAX_S64;
-                return Result;
-            }
-            else
-            {
-                /*Result has saturated in negative side*/
-                return OMX_MIN_S64;
-            }
-        
-        }
-   
-    }
-    else
-    {
-        return Result;
-    }
-    
-}
-
-/** Function :armSatSub_S32()
- * 
- * Description :
- *     Returns the result of saturated substraction of the two inputs Value1, Value2
- *
- * Parametrs:
- * [in] Value1       First Operand
- * [in] Value2       Second Operand
- *
- * Return:
- * [out]             Result of operation
- * 
- **/
-
-OMX_S32 armSatSub_S32(OMX_S32 Value1,OMX_S32 Value2)
-{
-    OMX_S32 Result;
-    
-    Result = Value1 - Value2;
-
-    if( (Value1^Value2) < 0)
-    {
-        /*Opposite sign*/
-        if( (Result^Value1) >= 0)
-        {
-            /*Result has not saturated*/
-            return Result;
-        }
-        else
-        {
-            if(Value1 >= 0)
-            {
-                /*Result has saturated in positive side*/
-                return OMX_MAX_S32;
-            }
-            else
-            {
-                /*Result has saturated in negative side*/
-                return OMX_MIN_S32;
-            }
-        
-        }
-   
-    }
-    else
-    {
-        return Result;
-    }
-    
-}
-
-/**
- * Function :armSatMac_S32()
- *
- * Description :
- *     Returns the result of Multiplication of Value1 and Value2 and subesquent saturated
- *     accumulation with Mac
- *
- * Parametrs:
- * [in] Value1       First Operand
- * [in] Value2       Second Operand
- * [in] Mac          Accumulator
- *
- * Return:
- * [out]             Result of operation
- **/
-
-OMX_S32 armSatMac_S32(OMX_S32 Mac,OMX_S16 Value1,OMX_S16 Value2)
-{
-    OMX_S32 Result;
-    
-    Result = (OMX_S32)(Value1*Value2);
-    Result = armSatAdd_S32( Mac , Result );
-
-    return Result;    
-}
-
-/**
- * Function :armSatMac_S16S32_S32
- *
- * Description :
- *   Returns the result of saturated MAC operation of the three inputs delayElem, filTap , mac
- *
- *   mac = mac + Saturate_in_32Bits(delayElem * filTap)
- *
- * Parametrs:
- * [in] delayElem    First 32 bit Operand
- * [in] filTap       Second 16 bit Operand
- * [in] mac          Result of MAC operation
- *
- * Return:
- * [out]  mac        Result of operation
- *    
- **/
- 
-OMX_S32 armSatMac_S16S32_S32(OMX_S32 mac, OMX_S32 delayElem, OMX_S16 filTap )
-{
-    
-    OMX_S32 result;
-
-    result = armSatMulS16S32_S32(filTap,delayElem); 
-
-    if ( result > OMX_MAX_S16 )
-    {
-        result = OMX_MAX_S32;
-    }
-    else if( result < OMX_MIN_S16 )
-    {
-        result = OMX_MIN_S32;
-    }
-    else
-    {
-        result = delayElem * filTap;
-    }
-
-    mac = armSatAdd_S32(mac,result);
-    
-    return mac;
-}
-
-
-/**
- * Function :armSatRoundRightShift_S32_S16
- *
- * Description :
- *   Returns the result of rounded right shift operation of input by the scalefactor
- *
- *   output = Saturate_in_16Bits( ( Right/LeftShift( (Round(input) , shift ) )
- *
- * Parametrs:
- * [in] input       The input to be operated on
- * [in] shift The shift number
- *
- * Return:
- * [out]            Result of operation
- *    
- **/
-
-
-OMX_S16 armSatRoundRightShift_S32_S16(OMX_S32 input, OMX_INT shift)
-{
-    input = armSatRoundLeftShift_S32(input,-shift);
-
-    if ( input > OMX_MAX_S16 )
-    {
-        return (OMX_S16)OMX_MAX_S16;
-    }
-    else if (input < OMX_MIN_S16)
-    {
-        return (OMX_S16)OMX_MIN_S16;
-    }
-    else
-    {
-       return (OMX_S16)input;
-    }
-
-}
-
-/**
- * Function :armSatRoundLeftShift_S32()
- *
- * Description :
- *     Returns the result of saturating left-shift operation on input
- *     Or rounded Right shift if the input Shift is negative.
- *     
- * Parametrs:
- * [in] Value        Operand
- * [in] Shift        Operand for shift operation
- *
- * Return:
- * [out]             Result of operation
- *    
- **/
-
-OMX_S32 armSatRoundLeftShift_S32(OMX_S32 Value, OMX_INT Shift)
-{
-    OMX_INT i;
-    
-    if (Shift < 0)
-    {
-        Shift = -Shift;
-        Value = armSatAdd_S32(Value, (1 << (Shift - 1)));
-        Value = Value >> Shift;
-    }
-    else
-    {
-        for (i = 0; i < Shift; i++)
-        {
-            Value = armSatAdd_S32(Value, Value);
-        }
-    }
-    return Value;
-}
-
-/**
- * Function :armSatRoundLeftShift_S64()
- *
- * Description :
- *     Returns the result of saturating left-shift operation on input
- *     Or rounded Right shift if the input Shift is negative.
- *
- * Parametrs:
- * [in] Value        Operand
- * [in] shift        Operand for shift operation
- *
- * Return:
- * [out]             Result of operation
- *    
- **/
- 
-OMX_S64 armSatRoundLeftShift_S64(OMX_S64 Value, OMX_INT Shift)
-{
-    OMX_INT i;
-    
-    if (Shift < 0)
-    {
-        Shift = -Shift;
-        Value = armSatAdd_S64(Value, ((OMX_S64)1 << (Shift - 1)));
-        Value = Value >> Shift;
-    }
-    else
-    {
-        for (i = 0; i < Shift; i++)
-        {
-            Value = armSatAdd_S64(Value, Value);
-        }
-    }
-    return Value;
-}
-
-/**
- * Function :armSatMulS16S32_S32()
- *
- * Description :
- *     Returns the result of a S16 data type multiplied with an S32 data type
- *     in a S32 container
- *
- * Parametrs:
- * [in] input1       Operand 1
- * [in] input2       Operand 2
- *
- * Return:
- * [out]             Result of operation
- *    
- **/
-
-
-OMX_S32 armSatMulS16S32_S32(OMX_S16 input1,OMX_S32 input2)
-{
-    OMX_S16 hi2,lo1;
-    OMX_U16 lo2;
-    
-    OMX_S32 temp1,temp2;
-    OMX_S32 result;
-    
-    lo1  = input1;
-
-    hi2  = ( input2 >>  16 );
-    lo2  = ( (OMX_U32)( input2 << 16 ) >> 16 );
-    
-    temp1 = hi2 * lo1;
-    temp2 = ( lo2* lo1 ) >> 16;
-
-    result =  armSatAdd_S32(temp1,temp2);
-
-    return result;
-}
-
-/**
- * Function :armSatMulS32S32_S32()
- *
- * Description :
- *     Returns the result of a S32 data type multiplied with an S32 data type
- *     in a S32 container
- *
- * Parametrs:
- * [in] input1       Operand 1
- * [in] input2       Operand 2
- *
- * Return:
- * [out]             Result of operation
- *    
- **/
-
-OMX_S32 armSatMulS32S32_S32(OMX_S32 input1,OMX_S32 input2)
-{
-    OMX_S16 hi1,hi2;
-    OMX_U16 lo1,lo2;
-    
-    OMX_S32 temp1,temp2,temp3;
-    OMX_S32 result;
-
-    hi1  = ( input1 >>  16 );
-    lo1  = ( (OMX_U32)( input1 << 16 ) >> 16 );
-
-    hi2  = ( input2 >>  16 );
-    lo2  = ( (OMX_U32)( input2 << 16 ) >> 16 );
-    
-    temp1 =   hi1 * hi2;
-    temp2 = ( hi1* lo2 ) >> 16;
-    temp3 = ( hi2* lo1 ) >> 16;
-
-    result = armSatAdd_S32(temp1,temp2);
-    result = armSatAdd_S32(result,temp3);
-
-    return result;
-}
-
-/**
- * Function :armIntDivAwayFromZero()
- *
- * Description : Integer division with rounding to the nearest integer. 
- *               Half-integer values are rounded away from zero
- *               unless otherwise specified. For example 3//2 is rounded 
- *               to 2, and -3//2 is rounded to -2.
- *
- * Parametrs:
- * [in] Num        Operand 1
- * [in] Deno       Operand 2
- *
- * Return:
- * [out]             Result of operation input1//input2
- *    
- **/
-
-OMX_S32 armIntDivAwayFromZero (OMX_S32 Num, OMX_S32 Deno)
-{
-    OMX_F64 result;
-    
-    result = ((OMX_F64)Num)/((OMX_F64)Deno);
-    
-    if (result >= 0)
-    {
-        result += 0.5;
-    }
-    else
-    {
-        result -= 0.5;
-    }
-
-    return (OMX_S32)(result);
-}
-
-
-/*End of File*/
-
