summaryrefslogtreecommitdiff
path: root/libavformat/mvdec.c
diff options
context:
space:
mode:
authorJohn-Paul Stewart <jpstewart@personalprojects.net>2021-11-27 16:45:51 -0500
committerPeter Ross <pross@xvid.org>2021-12-03 19:53:56 +1100
commit6c76b6392348460472f0b6deac4d0a161109d498 (patch)
tree4d0137687492e4345343a15ed23ede7641929c99 /libavformat/mvdec.c
parent4a90c039e7a17c913d2961f902f667d38490b6ab (diff)
avformat/mvdec: handle audio sample size
Adds support for reading audio sample size from the data instead of assuming all audio is 16 bits per sample. Reviewed-by: Peter Ross <pross@xvid.org>
Diffstat (limited to 'libavformat/mvdec.c')
-rw-r--r--libavformat/mvdec.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/libavformat/mvdec.c b/libavformat/mvdec.c
index 8492928820..8b54a9ab04 100644
--- a/libavformat/mvdec.c
+++ b/libavformat/mvdec.c
@@ -299,6 +299,8 @@ static int mv_read_header(AVFormatContext *avctx)
if (version == 2) {
uint64_t timestamp;
int v;
+ uint32_t bytes_per_sample;
+
avio_skip(pb, 22);
/* allocate audio track first to prevent unnecessary seeking
@@ -341,11 +343,21 @@ static int mv_read_header(AVFormatContext *avctx)
}
avpriv_set_pts_info(ast, 33, 1, ast->codecpar->sample_rate);
- avio_skip(pb, 4);
+ bytes_per_sample = avio_rb32(pb);
v = avio_rb32(pb);
if (v == AUDIO_FORMAT_SIGNED) {
- ast->codecpar->codec_id = AV_CODEC_ID_PCM_S16BE;
+ switch (bytes_per_sample) {
+ case 1:
+ ast->codecpar->codec_id = AV_CODEC_ID_PCM_S8;
+ break;
+ case 2:
+ ast->codecpar->codec_id = AV_CODEC_ID_PCM_S16BE;
+ break;
+ default:
+ avpriv_request_sample(avctx, "Audio sample size %i bytes", bytes_per_sample);
+ break;
+ }
} else {
avpriv_request_sample(avctx, "Audio compression (format %i)", v);
}
@@ -369,7 +381,7 @@ static int mv_read_header(AVFormatContext *avctx)
avio_skip(pb, 8);
av_add_index_entry(ast, pos, timestamp, asize, 0, AVINDEX_KEYFRAME);
av_add_index_entry(vst, pos + asize, i, vsize, 0, AVINDEX_KEYFRAME);
- timestamp += asize / (ast->codecpar->channels * 2LL);
+ timestamp += asize / (ast->codecpar->channels * bytes_per_sample);
}
} else if (!version && avio_rb16(pb) == 3) {
avio_skip(pb, 4);