blob: 2a1b0d762450204243b05b4d17cde3158613edfb
1 | /* |
2 | * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> |
3 | * |
4 | * This file is part of FFmpeg. |
5 | * |
6 | * FFmpeg is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. |
10 | * |
11 | * FFmpeg is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with FFmpeg; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ |
20 | |
21 | /** |
22 | * @file |
23 | * @ingroup lavu_crc32 |
24 | * Public header for CRC hash function implementation. |
25 | */ |
26 | |
27 | #ifndef AVUTIL_CRC_H |
28 | #define AVUTIL_CRC_H |
29 | |
30 | #include <stdint.h> |
31 | #include <stddef.h> |
32 | #include "attributes.h" |
33 | #include "version.h" |
34 | |
35 | /** |
36 | * @defgroup lavu_crc32 CRC |
37 | * @ingroup lavu_hash |
38 | * CRC (Cyclic Redundancy Check) hash function implementation. |
39 | * |
40 | * This module supports numerous CRC polynomials, in addition to the most |
41 | * widely used CRC-32-IEEE. See @ref AVCRCId for a list of available |
42 | * polynomials. |
43 | * |
44 | * @{ |
45 | */ |
46 | |
47 | typedef uint32_t AVCRC; |
48 | |
49 | typedef enum { |
50 | AV_CRC_8_ATM, |
51 | AV_CRC_16_ANSI, |
52 | AV_CRC_16_CCITT, |
53 | AV_CRC_32_IEEE, |
54 | AV_CRC_32_IEEE_LE, /*< reversed bitorder version of AV_CRC_32_IEEE */ |
55 | AV_CRC_16_ANSI_LE, /*< reversed bitorder version of AV_CRC_16_ANSI */ |
56 | #if FF_API_CRC_BIG_TABLE |
57 | AV_CRC_24_IEEE = 12, |
58 | #else |
59 | AV_CRC_24_IEEE, |
60 | #endif /* FF_API_CRC_BIG_TABLE */ |
61 | AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ |
62 | }AVCRCId; |
63 | |
64 | /** |
65 | * Initialize a CRC table. |
66 | * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024 |
67 | * @param le If 1, the lowest bit represents the coefficient for the highest |
68 | * exponent of the corresponding polynomial (both for poly and |
69 | * actual CRC). |
70 | * If 0, you must swap the CRC parameter and the result of av_crc |
71 | * if you need the standard representation (can be simplified in |
72 | * most cases to e.g. bswap16): |
73 | * av_bswap32(crc << (32-bits)) |
74 | * @param bits number of bits for the CRC |
75 | * @param poly generator polynomial without the x**bits coefficient, in the |
76 | * representation as specified by le |
77 | * @param ctx_size size of ctx in bytes |
78 | * @return <0 on failure |
79 | */ |
80 | int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); |
81 | |
82 | /** |
83 | * Get an initialized standard CRC table. |
84 | * @param crc_id ID of a standard CRC |
85 | * @return a pointer to the CRC table or NULL on failure |
86 | */ |
87 | const AVCRC *av_crc_get_table(AVCRCId crc_id); |
88 | |
89 | /** |
90 | * Calculate the CRC of a block. |
91 | * @param crc CRC of previous blocks if any or initial value for CRC |
92 | * @return CRC updated with the data from the given block |
93 | * |
94 | * @see av_crc_init() "le" parameter |
95 | */ |
96 | uint32_t av_crc(const AVCRC *ctx, uint32_t crc, |
97 | const uint8_t *buffer, size_t length) av_pure; |
98 | |
99 | /** |
100 | * @} |
101 | */ |
102 | |
103 | #endif /* AVUTIL_CRC_H */ |
104 |