diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2008-09-24 23:31:04 +0000 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2008-09-24 23:31:04 +0000 |
commit | 99f296b30462e6b940aff712920a3fe6b8ba5cc6 (patch) | |
tree | df444dc50a8271f8e1af634f81e9a3d1365ef717 /libavformat/gxf.c | |
parent | 60c9b24df0473d72f3b70ccae761fdf67cf55a37 (diff) | |
download | ffmpeg-99f296b30462e6b940aff712920a3fe6b8ba5cc6.tar.gz |
skip invalid audio samples in gxf packets
Originally committed as revision 15408 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/gxf.c')
-rw-r--r-- | libavformat/gxf.c | 23 |
1 files changed, 18 insertions, 5 deletions
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; |