changeset 5821:9e77d08ad311 libavformat

Prevent memory leak introduced in r22389 in Bink demuxer: pass partial packets to decoder.
author pross
date Thu, 11 Mar 2010 12:29:02 +0000
parents b56e31849e0f
children 528440939c06
files bink.c
diffstat 1 files changed, 7 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/bink.c	Thu Mar 11 08:33:04 2010 +0000
+++ b/bink.c	Thu Mar 11 12:29:02 2010 +0000
@@ -212,15 +212,16 @@
         bink->current_track++;
         if (audio_size >= 4) {
             /* get one audio packet per track */
-            if ((ret = av_get_packet(pb, pkt, audio_size)) != audio_size)
-                return ret < 0 ? ret : AVERROR(EIO);;
+            if ((ret = av_get_packet(pb, pkt, audio_size)) < 0)
+                return ret;
             pkt->stream_index = bink->current_track;
             pkt->pts = bink->audio_pts[bink->current_track - 1];
 
             /* Each audio packet reports the number of decompressed samples
                (in bytes). We use this value to calcuate the audio PTS */
-            bink->audio_pts[bink->current_track -1] +=
-                AV_RL32(pkt->data) / (2 * s->streams[bink->current_track]->codec->channels);
+            if (pkt->size >= 4)
+                bink->audio_pts[bink->current_track -1] +=
+                    AV_RL32(pkt->data) / (2 * s->streams[bink->current_track]->codec->channels);
             return 0;
         } else {
             url_fseek(pb, audio_size, SEEK_CUR);
@@ -228,9 +229,8 @@
     }
 
     /* get video packet */
-    if ((ret = av_get_packet(pb, pkt, bink->remain_packet_size))
-                                   != bink->remain_packet_size)
-        return ret < 0 ? ret : AVERROR(EIO);
+    if ((ret = av_get_packet(pb, pkt, bink->remain_packet_size)) < 0)
+        return ret;
     pkt->stream_index = 0;
     pkt->pts = bink->video_pts++;
     pkt->flags |= PKT_FLAG_KEY;