annotate crc.c @ 713:2f9c4e9ae095 libavutil

Use a wildcard match instead of a list to remove test programs. This is robust against renames and also removes test programs not (yet) hooked up in the main Makefiles.
author diego
date Thu, 26 Mar 2009 10:12:21 +0000
parents 683a6dbdd2b2
children 63e3c82b92d9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
108
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
1 /*
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
3 *
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
4 * This file is part of FFmpeg.
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
5 *
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
108
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
8 * License as published by the Free Software Foundation; either
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
108
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
10 *
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
108
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
14 * Lesser General Public License for more details.
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
15 *
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
116
d76a36742464 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 108
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
108
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
19 */
11be8e0d1344 Add official LGPL license headers to the files that were missing them.
diego
parents: 61
diff changeset
20
599
49da89abe282 Add necessary, remove unnecessary #includes.
diego
parents: 581
diff changeset
21 #include "config.h"
49da89abe282 Add necessary, remove unnecessary #includes.
diego
parents: 581
diff changeset
22 #include "bswap.h"
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
23 #include "crc.h"
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
24
603
880c6441f56a Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 599
diff changeset
25 #if CONFIG_HARDCODED_TABLES
420
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
26 #include "crc_data.h"
317
0df19c6b37d0 kill 3 more av_mallocz_static()
michael
parents: 116
diff changeset
27 #else
420
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
28 static struct {
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
29 uint8_t le;
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
30 uint8_t bits;
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
31 uint32_t poly;
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
32 } av_crc_table_params[AV_CRC_MAX] = {
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
33 [AV_CRC_8_ATM] = { 0, 8, 0x07 },
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
34 [AV_CRC_16_ANSI] = { 0, 16, 0x8005 },
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
35 [AV_CRC_16_CCITT] = { 0, 16, 0x1021 },
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
36 [AV_CRC_32_IEEE] = { 0, 32, 0x04C11DB7 },
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
37 [AV_CRC_32_IEEE_LE] = { 1, 32, 0xEDB88320 },
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
38 };
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
39 static AVCRC av_crc_table[AV_CRC_MAX][257];
317
0df19c6b37d0 kill 3 more av_mallocz_static()
michael
parents: 116
diff changeset
40 #endif
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
41
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
42 /**
637
683a6dbdd2b2 spelling/grammar/consistency review part III
diego
parents: 633
diff changeset
43 * Initializes a CRC table.
683a6dbdd2b2 spelling/grammar/consistency review part III
diego
parents: 633
diff changeset
44 * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
45 * @param cts_size size of ctx in bytes
637
683a6dbdd2b2 spelling/grammar/consistency review part III
diego
parents: 633
diff changeset
46 * @param le If 1, the lowest bit represents the coefficient for the highest
683a6dbdd2b2 spelling/grammar/consistency review part III
diego
parents: 633
diff changeset
47 * exponent of the corresponding polynomial (both for poly and
683a6dbdd2b2 spelling/grammar/consistency review part III
diego
parents: 633
diff changeset
48 * actual CRC).
683a6dbdd2b2 spelling/grammar/consistency review part III
diego
parents: 633
diff changeset
49 * If 0, you must swap the CRC parameter and the result of av_crc
377
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
50 * if you need the standard representation (can be simplified in
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
51 * most cases to e.g. bswap16):
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
52 * bswap_32(crc << (32-bits))
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
53 * @param bits number of bits for the CRC
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
54 * @param poly generator polynomial without the x**bits coefficient, in the
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
55 * representation as specified by le
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
56 * @return <0 on failure
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
57 */
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
58 int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size){
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
59 int i, j;
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
60 uint32_t c;
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
61
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
62 if (bits < 8 || bits > 32 || poly >= (1LL<<bits))
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
63 return -1;
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
64 if (ctx_size != sizeof(AVCRC)*257 && ctx_size != sizeof(AVCRC)*1024)
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
65 return -1;
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
66
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
67 for (i = 0; i < 256; i++) {
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
68 if (le) {
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
69 for (c = i, j = 0; j < 8; j++)
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
70 c = (c>>1)^(poly & (-(c&1)));
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
71 ctx[i] = c;
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
72 } else {
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
73 for (c = i << 24, j = 0; j < 8; j++)
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
74 c = (c<<1) ^ ((poly<<(32-bits)) & (((int32_t)c)>>31) );
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
75 ctx[i] = bswap_32(c);
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
76 }
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
77 }
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
78 ctx[256]=1;
603
880c6441f56a Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 599
diff changeset
79 #if !CONFIG_SMALL
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
80 if(ctx_size >= sizeof(AVCRC)*1024)
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
81 for (i = 0; i < 256; i++)
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
82 for(j=0; j<3; j++)
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
83 ctx[256*(j+1) + i]= (ctx[256*j + i]>>8) ^ ctx[ ctx[256*j + i]&0xFF ];
61
f85d07038450 put the code which is specific for the large crc table under #ifndef CONFIG_SMALL
michael
parents: 30
diff changeset
84 #endif
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
85
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
86 return 0;
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
87 }
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
88
377
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
89 /**
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 603
diff changeset
90 * Gets an initialized standard CRC table.
420
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
91 * @param crc_id ID of a standard CRC
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
92 * @return a pointer to the CRC table or NULL on failure
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
93 */
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
94 const AVCRC *av_crc_get_table(AVCRCId crc_id){
603
880c6441f56a Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 599
diff changeset
95 #if !CONFIG_HARDCODED_TABLES
581
95c9067ebb73 uses FF_ARRAY_ELEMS() where appropriate
aurel
parents: 442
diff changeset
96 if (!av_crc_table[crc_id][FF_ARRAY_ELEMS(av_crc_table[crc_id])-1])
420
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
97 if (av_crc_init(av_crc_table[crc_id],
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
98 av_crc_table_params[crc_id].le,
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
99 av_crc_table_params[crc_id].bits,
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
100 av_crc_table_params[crc_id].poly,
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
101 sizeof(av_crc_table[crc_id])) < 0)
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
102 return NULL;
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
103 #endif
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
104 return av_crc_table[crc_id];
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
105 }
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
106
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
107 /**
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 603
diff changeset
108 * Calculates the CRC of a block.
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 603
diff changeset
109 * @param crc CRC of previous blocks if any or initial value for CRC
377
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
110 * @return CRC updated with the data from the given block
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
111 *
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
112 * @see av_crc_init() "le" parameter
c31bd8d4962f Additional documentation for CRC functions
reimar
parents: 376
diff changeset
113 */
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
114 uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length){
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
115 const uint8_t *end= buffer+length;
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
116
603
880c6441f56a Change semantic of CONFIG_*, HAVE_* and ARCH_*.
aurel
parents: 599
diff changeset
117 #if !CONFIG_SMALL
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
118 if(!ctx[256])
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
119 while(buffer<end-3){
442
12f0072323ce Dont cast const away.
michael
parents: 427
diff changeset
120 crc ^= le2me_32(*(const uint32_t*)buffer); buffer+=4;
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
121 crc = ctx[3*256 + ( crc &0xFF)]
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
122 ^ctx[2*256 + ((crc>>8 )&0xFF)]
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
123 ^ctx[1*256 + ((crc>>16)&0xFF)]
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
124 ^ctx[0*256 + ((crc>>24) )];
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
125 }
61
f85d07038450 put the code which is specific for the large crc table under #ifndef CONFIG_SMALL
michael
parents: 30
diff changeset
126 #endif
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
127 while(buffer<end)
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
128 crc = ctx[((uint8_t)crc) ^ *buffer++] ^ (crc >> 8);
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
129
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
130 return crc;
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
131 }
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
132
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
133 #ifdef TEST
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
134 #undef printf
427
e7192ff1857d Fix a couple of 'return type defaults to int' and 'control reaches end of
diego
parents: 422
diff changeset
135 int main(void){
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
136 uint8_t buf[1999];
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
137 int i;
420
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
138 int p[4][3]={{AV_CRC_32_IEEE_LE, 0xEDB88320, 0x3D5CDD04},
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
139 {AV_CRC_32_IEEE , 0x04C11DB7, 0xC0F5BAE0},
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
140 {AV_CRC_16_ANSI , 0x8005, 0x1FBB },
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
141 {AV_CRC_8_ATM , 0x07, 0xE3 },};
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
142 const AVCRC *ctx;
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
143
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
144 for(i=0; i<sizeof(buf); i++)
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
145 buf[i]= i+i*i;
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
146
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
147 for(i=0; i<4; i++){
420
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
148 ctx = av_crc_get_table(p[i][0]);
40ef1f81f445 improve CRC API
aurel
parents: 404
diff changeset
149 printf("crc %08X =%X\n", p[i][1], av_crc(ctx, 0, buf, sizeof(buf)));
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
150 }
427
e7192ff1857d Fix a couple of 'return type defaults to int' and 'control reaches end of
diego
parents: 422
diff changeset
151 return 0;
30
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
152 }
664e2d2b92b9 generic crc calculation code
michael
parents:
diff changeset
153 #endif