Mercurial > mplayer.hg
comparison libmpdemux/demux_film.c @ 36532:2398517e5bda
film: Fix memory leaks in error cases.
author | reimar |
---|---|
date | Sun, 19 Jan 2014 11:30:05 +0000 |
parents | 249053c3da2b |
children | 80218ddb982f |
comparison
equal
deleted
inserted
replaced
36531:3cd07587a35d | 36532:2398517e5bda |
---|---|
106 sh_video_t *sh_video = demuxer->video->sh; | 106 sh_video_t *sh_video = demuxer->video->sh; |
107 sh_audio_t *sh_audio = demuxer->audio->sh; | 107 sh_audio_t *sh_audio = demuxer->audio->sh; |
108 film_data_t *film_data = (film_data_t *)demuxer->priv; | 108 film_data_t *film_data = (film_data_t *)demuxer->priv; |
109 film_chunk_t film_chunk; | 109 film_chunk_t film_chunk; |
110 int length_fix_bytes; | 110 int length_fix_bytes; |
111 demux_packet_t* dp; | 111 demux_packet_t* dp = NULL; |
112 | 112 |
113 // see if the end has been reached | 113 // see if the end has been reached |
114 if (film_data->current_chunk >= film_data->total_chunks) | 114 if (film_data->current_chunk >= film_data->total_chunks) |
115 return 0; | 115 return 0; |
116 | 116 |
126 { | 126 { |
127 if(demuxer->audio->id>=-1){ // audio not disabled | 127 if(demuxer->audio->id>=-1){ // audio not disabled |
128 dp = new_demux_packet(film_chunk.chunk_size); | 128 dp = new_demux_packet(film_chunk.chunk_size); |
129 if (stream_read(demuxer->stream, dp->buffer, film_chunk.chunk_size) != | 129 if (stream_read(demuxer->stream, dp->buffer, film_chunk.chunk_size) != |
130 film_chunk.chunk_size) | 130 film_chunk.chunk_size) |
131 return 0; | 131 goto err_out; |
132 dp->pts = film_chunk.pts; | 132 dp->pts = film_chunk.pts; |
133 dp->pos = film_chunk.chunk_offset; | 133 dp->pos = film_chunk.chunk_offset; |
134 dp->flags = 0; | 134 dp->flags = 0; |
135 | 135 |
136 // adjust the data before queuing it: | 136 // adjust the data before queuing it: |
169 } | 169 } |
170 } | 170 } |
171 | 171 |
172 // append packet to DS stream | 172 // append packet to DS stream |
173 ds_add_packet(demuxer->audio, dp); | 173 ds_add_packet(demuxer->audio, dp); |
174 dp = NULL; | |
174 } | 175 } |
175 } | 176 } |
176 else | 177 else |
177 { | 178 { |
178 // if the demuxer is dealing with CVID data, deal with it a special way | 179 // if the demuxer is dealing with CVID data, deal with it a special way |
186 // account for the fix bytes when allocating the buffer | 187 // account for the fix bytes when allocating the buffer |
187 dp = new_demux_packet(film_chunk.chunk_size - length_fix_bytes); | 188 dp = new_demux_packet(film_chunk.chunk_size - length_fix_bytes); |
188 | 189 |
189 // these CVID data chunks have a few extra bytes; skip them | 190 // these CVID data chunks have a few extra bytes; skip them |
190 if (stream_read(demuxer->stream, dp->buffer, 10) != 10) | 191 if (stream_read(demuxer->stream, dp->buffer, 10) != 10) |
191 return 0; | 192 goto err_out; |
192 stream_skip(demuxer->stream, length_fix_bytes); | 193 stream_skip(demuxer->stream, length_fix_bytes); |
193 | 194 |
194 if (stream_read(demuxer->stream, dp->buffer + 10, | 195 if (stream_read(demuxer->stream, dp->buffer + 10, |
195 film_chunk.chunk_size - (10 + length_fix_bytes)) != | 196 film_chunk.chunk_size - (10 + length_fix_bytes)) != |
196 (film_chunk.chunk_size - (10 + length_fix_bytes))) | 197 (film_chunk.chunk_size - (10 + length_fix_bytes))) |
197 return 0; | 198 goto err_out; |
198 | 199 |
199 dp->pts = film_chunk.pts; | 200 dp->pts = film_chunk.pts; |
200 dp->pos = film_chunk.chunk_offset; | 201 dp->pos = film_chunk.chunk_offset; |
201 dp->flags = (film_chunk.syncinfo1 & 0x80000000) ? 1 : 0; | 202 dp->flags = (film_chunk.syncinfo1 & 0x80000000) ? 1 : 0; |
202 | 203 |
206 dp->buffer[2] = (cvid_size >> 8) & 0xFF; | 207 dp->buffer[2] = (cvid_size >> 8) & 0xFF; |
207 dp->buffer[3] = (cvid_size >> 0) & 0xFF; | 208 dp->buffer[3] = (cvid_size >> 0) & 0xFF; |
208 | 209 |
209 // append packet to DS stream | 210 // append packet to DS stream |
210 ds_add_packet(demuxer->video, dp); | 211 ds_add_packet(demuxer->video, dp); |
212 dp = NULL; | |
211 } | 213 } |
212 else | 214 else |
213 { | 215 { |
214 ds_read_packet(demuxer->video, demuxer->stream, film_chunk.chunk_size, | 216 ds_read_packet(demuxer->video, demuxer->stream, film_chunk.chunk_size, |
215 film_chunk.pts, | 217 film_chunk.pts, |
217 } | 219 } |
218 } | 220 } |
219 film_data->current_chunk++; | 221 film_data->current_chunk++; |
220 | 222 |
221 return 1; | 223 return 1; |
224 | |
225 err_out: | |
226 if (dp) free_demux_packet(dp); | |
227 return NULL; | |
222 } | 228 } |
223 | 229 |
224 static demuxer_t* demux_open_film(demuxer_t* demuxer) | 230 static demuxer_t* demux_open_film(demuxer_t* demuxer) |
225 { | 231 { |
226 sh_video_t *sh_video = NULL; | 232 sh_video_t *sh_video = NULL; |