summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/on2/h264dec/omxdl/reference/vc/m4p10/src/armVCM4P10_UnpackBlock2x2.c
blob: dda49f67d404a75dc923e769b631c18853b9cd7b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* ----------------------------------------------------------------
 * 
 * 
 * File Name:  armVCM4P10_UnpackBlock2x2.c
 * OpenMAX DL: v1.0.2
 * Revision:   9641
 * Date:       Thursday, February 7, 2008
 * 
 * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
 * 
 * 
 *
 * H.264 inverse quantize and transform helper module
 * 
 */
 
#include "omxtypes.h"
#include "armOMX.h"
#include "omxVC.h"

#include "armVC.h"

/*
 * Description
 * Unpack a 2x2 block of coefficient-residual pair values
 *
 * Parameters:
 * [in]	ppSrc	Double pointer to residual coefficient-position pair
 *						buffer output by CALVC decoding
 * [out]	ppSrc	*ppSrc is updated to the start of next non empty block
 * [out]	pDst	Pointer to unpacked 4x4 block
 */

void armVCM4P10_UnpackBlock2x2(
     const OMX_U8 **ppSrc,
     OMX_S16* pDst
)
{
    const OMX_U8 *pSrc = *ppSrc;
    int i;
    int Flag, Value;

    for (i=0; i<4; i++)
    {
        pDst[i] = 0;
    }

    do
    {
        Flag  = *pSrc++;
        if (Flag & 0x10)
        {
            /* 16 bit */
            Value = *pSrc++;
            Value = Value | ((*pSrc++)<<8);
            if (Value & 0x8000)
            {
                Value -= 0x10000;
            }
        }
        else
        {
            /* 8 bit */
            Value = *pSrc++;
            if (Value & 0x80)
            {
                Value -= 0x100;
            }
        }
        i = Flag & 15;
        pDst[i] = (OMX_S16)Value;
    }
    while ((Flag & 0x20)==0);

    *ppSrc = pSrc;
}

/* End of file */