Mercurial > libavformat.hg
changeset 3938:aaae317c3d54 libavformat
skip invalid audio samples in gxf packets
author | bcoudurier |
---|---|
date | Wed, 24 Sep 2008 23:31:04 +0000 |
parents | c0667b2aa3ab |
children | 20da3b0e6adf |
files | gxf.c |
diffstat | 1 files changed, 18 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/gxf.c Wed Sep 24 22:11:53 2008 +0000 +++ b/gxf.c Wed Sep 24 23:31:04 2008 +0000 @@ -415,8 +415,9 @@ 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 @@ 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;