summaryrefslogtreecommitdiff
path: root/libavformat/xa.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavformat/xa.c')
-rw-r--r--libavformat/xa.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/libavformat/xa.c b/libavformat/xa.c
index 1e51eec934..c54d7f8b9c 100644
--- a/libavformat/xa.c
+++ b/libavformat/xa.c
@@ -38,7 +38,6 @@
typedef struct MaxisXADemuxContext {
uint32_t out_size;
uint32_t sent_bytes;
- uint32_t audio_frame_counter;
} MaxisXADemuxContext;
static int xa_probe(AVProbeData *p)
@@ -81,12 +80,15 @@ static int xa_read_header(AVFormatContext *s)
avio_skip(pb, 2); /* Skip the tag */
st->codec->channels = avio_rl16(pb);
st->codec->sample_rate = avio_rl32(pb);
- /* Value in file is average byte rate*/
- st->codec->bit_rate = avio_rl32(pb) * 8;
- st->codec->block_align = avio_rl16(pb);
- st->codec->bits_per_coded_sample = avio_rl16(pb);
+ avio_skip(pb, 4); /* Skip average byte rate */
+ avio_skip(pb, 2); /* Skip block align */
+ avio_skip(pb, 2); /* Skip bits-per-sample */
+
+ st->codec->bit_rate = av_clip(15LL * st->codec->channels * 8 *
+ st->codec->sample_rate / 28, 0, INT_MAX);
avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
+ st->start_time = 0;
return 0;
}
@@ -100,8 +102,8 @@ static int xa_read_packet(AVFormatContext *s,
unsigned int packet_size;
int ret;
- if(xa->sent_bytes > xa->out_size)
- return AVERROR(EIO);
+ if (xa->sent_bytes >= xa->out_size)
+ return AVERROR_EOF;
/* 1 byte header and 14 bytes worth of samples * number channels per block */
packet_size = 15*st->codec->channels;
@@ -111,9 +113,7 @@ static int xa_read_packet(AVFormatContext *s,
pkt->stream_index = st->index;
xa->sent_bytes += packet_size;
- pkt->pts = xa->audio_frame_counter;
- /* 14 bytes Samples per channel with 2 samples per byte */
- xa->audio_frame_counter += 28 * st->codec->channels;
+ pkt->duration = 28;
return ret;
}