Annotation of multiplexer/descref.c, revision 1.5
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 */
1.5 ! oskar 154: memcpy (&s->autodescr->data[0],dscr,size);
1.1 oskar 155: i = NUMBER_ELEMD;
156: while (--i >= 0) {
157: if (map->elemdnew[i] == NULL) {
1.5 ! oskar 158: s->autodescr->refx[i] = NULL;
1.1 oskar 159: } else {
1.5 ! oskar 160: s->autodescr->refx[i] =
! 161: map->elemdnew[i] + ((&s->autodescr->data[0]) - dscr);
1.1 oskar 162: }
163: }
164: }
165:
1.3 oskar 166: /* Take a set of descriptors from map stream m,
167: * determine the right stream to put the descriptors into
168: * (either the map stream itself, or a related data stream),
169: * save the descriptors into that stream.
170: */
1.1 oskar 171: void validate_mapref (stream_descr *m)
172: {
173: stream_descr *s;
174: int l;
175: mapreference *pmapref;
176: pmapref = (mapreference *)&m->data.ptr[m->data.out];
177: if (m->sourceid == pmapref->sourceid) {
178: s = m;
179: } else {
180: switch (m->fdescr->content) {
181: case ct_program:
182: s = m->fdescr->u.ps.stream[pmapref->sourceid];
183: break;
184: case ct_transport:
1.3 oskar 185: s = ts_file_stream (m->fdescr,pmapref->sourceid);
1.1 oskar 186: break;
187: default:
188: warn (LERR,"Mapref NULL",EDES,6,1,m->fdescr->content);
189: s = NULL;
190: break;
191: }
192: }
193: if (s != NULL) {
194: if (s->version != pmapref->version) {
195: save_mapreference (pmapref,
196: &m->data.ptr[m->data.out+sizeof(mapreference)],
197: m->ctrl.ptr[m->ctrl.out].length-sizeof(mapreference),s);
1.4 oskar 198: if (s->streamdata != sd_data) {
1.1 oskar 199: warn (LDEB,"Mapref isamap",EDES,6,3,pmapref->sourceid);
200: /* must do something, if input program is related to output prog */
201: } else {
202: s->u.d.mention = TRUE;
203: l = s->u.d.progs;
204: while (--l >= 0) {
205: s->u.d.pdescr[l]->changed = TRUE;
206: }
207: }
208: }
209: } else {
210: warn (LDEB,"Mapref NULL",EDES,6,2,pmapref->sourceid);
211: }
212: list_incr (m->ctrl.out,m->ctrl,1);
213: m->data.out = m->ctrl.ptr[m->ctrl.out].index;
1.5 ! oskar 214: }
! 215:
! 216: /* Clear a descriptor struct
! 217: */
! 218: void clear_descrdescr (descr_descr *dd)
! 219: {
! 220: memset (dd,0,sizeof(descr_descr));
1.1 oskar 221: }
222:
LinuxTV legacy CVS <linuxtv.org/cvs>