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>