Annotation of multiplexer/descref.c, revision 1.1
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: /*
! 167: {
! 168: int i;
! 169: i = m->ctrl.out;
! 170: fprintf(stderr,"m=(p=%08x,i=%d,o=%d,m=%d)\n",(int)m->ctrl.ptr,m->ctrl.in,m->ctrl.out,m->ctrl.mask);
! 171: while (i != m->ctrl.in) {
! 172: fprintf(stderr,"m[%d]=(i=%d,l=%d,s=%d,t=%d)\n",i,m->ctrl.ptr[i].index,m->ctrl.ptr[i].length,m->ctrl.ptr[i].sequence,m->ctrl.ptr[i].time.push);
! 173: list_incr (i,m->ctrl,1);
! 174: }
! 175: }
! 176: warn (LERR,"CP",EDES,6,s,m);
! 177: warn (LERR,"CP",EDES,6,m->data.in,m->data.out);
! 178: warn (LERR,"CP",EDES,6,pmapref->sourceid,42);
! 179: warn (LERR,"CP",EDES,6,m->sourceid,m->ctrl.in);
! 180: warn (LERR,"CP",EDES,6,s->version,m->ctrl.out);
! 181: warn (LERR,"CP",EDES,6,pmapref->version,m->ctrl.ptr[m->ctrl.out].sequence);
! 182: warn (LERR,"CP",EDES,6,m->ctrl.ptr[m->ctrl.out].index,m->ctrl.ptr[m->ctrl.out].length);
! 183: */
! 184: save_mapreference (pmapref,
! 185: &m->data.ptr[m->data.out+sizeof(mapreference)],
! 186: m->ctrl.ptr[m->ctrl.out].length-sizeof(mapreference),s);
! 187: if (s->isamap) {
! 188: warn (LDEB,"Mapref isamap",EDES,6,3,pmapref->sourceid);
! 189: /* must do something, if input program is related to output prog */
! 190: } else {
! 191: s->u.d.mention = TRUE;
! 192: l = s->u.d.progs;
! 193: while (--l >= 0) {
! 194: s->u.d.pdescr[l]->changed = TRUE;
! 195: }
! 196: }
! 197: }
! 198: } else {
! 199: warn (LDEB,"Mapref NULL",EDES,6,2,pmapref->sourceid);
! 200: }
! 201: list_incr (m->ctrl.out,m->ctrl,1);
! 202: m->data.out = m->ctrl.ptr[m->ctrl.out].index;
! 203: }
! 204:
LinuxTV legacy CVS <linuxtv.org/cvs>