Annotation of multiplexer/descref.c, revision 1.4

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;
                     61:   if ((t = f->data.ptr[index]) >= NUMBER_ELEMD) {
                     62:     warn (LWAR,"Bad Descriptor Tag",EDES,2,1,t);
                     63:     *infolen = -1;
                     64:     return (index);
                     65:   }
                     66:   warn (LINF,"Put Descriptor",EDES,2,0,t);
                     67:   list_incr (index,f->data,1);
                     68:   l = f->data.ptr[index];
                     69:   if ((*infolen -= (l + 2)) >= 0) {
                     70:     if (s != NULL) {
                     71:       mapref.elemdnew[t] = &s->data.ptr[din];
                     72:       s->ctrl.ptr[s->ctrl.in].length += (l + 2);
                     73:       s->data.ptr[din++] = t;
                     74:       s->data.ptr[din++] = l;
                     75:       while (l > 0) {
                     76:         list_incr (index,f->data,1);
                     77:         s->data.ptr[din++] = f->data.ptr[index];
                     78:         l -= 1;
                     79:       }
                     80:       list_incr (index,f->data,1);
                     81:     } else {
                     82:       list_incr (index,f->data,l+1);
                     83:     }
                     84:   }
                     85:   return (index);
                     86: }
                     87: 
1.3       oskar      88: /* Scan a descriptor and put it into the map stream s.
                     89:  * Source is direct data from byte pointer d.
                     90:  * Decrease infolen^ by number of bytes processed, or set to -1 on error.
                     91:  * Precondition: as thru alloc_descriptor
                     92:  * Return: byte pointer d increased by number of bytes processed.
                     93:  */
1.1       oskar      94: byte *put_descriptor_s (byte *d,
                     95:   stream_descr *s,
                     96:   int *infolen)
                     97: {
                     98:   byte t, l;
                     99:   if ((t = *d++) >= NUMBER_ELEMD) {
                    100:     warn (LWAR,"Bad Descriptor Tag",EDES,3,1,t);
                    101:     *infolen = -1;
                    102:     return (d);
                    103:   }
                    104:   warn (LINF,"Put Descriptor",EDES,3,0,t);
                    105:   l = *d++;
                    106:   if ((*infolen -= (l + 2)) >= 0) {
                    107:     if (s != NULL) {
                    108:       mapref.elemdnew[t] = &s->data.ptr[din];
                    109:       s->ctrl.ptr[s->ctrl.in].length += (l + 2);
                    110:       s->data.ptr[din++] = t;
                    111:       s->data.ptr[din++] = l;
                    112:       while (l > 0) {
                    113:         s->data.ptr[din++] = *d++;
                    114:         l -= 1;
                    115:       }
                    116:     } else {
                    117:       d += l;
                    118:     }
                    119:   }
                    120:   return (d);
                    121: }
                    122: 
1.3       oskar     123: /* Finish the collection of descriptors into the map stream s.
                    124:  */
1.1       oskar     125: void finish_descriptor (stream_descr *s)
                    126: {
                    127:   if (s != NULL) {
                    128:     warn (LINF,"Finish Descriptor",EDES,4,
                    129:         s->fdescr->sequence,s->ctrl.ptr[s->ctrl.in].length);
                    130:     memcpy (&s->data.ptr[s->ctrl.ptr[s->ctrl.in].index],&mapref,sizeof(mapref));
                    131:     s->data.in = din;
                    132:     warn (LDEB,"Sequence",EDES,4,1,s->fdescr->sequence);
                    133:     s->ctrl.ptr[s->ctrl.in].sequence = s->fdescr->sequence++;
                    134:     list_incr (s->ctrl.in,s->ctrl,1);
                    135:     if (s->ctrl.out == s->ctrl.in) {
                    136:       list_incr (s->ctrl.out,s->ctrl,1);
                    137:       s->data.out = s->ctrl.ptr[s->ctrl.out].index;
                    138:     }
                    139:   }
                    140: }
                    141: 
1.3       oskar     142: /* Save a set of descriptors map with a stream s,
                    143:  * including both the references and the raw data.
                    144:  */
1.1       oskar     145: static void save_mapreference (mapreference *map,
                    146:     byte *dscr,
                    147:     int size,
                    148:     stream_descr *s)
                    149: {
                    150:   int i;
                    151:   warn (LINF,"Save Mapref",EDES,5,0,size);
                    152:   s->version = map->version;
                    153:   /* ... = map->programnumber */
                    154:   memcpy (&s->elemdescr[0],dscr,size);
                    155:   i = NUMBER_ELEMD;
                    156:   while (--i >= 0) {
                    157:     if (map->elemdnew[i] == NULL) {
                    158:       s->elemdvld[i] = NULL;
                    159:     } else {
                    160:       s->elemdvld[i] = map->elemdnew[i] + ((&s->elemdescr[0]) - dscr);
                    161:     }
                    162:   }
                    163: }
                    164: 
1.3       oskar     165: /* Take a set of descriptors from map stream m,
                    166:  * determine the right stream to put the descriptors into
                    167:  * (either the map stream itself, or a related data stream),
                    168:  * save the descriptors into that stream.
                    169:  */
1.1       oskar     170: void validate_mapref (stream_descr *m)
                    171: {
                    172:   stream_descr *s;
                    173:   int l;
                    174:   mapreference *pmapref;
                    175:   pmapref = (mapreference *)&m->data.ptr[m->data.out];
                    176:   if (m->sourceid == pmapref->sourceid) {
                    177:     s = m;
                    178:   } else {
                    179:     switch (m->fdescr->content) {
                    180:       case ct_program:
                    181:         s = m->fdescr->u.ps.stream[pmapref->sourceid];
                    182:         break;
                    183:       case ct_transport:
1.3       oskar     184:         s = ts_file_stream (m->fdescr,pmapref->sourceid);
1.1       oskar     185:         break;
                    186:       default:
                    187:         warn (LERR,"Mapref NULL",EDES,6,1,m->fdescr->content);
                    188:         s = NULL;
                    189:         break;
                    190:     }
                    191:   }
                    192:   if (s != NULL) {
                    193:     if (s->version != pmapref->version) {
                    194:       save_mapreference (pmapref,
                    195:           &m->data.ptr[m->data.out+sizeof(mapreference)],
                    196:           m->ctrl.ptr[m->ctrl.out].length-sizeof(mapreference),s);
1.4     ! oskar     197:       if (s->streamdata != sd_data) {
1.1       oskar     198:         warn (LDEB,"Mapref isamap",EDES,6,3,pmapref->sourceid);
                    199:         /* must do something, if input program is related to output prog */
                    200:       } else {
                    201:         s->u.d.mention = TRUE;
                    202:         l = s->u.d.progs;
                    203:         while (--l >= 0) {
                    204:           s->u.d.pdescr[l]->changed = TRUE;
                    205:         }
                    206:       }
                    207:     }
                    208:   } else {
                    209:     warn (LDEB,"Mapref NULL",EDES,6,2,pmapref->sourceid);
                    210:   }
                    211:   list_incr (m->ctrl.out,m->ctrl,1);
                    212:   m->data.out = m->ctrl.ptr[m->ctrl.out].index;
                    213: }
                    214: 

LinuxTV legacy CVS <linuxtv.org/cvs>