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