diff mbox series

[FFmpeg-devel,2/6] avformat/mov: fix ISO/IEC 23003-5 support

Message ID tencent_3DFB806C34F53E3356C79C8CE13E5BD83409@qq.com
State New
Headers show
Series add PCM in mp4 support | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Zhao Zhili Feb. 24, 2023, 12:25 p.m. UTC
From: Zhao Zhili <zhilizhao@tencent.com>

Missing floating-point formats support.

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
---
 libavformat/mov.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

Comments

Tomas Härdin Feb. 24, 2023, 9:41 a.m. UTC | #1
fre 2023-02-24 klockan 20:25 +0800 skrev Zhao Zhili:
> From: Zhao Zhili <zhilizhao@tencent.com>
> 
> Missing floating-point formats support.
> 
> Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
> ---
>  libavformat/mov.c | 32 ++++++++++++++++++++++++++++++++
>  1 file changed, 32 insertions(+)

Looks OK

/Tomas
diff mbox series

Patch

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);