Solving memory leak and initialization problem with prev_pkt / pkt.

Originally committed as revision 25004 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Tobias Bindhammer 2010-08-31 07:15:11 +00:00
parent d1cacdb8dd
commit 8731c86d03
1 changed files with 13 additions and 3 deletions

View File

@ -125,8 +125,16 @@ static int a64_write_packet(struct AVFormatContext *s, AVPacket *pkt)
}
/* backup current packet for next turn */
if(pkt->data) {
av_new_packet(&c->prev_pkt, pkt->size);
memcpy(c->prev_pkt.data, pkt->data, pkt->size);
/* no backup packet yet? create one! */
if(!c->prev_pkt.data) av_new_packet(&c->prev_pkt, pkt->size);
/* we have a packet and data is big enough, reuse it */
if(c->prev_pkt.data && c->prev_pkt.size >= pkt->size) {
memcpy(c->prev_pkt.data, pkt->data, pkt->size);
c->prev_pkt.size = pkt->size;
} else {
av_log(avctx, AV_LOG_ERROR, "Too less memory for prev_pkt.\n");
return AVERROR(ENOMEM);
}
}
c->prev_frame_count = frame_count;
break;
@ -145,9 +153,11 @@ static int a64_write_packet(struct AVFormatContext *s, AVPacket *pkt)
static int a64_write_trailer(struct AVFormatContext *s)
{
A64MuxerContext *c = s->priv_data;
AVPacket pkt;
AVPacket pkt = {0};
/* need to flush last packet? */
if(c->interleaved) a64_write_packet(s, &pkt);
/* discard backed up packet */
if(c->prev_pkt.data) av_destruct_packet(&c->prev_pkt);
return 0;
}