summaryrefslogtreecommitdiff
path: root/libavformat/gxf.c
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2008-09-24 23:31:04 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2008-09-24 23:31:04 +0000
commit99f296b30462e6b940aff712920a3fe6b8ba5cc6 (patch)
treedf444dc50a8271f8e1af634f81e9a3d1365ef717 /libavformat/gxf.c
parent60c9b24df0473d72f3b70ccae761fdf67cf55a37 (diff)
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.c23
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;