Mercurial > mplayer.hg
annotate stream/realrtsp/sdpplin.c @ 35332:d6b957072297
subreader: do not skip the first char of ASS fields.
Without this change, fields that can be sometimes empty and
sometimes not, such as the Effect field, are counted in an
inconsistent way. Since the number of fields is used to find
where the text starts, it leads to internal field arriving
on the video.
Bug reported anonymously on the users mailing list.
author | cigaes |
---|---|
date | Tue, 20 Nov 2012 19:43:53 +0000 |
parents | aeb77e5b1942 |
children |
rev | line source |
---|---|
9922 | 1 /* |
2 * This file was ported to MPlayer from xine CVS sdpplin.c,v 1.1 2002/12/24 01:30:22 | |
3 */ | |
4 | |
5 /* | |
6 * Copyright (C) 2002 the xine project | |
7 * | |
8 * This file is part of xine, a free video player. | |
9 * | |
10 * xine is free software; you can redistribute it and/or modify | |
11 * it under the terms of the GNU General Public License as published by | |
12 * the Free Software Foundation; either version 2 of the License, or | |
13 * (at your option) any later version. | |
14 * | |
15 * xine is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 * GNU General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program; if not, write to the Free Software | |
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | |
23 * | |
24 * | |
25 * sdp/sdpplin parser. | |
26 * | |
27 */ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
28 |
15930
f59fdc0d0d14
Do some sanity checks before writing stream information
rtognimp
parents:
15797
diff
changeset
|
29 #include "config.h" |
27463
e16088a911c1
consistency cosmetics: Avoid using .. in #include paths.
diego
parents:
26267
diff
changeset
|
30 #include "stream/librtsp/rtsp.h" |
9922 | 31 #include "sdpplin.h" |
32 #include "xbuffer.h" | |
15930
f59fdc0d0d14
Do some sanity checks before writing stream information
rtognimp
parents:
15797
diff
changeset
|
33 #include "mp_msg.h" |
9922 | 34 |
35 /* | |
36 #define LOG | |
37 */ | |
38 | |
39 /* | |
40 * Decodes base64 strings (based upon b64 package) | |
41 */ | |
42 | |
43 static char *b64_decode(const char *in, char *out, int *size) | |
44 { | |
45 char dtable[256]; /* Encode / decode table */ | |
46 int i,j,k; | |
47 | |
48 for (i = 0; i < 255; i++) { | |
49 dtable[i] = 0x80; | |
50 } | |
51 for (i = 'A'; i <= 'Z'; i++) { | |
52 dtable[i] = 0 + (i - 'A'); | |
53 } | |
54 for (i = 'a'; i <= 'z'; i++) { | |
55 dtable[i] = 26 + (i - 'a'); | |
56 } | |
57 for (i = '0'; i <= '9'; i++) { | |
58 dtable[i] = 52 + (i - '0'); | |
59 } | |
60 dtable['+'] = 62; | |
61 dtable['/'] = 63; | |
62 dtable['='] = 0; | |
63 | |
64 k=0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
65 |
9922 | 66 /*CONSTANTCONDITION*/ |
67 for (j=0; j<strlen(in); j+=4) | |
68 { | |
69 char a[4], b[4]; | |
70 | |
71 for (i = 0; i < 4; i++) { | |
72 int c = in[i+j]; | |
73 | |
74 if (dtable[c] & 0x80) { | |
75 printf("Illegal character '%c' in input.\n", c); | |
76 // exit(1); | |
77 return NULL; | |
78 } | |
79 a[i] = (char) c; | |
80 b[i] = (char) dtable[c]; | |
81 } | |
15932
9bb26af4f477
Revert fix v1.3, it breaks streams with cook audio (ex.
rtognimp
parents:
15930
diff
changeset
|
82 out = xbuffer_ensure_size(out, k+4); |
9922 | 83 out[k++] = (b[0] << 2) | (b[1] >> 4); |
84 out[k++] = (b[1] << 4) | (b[2] >> 2); | |
85 out[k++] = (b[2] << 6) | b[3]; | |
86 i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3); | |
87 if (i < 3) { | |
15932
9bb26af4f477
Revert fix v1.3, it breaks streams with cook audio (ex.
rtognimp
parents:
15930
diff
changeset
|
88 out[k]=0; |
9922 | 89 *size=k; |
90 return out; | |
91 } | |
92 } | |
15932
9bb26af4f477
Revert fix v1.3, it breaks streams with cook audio (ex.
rtognimp
parents:
15930
diff
changeset
|
93 out[k]=0; |
9922 | 94 *size=k; |
95 return out; | |
96 } | |
97 | |
98 static char *nl(char *data) { | |
99 | |
12266 | 100 char *nlptr = (data) ? strchr(data,'\n') : NULL; |
101 return (nlptr) ? nlptr + 1 : NULL; | |
9922 | 102 } |
103 | |
104 static int filter(const char *in, const char *filter, char **out) { | |
105 | |
106 int flen=strlen(filter); | |
12266 | 107 int len; |
108 | |
109 if (!in) | |
110 return 0; | |
111 | |
112 len = (strchr(in,'\n')) ? strchr(in,'\n')-in : strlen(in); | |
9922 | 113 |
114 if (!strncmp(in,filter,flen)) | |
115 { | |
116 if(in[flen]=='"') flen++; | |
117 if(in[len-1]==13) len--; | |
118 if(in[len-1]=='"') len--; | |
119 *out = xbuffer_copyin(*out, 0, in+flen, len-flen+1); | |
120 (*out)[len-flen]=0; | |
121 | |
122 return len-flen; | |
123 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
124 |
9922 | 125 return 0; |
126 } | |
127 static sdpplin_stream_t *sdpplin_parse_stream(char **data) { | |
128 | |
129 sdpplin_stream_t *desc=calloc(1,sizeof(sdpplin_stream_t)); | |
130 char *buf=xbuffer_init(32); | |
131 char *decoded=xbuffer_init(32); | |
132 int handled; | |
19093
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
133 int got_mimetype; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
134 |
9922 | 135 if (filter(*data, "m=", &buf)) { |
136 desc->id = strdup(buf); | |
137 } else | |
138 { | |
139 printf("sdpplin: no m= found.\n"); | |
140 free(desc); | |
141 xbuffer_free(buf); | |
35297 | 142 xbuffer_free(decoded); |
9922 | 143 return NULL; |
144 } | |
145 *data=nl(*data); | |
146 | |
19093
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
147 got_mimetype = 0; |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
148 |
12266 | 149 while (*data && **data && *data[0]!='m') { |
19093
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
150 #ifdef LOG |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
151 { |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
152 int len=strchr(*data,'\n')-(*data); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
153 buf = xbuffer_copyin(buf, 0, *data, len+1); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
154 buf[len]=0; |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
155 printf("libreal: sdpplin_stream: '%s'\n", buf); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
156 } |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
157 #endif |
9922 | 158 |
159 handled=0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
160 |
9922 | 161 if(filter(*data,"a=control:streamid=",&buf)) { |
162 desc->stream_id=atoi(buf); | |
163 handled=1; | |
164 *data=nl(*data); | |
165 } | |
166 | |
167 if(filter(*data,"a=MaxBitRate:integer;",&buf)) { | |
168 desc->max_bit_rate=atoi(buf); | |
169 if (!desc->avg_bit_rate) | |
170 desc->avg_bit_rate=desc->max_bit_rate; | |
171 handled=1; | |
172 *data=nl(*data); | |
173 } | |
174 | |
175 if(filter(*data,"a=MaxPacketSize:integer;",&buf)) { | |
176 desc->max_packet_size=atoi(buf); | |
177 if (!desc->avg_packet_size) | |
178 desc->avg_packet_size=desc->max_packet_size; | |
179 handled=1; | |
180 *data=nl(*data); | |
181 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
182 |
9922 | 183 if(filter(*data,"a=StartTime:integer;",&buf)) { |
184 desc->start_time=atoi(buf); | |
185 handled=1; | |
186 *data=nl(*data); | |
187 } | |
188 | |
189 if(filter(*data,"a=Preroll:integer;",&buf)) { | |
190 desc->preroll=atoi(buf); | |
191 handled=1; | |
192 *data=nl(*data); | |
193 } | |
194 | |
195 if(filter(*data,"a=length:npt=",&buf)) { | |
196 desc->duration=(uint32_t)(atof(buf)*1000); | |
197 handled=1; | |
198 *data=nl(*data); | |
199 } | |
200 | |
201 if(filter(*data,"a=StreamName:string;",&buf)) { | |
202 desc->stream_name=strdup(buf); | |
203 desc->stream_name_size=strlen(desc->stream_name); | |
204 handled=1; | |
205 *data=nl(*data); | |
206 } | |
207 | |
208 if(filter(*data,"a=mimetype:string;",&buf)) { | |
209 desc->mime_type=strdup(buf); | |
210 desc->mime_type_size=strlen(desc->mime_type); | |
211 handled=1; | |
19093
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
212 got_mimetype = 1; |
9922 | 213 *data=nl(*data); |
214 } | |
215 | |
216 if(filter(*data,"a=OpaqueData:buffer;",&buf)) { | |
217 decoded = b64_decode(buf, decoded, &(desc->mlti_data_size)); | |
19070 | 218 desc->mlti_data=malloc(desc->mlti_data_size); |
9922 | 219 memcpy(desc->mlti_data, decoded, desc->mlti_data_size); |
220 handled=1; | |
221 *data=nl(*data); | |
222 #ifdef LOG | |
223 printf("mlti_data_size: %i\n", desc->mlti_data_size); | |
224 #endif | |
225 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
226 |
9922 | 227 if(filter(*data,"a=ASMRuleBook:string;",&buf)) { |
228 desc->asm_rule_book=strdup(buf); | |
229 handled=1; | |
230 *data=nl(*data); | |
231 } | |
232 | |
233 if(!handled) { | |
234 #ifdef LOG | |
235 int len=strchr(*data,'\n')-(*data); | |
236 buf = xbuffer_copyin(buf, 0, *data, len+1); | |
237 buf[len]=0; | |
19093
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
238 printf("libreal: sdpplin_stream: not handled: '%s'\n", buf); |
9922 | 239 #endif |
240 *data=nl(*data); | |
241 } | |
242 } | |
243 | |
19093
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
244 if (!got_mimetype) { |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
245 mp_msg(MSGT_OPEN, MSGL_V, "libreal: sdpplin_stream: no mimetype\n"); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
246 desc->mime_type = strdup("audio/x-pn-realaudio"); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
247 desc->mime_type_size = strlen(desc->mime_type); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
248 if (desc->stream_id) |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
249 mp_msg(MSGT_OPEN, MSGL_WARN, "libreal: sdpplin_stream: implicit mimetype for stream_id != 0, weird.\n"); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
250 } |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
251 |
9922 | 252 xbuffer_free(buf); |
253 xbuffer_free(decoded); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
254 |
9922 | 255 return desc; |
256 } | |
257 | |
258 sdpplin_t *sdpplin_parse(char *data) { | |
259 | |
260 sdpplin_t *desc=calloc(1,sizeof(sdpplin_t)); | |
261 char *buf=xbuffer_init(32); | |
262 char *decoded=xbuffer_init(32); | |
263 int handled; | |
264 int len; | |
265 | |
12266 | 266 while (data && *data) { |
19093
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
267 #ifdef LOG |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
268 { |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
269 int len=strchr(data,'\n')-(data); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
270 buf = xbuffer_copyin(buf, 0, data, len+1); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
271 buf[len]=0; |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
272 printf("libreal: sdpplin: '%s'\n", buf); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
273 } |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
274 #endif |
9922 | 275 |
276 handled=0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
277 |
9922 | 278 if (filter(data, "m=", &buf)) { |
18095
5327871ea0e5
missing free in case sdpplin_parse_stream returns invalid stream.
reimar
parents:
15932
diff
changeset
|
279 sdpplin_stream_t *stream=sdpplin_parse_stream(&data); |
9922 | 280 #ifdef LOG |
281 printf("got data for stream id %u\n", stream->stream_id); | |
282 #endif | |
15930
f59fdc0d0d14
Do some sanity checks before writing stream information
rtognimp
parents:
15797
diff
changeset
|
283 if (desc->stream && (stream->stream_id >= 0) && (stream->stream_id < desc->stream_count)) |
9922 | 284 desc->stream[stream->stream_id]=stream; |
19093
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
285 else if (desc->stream) |
18095
5327871ea0e5
missing free in case sdpplin_parse_stream returns invalid stream.
reimar
parents:
15932
diff
changeset
|
286 { |
19093
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
287 mp_msg(MSGT_OPEN, MSGL_ERR, "sdpplin: bad stream_id %d (must be >= 0, < %d). Broken sdp?\n", |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
288 stream->stream_id, desc->stream_count); |
18095
5327871ea0e5
missing free in case sdpplin_parse_stream returns invalid stream.
reimar
parents:
15932
diff
changeset
|
289 free(stream); |
19093
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
290 } else { |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
291 mp_msg(MSGT_OPEN, MSGL_V, "sdpplin: got 'm=', but 'a=StreamCount' is still unknown.\n"); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
292 if (stream->stream_id == 0) { |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
293 desc->stream_count=1; |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
294 desc->stream=malloc(sizeof(sdpplin_stream_t*)); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
295 desc->stream[0]=stream; |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
296 } else { |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
297 mp_msg(MSGT_OPEN, MSGL_ERR, "sdpplin: got 'm=', but 'a=StreamCount' is still unknown and stream_id != 0. Broken sdp?\n"); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
298 free(stream); |
aca5ce3701e9
Assume that missing streamcount means one stream, and missing mimetype
rtogni
parents:
19070
diff
changeset
|
299 } |
18095
5327871ea0e5
missing free in case sdpplin_parse_stream returns invalid stream.
reimar
parents:
15932
diff
changeset
|
300 } |
9922 | 301 continue; |
302 } | |
303 | |
304 if(filter(data,"a=Title:buffer;",&buf)) { | |
305 decoded=b64_decode(buf, decoded, &len); | |
306 desc->title=strdup(decoded); | |
307 handled=1; | |
308 data=nl(data); | |
309 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
310 |
9922 | 311 if(filter(data,"a=Author:buffer;",&buf)) { |
312 decoded=b64_decode(buf, decoded, &len); | |
313 desc->author=strdup(decoded); | |
314 handled=1; | |
315 data=nl(data); | |
316 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
317 |
9922 | 318 if(filter(data,"a=Copyright:buffer;",&buf)) { |
319 decoded=b64_decode(buf, decoded, &len); | |
320 desc->copyright=strdup(decoded); | |
321 handled=1; | |
322 data=nl(data); | |
323 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
324 |
9922 | 325 if(filter(data,"a=Abstract:buffer;",&buf)) { |
326 decoded=b64_decode(buf, decoded, &len); | |
327 desc->abstract=strdup(decoded); | |
328 handled=1; | |
329 data=nl(data); | |
330 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
331 |
9922 | 332 if(filter(data,"a=StreamCount:integer;",&buf)) { |
15930
f59fdc0d0d14
Do some sanity checks before writing stream information
rtognimp
parents:
15797
diff
changeset
|
333 desc->stream_count=(unsigned int)atoi(buf); |
26267
430da0c9fcce
Fix possible integer overflow in malloc by using calloc instead.
reimar
parents:
21790
diff
changeset
|
334 desc->stream=calloc(desc->stream_count, sizeof(sdpplin_stream_t*)); |
430da0c9fcce
Fix possible integer overflow in malloc by using calloc instead.
reimar
parents:
21790
diff
changeset
|
335 if (!desc->stream) desc->stream_count = 0; |
9922 | 336 handled=1; |
337 data=nl(data); | |
338 } | |
339 | |
340 if(filter(data,"a=Flags:integer;",&buf)) { | |
341 desc->flags=atoi(buf); | |
342 handled=1; | |
343 data=nl(data); | |
344 } | |
345 | |
346 if(!handled) { | |
347 #ifdef LOG | |
348 int len=strchr(data,'\n')-data; | |
349 buf = xbuffer_copyin(buf, 0, data, len+1); | |
350 buf[len]=0; | |
351 printf("libreal: sdpplin: not handled: '%s'\n", buf); | |
352 #endif | |
353 data=nl(data); | |
354 } | |
355 } | |
356 | |
357 xbuffer_free(buf); | |
358 xbuffer_free(decoded); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27463
diff
changeset
|
359 |
9922 | 360 return desc; |
361 } | |
362 | |
363 void sdpplin_free(sdpplin_t *description) { | |
364 | |
21788 | 365 int i; |
366 | |
367 if (!description) | |
368 return; | |
369 | |
370 for (i = 0; i < description->stream_count; i++) { | |
371 if (description->stream[i]) { | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
29583
diff
changeset
|
372 free(description->stream[i]->stream_name); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
29583
diff
changeset
|
373 free(description->stream[i]->mime_type); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
29583
diff
changeset
|
374 free(description->stream[i]->mlti_data); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
29583
diff
changeset
|
375 free(description->stream[i]->asm_rule_book); |
29583 | 376 free(description->stream[i]->id); |
21790
7ea888a4b348
More free() that were forgotten in r21806 memleak fix
rtogni
parents:
21788
diff
changeset
|
377 free(description->stream[i]); |
21788 | 378 } |
379 } | |
380 | |
21790
7ea888a4b348
More free() that were forgotten in r21806 memleak fix
rtogni
parents:
21788
diff
changeset
|
381 if(description->stream_count) |
7ea888a4b348
More free() that were forgotten in r21806 memleak fix
rtogni
parents:
21788
diff
changeset
|
382 free(description->stream); |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
29583
diff
changeset
|
383 free(description->title); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
29583
diff
changeset
|
384 free(description->author); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
29583
diff
changeset
|
385 free(description->copyright); |
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
29583
diff
changeset
|
386 free(description->abstract); |
21788 | 387 |
9922 | 388 free(description); |
389 } | |
390 |