|
Packit |
cb6d3d |
/*
|
|
Packit |
cb6d3d |
Copyright (C) 2004, 2005, 2008 Rocky Bernstein <rocky@gnu.org>
|
|
Packit |
cb6d3d |
Copyright (C) 2014 Robert Kausch <robert.kausch@freac.org>
|
|
Packit |
cb6d3d |
Copyright (C) by Monty (xiphmont@mit.edu)
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
This program is free software: you can redistribute it and/or modify
|
|
Packit |
cb6d3d |
it under the terms of the GNU General Public License as published by
|
|
Packit |
cb6d3d |
the Free Software Foundation, either version 3 of the License, or
|
|
Packit |
cb6d3d |
(at your option) any later version.
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
This program is distributed in the hope that it will be useful,
|
|
Packit |
cb6d3d |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
cb6d3d |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
cb6d3d |
GNU General Public License for more details.
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
You should have received a copy of the GNU General Public License
|
|
Packit |
cb6d3d |
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
cb6d3d |
*/
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#ifndef _P_BLOCK_H_
|
|
Packit |
cb6d3d |
#define _P_BLOCK_H_
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#include <cdio/paranoia/paranoia.h>
|
|
Packit |
cb6d3d |
#include <cdio/paranoia/cdda.h>
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#define MIN_WORDS_OVERLAP 64 /* 16 bit words */
|
|
Packit |
cb6d3d |
#define MIN_WORDS_SEARCH 64 /* 16 bit words */
|
|
Packit |
cb6d3d |
#define MIN_WORDS_RIFT 16 /* 16 bit words */
|
|
Packit |
cb6d3d |
#define MAX_SECTOR_OVERLAP 32 /* sectors */
|
|
Packit |
cb6d3d |
#define MIN_SECTOR_EPSILON 128 /* words */
|
|
Packit |
cb6d3d |
#define MIN_SECTOR_BACKUP 16 /* sectors */
|
|
Packit |
cb6d3d |
#define JIGGLE_MODULO 15 /* sectors */
|
|
Packit |
cb6d3d |
#define MIN_SILENCE_BOUNDARY 1024 /* 16 bit words */
|
|
Packit |
cb6d3d |
#define CACHEMODEL_SECTORS 1200
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#define min(x,y) ((x)>(y)?(y):(x))
|
|
Packit |
cb6d3d |
#define max(x,y) ((x)<(y)?(y):(x))
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#include "isort.h"
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
typedef struct {
|
|
Packit |
cb6d3d |
/* linked list */
|
|
Packit |
cb6d3d |
struct linked_element *head;
|
|
Packit |
cb6d3d |
struct linked_element *tail;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void *(*new_poly)();
|
|
Packit |
cb6d3d |
void (*free_poly)(void *poly);
|
|
Packit |
cb6d3d |
long current;
|
|
Packit |
cb6d3d |
long active;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
} linked_list_t;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
typedef struct linked_element{
|
|
Packit |
cb6d3d |
void *ptr;
|
|
Packit |
cb6d3d |
struct linked_element *prev;
|
|
Packit |
cb6d3d |
struct linked_element *next;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
linked_list_t *list;
|
|
Packit |
cb6d3d |
int stamp;
|
|
Packit |
cb6d3d |
} linked_element;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
extern linked_list_t *new_list(void *(*new_fn)(void),void (*free)(void *));
|
|
Packit |
cb6d3d |
extern linked_element *new_elem(linked_list_t *list);
|
|
Packit |
cb6d3d |
extern linked_element *add_elem(linked_list_t *list,void *elem);
|
|
Packit |
cb6d3d |
extern void free_list(linked_list_t *list,int free_ptr); /* unlink or free */
|
|
Packit |
cb6d3d |
extern void free_elem(linked_element *e,int free_ptr); /* unlink or free */
|
|
Packit |
cb6d3d |
extern void *get_elem(linked_element *e);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* This is a shallow copy; it doesn't copy contained structures */
|
|
Packit |
cb6d3d |
extern linked_list_t *copy_list(linked_list_t *p_list);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
typedef struct c_block {
|
|
Packit |
cb6d3d |
/* The buffer */
|
|
Packit |
cb6d3d |
int16_t *vector;
|
|
Packit |
cb6d3d |
long begin;
|
|
Packit |
cb6d3d |
long size;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* auxiliary support structures */
|
|
Packit |
cb6d3d |
unsigned char *flags; /* 1 known boundaries in read data
|
|
Packit |
cb6d3d |
2 known blanked data
|
|
Packit |
cb6d3d |
4 matched sample
|
|
Packit |
cb6d3d |
8 reserved
|
|
Packit |
cb6d3d |
16 reserved
|
|
Packit |
cb6d3d |
32 reserved
|
|
Packit |
cb6d3d |
64 reserved
|
|
Packit |
cb6d3d |
128 reserved
|
|
Packit |
cb6d3d |
*/
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* end of session cases */
|
|
Packit |
cb6d3d |
long lastsector;
|
|
Packit |
cb6d3d |
cdrom_paranoia_t *p;
|
|
Packit |
cb6d3d |
struct linked_element *e;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
} c_block_t;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
extern void free_c_block(c_block_t *c);
|
|
Packit |
cb6d3d |
extern void i_cblock_destructor(c_block_t *c);
|
|
Packit |
cb6d3d |
extern c_block_t *new_c_block(cdrom_paranoia_t *p);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
typedef struct v_fragment_s {
|
|
Packit |
cb6d3d |
c_block_t *one;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
long begin;
|
|
Packit |
cb6d3d |
long size;
|
|
Packit |
cb6d3d |
int16_t *vector;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* end of session cases */
|
|
Packit |
cb6d3d |
long lastsector;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* linked list */
|
|
Packit |
cb6d3d |
cdrom_paranoia_t *p;
|
|
Packit |
cb6d3d |
struct linked_element *e;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
} v_fragment_t;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
extern void free_v_fragment(v_fragment_t *c);
|
|
Packit |
cb6d3d |
extern v_fragment_t *new_v_fragment(cdrom_paranoia_t *p, c_block_t *one,
|
|
Packit |
cb6d3d |
long int begin, long int end,
|
|
Packit |
cb6d3d |
int lastsector);
|
|
Packit |
cb6d3d |
extern int16_t *v_buffer(v_fragment_t *v);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
extern c_block_t *c_first(cdrom_paranoia_t *p);
|
|
Packit |
cb6d3d |
extern c_block_t *c_last(cdrom_paranoia_t *p);
|
|
Packit |
cb6d3d |
extern c_block_t *c_next(c_block_t *c);
|
|
Packit |
cb6d3d |
extern c_block_t *c_prev(c_block_t *c);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
extern v_fragment_t *v_first(cdrom_paranoia_t *p);
|
|
Packit |
cb6d3d |
extern v_fragment_t *v_last(cdrom_paranoia_t *p);
|
|
Packit |
cb6d3d |
extern v_fragment_t *v_next(v_fragment_t *v);
|
|
Packit |
cb6d3d |
extern v_fragment_t *v_prev(v_fragment_t *v);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
typedef struct root_block{
|
|
Packit |
cb6d3d |
long returnedlimit;
|
|
Packit |
cb6d3d |
long lastsector;
|
|
Packit |
cb6d3d |
cdrom_paranoia_t *p;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
c_block_t *vector; /* doesn't use any sorting */
|
|
Packit |
cb6d3d |
int silenceflag;
|
|
Packit |
cb6d3d |
long silencebegin;
|
|
Packit |
cb6d3d |
} root_block;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
typedef struct offsets{
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
long offpoints;
|
|
Packit |
cb6d3d |
long newpoints;
|
|
Packit |
cb6d3d |
long offaccum;
|
|
Packit |
cb6d3d |
long offdiff;
|
|
Packit |
cb6d3d |
long offmin;
|
|
Packit |
cb6d3d |
long offmax;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
} offsets;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
struct cdrom_paranoia_s {
|
|
Packit |
cb6d3d |
cdrom_drive_t *d;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
root_block root; /* verified/reconstructed cached data */
|
|
Packit |
cb6d3d |
linked_list_t *cache; /* our data as read from the cdrom */
|
|
Packit |
cb6d3d |
long int cache_limit;
|
|
Packit |
cb6d3d |
linked_list_t *fragments; /* fragments of blocks that have been 'verified' */
|
|
Packit |
cb6d3d |
sort_info_t *sortcache;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* cache tracking */
|
|
Packit |
cb6d3d |
int cdcache_size;
|
|
Packit |
cb6d3d |
int cdcache_begin;
|
|
Packit |
cb6d3d |
int cdcache_end;
|
|
Packit |
cb6d3d |
int jitter;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
paranoia_cb_mode_t enable;
|
|
Packit |
cb6d3d |
long int cursor;
|
|
Packit |
cb6d3d |
long int current_lastsector;
|
|
Packit |
cb6d3d |
long int current_firstsector;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* statistics for drift/overlap */
|
|
Packit |
cb6d3d |
struct offsets stage1;
|
|
Packit |
cb6d3d |
struct offsets stage2;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
long dynoverlap;
|
|
Packit |
cb6d3d |
long dyndrift;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* statistics for verification */
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
};
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
extern c_block_t *c_alloc(int16_t *vector,long begin,long size);
|
|
Packit |
cb6d3d |
extern void c_set(c_block_t *v,long begin);
|
|
Packit |
cb6d3d |
extern void c_insert(c_block_t *v,long pos,int16_t *b,long size);
|
|
Packit |
cb6d3d |
extern void c_remove(c_block_t *v,long cutpos,long cutsize);
|
|
Packit |
cb6d3d |
extern void c_overwrite(c_block_t *v,long pos,int16_t *b,long size);
|
|
Packit |
cb6d3d |
extern void c_append(c_block_t *v, int16_t *vector, long size);
|
|
Packit |
cb6d3d |
extern void c_removef(c_block_t *v, long cut);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#define ce(v) (v->begin+v->size)
|
|
Packit |
cb6d3d |
#define cb(v) (v->begin)
|
|
Packit |
cb6d3d |
#define cs(v) (v->size)
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* pos here is vector position from zero */
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
extern void recover_cache(cdrom_paranoia_t *p);
|
|
Packit |
cb6d3d |
extern void i_paranoia_firstlast(cdrom_paranoia_t *p);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#define cv(c) (c->vector)
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#define fe(f) (f->begin+f->size)
|
|
Packit |
cb6d3d |
#define fb(f) (f->begin)
|
|
Packit |
cb6d3d |
#define fs(f) (f->size)
|
|
Packit |
cb6d3d |
#define fv(f) (v_buffer(f))
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#ifndef DO_NOT_WANT_PARANOIA_COMPATIBILITY
|
|
Packit |
cb6d3d |
/** For compatibility with good ol' paranoia */
|
|
Packit |
cb6d3d |
#define linked_list linked_list_t
|
|
Packit |
cb6d3d |
#endif /*DO_NOT_WANT_PARANOIA_COMPATIBILITY*/
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#define CDP_COMPILE
|
|
Packit |
cb6d3d |
#endif /*_P_BLOCK_H_*/
|
|
Packit |
cb6d3d |
|