From 99f296b30462e6b940aff712920a3fe6b8ba5cc6 Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Wed, 24 Sep 2008 23:31:04 +0000 Subject: skip invalid audio samples in gxf packets Originally committed as revision 15408 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/gxf.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'libavformat/gxf.c') diff --git a/libavformat/gxf.c b/libavformat/gxf.c index dbc069c193..3f5f392ac7 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; -- cgit v1.2.3