version 1.6, 2001/04/09 15:26:03
|
version 1.7, 2001/04/09 15:51:29
|
Line 75
|
Line 75
|
#define byte __u8 |
#define byte __u8 |
#define t_msec __s32 |
#define t_msec __s32 |
|
|
|
/* ISO 13818 clock reference 90kHz (33 bit) with 27MHz extension (9 bit). |
|
* ba33 holds the high bit of base. |
|
*/ |
typedef struct { |
typedef struct { |
__u32 base; |
__u32 base; |
__u16 ext; |
__u16 ext; |
Line 82 typedef struct {
|
Line 85 typedef struct {
|
boolean valid; |
boolean valid; |
} clockref; |
} clockref; |
|
|
|
/* For conversion purposes, this pair of values holds a partial clock |
|
* reference and an internal value in milliseconds. This is to eliminate |
|
* wrapping faults without producing conversion inaccuracies. |
|
*/ |
typedef struct { |
typedef struct { |
__u32 base; |
__u32 base; |
t_msec msec; |
t_msec msec; |
} conversion_base; |
} conversion_base; |
|
|
|
/* On reference to a controlled data buffer, this one holds the control |
|
* information, mainly: index into the data buffer, length of the referenced |
|
* data block. In a controlled data buffer, a data block is never split to |
|
* wrap at the end of the buffer. The other fields are usage dependend. |
|
*/ |
typedef struct { |
typedef struct { |
int index; |
int index; |
int length; |
int length; |
Line 98 typedef struct {
|
Line 110 typedef struct {
|
byte scramble; |
byte scramble; |
} ctrl_buffer; |
} ctrl_buffer; |
|
|
|
/* Control buffer */ |
typedef struct { |
typedef struct { |
ctrl_buffer *ptr; |
ctrl_buffer *ptr; |
int in; |
int in; |
Line 105 typedef struct {
|
Line 118 typedef struct {
|
int mask; |
int mask; |
} refr_ctrl; |
} refr_ctrl; |
|
|
|
/* Data buffer */ |
typedef struct { |
typedef struct { |
byte *ptr; |
byte *ptr; |
int in; |
int in; |
Line 112 typedef struct {
|
Line 126 typedef struct {
|
int mask; |
int mask; |
} refr_data; |
} refr_data; |
|
|
|
/* Test on buffer emptiness */ |
#define list_empty(refr) ((refr).out == (refr).in) |
#define list_empty(refr) ((refr).out == (refr).in) |
|
|
|
/* Create a new buffer, return TRUE on success, FALSE otherwise */ |
#define list_create(refr,size) \ |
#define list_create(refr,size) \ |
((((size) & ((size)-1)) || (size < 2)) ? \ |
((((size) & ((size)-1)) || (size < 2)) ? \ |
warn (LERR,"List Create",EGLO,1,1,size), FALSE : \ |
warn (LERR,"List Create",EGLO,1,1,size), FALSE : \ |
Line 121 typedef struct {
|
Line 137 typedef struct {
|
warn (LERR,"List Create",EGLO,1,2,size), FALSE : \ |
warn (LERR,"List Create",EGLO,1,2,size), FALSE : \ |
((refr).mask = (size)-1, (refr).in = (refr).out = 0, TRUE)) |
((refr).mask = (size)-1, (refr).in = (refr).out = 0, TRUE)) |
|
|
|
/* Release a buffer no longer used */ |
#define list_release(refr) \ |
#define list_release(refr) \ |
((refr).mask = 0, free((refr).ptr), (refr).ptr = NULL) |
((refr).mask = 0, free((refr).ptr), (refr).ptr = NULL) |
|
|
|
/* Compute number of free elements in buffer */ |
#define list_free(refr) \ |
#define list_free(refr) \ |
(((refr).out - (refr).in - 1) & (refr).mask) |
(((refr).out - (refr).in - 1) & (refr).mask) |
|
|
|
/* Compute number of free elements up to the wrapping point, if the |
|
latter is included in the free part of the buffer */ |
#define list_freeinend(refr) \ |
#define list_freeinend(refr) \ |
((refr).mask + 1 - (refr).in) |
((refr).mask + 1 - (refr).in) |
|
|
|
/* Compute number of used elements in buffer (i.e. its current size) */ |
#define list_size(refr) \ |
#define list_size(refr) \ |
(((refr).in - (refr).out) & (refr).mask) |
(((refr).in - (refr).out) & (refr).mask) |
|
|
|
/* Test on buffer fullness */ |
#define list_full(refr) \ |
#define list_full(refr) \ |
(list_free(refr) == 0) |
(list_free(refr) == 0) |
|
|
|
/* Test on buffer half-fullness (as trigger criterium) */ |
#define list_halffull(refr) \ |
#define list_halffull(refr) \ |
(list_size(refr) > ((refr).mask >> 1)) |
(list_size(refr) > ((refr).mask >> 1)) |
|
|
|
/* Increment an index variable that points in to a buffer by a given value */ |
#define list_incr(var,refr,incr) \ |
#define list_incr(var,refr,incr) \ |
((var) = (((var) + (incr)) & (refr).mask)) |
((var) = (((var) + (incr)) & (refr).mask)) |
|
|
|
/* Check a data byte against a mask */ |
#define marker_check(data,val,mask) \ |
#define marker_check(data,val,mask) \ |
(((data & mask) != val) ? \ |
(((data & mask) != val) ? \ |
warn(LWAR,"Marker bit",EGLO,2,data,mask), TRUE : FALSE) |
warn(LWAR,"Marker bit",EGLO,2,data,mask), TRUE : FALSE) |
|
|
|
/* Check whether a given bit is set in a data byte */ |
#define marker_bit(data,bit) \ |
#define marker_bit(data,bit) \ |
marker_check(data,1<<bit,1<<bit) |
marker_check(data,1<<bit,1<<bit) |
|
|
#define mmin(a,b) ((a)<(b)?(a):(b)) |
#define mmin(a,b) ((a)<(b)?(a):(b)) |
#define mmax(a,b) ((a)<(b)?(b):(a)) |
#define mmax(a,b) ((a)<(b)?(b):(a)) |
|
|
|
/* Allocate memory for a struct with known union usage */ |
#define unionalloc(typ,fld) \ |
#define unionalloc(typ,fld) \ |
(malloc (sizeof(typ)-sizeof(((typ*)0)->u)+sizeof(((typ*)0)->u.fld))) |
(malloc (sizeof(typ)-sizeof(((typ*)0)->u)+sizeof(((typ*)0)->u.fld))) |
|
|
|
/* Reference descriptors as these are parsed from PSI */ |
typedef struct { |
typedef struct { |
int programnumber; |
int programnumber; |
short sourceid; |
short sourceid; |
Line 162 typedef struct {
|
Line 190 typedef struct {
|
byte *elemdnew[NUMBER_ELEMD]; |
byte *elemdnew[NUMBER_ELEMD]; |
} mapreference; |
} mapreference; |
|
|
|
/* Source TS PMT list */ |
typedef struct pmtdescr { |
typedef struct pmtdescr { |
struct pmtdescr *next; |
struct pmtdescr *next; |
short pat_section; |
short pat_section; |
Line 176 typedef struct pmtdescr {
|
Line 205 typedef struct pmtdescr {
|
byte elemdescr[MAX_PSI_SIZE]; |
byte elemdescr[MAX_PSI_SIZE]; |
} pmt_descr; |
} pmt_descr; |
|
|
|
/* Automatic stream usage requests as stated via command */ |
typedef struct { |
typedef struct { |
int sprg, tprg, ssid, tsid; |
int sprg, tprg, ssid, tsid; |
} tsauto_descr; |
} tsauto_descr; |
|
|
|
/* Supported input file types */ |
typedef enum { |
typedef enum { |
ct_none, |
ct_none, |
ct_packetized, |
ct_packetized, |
Line 188 typedef enum {
|
Line 219 typedef enum {
|
ct_unknown |
ct_unknown |
} content_type; |
} content_type; |
|
|
|
/* Source file */ |
typedef struct { |
typedef struct { |
refr_data data; |
refr_data data; |
int handle; |
int handle; |
Line 248 typedef struct {
|
Line 280 typedef struct {
|
} u; |
} u; |
} file_descr; |
} file_descr; |
|
|
|
/* Target program */ |
typedef struct { |
typedef struct { |
int program_number; |
int program_number; |
short pcr_pid; |
short pcr_pid; |
Line 260 typedef struct {
|
Line 293 typedef struct {
|
struct streamdescr *stream[MAX_STRPERPRG]; |
struct streamdescr *stream[MAX_STRPERPRG]; |
} prog_descr; |
} prog_descr; |
|
|
|
/* Single data or map stream */ |
typedef struct streamdescr { |
typedef struct streamdescr { |
refr_ctrl ctrl; |
refr_ctrl ctrl; |
refr_data data; |
refr_data data; |