Annotation of multiplexer/global.h, revision 1.25

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: 
                     21: #include <sys/types.h>
                     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.23      oskar      90: #define boolean u_int8_t
1.1       oskar      91: #define FALSE   0
                     92: #define TRUE    1
                     93: 
1.23      oskar      94: #define byte u_int8_t
                     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.23      oskar     101:   u_int32_t base;
                    102:   u_int16_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.23      oskar     112:   u_int32_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.23      oskar     304:         u_int32_t muxrate;
1.1       oskar     305:       } ph;
                    306:       struct {
1.23      oskar     307:         u_int32_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.23      oskar     324:       u_int16_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>