Annotation of multiplexer/descref.c, revision 1.6

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"
1.3       oskar      14: #include "splitts.h"
1.1       oskar      15: 
                     16: static mapreference mapref;
                     17: static int din;
                     18: 
1.3       oskar      19: /* Start descriptor processing into a map stream s.
                     20:  * The descriptor functions are to be used always in the
                     21:  * sequence "alloc, put...put, finish"
                     22:  * Postcondition: din==InputIndex, enough free space for PSI.
                     23:  */
1.1       oskar      24: void alloc_descriptor (stream_descr *s,
                     25:     int sourceid,
                     26:     int programnumber,
                     27:     byte version)
                     28: {
                     29:   if (s != NULL) {
                     30:     warn (LINF,"Alloc Descriptor",EDES,1,version,sourceid);
                     31:     mapref.sourceid = sourceid;
                     32:     mapref.programnumber = programnumber;
                     33:     mapref.version = version;
                     34:     memset (&mapref.elemdnew,0,sizeof(mapref.elemdnew));
                     35:     din = s->data.in;
                     36:     while (list_free (s->data) < 2*(sizeof(mapreference) + MAX_PSI_SIZE) + 1) {
                     37:       list_incr (s->ctrl.out,s->ctrl,1);
                     38:       s->data.out = s->ctrl.ptr[s->ctrl.out].index;
                     39:     }
                     40:     if (list_freeinend (s->data) < sizeof(mapreference) + MAX_PSI_SIZE) {
                     41:       din = 0;
                     42:     }
                     43:     s->ctrl.ptr[s->ctrl.in].index = din;
                     44:     s->ctrl.ptr[s->ctrl.in].length = sizeof(mapreference);
                     45:     din += sizeof(mapreference);
                     46:   }
                     47: }
                     48: 
1.3       oskar      49: /* Scan a descriptor and put it into the map stream s.
                     50:  * Source is raw data from file f.
                     51:  * Decrease infolen^ by number of bytes processed, or set to -1 on error.
                     52:  * Precondition: as thru alloc_descriptor
                     53:  * Return: index increased by number of bytes processed.
                     54:  */
1.1       oskar      55: int put_descriptor (file_descr *f,
                     56:   stream_descr *s,
                     57:   int index,
                     58:   int *infolen)
                     59: {
                     60:   byte t, l;
1.6     ! oskar      61:   t = f->data.ptr[index];
        !            62: #if (NUMBER_DESCR < 0x100)
        !            63:   if (t >= NUMBER_DESCR) {
1.1       oskar      64:     warn (LWAR,"Bad Descriptor Tag",EDES,2,1,t);
                     65:     *infolen = -1;
                     66:     return (index);
                     67:   }
1.6     ! oskar      68: #endif
1.1       oskar      69:   warn (LINF,"Put Descriptor",EDES,2,0,t);
                     70:   list_incr (index,f->data,1);
                     71:   l = f->data.ptr[index];
                     72:   if ((*infolen -= (l + 2)) >= 0) {
                     73:     if (s != NULL) {
                     74:       mapref.elemdnew[t] = &s->data.ptr[din];
                     75:       s->ctrl.ptr[s->ctrl.in].length += (l + 2);
                     76:       s->data.ptr[din++] = t;
                     77:       s->data.ptr[din++] = l;
                     78:       while (l > 0) {
                     79:         list_incr (index,f->data,1);
                     80:         s->data.ptr[din++] = f->data.ptr[index];
                     81:         l -= 1;
                     82:       }
                     83:       list_incr (index,f->data,1);
                     84:     } else {
                     85:       list_incr (index,f->data,l+1);
                     86:     }
                     87:   }
                     88:   return (index);
                     89: }
                     90: 
1.3       oskar      91: /* Scan a descriptor and put it into the map stream s.
                     92:  * Source is direct data from byte pointer d.
                     93:  * Decrease infolen^ by number of bytes processed, or set to -1 on error.
                     94:  * Precondition: as thru alloc_descriptor
                     95:  * Return: byte pointer d increased by number of bytes processed.
                     96:  */
1.1       oskar      97: byte *put_descriptor_s (byte *d,
                     98:   stream_descr *s,
                     99:   int *infolen)
                    100: {
                    101:   byte t, l;
1.6     ! oskar     102:   t = *d++;
        !           103: #if (NUMBER_DESCR < 0x100)
        !           104:   if (t >= NUMBER_DESCR) {
1.1       oskar     105:     warn (LWAR,"Bad Descriptor Tag",EDES,3,1,t);
                    106:     *infolen = -1;
                    107:     return (d);
                    108:   }
1.6     ! oskar     109: #endif
1.1       oskar     110:   warn (LINF,"Put Descriptor",EDES,3,0,t);
                    111:   l = *d++;
                    112:   if ((*infolen -= (l + 2)) >= 0) {
                    113:     if (s != NULL) {
                    114:       mapref.elemdnew[t] = &s->data.ptr[din];
                    115:       s->ctrl.ptr[s->ctrl.in].length += (l + 2);
                    116:       s->data.ptr[din++] = t;
                    117:       s->data.ptr[din++] = l;
                    118:       while (l > 0) {
                    119:         s->data.ptr[din++] = *d++;
                    120:         l -= 1;
                    121:       }
                    122:     } else {
                    123:       d += l;
                    124:     }
                    125:   }
                    126:   return (d);
                    127: }
                    128: 
1.3       oskar     129: /* Finish the collection of descriptors into the map stream s.
                    130:  */
1.1       oskar     131: void finish_descriptor (stream_descr *s)
                    132: {
                    133:   if (s != NULL) {
                    134:     warn (LINF,"Finish Descriptor",EDES,4,
                    135:         s->fdescr->sequence,s->ctrl.ptr[s->ctrl.in].length);
                    136:     memcpy (&s->data.ptr[s->ctrl.ptr[s->ctrl.in].index],&mapref,sizeof(mapref));
                    137:     s->data.in = din;
                    138:     warn (LDEB,"Sequence",EDES,4,1,s->fdescr->sequence);
                    139:     s->ctrl.ptr[s->ctrl.in].sequence = s->fdescr->sequence++;
                    140:     list_incr (s->ctrl.in,s->ctrl,1);
                    141:     if (s->ctrl.out == s->ctrl.in) {
                    142:       list_incr (s->ctrl.out,s->ctrl,1);
                    143:       s->data.out = s->ctrl.ptr[s->ctrl.out].index;
                    144:     }
                    145:   }
                    146: }
                    147: 
1.3       oskar     148: /* Save a set of descriptors map with a stream s,
                    149:  * including both the references and the raw data.
                    150:  */
1.1       oskar     151: static void save_mapreference (mapreference *map,
                    152:     byte *dscr,
                    153:     int size,
                    154:     stream_descr *s)
                    155: {
                    156:   int i;
                    157:   warn (LINF,"Save Mapref",EDES,5,0,size);
                    158:   s->version = map->version;
                    159:   /* ... = map->programnumber */
1.5       oskar     160:   memcpy (&s->autodescr->data[0],dscr,size);
1.6     ! oskar     161:   i = NUMBER_DESCR;
1.1       oskar     162:   while (--i >= 0) {
                    163:     if (map->elemdnew[i] == NULL) {
1.5       oskar     164:       s->autodescr->refx[i] = NULL;
1.1       oskar     165:     } else {
1.5       oskar     166:       s->autodescr->refx[i] =
                    167:         map->elemdnew[i] + ((&s->autodescr->data[0]) - dscr);
1.1       oskar     168:     }
                    169:   }
                    170: }
                    171: 
1.3       oskar     172: /* Take a set of descriptors from map stream m,
                    173:  * determine the right stream to put the descriptors into
                    174:  * (either the map stream itself, or a related data stream),
                    175:  * save the descriptors into that stream.
                    176:  */
1.1       oskar     177: void validate_mapref (stream_descr *m)
                    178: {
                    179:   stream_descr *s;
                    180:   int l;
                    181:   mapreference *pmapref;
                    182:   pmapref = (mapreference *)&m->data.ptr[m->data.out];
                    183:   if (m->sourceid == pmapref->sourceid) {
                    184:     s = m;
                    185:   } else {
                    186:     switch (m->fdescr->content) {
                    187:       case ct_program:
                    188:         s = m->fdescr->u.ps.stream[pmapref->sourceid];
                    189:         break;
                    190:       case ct_transport:
1.3       oskar     191:         s = ts_file_stream (m->fdescr,pmapref->sourceid);
1.1       oskar     192:         break;
                    193:       default:
                    194:         warn (LERR,"Mapref NULL",EDES,6,1,m->fdescr->content);
                    195:         s = NULL;
                    196:         break;
                    197:     }
                    198:   }
                    199:   if (s != NULL) {
                    200:     if (s->version != pmapref->version) {
                    201:       save_mapreference (pmapref,
                    202:           &m->data.ptr[m->data.out+sizeof(mapreference)],
                    203:           m->ctrl.ptr[m->ctrl.out].length-sizeof(mapreference),s);
1.4       oskar     204:       if (s->streamdata != sd_data) {
1.1       oskar     205:         warn (LDEB,"Mapref isamap",EDES,6,3,pmapref->sourceid);
                    206:         /* must do something, if input program is related to output prog */
                    207:       } else {
                    208:         s->u.d.mention = TRUE;
                    209:         l = s->u.d.progs;
                    210:         while (--l >= 0) {
                    211:           s->u.d.pdescr[l]->changed = TRUE;
                    212:         }
                    213:       }
                    214:     }
                    215:   } else {
                    216:     warn (LDEB,"Mapref NULL",EDES,6,2,pmapref->sourceid);
                    217:   }
                    218:   list_incr (m->ctrl.out,m->ctrl,1);
                    219:   m->data.out = m->ctrl.ptr[m->ctrl.out].index;
1.5       oskar     220: }
                    221: 
                    222: /* Clear a descriptor struct
                    223:  */
                    224: void clear_descrdescr (descr_descr *dd)
                    225: {
                    226:   memset (dd,0,sizeof(descr_descr));
1.1       oskar     227: }
                    228: 

LinuxTV legacy CVS <linuxtv.org/cvs>