aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorZhao Zhili <zhilizhao@tencent.com>2023-03-06 20:02:07 +0800
committerZhao Zhili <zhilizhao@tencent.com>2023-03-15 00:12:59 +0800
commitd04dbf48fc7474747e27caceeed7153d1c0585e4 (patch)
tree430898fa24dcc87b6d1646d648133f98775de29f /libavformat/mov.c
parenta6e9d01f88a707f8a2057e01b5ad2e8968109530 (diff)
downloadffmpeg-d04dbf48fc7474747e27caceeed7153d1c0585e4.tar.gz
avformat/mov: fix ISO/IEC 23003-5 support
Missing floating-point formats support. Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r--libavformat/mov.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index a9911c0f79..14528bdcaa 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1591,6 +1591,10 @@ static int mov_read_pcmc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
int format_flags;
int version, 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");
@@ -1608,6 +1612,51 @@ static int mov_read_pcmc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
}
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 == MOV_MP4_FPCM_TAG) {
+ switch (pcm_sample_size) {
+ case 32:
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_F32BE;
+ break;
+ case 64:
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_F64BE;
+ break;
+ default:
+ av_log(fc, AV_LOG_ERROR, "invalid pcm_sample_size %d for %s\n",
+ pcm_sample_size,
+ av_fourcc2str(sc->format));
+ return AVERROR_INVALIDDATA;
+ }
+ } else if (sc->format == MOV_MP4_IPCM_TAG) {
+ switch (pcm_sample_size) {
+ case 16:
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S16BE;
+ break;
+ case 24:
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S24BE;
+ break;
+ case 32:
+ st->codecpar->codec_id = AV_CODEC_ID_PCM_S32BE;
+ break;
+ default:
+ av_log(fc, AV_LOG_ERROR, "invalid pcm_sample_size %d for %s\n",
+ pcm_sample_size,
+ av_fourcc2str(sc->format));
+ return AVERROR_INVALIDDATA;
+ }
+ } else {
+ av_log(fc, AV_LOG_ERROR, "'pcmC' with invalid sample entry '%s'\n",
+ av_fourcc2str(sc->format));
+ 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);