From: Zhao Zhili <[email protected]> Missing floating-point formats support.
Signed-off-by: Zhao Zhili <[email protected]> --- 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 _______________________________________________ ffmpeg-devel mailing list [email protected] https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
