Annotation of multiplexer/global.h, revision 1.3
1.1 oskar 1: /*
2: * ISO 13818 stream multiplexer
3: * Copyright (C) 2001 Convergence Integrated Media GmbH Berlin
4: * Author: Oskar Schirmer (oskar@convergence.de)
5: */
6:
7: #include <asm/types.h>
8: #include <sys/types.h>
9: #include <sys/poll.h>
10: #include <sys/time.h>
11: #include <sys/unistd.h>
12: #include <sys/stat.h>
13: #include <unistd.h>
14: #include <fcntl.h>
15: #include <stdlib.h>
16: #include <string.h>
17: #include <errno.h>
18:
19: /* for a timing and poll profile: */
20: #if 0
21: #define DEBUG_TIMEPOLL
22: #endif
23:
24: #define MAX_MSEC_OUTDELAY 500
25: #define MAX_MSEC_PUSHJTTR (2 * 250)
1.3 ! oskar 26: #define MAX_MSEC_PCRDIST (100 * 80/100)
1.1 oskar 27:
28: #define MAX_POLLFD (MAX_INFILE+3)
29:
30: #define MAX_DATA_COMB 512
31: #define HIGHWATER_COM 8
32:
33: #define BUFSIZ_FACTOR 32 * 2
34:
35: #define MAX_CTRL_OUTB 32 * BUFSIZ_FACTOR
36: #define MAX_DATA_OUTB 4096 * BUFSIZ_FACTOR
37: #define HIGHWATER_OUT 512
38: #define MAX_WRITE_OUT (128 * 188)
39: #define OUT_TRIGCOND (MAX_DATA_OUTB / 2)
40:
41: #define MAX_CTRL_INB 32 * BUFSIZ_FACTOR
42: #define MAX_DATA_INB 4096 * BUFSIZ_FACTOR
1.3 ! oskar 43: #define HIGHWATER_IN (512 * 4 * 8)
! 44: #define IN_TRIGCOND (MAX_DATA_INB / 2)
! 45:
1.1 oskar 46: #define MAX_DATA_RAWB 4096 * BUFSIZ_FACTOR
1.3 ! oskar 47: #define HIGHWATER_RAW (512 * 4 * 8)
1.1 oskar 48: #define MAX_READ_IN (1024 * 8)
49:
50: #define MAX_INSTREAM 64 /* ? */
51: #define MAX_INFILE 8 /* ? */
52:
53: #define MAX_STRPERPS (1<<8)
54: #define MAX_STRPERTS (1<<13)
55:
56: #define MAX_STRPERPRG 42 /* ? */
57: #define MAX_PRGFORSTR 12 /* ? */
58: #define MAX_OUTPROG 16 /* ? */
59:
60: #define MAX_PSI_SIZE 1025
61: #define MAX_PMTSTREAMS (MAX_PSI_SIZE / 4)
62:
63: #define ENDFILE_CLOSE 0
64: #define ENDFILE_RESET 1
65: #define ENDFILE_CHAIN 2
66:
67: #define ENDSTR_KILL 0
68: #define ENDSTR_CLOSE 1
69: #define ENDSTR_WAIT 2
70:
71: #define PES_LOWEST_SID (0xBC)
72: #define NUMBER_ELEMD 19
73: #define TS_PACKET_SIZE 188
74:
75: #define CRC_SIZE 4
76:
77: #define boolean __u8
78: #define FALSE 0
79: #define TRUE 1
80:
81: #define byte __u8
82:
83: typedef struct {
84: unsigned long base;
85: unsigned short ext;
1.3 ! oskar 86: byte ba33;
1.1 oskar 87: boolean valid;
88: } clockref;
89:
90: typedef struct {
1.3 ! oskar 91: unsigned long base;
1.1 oskar 92: int msec;
1.3 ! oskar 93: } conversion_base;
1.1 oskar 94:
95: typedef struct {
96: int index;
97: int length;
98: int sequence;
99: int scramble;
1.3 ! oskar 100: int msecread;
! 101: int msecpush;
! 102: clockref pcr;
1.1 oskar 103: clockref opcr;
104: } ctrl_buffer;
105:
106: typedef struct {
107: ctrl_buffer *ptr;
108: int in;
109: int out;
110: int mask;
111: } refr_ctrl;
112:
113: typedef struct {
114: byte *ptr;
115: int in;
116: int out;
117: int mask;
118: } refr_data;
119:
120: #define list_empty(refr) ((refr).out == (refr).in)
121:
122: #define list_create(refr,size) \
123: ((((size) & ((size)-1)) || (size < 2)) ? \
124: warn (LERR,"List Create",EGLO,1,1,size), FALSE : \
125: ((refr).ptr = malloc((size) * sizeof(*(refr).ptr))) == NULL ? \
126: warn (LERR,"List Create",EGLO,1,2,size), FALSE : \
127: ((refr).mask = (size)-1, (refr).in = (refr).out = 0, TRUE))
128:
129: #define list_release(refr) \
130: ((refr).mask = 0, free((refr).ptr), (refr).ptr = NULL)
131:
132: #define list_free(refr) \
133: (((refr).out - (refr).in - 1) & (refr).mask)
134:
135: #define list_freeinend(refr) \
136: ((refr).mask + 1 - (refr).in)
137:
138: #define list_size(refr) \
139: (((refr).in - (refr).out) & (refr).mask)
140:
141: #define list_full(refr) \
142: (list_free(refr) == 0)
143:
144: #define list_incr(var,refr,incr) \
145: ((var) = (((var) + (incr)) & (refr).mask))
146:
1.3 ! oskar 147: /*
1.1 oskar 148: #define clockref2msec(cref) \
149: ((cref).base / 90)
150:
151: #define msec2clockref(msec,cref) \
152: (((cref).base = (msec) * 90), ((cref).ext = 0), ((cref).ba33 = 0))
1.3 ! oskar 153: */
1.1 oskar 154:
155: #define marker_check(data,val,mask) \
156: (((data & mask) != val) ? \
157: warn(LWAR,"Marker bit",EGLO,2,data,mask), TRUE : FALSE)
158:
159: #define marker_bit(data,bit) \
160: marker_check(data,1<<bit,1<<bit)
161:
162: #define mmin(a,b) ((a)<(b)?(a):(b))
163: #define mmax(a,b) ((a)<(b)?(b):(a))
164:
165: #define unionalloc(typ,fld) \
166: (malloc (sizeof(typ)-sizeof(((typ*)0)->u)+sizeof(((typ*)0)->u.fld)))
167:
168: typedef struct {
169: int sourceid;
170: int programnumber;
171: byte version;
172: byte *elemdnew[NUMBER_ELEMD];
173: } mapreference;
174:
175: typedef struct pmtdescr {
176: struct pmtdescr *next;
177: short pat_section;
178: byte pmt_version;
179: int programnumber;
180: int pcr_pid;
181: int pmt_pid;
182: int streams;
183: short stream[MAX_PMTSTREAMS];
184: byte streamtype[MAX_PMTSTREAMS];
185: int descrlen;
186: byte elemdescr[MAX_PSI_SIZE];
187: } pmt_descr;
188:
189: typedef struct {
190: int sprg, tprg, ssid, tsid;
191: } tsauto_descr;
192:
193: typedef enum {
194: ct_none,
195: ct_packetized,
196: ct_program,
197: ct_transport,
198: ct_unknown
199: } content_type;
200:
201: typedef struct {
202: refr_data data;
203: char *name;
204: int handle;
205: struct stat stat;
206: struct pollfd *ufds;
207: int skipped; /* undesired bytes skipped, total */
208: int payload; /* split payload used total */
209: int total; /* split total (skipped, used, wasted) */
210: int sequence; /* source counter for PES sequence */
211: int opendatastreams;
212: int openmapstreams;
213: byte endaction;
214: boolean automatic; /* extract'o'use */
1.2 oskar 215: int repeatitions;
1.1 oskar 216: int auto_programnb;
217: content_type content;
218: union {
219: struct {
220: struct streamdescr *stream;
221: } pes;
222: struct {
223: struct {
224: clockref scr;
225: long muxrate;
226: } ph;
227: struct {
228: long ratebound;
229: int audiobound;
230: int videobound;
231: boolean csps_flag;
232: boolean fixed_flag;
233: boolean system_video_lock_flag;
234: boolean system_audio_lock_flag;
235: boolean packet_rate_restriction_flag;
236: short buffer_bound[MAX_STRPERPS-PES_LOWEST_SID];
237: } sh;
238: /*
239: struct {
240: } dir;
241: */
242: struct streamdescr *stream[MAX_STRPERPS];
243: } ps;
244: struct {
245: int transportstreamid;
246: byte pat_version;
247: byte newpat_version;
248: pmt_descr *pat;
249: pmt_descr *newpat;
250: int tsautos;
251: tsauto_descr *tsauto;
252: struct streamdescr *stream[MAX_STRPERTS];
253: } ts;
254: } u;
255: } file_descr;
256:
257: typedef struct {
258: int program_number;
259: int pcr_pid;
260: int pmt_pid;
261: byte pmt_conticnt;
262: byte pmt_version;
263: boolean changed;
264: int pat_section;
265: int streams;
266: struct streamdescr *stream[MAX_STRPERPRG];
267: } prog_descr;
268:
269: typedef struct streamdescr {
270: refr_ctrl ctrl;
271: refr_data data;
272: int sourceid; /* index into fdescr->u.xx.stream[] */
273: byte stream_id; /* elementary stream id, table 2-35, etc */
274: byte stream_type;
275: byte version;
276: byte *elemdvld[NUMBER_ELEMD]; /* as valid for out */
277: byte elemdescr[MAX_PSI_SIZE];
278: /*what if a stream is leftupper corner in one prog, but elsewhere in another?*/
279: file_descr *fdescr;
280: byte conticnt;
281: byte endaction;
282: boolean isamap;
283: union {
284: struct {
285: int pid; /* splicets: 0010..1FFE, spliceps: ...FF */
286: struct streamdescr *mapstream;
287: boolean discontinuity;
288: boolean trigger;
289: boolean mention;
290: boolean has_clockref; /* in output */
291: int next_clockref;
292: int delta;
1.3 ! oskar 293: conversion_base conv;
1.1 oskar 294: int lasttime;
295: int progs;
296: prog_descr *pdescr[MAX_PRGFORSTR];
297: } d;
298: struct {
1.3 ! oskar 299: int msectime;
! 300: conversion_base conv;
1.1 oskar 301: int psi_length;
302: byte psi_data[MAX_PSI_SIZE+TS_PACKET_SIZE];
303: } m;
304: } u;
305: } stream_descr;
306:
307:
308: extern boolean timed_io;
309: extern boolean accept_weird_scr;
310: extern int global_delta;
311: extern int psi_frequency_msec;
312: extern boolean psi_frequency_changed;
313:
314: int msec_now (void);
1.3 ! oskar 315:
! 316: void cref2msec (conversion_base *b,
! 317: clockref c,
! 318: int *m);
! 319:
! 320: void msec2cref (conversion_base *b,
! 321: int m,
! 322: clockref *c);
1.1 oskar 323:
324: void global_init (void);
325:
326:
327: #ifdef DEBUG_TIMEPOLL
328:
329: #define max_timepoll (1024*1024)
330:
331: typedef struct {
332: struct timeval tv;
333: int msec_now;
334: int usec;
335: int tmo;
336: int sr, si, so;
337: unsigned char cnt_msecnow;
338: unsigned char nfdso, nfdsi;
339: unsigned char nfdsrevent;
340: unsigned char flags;
341: } timepoll;
342: #define LTP_FLAG_DELTASHIFT 0x80
343: #define LTP_FLAG_OUTPUT 0x40
344: #define LTP_FLAG_INPUT 0x20
345: #define LTP_FLAG_SPLIT 0x10
346: #define LTP_FLAG_PROCESS 0x08
347:
348: extern timepoll logtp [max_timepoll];
349: extern long logtpc;
350: extern timepoll *ltp;
351:
352: #endif
353:
LinuxTV legacy CVS <linuxtv.org/cvs>