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>