# HG changeset patch # User bcoudurier # Date 1222299064 0 # Node ID aaae317c3d54d36acf25e118fb4bb9ec13dc11bb # Parent c0667b2aa3abf05447e36dea51f849c2c1b6f5cd skip invalid audio samples in gxf packets diff -r c0667b2aa3ab -r aaae317c3d54 gxf.c --- 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;