1/* ///////////////////////////////////////////////////////////////////////
2//
3//               INTEL CORPORATION PROPRIETARY INFORMATION
4//  This software is supplied under the terms of a license agreement or
5//  nondisclosure agreement with Intel Corporation and may not be copied
6//  or disclosed except in accordance with the terms of that agreement.
7//        Copyright (c) 2008 Intel Corporation. All Rights Reserved.
8//
9//  Description: Parses VLC syntax elements within VC-1 bitstream.
10//
11*/
12
13#include "vc1parse.h"
14
15/*----------------------------------------------------------------------------*/
16
17vc1_Status vc1_DecodeHuffmanOne(void* ctxt, int32_t *pDst, const int32_t *pDecodeTable)
18{
19    uint32_t tempValue;
20    const int32_t *pTable = pDecodeTable;
21    vc1_Status status = VC1_STATUS_OK;
22    int32_t i, j, maxBits, loopCount, totalBits, value;
23
24    maxBits = *pTable++;
25    loopCount = *pTable++;
26    totalBits = 0;
27    for (i = 0; i < loopCount; i++)
28        totalBits += *pTable++;
29
30    if (totalBits != maxBits)
31        return VC1_STATUS_PARSE_ERROR;
32
33    value = 0;
34    for (i = 0; i < maxBits; i++)
35    {
36        VC1_GET_BITS9(1, tempValue);
37        value = (value << 1) | tempValue;
38        loopCount = *pTable++;
39        if (loopCount == -1)
40            break;
41        for (j = 0; j < loopCount; j++)
42        {
43            if (value == *pTable++)
44            {
45                *pDst = *pTable;
46                return status;
47            }
48            else
49                pTable++;
50        }
51    }
52
53    return status;
54}
55
56/*----------------------------------------------------------------------------*/
57
58vc1_Status vc1_DecodeHuffmanPair(void* ctxt, const int32_t *pDecodeTable,
59                                 int8_t *pFirst, int16_t *pSecond)
60{
61    uint32_t tempValue;
62    const int32_t *pTable = pDecodeTable;
63    vc1_Status status = VC1_STATUS_OK;
64    int32_t i, j, maxBits, loopCount, totalBits, value;
65
66    maxBits = *pTable++;
67    loopCount = *pTable++;
68    totalBits = 0;
69    for (i = 0; i < loopCount; i++)
70        totalBits += *pTable++;
71
72    if (totalBits != maxBits)
73        return VC1_STATUS_PARSE_ERROR;
74
75    value = 0;
76    for (i = 0; i < maxBits; i++)
77    {
78        VC1_GET_BITS9(1, tempValue);
79        value = (value << 1) | tempValue;
80        loopCount = *pTable++;
81        if (loopCount == -1)
82            break;
83        for (j = 0; j < loopCount; j++)
84        {
85            if (value == *pTable++)
86            {
87                *pFirst = *pTable++;
88                *pSecond = *pTable;
89                return status;
90            }
91            else
92                pTable += 2;
93        }
94    }
95
96    return status;
97}
98