From patchwork Wed Dec 30 23:31:54 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 24719 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 3D15144BA0E for ; Thu, 31 Dec 2020 01:36:48 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D4AC068AA68; Thu, 31 Dec 2020 01:33:11 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f46.google.com (mail-ej1-f46.google.com [209.85.218.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2695668AA07 for ; Thu, 31 Dec 2020 01:33:00 +0200 (EET) Received: by mail-ej1-f46.google.com with SMTP id g20so23726967ejb.1 for ; Wed, 30 Dec 2020 15:32:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references:reply-to :mime-version:content-transfer-encoding; bh=RR258NAwtT0V4/Hn1kFffv+uV4vYR/aI9XKrTn6MP74=; b=WUYYF8ggjxSbw++LHcLKhBF0Xu5WZbvi5VbLv9SLSAEsLCRoePi74bIG7IZbQxR0f8 Kbotf6J4Nz41MDY5Qamo5FgQ7RuRwxxhcfnCq4zTTlvKCwWOsosSBxhjwo7Kjl3IE0Id BLqYEn8poXUdzodDeMddRkHiXRfSYAgpG0o+nyBlfVqr0fYVwxjZq8qMsyehpO552sJZ 22TFTi+NTX1Ts8hqUPXiJNYrqTv0YT2QNUb2plsMchi+Z6aMIznBwJntA4kyqhsIRGSe j79YZpfUiw9yaF98OwFplF/qCF0wJ2IRBBaJgpqJWZxXWfMFhnz4/BL09VaN/V+pDOR5 0FkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:reply-to:mime-version:content-transfer-encoding; bh=RR258NAwtT0V4/Hn1kFffv+uV4vYR/aI9XKrTn6MP74=; b=LljHLFNoxomNrojm7kIZ5iq965t9m8TTPJxPXdXsu2SWSY1uFze9nRxxQ9p6/UcPKM RFHoIiQTtnm2kk07/MUITsVDkWFzMeK875H+25qnNuH/YFPbH/GG+jgjAtMK0qj6bdLF i5u8fP9EjONVJCR1GzhkOdUGoIrNkw3vGgTE9bRN8qXSbeTasZ7GnmonTT2PyDFjtBcp Nq1hclWXMGJrPsITCjzj/D/KTe6Yis/z+N2IOATCJadeIRQmFaDxE8JE7lhvV80RfJuX BH6Ieuq6EnYqukLzwEJCwYDCiiESq/HXII9FbmcWs/efEXWDaH6qpt6nzu0s4uavdb4b dFxQ== X-Gm-Message-State: AOAM533R4jVVe2J+6X2VxR/hLhNmgrIL5AqT1GyKyvm5HrRohyPcAvmX BcBhEj80fbu6/RzEq0OWTGg/fWYCtms= X-Google-Smtp-Source: ABdhPJwCKrcaTKLhyXrWT9z+AcKQVY/1+rypUgDB8VTqMQaxIElUTvXX2fsWIZP7y3Q+gWukhgYhDg== X-Received: by 2002:a17:906:eb5b:: with SMTP id mc27mr50725348ejb.163.1609371179253; Wed, 30 Dec 2020 15:32:59 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id u19sm19630409ejg.16.2020.12.30.15.32.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Dec 2020 15:32:58 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 31 Dec 2020 00:31:54 +0100 Message-Id: <20201230233157.1055287-27-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201230233157.1055287-1-andreas.rheinhardt@gmail.com> References: <20201230233157.1055287-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 27/30] avcodec/dv: Don't initialize RL VLC for encoder X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Said RL VLC is only used by the decoder, ergo don't initialize it for the encoder and move the whole code and the RL VLC table itself to dvdec.c. Signed-off-by: Andreas Rheinhardt --- libavcodec/dv.c | 59 ------------------------------------ libavcodec/dv.h | 4 --- libavcodec/dvdec.c | 74 +++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 70 insertions(+), 67 deletions(-) diff --git a/libavcodec/dv.c b/libavcodec/dv.c index 7c1ec6e0b2..8a4cac859e 100644 --- a/libavcodec/dv.c +++ b/libavcodec/dv.c @@ -48,9 +48,6 @@ #include "put_bits.h" #include "simple_idct.h" -/* XXX: also include quantization */ -RL_VLC_ELEM ff_dv_rl_vlc[1664]; - static inline void dv_calc_mb_coordinates(const AVDVProfile *d, int chan, int seq, int slot, uint16_t *tbl) { @@ -198,65 +195,9 @@ int ff_dv_init_dynamic_tables(DVVideoContext *ctx, const AVDVProfile *d) av_cold int ff_dvvideo_init(AVCodecContext *avctx) { DVVideoContext *s = avctx->priv_data; - static int done = 0; - int i, j; - - if (!done) { - VLC_TYPE vlc_buf[FF_ARRAY_ELEMS(ff_dv_rl_vlc)][2] = { 0 }; - VLC dv_vlc = { .table = vlc_buf, .table_allocated = FF_ARRAY_ELEMS(vlc_buf) }; - uint16_t new_dv_vlc_bits[NB_DV_VLC * 2]; - uint8_t new_dv_vlc_len[NB_DV_VLC * 2]; - uint8_t new_dv_vlc_run[NB_DV_VLC * 2]; - int16_t new_dv_vlc_level[NB_DV_VLC * 2]; - - done = 1; - - /* it's faster to include sign bit in a generic VLC parsing scheme */ - for (i = 0, j = 0; i < NB_DV_VLC; i++, j++) { - new_dv_vlc_bits[j] = ff_dv_vlc_bits[i]; - new_dv_vlc_len[j] = ff_dv_vlc_len[i]; - new_dv_vlc_run[j] = ff_dv_vlc_run[i]; - new_dv_vlc_level[j] = ff_dv_vlc_level[i]; - - if (ff_dv_vlc_level[i]) { - new_dv_vlc_bits[j] <<= 1; - new_dv_vlc_len[j]++; - - j++; - new_dv_vlc_bits[j] = (ff_dv_vlc_bits[i] << 1) | 1; - new_dv_vlc_len[j] = ff_dv_vlc_len[i] + 1; - new_dv_vlc_run[j] = ff_dv_vlc_run[i]; - new_dv_vlc_level[j] = -ff_dv_vlc_level[i]; - } - } - - /* NOTE: as a trick, we use the fact the no codes are unused - * to accelerate the parsing of partial codes */ - init_vlc(&dv_vlc, TEX_VLC_BITS, j, new_dv_vlc_len, - 1, 1, new_dv_vlc_bits, 2, 2, INIT_VLC_USE_NEW_STATIC); - av_assert1(dv_vlc.table_size == 1664); - - for (i = 0; i < dv_vlc.table_size; i++) { - int code = dv_vlc.table[i][0]; - int len = dv_vlc.table[i][1]; - int level, run; - - if (len < 0) { // more bits needed - run = 0; - level = code; - } else { - run = new_dv_vlc_run[code] + 1; - level = new_dv_vlc_level[code]; - } - ff_dv_rl_vlc[i].len = len; - ff_dv_rl_vlc[i].level = level; - ff_dv_rl_vlc[i].run = run; - } - } s->avctx = avctx; avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT; return 0; } - diff --git a/libavcodec/dv.h b/libavcodec/dv.h index 0205d72347..19290aa382 100644 --- a/libavcodec/dv.h +++ b/libavcodec/dv.h @@ -96,10 +96,6 @@ enum dv_pack_type { */ #define DV_MAX_BPM 8 -#define TEX_VLC_BITS 10 - -extern RL_VLC_ELEM ff_dv_rl_vlc[1664]; - int ff_dv_init_dynamic_tables(DVVideoContext *s, const AVDVProfile *d); int ff_dvvideo_init(AVCodecContext *avctx); diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c index c526091eb4..85619a42a8 100644 --- a/libavcodec/dvdec.c +++ b/libavcodec/dvdec.c @@ -127,6 +127,70 @@ static const uint16_t dv_iweight_720_c[64] = { 394, 406, 418, 438, 418, 464, 464, 492, }; +#define TEX_VLC_BITS 10 + +/* XXX: also include quantization */ +static RL_VLC_ELEM dv_rl_vlc[1664]; + +static void dv_init_static(void) +{ + VLC_TYPE vlc_buf[FF_ARRAY_ELEMS(dv_rl_vlc)][2] = { 0 }; + VLC dv_vlc = { .table = vlc_buf, .table_allocated = FF_ARRAY_ELEMS(vlc_buf) }; + uint16_t new_dv_vlc_bits[NB_DV_VLC * 2]; + uint8_t new_dv_vlc_len[NB_DV_VLC * 2]; + uint8_t new_dv_vlc_run[NB_DV_VLC * 2]; + int16_t new_dv_vlc_level[NB_DV_VLC * 2]; + int i, j; + static int done = 0; + + if (done) + return; + + done = 1; + + /* it's faster to include sign bit in a generic VLC parsing scheme */ + for (i = 0, j = 0; i < NB_DV_VLC; i++, j++) { + new_dv_vlc_bits[j] = ff_dv_vlc_bits[i]; + new_dv_vlc_len[j] = ff_dv_vlc_len[i]; + new_dv_vlc_run[j] = ff_dv_vlc_run[i]; + new_dv_vlc_level[j] = ff_dv_vlc_level[i]; + + if (ff_dv_vlc_level[i]) { + new_dv_vlc_bits[j] <<= 1; + new_dv_vlc_len[j]++; + + j++; + new_dv_vlc_bits[j] = (ff_dv_vlc_bits[i] << 1) | 1; + new_dv_vlc_len[j] = ff_dv_vlc_len[i] + 1; + new_dv_vlc_run[j] = ff_dv_vlc_run[i]; + new_dv_vlc_level[j] = -ff_dv_vlc_level[i]; + } + } + + /* NOTE: as a trick, we use the fact the no codes are unused + * to accelerate the parsing of partial codes */ + init_vlc(&dv_vlc, TEX_VLC_BITS, j, new_dv_vlc_len, + 1, 1, new_dv_vlc_bits, 2, 2, INIT_VLC_USE_NEW_STATIC); + av_assert1(dv_vlc.table_size == 1664); + + for (int i = 0; i < dv_vlc.table_size; i++) { + int code = dv_vlc.table[i][0]; + int len = dv_vlc.table[i][1]; + int level, run; + + if (len < 0) { // more bits needed + run = 0; + level = code; + } else { + run = new_dv_vlc_run[code] + 1; + level = new_dv_vlc_level[code]; + } + dv_rl_vlc[i].len = len; + dv_rl_vlc[i].level = level; + dv_rl_vlc[i].run = run; + } +} + static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d) { int j, i, c, s; @@ -194,6 +258,8 @@ static av_cold int dvvideo_decode_init(AVCodecContext *avctx) s->idct_put[0] = s->idsp.idct_put; s->idct_put[1] = ff_simple_idct248_put; + dv_init_static(); + return ff_dvvideo_init(avctx); } @@ -224,14 +290,14 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block) pos, SHOW_UBITS(re, gb, 16), re_index); /* our own optimized GET_RL_VLC */ index = NEG_USR32(re_cache, TEX_VLC_BITS); - vlc_len = ff_dv_rl_vlc[index].len; + vlc_len = dv_rl_vlc[index].len; if (vlc_len < 0) { index = NEG_USR32((unsigned) re_cache << TEX_VLC_BITS, -vlc_len) + - ff_dv_rl_vlc[index].level; + dv_rl_vlc[index].level; vlc_len = TEX_VLC_BITS - vlc_len; } - level = ff_dv_rl_vlc[index].level; - run = ff_dv_rl_vlc[index].run; + level = dv_rl_vlc[index].level; + run = dv_rl_vlc[index].run; /* gotta check if we're still within gb boundaries */ if (re_index + vlc_len > last_index) {