Imported Upstream version 1.1.11
[platform/upstream/cdrkit.git] / libparanoia / p_block.h
1 /*
2  * This file has been modified for the cdrkit suite.
3  *
4  * The behaviour and appearence of the program code below can differ to a major
5  * extent from the version distributed by the original author(s).
6  *
7  * For details, see Changelog file distributed with the cdrkit package. If you
8  * received this file from another source then ask the distributing person for
9  * a log of modifications.
10  *
11  */
12
13 /* @(#)p_block.h        1.16 04/02/20 J. Schilling from cdparanoia-III-alpha9.8 */
14 /*
15  *      Modifications to make the code portable Copyright (c) 2002 J. Schilling
16  */
17 /*
18  * CopyPolicy: GNU Public License 2 applies
19  * Copyright (C) by Monty (xiphmont@mit.edu)
20  */
21
22 #ifndef _p_block_h_
23 #define _p_block_h_
24
25 #define MIN_WORDS_OVERLAP         64    /* 16 bit words */
26 #define MIN_WORDS_SEARCH          64    /* 16 bit words */
27 #define MIN_WORDS_RIFT            16    /* 16 bit words */
28 #define MAX_SECTOR_OVERLAP        32    /* sectors */
29 #define MIN_SECTOR_EPSILON       128    /* words */
30 #define MIN_SECTOR_BACKUP         16    /* sectors */
31 #define JIGGLE_MODULO             15    /* sectors */
32 #define MIN_SILENCE_BOUNDARY    1024    /* 16 bit words */
33
34 #define min(x, y) ((x) > (y)?(y):(x))
35 #define max(x, y) ((x) < (y)?(y):(x))
36
37 #include "isort.h"
38
39 typedef struct linked_list {
40         /* linked list */
41         struct linked_element   *head;
42         struct linked_element   *tail;
43
44         void                    *(*new_poly)(void);
45         void                    (*free_poly)(void *poly);
46         long                    current;
47         long                    active;
48
49 } linked_list;
50
51 typedef struct linked_element {
52         void                    *ptr;
53         struct linked_element   *prev;
54         struct linked_element   *next;
55
56         struct linked_list      *list;
57         int                     stamp;
58 } linked_element;
59
60 extern linked_list      *new_list(void *(*newp) (void),
61                                                                                  void (*freep) (void *));
62 extern linked_element   *new_elem(linked_list *list);
63 extern linked_element   *add_elem(linked_list *list, void *elem);
64 extern void             free_list(linked_list *list, int free_ptr);     /* unlink or free */
65 extern void             free_elem(linked_element *e, int free_ptr);     /* unlink or free */
66 extern void             *get_elem(linked_element *e);
67 extern linked_list      *copy_list(linked_list *list);  /* shallow; doesn't copy */
68                                                                         /* contained structures */
69
70 typedef struct c_block {
71         /* The buffer */
72         Int16_t         *vector;
73         long            begin;
74         long            size;
75
76         /* auxiliary support structures */
77         unsigned char   *flags;
78                                 /*
79                                  * 1    known boundaries in read data
80                                  * 2    known blanked data
81                                  * 4    matched sample
82                                  * 8    reserved
83                                  * 16   reserved
84                                  * 32   reserved
85                                  * 64   reserved
86                                  * 128  reserved
87                                  */
88
89         /* end of session cases */
90         long            lastsector;
91         struct cdrom_paranoia   *p;
92         struct linked_element   *e;
93 } c_block;
94
95 extern void     free_c_block(c_block *c);
96 extern void     i_cblock_destructor(c_block *c);
97 extern c_block  *new_c_block(struct cdrom_paranoia *p);
98
99 typedef struct v_fragment {
100         c_block         *one;
101
102         long            begin;
103         long            size;
104         Int16_t         *vector;
105
106         /* end of session cases */
107         long            lastsector;
108
109         /* linked list */
110         struct cdrom_paranoia   *p;
111         struct linked_element   *e;
112
113 } v_fragment;
114
115 extern void     free_v_fragment(v_fragment *c);
116 extern v_fragment *new_v_fragment(struct cdrom_paranoia *p, c_block *one,
117                                                                                          long begin, long end,
118                                                                                          int lastsector);
119 extern Int16_t  *v_buffer(v_fragment *v);
120
121 extern c_block  *c_first(struct cdrom_paranoia *p);
122 extern c_block  *c_last(struct cdrom_paranoia *p);
123 extern c_block  *c_next(c_block *c);
124 extern c_block  *c_prev(c_block *c);
125
126 extern v_fragment *v_first(struct cdrom_paranoia *p);
127 extern v_fragment *v_last(struct cdrom_paranoia *p);
128 extern v_fragment *v_next(v_fragment *v);
129 extern v_fragment *v_prev(v_fragment *v);
130
131 typedef struct root_block {
132         long            returnedlimit;
133         long            lastsector;
134         struct cdrom_paranoia   *p;
135
136         c_block         *vector;        /* doesn't use any sorting */
137         int             silenceflag;
138         long            silencebegin;
139 } root_block;
140
141 typedef struct offsets {
142         long    offpoints;
143         long    newpoints;
144         long    offaccum;
145         long    offdiff;
146         long    offmin;
147         long    offmax;
148
149 } offsets;
150
151 typedef struct cdrom_paranoia {
152         void            *d;             /* A pointer to the driver interface */
153         int             nsectors;       /* # of sectors that fit into DMA buf */
154
155         root_block      root;           /* verified/reconstructed cached data */
156         linked_list     *cache;         /* our data as read from the cdrom */
157         long            cache_limit;
158         linked_list     *fragments;     /* fragments of blocks that have been */
159                                         /* 'verified' */
160         sort_info       *sortcache;
161
162         int             readahead;      /* sectors of readahead in each readop */
163         int             jitter;
164         long            lastread;
165
166         int             enable;
167         long            cursor;
168         long            current_lastsector;
169         long            current_firstsector;
170
171         /* statistics for drift/overlap */
172         struct offsets  stage1;
173         struct offsets  stage2;
174
175         long            mindynoverlap;
176         long            maxdynoverlap;
177         long            dynoverlap;
178         long            dyndrift;
179
180         /* statistics for verification */
181
182 } cdrom_paranoia;
183
184 extern c_block  *c_alloc(Int16_t *vector, long begin, long size);
185 extern void     c_set(c_block *v, long begin);
186 extern void     c_insert(c_block *v, long pos, Int16_t *b, long size);
187 extern void     c_remove(c_block *v, long cutpos, long cutsize);
188 extern void     c_overwrite(c_block *v, long pos, Int16_t *b, long size);
189 extern void     c_append(c_block *v, Int16_t *vector, long size);
190 extern void     c_removef(c_block *v, long cut);
191
192 #define ce(v)   ((v)->begin + (v)->size)
193 #define cb(v)   ((v)->begin)
194 #define cs(v)   ((v)->size)
195
196 /*
197  * pos here is vector position from zero
198  */
199 extern void     recover_cache(cdrom_paranoia *p);
200 extern void     i_paranoia_firstlast(cdrom_paranoia *p);
201
202 #define cv(c)   ((c)->vector)
203
204 #define fe(f)   ((f)->begin + (f)->size)
205 #define fb(f)   ((f)->begin)
206 #define fs(f)   ((f)->size)
207 #define fv(f)   (v_buffer(f))
208
209 #define CDP_COMPILE
210 #endif