diff mbox series

[FFmpeg-devel,1/2] avformat/movenc: fix sample size being zero in pcmC

Message ID tencent_BE009D6AA67FAEAD3A3BB9C1F9B4A4692E0A@qq.com
State Accepted
Commit 0c02ad857c624d75de1c6fa85098d1752dfdb771
Headers show
Series [FFmpeg-devel,1/2] avformat/movenc: fix sample size being zero in pcmC | 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 July 26, 2023, 3:45 a.m. UTC
From: Zhao Zhili <zhilizhao@tencent.com>

bits_per_raw_sample might not set when remux raw PCM.

Fix #10433.
---
 libavformat/movenc.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

Comments

Zhao Zhili July 26, 2023, 3:22 p.m. UTC | #1
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Raphaël Zumer
> Sent: 2023年7月26日 21:38
> To: ffmpeg-devel@ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH 1/2] avformat/movenc: fix sample size being zero in pcmC
> 
> On 7/25/23 23:45, Zhao Zhili wrote:
> > From: Zhao Zhili <zhilizhao@tencent.com>
> >
> > -    avio_w8(pb, track->par->bits_per_raw_sample);
> > +    sample_size = track->par->bits_per_raw_sample;
> > +    if (!sample_size)
> > +        sample_size = av_get_exact_bits_per_sample(track->par->codec_id);
> > +    av_assert0(sample_size);
> > +    avio_w8(pb, sample_size);
> 
> Why not just replace bits_per_raw_sample completely with av_get_exact_bits_per_sample()?
> 
> Are there edge cases, like incorrect codec ID, or sample sizes smaller than specified by the codec ID (and if there is ever a mismatch,
> which is expected in pcmC?)
> 
> If not, there should be no need to prioritize bits_per_raw_sample in the first place and add a fallback - going straight to
> av_get_exact_bits_per_sample() should suffice and keep the code simpler.

Check bits_per_raw_sample first for a little bit of performance.
Don't use bits_per_coded_sample because it make less sense in this case and to keep the code simpler.

> 
> As noted in another thread, bits_per_raw_sample seems to always be 0 when muxing PCM to MP4 with FFmpeg, whereas
> bits_per_coded_sample has the correct value from the samples that I tested.

That's only one usecase. bits_per_coded_sample has been set while bit_per_raw_sample wasn't only
because the implementation of wav demux and there's no encoding process. (You can try -c:a pcm_s16le)

There are more usecases to support, e.g., only use mp4 muxer without any demuxer or encoder.
User can create and set a AVCodecParameters manually, and let bits_per_coded_sample be zero.

> 
> Raphaël Zumer
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
diff mbox series

Patch

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index f1cc80b1b3..7ef6cef46a 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -1225,6 +1225,7 @@  static int mov_write_pcmc_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra
 {
     int64_t pos = avio_tell(pb);
     int format_flags;
+    int sample_size;
 
     avio_wb32(pb, 0); /* size */
     ffio_wfourcc(pb, "pcmC");
@@ -1237,7 +1238,11 @@  static int mov_write_pcmc_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra
                     track->par->codec_id == AV_CODEC_ID_PCM_S24LE ||
                     track->par->codec_id == AV_CODEC_ID_PCM_S32LE);
     avio_w8(pb, format_flags);
-    avio_w8(pb, track->par->bits_per_raw_sample);
+    sample_size = track->par->bits_per_raw_sample;
+    if (!sample_size)
+        sample_size = av_get_exact_bits_per_sample(track->par->codec_id);
+    av_assert0(sample_size);
+    avio_w8(pb, sample_size);
 
     return update_size(pb, pos);
 }