[00587dc] | 1 | /********************************************************************* |
---|
| 2 | Blosc - Blocked Suffling and Compression Library |
---|
| 3 | |
---|
| 4 | Author: Francesc Alted <[email protected]> |
---|
| 5 | |
---|
| 6 | See LICENSES/BLOSC.txt for details about copyright and rights to use. |
---|
| 7 | **********************************************************************/ |
---|
| 8 | |
---|
| 9 | #include <limits.h> |
---|
| 10 | |
---|
| 11 | #ifndef BLOSC_H |
---|
| 12 | #define BLOSC_H |
---|
| 13 | |
---|
| 14 | /* Version numbers */ |
---|
| 15 | #define BLOSC_VERSION_MAJOR 1 /* for major interface/format changes */ |
---|
| 16 | #define BLOSC_VERSION_MINOR 2 /* for minor interface/format changes */ |
---|
| 17 | #define BLOSC_VERSION_RELEASE 3 /* for tweaks, bug-fixes, or development */ |
---|
| 18 | |
---|
| 19 | #define BLOSC_VERSION_STRING "1.2.3" /* string version. Sync with above! */ |
---|
| 20 | #define BLOSC_VERSION_REVISION "$Rev$" /* revision version */ |
---|
| 21 | #define BLOSC_VERSION_DATE "$Date:: 2013-05-17 #$" /* date version */ |
---|
| 22 | |
---|
| 23 | /* The *_VERS_FORMAT should be just 1-byte long */ |
---|
| 24 | #define BLOSC_VERSION_FORMAT 2 /* Blosc format version, starting at 1 */ |
---|
| 25 | #define BLOSCLZ_VERSION_FORMAT 1 /* Blosclz format version, starting at 1 */ |
---|
| 26 | |
---|
| 27 | /* The combined blosc and blosclz formats */ |
---|
| 28 | #define BLOSC_VERSION_CFORMAT (BLOSC_VERSION_FORMAT << 8) & (BLOSCLZ_VERSION_FORMAT) |
---|
| 29 | |
---|
| 30 | /* Minimum header length */ |
---|
| 31 | #define BLOSC_MIN_HEADER_LENGTH 16 |
---|
| 32 | |
---|
| 33 | /* The maximum overhead during compression in bytes. This equals to |
---|
| 34 | BLOSC_MIN_HEADER_LENGTH now, but can be higher in future |
---|
| 35 | implementations */ |
---|
| 36 | #define BLOSC_MAX_OVERHEAD BLOSC_MIN_HEADER_LENGTH |
---|
| 37 | |
---|
| 38 | /* Maximum buffer size to be compressed */ |
---|
| 39 | #define BLOSC_MAX_BUFFERSIZE (INT_MAX - BLOSC_MAX_OVERHEAD) |
---|
| 40 | |
---|
| 41 | /* Maximum typesize before considering buffer as a stream of bytes */ |
---|
| 42 | #define BLOSC_MAX_TYPESIZE 255 /* Cannot be larger than 255 */ |
---|
| 43 | |
---|
| 44 | /* The maximum number of threads (for some static arrays) */ |
---|
| 45 | #define BLOSC_MAX_THREADS 256 |
---|
| 46 | |
---|
| 47 | /* Codes for internal flags (see blosc_cbuffer_metainfo) */ |
---|
| 48 | #define BLOSC_DOSHUFFLE 0x1 |
---|
| 49 | #define BLOSC_MEMCPYED 0x2 |
---|
| 50 | |
---|
| 51 | |
---|
| 52 | |
---|
| 53 | /** |
---|
| 54 | Initialize the Blosc library. You must call this previous to any other |
---|
| 55 | Blosc call, and make sure that you call this in a non-threaded environment. |
---|
| 56 | Other Blosc calls can be called in a threaded environment, if desired. |
---|
| 57 | |
---|
| 58 | */ |
---|
| 59 | |
---|
| 60 | void blosc_init(void); |
---|
| 61 | |
---|
| 62 | |
---|
| 63 | /** |
---|
| 64 | |
---|
| 65 | Destroy the Blosc library environment. You must call this after to you are |
---|
| 66 | done with all the Blosc calls, and make sure that you call this in a |
---|
| 67 | non-threaded environment. |
---|
| 68 | |
---|
| 69 | */ |
---|
| 70 | |
---|
| 71 | void blosc_destroy(void); |
---|
| 72 | |
---|
| 73 | |
---|
| 74 | /** |
---|
| 75 | Compress a block of data in the `src` buffer and returns the size of |
---|
| 76 | compressed block. The size of `src` buffer is specified by |
---|
| 77 | `nbytes`. There is not a minimum for `src` buffer size (`nbytes`). |
---|
| 78 | |
---|
| 79 | `clevel` is the desired compression level and must be a number |
---|
| 80 | between 0 (no compression) and 9 (maximum compression). |
---|
| 81 | |
---|
| 82 | `doshuffle` specifies whether the shuffle compression preconditioner |
---|
| 83 | should be applied or not. 0 means not applying it and 1 means |
---|
| 84 | applying it. |
---|
| 85 | |
---|
| 86 | `typesize` is the number of bytes for the atomic type in binary |
---|
| 87 | `src` buffer. This is mainly useful for the shuffle preconditioner. |
---|
| 88 | Only a typesize > 1 will allow the shuffle to work. |
---|
| 89 | |
---|
| 90 | The `dest` buffer must have at least the size of `destsize`. Blosc |
---|
| 91 | guarantees that if you set `destsize` to, at least, |
---|
| 92 | (`nbytes`+BLOSC_MAX_OVERHEAD), the compression will always succeed. |
---|
| 93 | The `src` buffer and the `dest` buffer can not overlap. |
---|
| 94 | |
---|
| 95 | If `src` buffer cannot be compressed into `destsize`, the return |
---|
| 96 | value is zero and you should discard the contents of the `dest` |
---|
| 97 | buffer. |
---|
| 98 | |
---|
| 99 | A negative return value means that an internal error happened. This |
---|
| 100 | should never happen. If you see this, please report it back |
---|
| 101 | together with the buffer data causing this and compression settings. |
---|
| 102 | |
---|
| 103 | Compression is memory safe and guaranteed not to write the `dest` |
---|
| 104 | buffer more than what is specified in `destsize`. However, it is |
---|
| 105 | not re-entrant and not thread-safe (despite the fact that it uses |
---|
| 106 | threads internally). |
---|
| 107 | */ |
---|
| 108 | |
---|
| 109 | int blosc_compress(int clevel, int doshuffle, size_t typesize, size_t nbytes, |
---|
| 110 | const void *src, void *dest, size_t destsize); |
---|
| 111 | |
---|
| 112 | |
---|
| 113 | /** |
---|
| 114 | Decompress a block of compressed data in `src`, put the result in |
---|
| 115 | `dest` and returns the size of the decompressed block. If error |
---|
| 116 | occurs, e.g. the compressed data is corrupted or the output buffer |
---|
| 117 | is not large enough, then 0 (zero) or a negative value will be |
---|
| 118 | returned instead. |
---|
| 119 | |
---|
| 120 | The `src` buffer and the `dest` buffer can not overlap. |
---|
| 121 | |
---|
| 122 | Decompression is memory safe and guaranteed not to write the `dest` |
---|
| 123 | buffer more than what is specified in `destsize`. However, it is |
---|
| 124 | not re-entrant and not thread-safe (despite the fact that it uses |
---|
| 125 | threads internally). |
---|
| 126 | */ |
---|
| 127 | |
---|
| 128 | int blosc_decompress(const void *src, void *dest, size_t destsize); |
---|
| 129 | |
---|
| 130 | |
---|
| 131 | /** |
---|
| 132 | Get `nitems` (of typesize size) in `src` buffer starting in `start`. |
---|
| 133 | The items are returned in `dest` buffer, which has to have enough |
---|
| 134 | space for storing all items. Returns the number of bytes copied to |
---|
| 135 | `dest` or a negative value if some error happens. |
---|
| 136 | */ |
---|
| 137 | |
---|
| 138 | int blosc_getitem(const void *src, int start, int nitems, void *dest); |
---|
| 139 | |
---|
| 140 | |
---|
| 141 | /** |
---|
| 142 | Initialize a pool of threads for compression/decompression. If |
---|
| 143 | `nthreads` is 1, then the serial version is chosen and a possible |
---|
| 144 | previous existing pool is ended. Returns the previous number of |
---|
| 145 | threads. If this is not called, `nthreads` is set to 1 internally. |
---|
| 146 | */ |
---|
| 147 | |
---|
| 148 | int blosc_set_nthreads(int nthreads); |
---|
| 149 | |
---|
| 150 | |
---|
| 151 | /** |
---|
| 152 | Free possible memory temporaries and thread resources. Use this when you |
---|
| 153 | are not going to use Blosc for a long while. In case of problems releasing |
---|
| 154 | the resources, it returns a negative number, else it returns 0. |
---|
| 155 | */ |
---|
| 156 | |
---|
| 157 | int blosc_free_resources(void); |
---|
| 158 | |
---|
| 159 | |
---|
| 160 | /** |
---|
| 161 | Return information about a compressed buffer, namely the number of |
---|
| 162 | uncompressed bytes (`nbytes`) and compressed (`cbytes`). It also |
---|
| 163 | returns the `blocksize` (which is used internally for doing the |
---|
| 164 | compression by blocks). |
---|
| 165 | |
---|
| 166 | You only need to pass the first BLOSC_MIN_HEADER_LENGTH bytes of a |
---|
| 167 | compressed buffer for this call to work. |
---|
| 168 | |
---|
| 169 | This function should always succeed. |
---|
| 170 | */ |
---|
| 171 | |
---|
| 172 | void blosc_cbuffer_sizes(const void *cbuffer, size_t *nbytes, |
---|
| 173 | size_t *cbytes, size_t *blocksize); |
---|
| 174 | |
---|
| 175 | |
---|
| 176 | /** |
---|
| 177 | Return information about a compressed buffer, namely the type size |
---|
| 178 | (`typesize`), as well as some internal `flags`. |
---|
| 179 | |
---|
| 180 | The `flags` is a set of bits, where the currently used ones are: |
---|
| 181 | * bit 0: whether the shuffle filter has been applied or not |
---|
| 182 | * bit 1: whether the internal buffer is a pure memcpy or not |
---|
| 183 | |
---|
| 184 | You can use the `BLOSC_DOSHUFFLE` and `BLOSC_MEMCPYED` symbols for |
---|
| 185 | extracting the interesting bits (e.g. ``flags & BLOSC_DOSHUFFLE`` |
---|
| 186 | says whether the buffer is shuffled or not). |
---|
| 187 | |
---|
| 188 | This function should always succeed. |
---|
| 189 | */ |
---|
| 190 | |
---|
| 191 | void blosc_cbuffer_metainfo(const void *cbuffer, size_t *typesize, |
---|
| 192 | int *flags); |
---|
| 193 | |
---|
| 194 | |
---|
| 195 | /** |
---|
| 196 | Return information about a compressed buffer, namely the internal |
---|
| 197 | Blosc format version (`version`) and the format for the internal |
---|
| 198 | Lempel-Ziv algorithm (`versionlz`). This function should always |
---|
| 199 | succeed. |
---|
| 200 | */ |
---|
| 201 | |
---|
| 202 | void blosc_cbuffer_versions(const void *cbuffer, int *version, |
---|
| 203 | int *versionlz); |
---|
| 204 | |
---|
| 205 | |
---|
| 206 | |
---|
| 207 | /********************************************************************* |
---|
| 208 | |
---|
| 209 | Low-level functions follows. Use them only if you are an expert! |
---|
| 210 | |
---|
| 211 | *********************************************************************/ |
---|
| 212 | |
---|
| 213 | |
---|
| 214 | /** |
---|
| 215 | Force the use of a specific blocksize. If 0, an automatic |
---|
| 216 | blocksize will be used (the default). |
---|
| 217 | */ |
---|
| 218 | |
---|
| 219 | void blosc_set_blocksize(size_t blocksize); |
---|
| 220 | |
---|
| 221 | |
---|
| 222 | #endif |
---|