NVBIO
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
cram_codecs.h
Go to the documentation of this file.
1 /*
2 Copyright (c) 2012-2013 Genome Research Ltd.
3 Author: James Bonfield <jkb@sanger.ac.uk>
4 
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7 
8  1. Redistributions of source code must retain the above copyright notice,
9 this list of conditions and the following disclaimer.
10 
11  2. Redistributions in binary form must reproduce the above copyright notice,
12 this list of conditions and the following disclaimer in the documentation
13 and/or other materials provided with the distribution.
14 
15  3. Neither the names Genome Research Ltd and Wellcome Trust Sanger
16 Institute nor the names of its contributors may be used to endorse or promote
17 products derived from this software without specific prior written permission.
18 
19 THIS SOFTWARE IS PROVIDED BY GENOME RESEARCH LTD AND CONTRIBUTORS "AS IS" AND
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 DISCLAIMED. IN NO EVENT SHALL GENOME RESEARCH LTD OR CONTRIBUTORS BE LIABLE
23 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 
31 #ifndef _CRAM_ENCODINGS_H_
32 #define _CRAM_ENCODINGS_H_
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 #include <inttypes.h>
39 
40 struct cram_codec;
41 
42 /*
43  * Slow but simple huffman decoder to start with.
44  * Read a bit at a time, keeping track of {length, value}
45  * eg. 1 1 0 1 => {1,1}, {2,3}, {3,6}, {4,13}
46  *
47  * Keep track of this through the huffman code table.
48  * For fast scanning we have an index of where the first code of length X
49  * appears.
50  */
51 typedef struct {
53  int32_t p; // next code start value, minus index to codes[]
57 
58 typedef struct {
59  int ncodes;
62 
63 #define MAX_HUFF 128
64 typedef struct {
66  int nvals;
67  int val2code[MAX_HUFF+1]; // value to code lookup for small values
69 
70 typedef struct {
74 
75 typedef struct {
78 
79 typedef struct {
83 
84 typedef struct {
86  enum cram_external_type type;
88 
89 typedef struct {
93 
94 typedef struct {
95  unsigned char stop;
98 
99 typedef struct {
101  unsigned char *len_dat;
103  unsigned char *val_dat;
105 
106 /*
107  * A generic codec structure.
108  */
109 typedef struct cram_codec {
111  void (*free)(struct cram_codec *codec);
112  int (*decode)(cram_slice *slice, struct cram_codec *codec,
113  cram_block *in, char *out, int *out_size);
114  int (*encode)(cram_slice *slice, struct cram_codec *codec,
115  cram_block *out, char *in, int in_size);
116  int (*store)(struct cram_codec *codec, cram_block *b, char *prefix,
117  int version);
118  union {
126 
132  };
133 } cram_codec;
134 
135 char *cram_encoding2str(enum cram_encoding t);
136 
137 cram_codec *cram_decoder_init(enum cram_encoding codec, char *data, int size,
138  enum cram_external_type option,
139  int version);
141  enum cram_external_type option, void *dat,
142  int version);
143 
144 //int cram_decode(void *codes, char *in, int in_size, char *out, int *out_size);
145 //void cram_decoder_free(void *codes);
146 
147 //#define GET_BIT_MSB(b,v) (void)(v<<=1, v|=(b->data[b->byte] >> b->bit)&1, (--b->bit == -1) && (b->bit = 7, b->byte++))
148 
149 #define GET_BIT_MSB(b,v) (void)(v<<=1, v|=(b->data[b->byte] >> b->bit)&1, b->byte += (b->bit==0), b->bit+=(b->bit==0)*8-1)
150 
151 #ifdef __cplusplus
152 }
153 #endif
154 
155 #endif /* _CRAM_ENCODINGS_H_ */