* [FFmpeg-devel] [PATCH] avcodec/mlpdec: fix decoding of overlapping channels in substreams
@ 2022-09-15 15:27 Paul B Mahol
0 siblings, 0 replies; only message in thread
From: Paul B Mahol @ 2022-09-15 15:27 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1: Type: text/plain, Size: 165 bytes --]
Patch attached.
There are cases when previously decoded substreams
would, if they have overlapping channels with final substream, cause
incorrect decoding results.
[-- Attachment #2: 0001-avcodec-mlpdec-fix-decoding-of-overlapping-channels-.patch --]
[-- Type: text/x-patch, Size: 3219 bytes --]
From adf5fd3bdb397f88a52d7ce0cf76491a55d33eef Mon Sep 17 00:00:00 2001
From: Paul B Mahol <onemda@gmail.com>
Date: Thu, 15 Sep 2022 16:14:08 +0200
Subject: [PATCH] avcodec/mlpdec: fix decoding of overlapping channels in
substreams
Fixes #5039
Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
libavcodec/mlpdec.c | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/libavcodec/mlpdec.c b/libavcodec/mlpdec.c
index 0a97fae26c..bb72134b09 100644
--- a/libavcodec/mlpdec.c
+++ b/libavcodec/mlpdec.c
@@ -67,6 +67,8 @@ typedef struct SubStream {
uint8_t min_channel;
/// The index of the last channel coded in this substream.
uint8_t max_channel;
+ /// The coded channels mask in this substream.
+ uint64_t coded_channels;
/// The number of channels input into the rematrix stage.
uint8_t max_matrix_channel;
/// For each channel output by the matrix, the output channel to map it to
@@ -563,6 +565,7 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
s->min_channel = min_channel;
s->max_channel = max_channel;
+ s->coded_channels = ((1LL << (max_channel - min_channel + 1)) - 1) << min_channel;
s->max_matrix_channel = max_matrix_channel;
s->noise_type = noise_type;
@@ -1272,11 +1275,6 @@ static int read_access_unit(AVCodecContext *avctx, AVFrame *frame,
for (substr = 0; substr <= m->max_decoded_substream; substr++) {
SubStream *s = &m->substream[substr];
- if (substr != m->max_decoded_substream &&
- m->substream[m->max_decoded_substream].min_channel == 0 &&
- m->substream[m->max_decoded_substream].max_channel == avctx->ch_layout.nb_channels - 1)
- goto skip_substr;
-
init_get_bits(&gb, buf, substream_data_len[substr] * 8);
m->matrix_changed = 0;
@@ -1301,6 +1299,22 @@ static int read_access_unit(AVCodecContext *avctx, AVFrame *frame,
if (!s->restart_seen)
goto next_substr;
+ if (substr > 0 && substr < m->max_decoded_substream &&
+ (s->min_channel <= m->substream[substr - 1].max_channel)) {
+ av_log(avctx, AV_LOG_DEBUG,
+ "Previous substream(%d) channels overlaps current substream(%d) channels, skipping.\n",
+ substr - 1, substr);
+ goto next_substr;
+ }
+
+ if (substr != m->max_decoded_substream &&
+ ((s->coded_channels & m->substream[m->max_decoded_substream].coded_channels) != 0)) {
+ av_log(avctx, AV_LOG_DEBUG,
+ "Current substream(%d) channels overlaps final substream(%d) channels, skipping.\n",
+ substr, m->max_decoded_substream);
+ goto next_substr;
+ }
+
if ((ret = read_block_data(m, &gb, substr)) < 0)
return ret;
@@ -1350,7 +1364,6 @@ next_substr:
av_log(m->avctx, AV_LOG_ERROR,
"No restart header present in substream %d.\n", substr);
-skip_substr:
buf += substream_data_len[substr];
}
--
2.37.2
[-- Attachment #3: Type: text/plain, Size: 251 bytes --]
_______________________________________________
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".
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-09-15 15:27 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-15 15:27 [FFmpeg-devel] [PATCH] avcodec/mlpdec: fix decoding of overlapping channels in substreams Paul B Mahol
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git