diff options
Diffstat (limited to 'libavformat/xa.c')
-rw-r--r-- | libavformat/xa.c | 20 |
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; } |