[SCM] libav/experimental: skip invalid audio samples in gxf packets

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:30:30 UTC 2013


The following commit has been merged in the experimental branch:
commit 99f296b30462e6b940aff712920a3fe6b8ba5cc6
Author: Baptiste Coudurier <baptiste.coudurier at gmail.com>
Date:   Wed Sep 24 23:31:04 2008 +0000

    skip invalid audio samples in gxf packets
    
    Originally committed as revision 15408 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/gxf.c b/libavformat/gxf.c
index dbc069c..3f5f392 100644
--- a/libavformat/gxf.c
+++ b/libavformat/gxf.c
@@ -415,8 +415,9 @@ static int gxf_packet(AVFormatContext *s, AVPacket *pkt) {
     pkt_type_t pkt_type;
     int pkt_len;
     while (!url_feof(pb)) {
+        AVStream *st;
         int track_type, track_id, ret;
-        int field_nr;
+        int field_nr, field_info, skip = 0;
         int stream_index;
         if (!parse_packet_header(pb, &pkt_type, &pkt_len)) {
             if (!url_feof(pb))
@@ -441,15 +442,27 @@ static int gxf_packet(AVFormatContext *s, AVPacket *pkt) {
         stream_index = get_sindex(s, track_id, track_type);
         if (stream_index < 0)
             return stream_index;
+        st = s->streams[stream_index];
         field_nr = get_be32(pb);
-        get_be32(pb); // field information
+        field_info = get_be32(pb);
         get_be32(pb); // "timeline" field number
         get_byte(pb); // flags
         get_byte(pb); // reserved
-        // NOTE: there is also data length information in the
-        // field information, it might be better to take this into account
-        // as well.
+        if (st->codec->codec_id == CODEC_ID_PCM_S24LE ||
+            st->codec->codec_id == CODEC_ID_PCM_S16LE) {
+            int first = field_info >> 16;
+            int last  = field_info & 0xffff; // last is exclusive
+            int bps = av_get_bits_per_sample(st->codec->codec_id)>>3;
+            if (first <= last && last*bps <= pkt_len) {
+                url_fskip(pb, first*bps);
+                skip = pkt_len - last*bps;
+                pkt_len = (last-first)*bps;
+            } else
+                av_log(s, AV_LOG_ERROR, "invalid first and last sample values\n");
+        }
         ret = av_get_packet(pb, pkt, pkt_len);
+        if (skip)
+            url_fskip(pb, skip);
         pkt->stream_index = stream_index;
         pkt->dts = field_nr;
         return ret;

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list