Mercurial > mplayer.hg
annotate stream/realrtsp/sdpplin.c @ 35550:d31d6a5c1e94
Deallocate in reverse order of allocation.
author | ib |
---|---|
date | Mon, 10 Dec 2012 01:46:50 +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 |