diff mbox series

[FFmpeg-devel,v2,10/10] avcodec/aptxenc: Process data in complete blocks of four samples only

Message ID AM7PR03MB6660D62FE2B9B02A9D3F1D738FCC9@AM7PR03MB6660.eurprd03.prod.outlook.com
State New
Headers show
Series [FFmpeg-devel,v2,01/10] tests/fate-run: Allow multiple inputs for transcode()
Related show

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished
andriy/make_ppc success Make finished
andriy/make_fate_ppc success Make fate finished

Commit Message

Andreas Rheinhardt Aug. 31, 2021, 12:42 p.m. UTC
Otherwise one could read into the frame's padding when one encounters
the small last frame; furthermore, one would indicate a packet size
that is not a multiple of the actual block size and one would write
into the padding of said packet.

This actually happened in our FATE tests (where the number of samples
is 2 mod 4), which therefore needed to be updated.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/aptxenc.c   | 5 +++--
 tests/ref/fate/aptx    | 4 ++--
 tests/ref/fate/aptx-hd | 4 ++--
 3 files changed, 7 insertions(+), 6 deletions(-)

Comments

Paul B Mahol Sept. 1, 2021, 6:35 a.m. UTC | #1
lgtm
diff mbox series

Patch

diff --git a/libavcodec/aptxenc.c b/libavcodec/aptxenc.c
index 5ea6053c26..0760d1932e 100644
--- a/libavcodec/aptxenc.c
+++ b/libavcodec/aptxenc.c
@@ -215,7 +215,7 @@  static int aptx_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
     if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
         return ret;
 
-    output_size = s->block_size * frame->nb_samples/4;
+    output_size = s->block_size * (frame->nb_samples/4);
     if ((ret = ff_get_encode_buffer(avctx, avpkt, output_size, 0)) < 0)
         return ret;
 
@@ -229,7 +229,8 @@  static int aptx_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
         aptx_encode_samples(s, samples, avpkt->data + pos);
     }
 
-    ff_af_queue_remove(&s->afq, frame->nb_samples, &avpkt->pts, &avpkt->duration);
+    ff_af_queue_remove(&s->afq, frame->nb_samples & ~3,
+                       &avpkt->pts, &avpkt->duration);
     *got_packet_ptr = 1;
     return 0;
 }
diff --git a/tests/ref/fate/aptx b/tests/ref/fate/aptx
index 35729b77c7..ccc3a49ac9 100644
--- a/tests/ref/fate/aptx
+++ b/tests/ref/fate/aptx
@@ -1,5 +1,5 @@ 
-b5d8a297c0e8d9854f19d9d3e8b82859 *tests/data/fate/aptx.aptx
-418950 tests/data/fate/aptx.aptx
+966f4391a8472208409a52603494846f *tests/data/fate/aptx.aptx
+418948 tests/data/fate/aptx.aptx
 #tb 0: 1/44100
 #media_type 0: audio
 #codec_id 0: pcm_s16le
diff --git a/tests/ref/fate/aptx-hd b/tests/ref/fate/aptx-hd
index fe611de03e..a3cb78daa5 100644
--- a/tests/ref/fate/aptx-hd
+++ b/tests/ref/fate/aptx-hd
@@ -1,5 +1,5 @@ 
-48ecaa81ee5adaaa62ed3ff6574b6666 *tests/data/fate/aptx-hd.aptx_hd
-628425 tests/data/fate/aptx-hd.aptx_hd
+0bb7bb4313bd33fe44e409c67d392fd0 *tests/data/fate/aptx-hd.aptx_hd
+628422 tests/data/fate/aptx-hd.aptx_hd
 #tb 0: 1/44100
 #media_type 0: audio
 #codec_id 0: pcm_s32le