omxVCM4P2_IDCT8x8blk.c revision 78e52bfac041d71ce53b5b13c2abf78af742b09d
1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2007-2008 ARM Limited 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Licensed under the Apache License, Version 2.0 (the "License"); 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * you may not use this file except in compliance with the License. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * You may obtain a copy of the License at 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * http://www.apache.org/licenses/LICENSE-2.0 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unless required by applicable law or agreed to in writing, software 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distributed under the License is distributed on an "AS IS" BASIS, 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See the License for the specific language governing permissions and 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * limitations under the License. 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * File Name: omxVCM4P2_IDCT8x8blk.c 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OpenMAX DL: v1.0.2 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Revision: 9641 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Date: Thursday, February 7, 2008 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Description: 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Contains modules for 8x8 block IDCT 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <math.h> 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "omxtypes.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "armOMX.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "omxVC.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "armCOMM.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "armVCM4P2_DCT_Table.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Function: omxVCM4P2_IDCT8x8blk (6.2.3.2.1) 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Description: 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Computes a 2D inverse DCT for a single 8x8 block, as defined in 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * [ISO14496-2]. 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input Arguments: 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pSrc - pointer to the start of the linearly arranged IDCT input buffer; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * must be aligned on a 16-byte boundary. According to 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * [ISO14496-2], the input coefficient values should lie within the 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * range [-2048, 2047]. 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output Arguments: 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pDst - pointer to the start of the linearly arranged IDCT output buffer; 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * must be aligned on a 16-byte boundary. 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return Value: 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OMX_Sts_NoErr - no error 63 * OMX_Sts_BadArgErr - bad arguments: 64 * - pSrc or pDst is NULL. 65 * - pSrc or pDst is not 16-byte aligned. 66 * 67 */ 68OMXResult omxVCM4P2_IDCT8x8blk (const OMX_S16 *pSrc, OMX_S16 *pDst) 69{ 70 OMX_INT x, y, u, v; 71 72 /* Argument error checks */ 73 armRetArgErrIf(pSrc == NULL, OMX_Sts_BadArgErr); 74 armRetArgErrIf(!armIs16ByteAligned(pSrc), OMX_Sts_BadArgErr); 75 armRetArgErrIf(pDst == NULL, OMX_Sts_BadArgErr); 76 armRetArgErrIf(!armIs16ByteAligned(pDst), OMX_Sts_BadArgErr); 77 78 for (x = 0; x < 8; x++) 79 { 80 for (y = 0; y < 8; y++) 81 { 82 OMX_F64 sum = 0.0; 83 for (u = 0; u < 8; u++) 84 { 85 for (v = 0; v < 8; v++) 86 { 87 sum += pSrc[(u * 8) + v] * 88 armVCM4P2_preCalcDCTCos[x][u] * 89 armVCM4P2_preCalcDCTCos[y][v]; 90 } 91 } 92 pDst[(x * 8) + y] = (OMX_S16) floor(sum + 0.5); 93 94 /* Saturate to [-256, 255] */ 95 pDst[(x * 8) + y] = armClip ( 96 -256, 97 255, 98 pDst[(x * 8) + y]); 99 } 100 } 101 102 return OMX_Sts_NoErr; 103} 104 105/* End of file */ 106 107 108