Annotation of multiplexer/global.h, revision 1.22
1.1 oskar 1: /*
2: * ISO 13818 stream multiplexer
3: * Copyright (C) 2001 Convergence Integrated Media GmbH Berlin
1.22 ! oskar 4: * Copyright (C) 2004 Oskar Schirmer (oskar@scara.com)
1.21 oskar 5: *
6: * This program is free software; you can redistribute it and/or modify
7: * it under the terms of the GNU General Public License as published by
8: * the Free Software Foundation; either version 2 of the License, or
9: * (at your option) any later version.
10: *
11: * This program is distributed in the hope that it will be useful,
12: * but WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: * GNU General Public License for more details.
15: *
16: * You should have received a copy of the GNU General Public License
17: * along with this program; if not, write to the Free Software
18: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1.1 oskar 19: */
20:
21: #include <asm/types.h>
22: #include <sys/types.h>
23: #include <sys/poll.h>
24: #include <sys/time.h>
25: #include <sys/unistd.h>
26: #include <sys/stat.h>
27: #include <unistd.h>
28: #include <fcntl.h>
29: #include <stdlib.h>
30: #include <string.h>
31: #include <errno.h>
32:
33: /* for a timing and poll profile: */
34: #if 0
35: #define DEBUG_TIMEPOLL
36: #endif
37:
1.12 oskar 38: #define PES_LOWEST_SID (0xBC)
1.15 oskar 39: #define NUMBER_DESCR 256
1.12 oskar 40: #define TS_PACKET_SIZE 188
41:
42: #define CRC_SIZE 4
43:
1.1 oskar 44: #define MAX_MSEC_OUTDELAY 500
45: #define MAX_MSEC_PUSHJTTR (2 * 250)
1.3 oskar 46: #define MAX_MSEC_PCRDIST (100 * 80/100)
1.1 oskar 47:
1.12 oskar 48: #define TRIGGER_MSEC_INPUT 250
49: #define TRIGGER_MSEC_OUTPUT 250
1.1 oskar 50:
51: #define MAX_DATA_COMB 512
52: #define HIGHWATER_COM 8
53:
1.12 oskar 54: #define MAX_CTRL_OUTB (1 << 16)
1.4 oskar 55: #define MAX_DATA_OUTB (MAX_CTRL_OUTB << 7)
1.1 oskar 56: #define HIGHWATER_OUT 512
1.12 oskar 57: #define MAX_WRITE_OUT (44 * TS_PACKET_SIZE)
1.1 oskar 58:
1.12 oskar 59: #define MAX_CTRL_INB (1 << 10)
1.4 oskar 60: #define MAX_DATA_INBV (MAX_CTRL_INB << 10)
61: #define MAX_DATA_INBA (MAX_CTRL_INB << 9)
62: #define MAX_DATA_INB (MAX_CTRL_INB << 9)
1.18 oskar 63: #define MAX_DATA_INBPSI (MAX_CTRL_INB << 6)
1.4 oskar 64: #define HIGHWATER_IN (16 * 1024)
65:
66: #define MAX_DATA_RAWB (1 << 18)
67: #define HIGHWATER_RAW (16 * 1024)
68: #define MAX_READ_IN (8 * 1024)
1.1 oskar 69:
70: #define MAX_INSTREAM 64 /* ? */
71: #define MAX_INFILE 8 /* ? */
72:
73: #define MAX_STRPERPS (1<<8)
74: #define MAX_STRPERTS (1<<13)
75:
1.16 oskar 76: #define MAX_DESCR_LEN 0xFF
1.13 oskar 77: #define MAX_PSI_SIZE (4096+1)
78: #define CAN_PSI_SIZE (1024+1)
79: #define MAX_PMTSTREAMS (CAN_PSI_SIZE / 4)
80:
1.1 oskar 81: #define MAX_STRPERPRG 42 /* ? */
1.13 oskar 82: #define MAX_OUTPROG 32 /* ? */
83: #define MAX_PRGFORSTR MAX_OUTPROG
1.1 oskar 84:
1.12 oskar 85: #define MAX_POLLFD (MAX_INFILE+3)
86:
1.1 oskar 87: #define ENDSTR_KILL 0
88: #define ENDSTR_CLOSE 1
89: #define ENDSTR_WAIT 2
90:
91: #define boolean __u8
92: #define FALSE 0
93: #define TRUE 1
94:
95: #define byte __u8
1.4 oskar 96: #define t_msec __s32
1.1 oskar 97:
1.7 oskar 98: /* ISO 13818 clock reference 90kHz (33 bit) with 27MHz extension (9 bit).
99: * ba33 holds the high bit of base.
100: */
1.1 oskar 101: typedef struct {
1.4 oskar 102: __u32 base;
103: __u16 ext;
1.3 oskar 104: byte ba33;
1.1 oskar 105: boolean valid;
106: } clockref;
107:
1.7 oskar 108: /* For conversion purposes, this pair of values holds a partial clock
109: * reference and an internal value in milliseconds. This is to eliminate
110: * wrapping faults without producing conversion inaccuracies.
111: */
1.1 oskar 112: typedef struct {
1.4 oskar 113: __u32 base;
114: t_msec msec;
1.3 oskar 115: } conversion_base;
1.1 oskar 116:
1.7 oskar 117: /* On reference to a controlled data buffer, this one holds the control
118: * information, mainly: index into the data buffer, length of the referenced
119: * data block. In a controlled data buffer, a data block is never split to
120: * wrap at the end of the buffer. The other fields are usage dependend.
121: */
1.1 oskar 122: typedef struct {
123: int index;
124: int length;
125: int sequence;
1.4 oskar 126: t_msec msecread;
127: t_msec msecpush;
1.3 oskar 128: clockref pcr;
1.1 oskar 129: clockref opcr;
1.4 oskar 130: byte scramble;
1.1 oskar 131: } ctrl_buffer;
132:
1.7 oskar 133: /* Control buffer */
1.1 oskar 134: typedef struct {
135: ctrl_buffer *ptr;
136: int in;
137: int out;
138: int mask;
139: } refr_ctrl;
140:
1.7 oskar 141: /* Data buffer */
1.1 oskar 142: typedef struct {
143: byte *ptr;
144: int in;
145: int out;
146: int mask;
147: } refr_data;
148:
149:
1.7 oskar 150: /* Create a new buffer, return TRUE on success, FALSE otherwise */
1.1 oskar 151: #define list_create(refr,size) \
152: ((((size) & ((size)-1)) || (size < 2)) ? \
153: warn (LERR,"List Create",EGLO,1,1,size), FALSE : \
154: ((refr).ptr = malloc((size) * sizeof(*(refr).ptr))) == NULL ? \
155: warn (LERR,"List Create",EGLO,1,2,size), FALSE : \
156: ((refr).mask = (size)-1, (refr).in = (refr).out = 0, TRUE))
157:
1.7 oskar 158: /* Release a buffer no longer used */
1.1 oskar 159: #define list_release(refr) \
160: ((refr).mask = 0, free((refr).ptr), (refr).ptr = NULL)
161:
1.12 oskar 162: /* Test on buffer emptiness */
163: #define list_empty(refr) ((refr).out == (refr).in)
164:
1.7 oskar 165: /* Compute number of free elements in buffer */
1.1 oskar 166: #define list_free(refr) \
167: (((refr).out - (refr).in - 1) & (refr).mask)
168:
1.17 oskar 169: /* Version of list_free with cached (refr).in */
170: #define list_freecachedin(refr,refrin) \
171: (((refr).out - refrin - 1) & (refr).mask)
172:
1.7 oskar 173: /* Compute number of free elements up to the wrapping point, if the
174: latter is included in the free part of the buffer */
1.1 oskar 175: #define list_freeinend(refr) \
176: ((refr).mask + 1 - (refr).in)
1.17 oskar 177:
178: /* Version of list_freeinend with cached (refr).in */
179: #define list_freeinendcachedin(refr,refrin) \
180: ((refr).mask + 1 - refrin)
1.1 oskar 181:
1.7 oskar 182: /* Compute number of used elements in buffer (i.e. its current size) */
1.1 oskar 183: #define list_size(refr) \
184: (((refr).in - (refr).out) & (refr).mask)
185:
1.7 oskar 186: /* Test on buffer fullness */
1.1 oskar 187: #define list_full(refr) \
188: (list_free(refr) == 0)
189:
1.12 oskar 190: /* Test on buffer partial fullness (as trigger criterium) */
191: #define list_partialfull(refr) \
192: (list_size(refr) > ((refr).mask * 3/4))
1.4 oskar 193:
1.7 oskar 194: /* Increment an index variable that points in to a buffer by a given value */
1.1 oskar 195: #define list_incr(var,refr,incr) \
196: ((var) = (((var) + (incr)) & (refr).mask))
1.12 oskar 197:
1.1 oskar 198:
1.7 oskar 199: /* Check a data byte against a mask */
1.1 oskar 200: #define marker_check(data,val,mask) \
201: (((data & mask) != val) ? \
202: warn(LWAR,"Marker bit",EGLO,2,data,mask), TRUE : FALSE)
203:
1.7 oskar 204: /* Check whether a given bit is set in a data byte */
1.1 oskar 205: #define marker_bit(data,bit) \
206: marker_check(data,1<<bit,1<<bit)
207:
208: #define mmin(a,b) ((a)<(b)?(a):(b))
209: #define mmax(a,b) ((a)<(b)?(b):(a))
210:
1.7 oskar 211: /* Allocate memory for a struct with known union usage */
1.1 oskar 212: #define unionalloc(typ,fld) \
213: (malloc (sizeof(typ)-sizeof(((typ*)0)->u)+sizeof(((typ*)0)->u.fld)))
214:
1.8 oskar 215: /* Release a chained list completely */
216: #define releasechain(typ,root) \
1.14 oskar 217: { register typ *relchn_n, *relchn_p = root; \
218: while (relchn_p != NULL) { \
219: relchn_n = relchn_p->next; free (relchn_p); relchn_p = relchn_n; \
1.8 oskar 220: } }
221:
1.10 oskar 222: /* Supported input file types */
223: typedef enum {
224: ct_packetized, /* packetized elementary stream */
225: ct_program, /* program stream */
226: ct_transport, /* transport stream */
1.11 oskar 227: number_ct
1.10 oskar 228: } content_type;
229:
230: /* stream data types, dependend on buffer contents */
231: typedef enum {
232: sd_data, /* PES packet */
233: sd_map, /* mapreference containing descriptors */
234: sd_unparsedsi, /* TS packet containing raw partial SI sections */
1.11 oskar 235: number_sd
1.10 oskar 236: } streamdata_type;
237:
1.7 oskar 238: /* Reference descriptors as these are parsed from PSI */
1.1 oskar 239: typedef struct {
240: int programnumber;
1.4 oskar 241: short sourceid;
1.1 oskar 242: byte version;
1.15 oskar 243: byte *elemdnew[NUMBER_DESCR];
1.1 oskar 244: } mapreference;
245:
1.7 oskar 246: /* Source TS PMT list */
1.1 oskar 247: typedef struct pmtdescr {
248: struct pmtdescr *next;
249: short pat_section;
250: byte pmt_version;
251: int programnumber;
1.4 oskar 252: short pcr_pid;
253: short pmt_pid;
254: short streams;
1.1 oskar 255: short stream[MAX_PMTSTREAMS];
256: byte streamtype[MAX_PMTSTREAMS];
1.4 oskar 257: short descrlen;
1.1 oskar 258: byte elemdescr[MAX_PSI_SIZE];
259: } pmt_descr;
260:
1.7 oskar 261: /* Automatic stream usage requests as stated via command */
1.8 oskar 262: typedef struct tsautodescr {
263: struct tsautodescr *next;
264: int sprg;
265: int tprg;
266: int ssid; /* ssid<0 when referencing a complete program */
267: int tsid;
1.1 oskar 268: } tsauto_descr;
269:
1.9 oskar 270: /* Declaration of pid ranges as being not-to-be-parsed SI */
271: typedef struct tssidescr {
272: struct tssidescr *next;
273: short pid_low;
274: short pid_high;
275: } tssi_descr;
276:
1.7 oskar 277: /* Source file */
1.1 oskar 278: typedef struct {
279: refr_data data;
1.5 oskar 280: int handle;
1.1 oskar 281: char *name;
1.5 oskar 282: int filerefnum;
1.4 oskar 283: int st_mode;
1.1 oskar 284: struct pollfd *ufds;
285: int skipped; /* undesired bytes skipped, total */
286: int payload; /* split payload used total */
287: int total; /* split total (skipped, used, wasted) */
288: int sequence; /* source counter for PES sequence */
1.11 oskar 289: short openstreams[number_sd];
1.5 oskar 290: char *append_name;
291: int append_filerefnum;
292: int append_repeatitions;
1.2 oskar 293: int repeatitions;
1.1 oskar 294: int auto_programnb;
1.5 oskar 295: boolean automatic; /* extract'o'use */
296: boolean stopfile;
1.1 oskar 297: content_type content;
298: union {
299: struct {
300: struct streamdescr *stream;
301: } pes;
302: struct {
303: struct {
304: clockref scr;
1.4 oskar 305: __u32 muxrate;
1.1 oskar 306: } ph;
307: struct {
1.4 oskar 308: __u32 ratebound;
309: byte audiobound;
310: byte videobound;
1.1 oskar 311: boolean csps_flag;
312: boolean fixed_flag;
313: boolean system_video_lock_flag;
314: boolean system_audio_lock_flag;
315: boolean packet_rate_restriction_flag;
316: short buffer_bound[MAX_STRPERPS-PES_LOWEST_SID];
317: } sh;
318: /*
319: struct {
320: } dir;
321: */
322: struct streamdescr *stream[MAX_STRPERPS];
323: } ps;
324: struct {
1.4 oskar 325: __u16 transportstreamid;
1.1 oskar 326: byte pat_version;
327: byte newpat_version;
328: pmt_descr *pat;
329: pmt_descr *newpat;
330: tsauto_descr *tsauto;
1.9 oskar 331: tssi_descr *tssi;
1.1 oskar 332: struct streamdescr *stream[MAX_STRPERTS];
333: } ts;
334: } u;
335: } file_descr;
336:
1.14 oskar 337: /* Descriptors, data and reference index list */
338: typedef struct {
1.15 oskar 339: byte *refx[NUMBER_DESCR];
1.16 oskar 340: byte null[2];
1.14 oskar 341: byte data[MAX_PSI_SIZE];
342: } descr_descr;
343:
344: /* Stream entry in target PMT, without corresponding input stream.
345: * This is used to manually denote si streams, that are brought in
346: * via --si and have to be mentioned in PMT in some way.
347: */
348: typedef struct stumpdescr {
349: struct stumpdescr *next;
350: int program_number;
351: short pid;
352: byte stream_type;
353: descr_descr manudescr;
354: } stump_descr;
355:
1.7 oskar 356: /* Target program */
1.1 oskar 357: typedef struct {
358: int program_number;
1.4 oskar 359: short pcr_pid;
360: short pmt_pid;
1.1 oskar 361: byte pmt_conticnt;
362: byte pmt_version;
1.18 oskar 363: boolean changed; /* must generate new psi due to change */
364: boolean unchanged; /* must generate new psi due to timing */
1.4 oskar 365: short pat_section;
366: short streams;
1.1 oskar 367: struct streamdescr *stream[MAX_STRPERPRG];
1.14 oskar 368: stump_descr *stump; /* just entries in PMT, not really data streams */
1.16 oskar 369: descr_descr manudescr;
1.1 oskar 370: } prog_descr;
371:
1.7 oskar 372: /* Single data or map stream */
1.1 oskar 373: typedef struct streamdescr {
374: refr_ctrl ctrl;
375: refr_data data;
1.4 oskar 376: file_descr *fdescr;
377: short sourceid; /* index into fdescr->u.xx.stream[] */
1.1 oskar 378: byte stream_id; /* elementary stream id, table 2-35, etc */
1.14 oskar 379: byte stream_type; /* table 2-29 */
1.1 oskar 380: byte version;
1.4 oskar 381: byte conticnt;
382: byte endaction;
1.14 oskar 383: descr_descr *autodescr; /* Descriptors copied from input stream */
384: descr_descr *manudescr; /* Descriptors manually added */
1.1 oskar 385: /*what if a stream is leftupper corner in one prog, but elsewhere in another?*/
1.10 oskar 386: streamdata_type streamdata;
1.1 oskar 387: union {
388: struct {
1.4 oskar 389: short pid; /* splicets: 0010..1FFE, spliceps: ...FF */
1.1 oskar 390: boolean discontinuity;
391: boolean trigger;
392: boolean mention;
393: boolean has_clockref; /* in output */
1.6 oskar 394: boolean has_opcr; /* in input */
1.14 oskar 395: struct streamdescr *mapstream;
396: t_msec next_clockref;
397: t_msec delta;
398: conversion_base conv;
399: t_msec lasttime;
1.4 oskar 400: short progs;
1.1 oskar 401: prog_descr *pdescr[MAX_PRGFORSTR];
402: } d;
403: struct {
1.4 oskar 404: t_msec msectime;
1.3 oskar 405: conversion_base conv;
1.1 oskar 406: int psi_length;
407: byte psi_data[MAX_PSI_SIZE+TS_PACKET_SIZE];
408: } m;
1.10 oskar 409: struct {
410: } usi;
1.1 oskar 411: } u;
412: } stream_descr;
413:
414:
415: extern boolean timed_io;
416: extern boolean accept_weird_scr;
1.22 ! oskar 417: extern boolean conservative_pid_assignment;
1.4 oskar 418: extern t_msec global_delta;
419: extern t_msec psi_frequency_msec;
1.1 oskar 420: extern boolean psi_frequency_changed;
421:
1.4 oskar 422: t_msec msec_now (void);
1.3 oskar 423:
424: void cref2msec (conversion_base *b,
425: clockref c,
1.4 oskar 426: t_msec *m);
1.3 oskar 427:
428: void msec2cref (conversion_base *b,
1.4 oskar 429: t_msec m,
1.3 oskar 430: clockref *c);
1.1 oskar 431:
432: void global_init (void);
433:
434:
435: #ifdef DEBUG_TIMEPOLL
436:
437: #define max_timepoll (1024*1024)
438:
439: typedef struct {
440: struct timeval tv;
1.4 oskar 441: t_msec msec_now;
1.1 oskar 442: int usec;
443: int tmo;
444: int sr, si, so;
445: unsigned char cnt_msecnow;
446: unsigned char nfdso, nfdsi;
447: unsigned char nfdsrevent;
448: unsigned char flags;
449: } timepoll;
450: #define LTP_FLAG_DELTASHIFT 0x80
451: #define LTP_FLAG_OUTPUT 0x40
452: #define LTP_FLAG_INPUT 0x20
453: #define LTP_FLAG_SPLIT 0x10
454: #define LTP_FLAG_PROCESS 0x08
455:
456: extern timepoll logtp [max_timepoll];
457: extern long logtpc;
458: extern timepoll *ltp;
459:
460: #endif
461:
LinuxTV legacy CVS <linuxtv.org/cvs>