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