[FFmpeg-devel] [PATCH 2/6] avformat/mov: fix ISO/IEC 23003-5 support
Zhao Zhili
quinkblack at foxmail.com
Fri Feb 24 14:25:19 EET 2023
From: Zhao Zhili <zhilizhao at tencent.com>
Missing floating-point formats support.
Signed-off-by: Zhao Zhili <zhilizhao at tencent.com>
---
libavformat/mov.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 6ab43b00c6..b125343f84 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1590,6 +1590,10 @@ static int mov_read_enda(MOVContext *c, AVIOContext *pb, MOVAtom atom)
static int mov_read_pcmc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
int format_flags;
+ int pcm_sample_size;
+ AVFormatContext *fc = c->fc;
+ AVStream *st;
+ MOVStreamContext *sc;
if (atom.size < 6) {
av_log(c->fc, AV_LOG_ERROR, "Empty pcmC box\n");
@@ -1599,6 +1603,34 @@ static int mov_read_pcmc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
avio_r8(pb); // version
avio_rb24(pb); // flags
format_flags = avio_r8(pb);
+ pcm_sample_size = avio_r8(pb);
+
+ if (fc->nb_streams < 1)
+ return AVERROR_INVALIDDATA;
+
+ st = fc->streams[fc->nb_streams - 1];
+ sc = st->priv_data;
+
+ if (sc->format == MKTAG('f', 'p', 'c', 'm')) {
+ if (pcm_sample_size == 32)
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_F32BE;
+ else if (pcm_sample_size == 64)
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_F64BE;
+ else
+ return AVERROR_INVALIDDATA;
+ } else if (sc->format == MKTAG('i', 'p', 'c', 'm')) {
+ if (pcm_sample_size == 16)
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S16BE;
+ else if (pcm_sample_size == 24)
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S24BE;
+ else if (pcm_sample_size == 32)
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S32BE;
+ else
+ return AVERROR_INVALIDDATA;
+ } else {
+ return AVERROR_INVALIDDATA;
+ }
+
if (format_flags == 1) // indicates little-endian format. If not present, big-endian format is used
set_last_stream_little_endian(c->fc);
--
2.25.1
More information about the ffmpeg-devel
mailing list