omxVCM4P2_QuantInvInter_I.c revision 0c1bc742181ded4930842b46e9507372f0b1b963
1/**
2 *
3 * File Name:  omxVCM4P2_QuantInvInter_I.c
4 * OpenMAX DL: v1.0.2
5 * Revision:   9641
6 * Date:       Thursday, February 7, 2008
7 *
8 * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
9 *
10 *
11 *
12 * Description:
13 * Contains modules for inter inverse Quantization
14 *
15 */
16
17#include "omxtypes.h"
18#include "armOMX.h"
19#include "omxVC.h"
20
21#include "armCOMM.h"
22
23
24/**
25 * Function:  omxVCM4P2_QuantInvInter_I   (6.2.5.3.2)
26 *
27 * Description:
28 * Performs the second inverse quantization mode on an intra/inter coded
29 * block. Supports bits_per_pixel = 8. The output coefficients are clipped to
30 * the range [-2048, 2047].
31 *
32 * Input Arguments:
33 *
34 *   pSrcDst - pointer to the input (quantized) intra/inter block; must be
35 *            aligned on a 16-byte boundary.
36 *   QP - quantization parameter (quantizer_scale)
37 *   videoComp - video component type of the current block. Takes one of the
38 *            following flags: OMX_VC_LUMINANCE, OMX_VC_CHROMINANCE (intra
39 *            version only).
40 *   shortVideoHeader - binary flag indicating presence of short_video_header
41 *            (intra version only).
42 *
43 * Output Arguments:
44 *
45 *   pSrcDst - pointer to the output (dequantized) intra/inter block
46 *
47 * Return Value:
48 *
49 *    OMX_Sts_NoErr - no error
50 *    OMX_Sts_BadArgErr - bad arguments; one or more of the following is
51 *              true:
52 *    -    pSrcDst is NULL
53 *    -    QP <= 0 or QP >=31
54 *    -    videoComp is neither OMX_VC_LUMINANCE nor OMX_VC_CHROMINANCE.
55 *
56 */
57
58OMXResult omxVCM4P2_QuantInvInter_I(
59     OMX_S16 * pSrcDst,
60     OMX_INT QP
61	 )
62{
63
64    OMX_INT coeffCount, Sign;
65
66    /* Argument error checks */
67    armRetArgErrIf(pSrcDst == NULL, OMX_Sts_BadArgErr);
68    armRetArgErrIf(((QP <= 0) || (QP >= 32)), OMX_Sts_BadArgErr);
69
70    /* Second Inverse quantisation method */
71    for (coeffCount = 0; coeffCount < 64; coeffCount++)
72    {
73        /* check sign */
74        Sign =  armSignCheck (pSrcDst[coeffCount]);
75
76        /* Quantize the coeff */
77        if (QP & 0x1)
78        {
79            pSrcDst[coeffCount] = (2* armAbs(pSrcDst[coeffCount]) + 1) * QP;
80            pSrcDst[coeffCount] *= Sign;
81        }
82        else
83        {
84            pSrcDst[coeffCount] = (2* armAbs(pSrcDst[coeffCount]) + 1)
85                                                                * QP - 1;
86            pSrcDst[coeffCount] *= Sign;
87        }
88        /* Saturate */
89        pSrcDst[coeffCount] = armClip (-2048, 2047, pSrcDst[coeffCount]);
90    }
91    return OMX_Sts_NoErr;
92}
93
94/* End of file */
95
96
97