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;