diff mbox series

[FFmpeg-devel,3/9] avcodec/aptx: Use AVCodecContext.frame_size according to the API

Message ID GV1P250MB0737E272D59936FE472466B18F499@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM
State Accepted
Commit c0d483cecb3ca31574f850c031d66a34a4f2d140
Headers show
Series [FFmpeg-devel,1/9] fate/audio: Add tests for APTX (HD) | expand


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

Andreas Rheinhardt Sept. 15, 2022, 7:28 p.m. UTC
Currently the APTX (HD) codecs set frame_size if unset and check
whether it is divisible by block_size (corresponding to block_align
as used by other codecs). But this is based upon a misunderstanding
of the API: frame_size is not in bytes, but in samples.

Said value is also not intended to be set by the user at all,
but set by encoders and (possibly) decoders if the number of channels
in a frame is constant. The latter condition is not fulfilled here,
so only set it for encoders. Given that the encoder can handle any
number of samples as long as it is divisible by four and given that
it worked to set a custom frame size before, the encoders accept
any multiple of four; otherwise the value is set to the value
that it already had for APTX: 1024 samples (per channel).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
 libavcodec/aptx.c    | 9 ---------
 libavcodec/aptxenc.c | 3 +++
 2 files changed, 3 insertions(+), 9 deletions(-)
diff mbox series


diff --git a/libavcodec/aptx.c b/libavcodec/aptx.c
index 8e110acc97..ed814ad1c0 100644
--- a/libavcodec/aptx.c
+++ b/libavcodec/aptx.c
@@ -516,15 +516,6 @@  av_cold int ff_aptx_init(AVCodecContext *avctx)
     s->hd = avctx->codec->id == AV_CODEC_ID_APTX_HD;
     s->block_size = s->hd ? 6 : 4;
-    if (avctx->frame_size == 0)
-        avctx->frame_size = 256 * s->block_size;
-    if (avctx->frame_size % s->block_size) {
-        av_log(avctx, AV_LOG_ERROR,
-               "Frame size must be a multiple of %d samples\n", s->block_size);
-        return AVERROR(EINVAL);
-    }
     for (chan = 0; chan < NB_CHANNELS; chan++) {
         Channel *channel = &s->channels[chan];
         for (subband = 0; subband < NB_SUBBANDS; subband++) {
diff --git a/libavcodec/aptxenc.c b/libavcodec/aptxenc.c
index f9347853d2..434a9abf0f 100644
--- a/libavcodec/aptxenc.c
+++ b/libavcodec/aptxenc.c
@@ -257,6 +257,9 @@  static av_cold int aptx_encode_init(AVCodecContext *avctx)
     ff_af_queue_init(avctx, &s->afq);
+    if (!avctx->frame_size || avctx->frame_size % 4)
+        avctx->frame_size = 1024;
     return ff_aptx_init(avctx);