1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------
2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo
3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License.
6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at
7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber *
10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied.
14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions
15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License.
16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * -------------------------------------------------------------------
17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */
18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*
19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   PacketVideo Corp.
22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   MP3 Decoder Library
23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Filename: pvmp3_crc.cpp
25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber   Functions:
27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        getbits_crc
28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        calculate_crc
29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     Date: 09/21/2007
31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY
34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description:
37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubergetbits_crc
42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    tbits *inputStream,     bit stream structure
45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    int32 neededBits,       number of bits to read from the bit stream
46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32 *crc,            memory location holding calculated crc value
47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32 crc_enabled      flag to enable/disable crc checking
48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS
51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubercalculate_crc
53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas HuberInput
55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32 data,            data vector
56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32 length,          number of element upon the crc will be calculated
57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32 *crc,            memory location holding calculated crc value
58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION
61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS
65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES
69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------
74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE
75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber ------------------------------------------------------------------------------
77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/
78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES
82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_getbits.h"
85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_crc.h"
86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS
89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here
90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES
95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional
96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also.
97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS
101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration
102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module
107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES
111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module
112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere
117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberuint32 getbits_crc(tmp3Bits *inputStream,  /* bit stream structure */
124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                   int32 neededBits, /* number of bits to read from the bit stream */
125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                   uint32 *crc,
126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                   uint32 crc_enabled)
127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32 bits = getNbits(inputStream, neededBits);
129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    if (crc_enabled)
131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        calculate_crc(bits, neededBits, crc);
133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    return(bits);
135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*----------------------------------------------------------------------------
138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE
139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/
140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Hubervoid calculate_crc(uint32 data,
142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                   uint32 length,
143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber                   uint32 *crc)
144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{
145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32  carry;
146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    uint32  masking = 1 << length;
147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    while ((masking >>= 1))
149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    {
150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        carry = *crc & 0x8000;
151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        *crc <<= 1;
152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        if (!carry ^ !(data & masking))
153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        {
154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber            *crc ^= CRC16_POLYNOMIAL;
155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber        }
156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    }
157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber    *crc &= 0xffff;
158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber}
159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber
162