Annotation of multiplexer/descref.c, revision 1.2

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: /*
                      8:  * Module:  Descref
                      9:  * Purpose: Put descriptor data into map stream buffers.
                     10:  */
                     11: 
                     12: #include "global.h"
                     13: #include "error.h"
                     14: 
                     15: static mapreference mapref;
                     16: static int din;
                     17: 
                     18: void alloc_descriptor (stream_descr *s,
                     19:     int sourceid,
                     20:     int programnumber,
                     21:     byte version)
                     22: {
                     23:   if (s != NULL) {
                     24:     warn (LINF,"Alloc Descriptor",EDES,1,version,sourceid);
                     25:     mapref.sourceid = sourceid;
                     26:     mapref.programnumber = programnumber;
                     27:     mapref.version = version;
                     28:     memset (&mapref.elemdnew,0,sizeof(mapref.elemdnew));
                     29:     din = s->data.in;
                     30:     while (list_free (s->data) < 2*(sizeof(mapreference) + MAX_PSI_SIZE) + 1) {
                     31:       list_incr (s->ctrl.out,s->ctrl,1);
                     32:       s->data.out = s->ctrl.ptr[s->ctrl.out].index;
                     33:     }
                     34:     if (list_freeinend (s->data) < sizeof(mapreference) + MAX_PSI_SIZE) {
                     35:       din = 0;
                     36:     }
                     37:     s->ctrl.ptr[s->ctrl.in].index = din;
                     38:     s->ctrl.ptr[s->ctrl.in].length = sizeof(mapreference);
                     39:     din += sizeof(mapreference);
                     40:   }
                     41: }
                     42: 
                     43: int put_descriptor (file_descr *f,
                     44:   stream_descr *s,
                     45:   int index,
                     46:   int *infolen)
                     47: {
                     48:   byte t, l;
                     49:   if ((t = f->data.ptr[index]) >= NUMBER_ELEMD) {
                     50:     warn (LWAR,"Bad Descriptor Tag",EDES,2,1,t);
                     51:     *infolen = -1;
                     52:     return (index);
                     53:   }
                     54:   warn (LINF,"Put Descriptor",EDES,2,0,t);
                     55:   list_incr (index,f->data,1);
                     56:   l = f->data.ptr[index];
                     57:   if ((*infolen -= (l + 2)) >= 0) {
                     58:     if (s != NULL) {
                     59:       mapref.elemdnew[t] = &s->data.ptr[din];
                     60:       s->ctrl.ptr[s->ctrl.in].length += (l + 2);
                     61:       s->data.ptr[din++] = t;
                     62:       s->data.ptr[din++] = l;
                     63:       while (l > 0) {
                     64:         list_incr (index,f->data,1);
                     65:         s->data.ptr[din++] = f->data.ptr[index];
                     66:         l -= 1;
                     67:       }
                     68:       list_incr (index,f->data,1);
                     69:     } else {
                     70:       list_incr (index,f->data,l+1);
                     71:     }
                     72:   }
                     73:   return (index);
                     74: }
                     75: 
                     76: byte *put_descriptor_s (byte *d,
                     77:   stream_descr *s,
                     78:   int *infolen)
                     79: {
                     80:   byte t, l;
                     81:   if ((t = *d++) >= NUMBER_ELEMD) {
                     82:     warn (LWAR,"Bad Descriptor Tag",EDES,3,1,t);
                     83:     *infolen = -1;
                     84:     return (d);
                     85:   }
                     86:   warn (LINF,"Put Descriptor",EDES,3,0,t);
                     87:   l = *d++;
                     88:   if ((*infolen -= (l + 2)) >= 0) {
                     89:     if (s != NULL) {
                     90:       mapref.elemdnew[t] = &s->data.ptr[din];
                     91:       s->ctrl.ptr[s->ctrl.in].length += (l + 2);
                     92:       s->data.ptr[din++] = t;
                     93:       s->data.ptr[din++] = l;
                     94:       while (l > 0) {
                     95:         s->data.ptr[din++] = *d++;
                     96:         l -= 1;
                     97:       }
                     98:     } else {
                     99:       d += l;
                    100:     }
                    101:   }
                    102:   return (d);
                    103: }
                    104: 
                    105: void finish_descriptor (stream_descr *s)
                    106: {
                    107:   if (s != NULL) {
                    108:     warn (LINF,"Finish Descriptor",EDES,4,
                    109:         s->fdescr->sequence,s->ctrl.ptr[s->ctrl.in].length);
                    110:     memcpy (&s->data.ptr[s->ctrl.ptr[s->ctrl.in].index],&mapref,sizeof(mapref));
                    111:     s->data.in = din;
                    112:     warn (LDEB,"Sequence",EDES,4,1,s->fdescr->sequence);
                    113:     s->ctrl.ptr[s->ctrl.in].sequence = s->fdescr->sequence++;
                    114:     list_incr (s->ctrl.in,s->ctrl,1);
                    115:     if (s->ctrl.out == s->ctrl.in) {
                    116:       list_incr (s->ctrl.out,s->ctrl,1);
                    117:       s->data.out = s->ctrl.ptr[s->ctrl.out].index;
                    118:     }
                    119:   }
                    120: }
                    121: 
                    122: static void save_mapreference (mapreference *map,
                    123:     byte *dscr,
                    124:     int size,
                    125:     stream_descr *s)
                    126: {
                    127:   int i;
                    128:   warn (LINF,"Save Mapref",EDES,5,0,size);
                    129:   s->version = map->version;
                    130:   /* ... = map->programnumber */
                    131:   memcpy (&s->elemdescr[0],dscr,size);
                    132:   i = NUMBER_ELEMD;
                    133:   while (--i >= 0) {
                    134:     if (map->elemdnew[i] == NULL) {
                    135:       s->elemdvld[i] = NULL;
                    136:     } else {
                    137:       s->elemdvld[i] = map->elemdnew[i] + ((&s->elemdescr[0]) - dscr);
                    138:     }
                    139:   }
                    140: }
                    141: 
                    142: void validate_mapref (stream_descr *m)
                    143: {
                    144:   stream_descr *s;
                    145:   int l;
                    146:   mapreference *pmapref;
                    147:   pmapref = (mapreference *)&m->data.ptr[m->data.out];
                    148:   if (m->sourceid == pmapref->sourceid) {
                    149:     s = m;
                    150:   } else {
                    151:     switch (m->fdescr->content) {
                    152:       case ct_program:
                    153:         s = m->fdescr->u.ps.stream[pmapref->sourceid];
                    154:         break;
                    155:       case ct_transport:
                    156:         s = m->fdescr->u.ts.stream[pmapref->sourceid];
                    157:         break;
                    158:       default:
                    159:         warn (LERR,"Mapref NULL",EDES,6,1,m->fdescr->content);
                    160:         s = NULL;
                    161:         break;
                    162:     }
                    163:   }
                    164:   if (s != NULL) {
                    165:     if (s->version != pmapref->version) {
                    166:       save_mapreference (pmapref,
                    167:           &m->data.ptr[m->data.out+sizeof(mapreference)],
                    168:           m->ctrl.ptr[m->ctrl.out].length-sizeof(mapreference),s);
                    169:       if (s->isamap) {
                    170:         warn (LDEB,"Mapref isamap",EDES,6,3,pmapref->sourceid);
                    171:         /* must do something, if input program is related to output prog */
                    172:       } else {
                    173:         s->u.d.mention = TRUE;
                    174:         l = s->u.d.progs;
                    175:         while (--l >= 0) {
                    176:           s->u.d.pdescr[l]->changed = TRUE;
                    177:         }
                    178:       }
                    179:     }
                    180:   } else {
                    181:     warn (LDEB,"Mapref NULL",EDES,6,2,pmapref->sourceid);
                    182:   }
                    183:   list_incr (m->ctrl.out,m->ctrl,1);
                    184:   m->data.out = m->ctrl.ptr[m->ctrl.out].index;
                    185: }
                    186: 

LinuxTV legacy CVS <linuxtv.org/cvs>