From aecd63478e32b17a7896510b50165283c75d6ead Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Mon, 1 Apr 2024 00:03:09 +0200 Subject: [PATCH] avcodec/dsd: Hoist branch out of loop This is possible by not converting from LSBF to MSBF; instead add LSBF LUTs. This approach necessitates reversing the initial values. Signed-off-by: Andreas Rheinhardt --- libavcodec/dsd.c | 12 ++++++++---- libavcodec/dsddec.c | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libavcodec/dsd.c b/libavcodec/dsd.c index ec63a706f6..1093c5e2dd 100644 --- a/libavcodec/dsd.c +++ b/libavcodec/dsd.c @@ -68,7 +68,8 @@ static const double htaps[HTAPS] = { 3.423230509967409e-07, 1.244182214744588e-07, 3.130441005359396e-08 }; -static double ctables[CTABLES][256]; +static double ctables_lsbf[CTABLES][256]; +static double ctables_msbf[CTABLES][256]; static av_cold void dsd_ctables_tableinit(void) { @@ -81,8 +82,10 @@ static av_cold void dsd_ctables_tableinit(void) for (t = 0; t < CTABLES; ++t) acc[t] += sign * htaps[t * 8 + m]; } - for (t = 0; t < CTABLES; ++t) - ctables[CTABLES - 1 - t][e] = acc[t]; + for (t = 0; t < CTABLES; ++t) { + ctables_msbf[CTABLES - 1 - t][e] = acc[t]; + ctables_lsbf[CTABLES - 1 - t][ff_reverse[e]] = acc[t]; + } } } @@ -100,13 +103,14 @@ void ff_dsd2pcm_translate(DSDContext* s, size_t samples, int lsbf, unsigned pos, i; uint8_t* p; double sum; + const double (*const ctables)[256] = lsbf ? ctables_lsbf : ctables_msbf; pos = s->pos; memcpy(buf, s->buf, sizeof(buf)); while (samples-- > 0) { - buf[pos] = lsbf ? ff_reverse[*src] : *src; + buf[pos] = *src; src += src_stride; p = buf + ((pos - CTABLES) & FIFOMASK); diff --git a/libavcodec/dsddec.c b/libavcodec/dsddec.c index 2bb2e73b75..dd1ea83784 100644 --- a/libavcodec/dsddec.c +++ b/libavcodec/dsddec.c @@ -56,7 +56,8 @@ static av_cold int decode_init(AVCodecContext *avctx) if (!s) return AVERROR(ENOMEM); - silence = DSD_SILENCE; + silence = avctx->codec_id == AV_CODEC_ID_DSD_LSBF_PLANAR || + avctx->codec_id == AV_CODEC_ID_DSD_LSBF ? DSD_SILENCE_REVERSED : DSD_SILENCE; for (i = 0; i < avctx->ch_layout.nb_channels; i++) { s[i].pos = 0; memset(s[i].buf, silence, sizeof(s[i].buf));