summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorZane van Iperen <zane@zanevaniperen.com>2020-09-05 21:30:12 +1000
committerZane van Iperen <zane@zanevaniperen.com>2020-09-07 13:13:33 +1000
commitd2f7b399149f725138f5551ae980e755596d527c (patch)
treed6e92f499ed23abce18b2ab61a7ae989ea295a04 /libavformat
parent5c2c35da12127a87cc33ed8d85305406a0e56801 (diff)
avformat/argo_asf: fix handling of v1.1 files
Version 1.1 (FX Fighter) files all have a sample rate of 44100 in the header, but only play back correctly at 22050. Force the sample rate to 22050 when reading, and restrict it when muxing.
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/argo_asf.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/libavformat/argo_asf.c b/libavformat/argo_asf.c
index 37ad2bf5e9..bf9b5d0c0a 100644
--- a/libavformat/argo_asf.c
+++ b/libavformat/argo_asf.c
@@ -187,7 +187,11 @@ static int argo_asf_read_header(AVFormatContext *s)
st->codecpar->channels = 1;
}
- st->codecpar->sample_rate = asf->ckhdr.sample_rate;
+ /* v1.1 files (FX Fighter) are all marked as 44100, but are actually 22050. */
+ if (asf->fhdr.version_major == 1 && asf->fhdr.version_minor == 1)
+ st->codecpar->sample_rate = 22050;
+ else
+ st->codecpar->sample_rate = asf->ckhdr.sample_rate;
st->codecpar->bits_per_coded_sample = 4;
@@ -264,6 +268,7 @@ AVInputFormat ff_argo_asf_demuxer = {
#if CONFIG_ARGO_ASF_MUXER
static int argo_asf_write_init(AVFormatContext *s)
{
+ ArgoASFMuxContext *ctx = s->priv_data;
const AVCodecParameters *par;
if (s->nb_streams != 1) {
@@ -279,6 +284,11 @@ static int argo_asf_write_init(AVFormatContext *s)
return AVERROR(EINVAL);
}
+ if (ctx->version_major == 1 && ctx->version_minor == 1 && par->sample_rate != 22050) {
+ av_log(s, AV_LOG_ERROR, "ASF v1.1 files only support a sample rate of 22050\n");
+ return AVERROR(EINVAL);
+ }
+
if (par->channels > 2) {
av_log(s, AV_LOG_ERROR, "ASF files only support up to 2 channels\n");
return AVERROR(EINVAL);
@@ -351,7 +361,12 @@ static int argo_asf_write_header(AVFormatContext *s)
chdr.num_blocks = 0;
chdr.num_samples = ASF_SAMPLE_COUNT;
chdr.unk1 = 0;
- chdr.sample_rate = par->sample_rate;
+
+ if (ctx->version_major == 1 && ctx->version_minor == 1)
+ chdr.sample_rate = 44100;
+ else
+ chdr.sample_rate = par->sample_rate;
+
chdr.unk2 = ~0;
chdr.flags = ASF_CF_BITS_PER_SAMPLE | ASF_CF_ALWAYS1;