From patchwork Tue Nov 10 10:48:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 23546 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 265D144B2CF for ; Tue, 10 Nov 2020 13:05:04 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0AEAA68BF4C; Tue, 10 Nov 2020 12:50:43 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 62D7368BEF1 for ; Tue, 10 Nov 2020 12:50:27 +0200 (EET) Received: by mail-wr1-f50.google.com with SMTP id 33so12136464wrl.7 for ; Tue, 10 Nov 2020 02:50:27 -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=w09GAa4UjI+q9kbq/duStar4DE5sHnR0N5SiLrFM3mw=; b=dTV3Wh2KtPn+QNErlO9JSTTVWKDEnp4Ufijs3nqR1GFWmv4VJmJoJK8AqTnoV1/RW6 ebnVxMRmbCSr8IhrjNWsH7tvcmvE+qGSR8xuf1iQ3pYmuNOsh7OjEkd9ddSzJjK5+cPd w+5lpUfdJyPUmVBRCKMu1Zzf9LFXZ9K678+68MuvNEXSU1oMLQcd4zu5NqKZfJNAFj9p jMiNZmKnlEAOU+UWhMRq9K0BfAz/RDPBHso/LCvuxUp/RDJ5PSfHQQOi+P4nH8WlSqiu kiR237yXIkIm3Uq3z6Hj98YYxHS+LKVeyRqtXai1TZtMvxJjQl7GXH54AkjUzbFuvGk1 kKTQ== 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=w09GAa4UjI+q9kbq/duStar4DE5sHnR0N5SiLrFM3mw=; b=PJdKmxeO+deF/xroH6bUJAHqI8bCxvoAm3t/fQB8XaekpYl7ZLP6yXrneROi1YAA0g msCrpEcXaPN8Ml4pACdLNk0cuQEtp6HSc2qnJQkOB/Yxmu291mzbcbiPqF6X4l7xHBup s7wGU4XoKASKFRBrDCqhuL7sozgy/IQ2WRIakw49SFjiUdGtWVtSs0/EsmmugubCaowV b1ryWvqKqWbohY7YI0Na5C8lAQNuVByhtCPS6afGqs7z1Xj+phuYstkpbQVtH4y1bBZF PN3ArX5hPfX02Q/DOAQNt2Mhxbrcy96PNG2k6qXhK4E5oM+Mtq70ncqOZcH9GZ8A8geK NRbA== X-Gm-Message-State: AOAM532zV63CjQ2R1rfvZ1Fy8i3eufnIMfCkhlld+v1GWwOEDc5WXsm9 wdqTn+TmPm1cxwtQ++PNEt2cFiZPK8g= X-Google-Smtp-Source: ABdhPJzg7WKkzgUBGqpS7T7+9RzpW8JLMbEuc9uhWajq1frlZiCSLiq/5MU45/2mdlZiAtaNNDGHjQ== X-Received: by 2002:a05:6000:107:: with SMTP id o7mr22880070wrx.354.1605005426316; Tue, 10 Nov 2020 02:50:26 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc1aa4b.dynamic.kabel-deutschland.de. [188.193.170.75]) by smtp.gmail.com with ESMTPSA id l24sm2572543wmi.7.2020.11.10.02.50.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Nov 2020 02:50:25 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 10 Nov 2020 11:48:05 +0100 Message-Id: <20201110104851.321029-69-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201110104851.321029-1-andreas.rheinhardt@gmail.com> References: <20201110104851.321029-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 068/114] avcodec/mpeg4videodec: Make studio VLCs static 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" Signed-off-by: Andreas Rheinhardt --- libavcodec/mpeg4video.h | 4 -- libavcodec/mpeg4videodec.c | 87 ++++++++++++++++---------------------- 2 files changed, 36 insertions(+), 55 deletions(-) diff --git a/libavcodec/mpeg4video.h b/libavcodec/mpeg4video.h index 3de598465f..e919db87a5 100644 --- a/libavcodec/mpeg4video.h +++ b/libavcodec/mpeg4video.h @@ -115,10 +115,6 @@ typedef struct Mpeg4DecContext { int cplx_estimation_trash_p; int cplx_estimation_trash_b; - VLC studio_intra_tab[12]; - VLC studio_luma_dc; - VLC studio_chroma_dc; - int rgb; } Mpeg4DecContext; diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index a03bd240a8..a94fe16056 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -53,6 +53,9 @@ static int decode_studio_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb); static VLC dc_lum, dc_chrom; static VLC sprite_trajectory; static VLC mb_type_b_vlc; +static VLC studio_intra_tab[12]; +static VLC studio_luma_dc; +static VLC studio_chroma_dc; static const int mb_type_b_map[4] = { MB_TYPE_DIRECT2 | MB_TYPE_L0L1, @@ -1820,7 +1823,7 @@ static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n int cc, dct_dc_size, dct_diff, code, j, idx = 1, group = 0, run = 0, additional_code_len, sign, mismatch; - VLC *cur_vlc = &ctx->studio_intra_tab[0]; + const VLC *cur_vlc = &studio_intra_tab[0]; uint8_t *const scantable = s->intra_scantable.permutated; const uint16_t *quant_matrix; uint32_t flc; @@ -1834,14 +1837,14 @@ static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n if (n < 4) { cc = 0; - dct_dc_size = get_vlc2(&s->gb, ctx->studio_luma_dc.table, STUDIO_INTRA_BITS, 2); + dct_dc_size = get_vlc2(&s->gb, studio_luma_dc.table, STUDIO_INTRA_BITS, 2); quant_matrix = s->intra_matrix; } else { cc = (n & 1) + 1; if (ctx->rgb) - dct_dc_size = get_vlc2(&s->gb, ctx->studio_luma_dc.table, STUDIO_INTRA_BITS, 2); + dct_dc_size = get_vlc2(&s->gb, studio_luma_dc.table, STUDIO_INTRA_BITS, 2); else - dct_dc_size = get_vlc2(&s->gb, ctx->studio_chroma_dc.table, STUDIO_INTRA_BITS, 2); + dct_dc_size = get_vlc2(&s->gb, studio_chroma_dc.table, STUDIO_INTRA_BITS, 2); quant_matrix = s->chroma_intra_matrix; } @@ -1878,7 +1881,7 @@ static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n } additional_code_len = ac_state_tab[group][0]; - cur_vlc = &ctx->studio_intra_tab[ac_state_tab[group][1]]; + cur_vlc = &studio_intra_tab[ac_state_tab[group][1]]; if (group == 0) { /* End of Block */ @@ -3501,36 +3504,33 @@ static int mpeg4_update_thread_context(AVCodecContext *dst, } #endif -static av_cold int init_studio_vlcs(Mpeg4DecContext *ctx) +static av_cold void init_studio_vlcs(void) { - int i, ret; - - for (i = 0; i < 12; i++) { - ret = ff_init_vlc_from_lengths(&ctx->studio_intra_tab[i], - STUDIO_INTRA_BITS, 24, - &ff_mpeg4_studio_intra[i][0][1], 2, - &ff_mpeg4_studio_intra[i][0][0], 2, 1, - 0, 0); - - if (ret < 0) - return ret; - } - - ret = ff_init_vlc_from_lengths(&ctx->studio_luma_dc, STUDIO_INTRA_BITS, 19, - &ff_mpeg4_studio_dc_luma[0][1], 2, - &ff_mpeg4_studio_dc_luma[0][0], 2, 1, - 0, 0); - if (ret < 0) - return ret; - - ret = ff_init_vlc_from_lengths(&ctx->studio_chroma_dc, STUDIO_INTRA_BITS, 19, - &ff_mpeg4_studio_dc_chroma[0][1], 2, - &ff_mpeg4_studio_dc_chroma[0][0], 2, 1, - 0, 0); - if (ret < 0) - return ret; - - return 0; + if (studio_chroma_dc.table_size) + return; + + for (unsigned i = 0, offset = 0; i < 12; i++) { + static VLC_TYPE vlc_buf[6498][2]; + + studio_intra_tab[i].table = &vlc_buf[offset]; + studio_intra_tab[i].table_allocated = FF_ARRAY_ELEMS(vlc_buf) - offset; + ff_init_vlc_from_lengths(&studio_intra_tab[i], + STUDIO_INTRA_BITS, 24, + &ff_mpeg4_studio_intra[i][0][1], 2, + &ff_mpeg4_studio_intra[i][0][0], 2, 1, + 0, INIT_VLC_USE_NEW_STATIC); + offset += studio_intra_tab[i].table_size; + } + + INIT_VLC_STATIC_FROM_LENGTHS(&studio_luma_dc, STUDIO_INTRA_BITS, 19, + &ff_mpeg4_studio_dc_luma[0][1], 2, + &ff_mpeg4_studio_dc_luma[0][0], 2, 1, + 0, 0, 528); + + INIT_VLC_STATIC_FROM_LENGTHS(&studio_chroma_dc, STUDIO_INTRA_BITS, 19, + &ff_mpeg4_studio_dc_chroma[0][1], 2, + &ff_mpeg4_studio_dc_chroma[0][0], 2, 1, + 0, 0, 528); } static av_cold int decode_init(AVCodecContext *avctx) @@ -3548,8 +3548,7 @@ static av_cold int decode_init(AVCodecContext *avctx) return ret; ff_mpeg4videodec_static_init(); - if ((ret = init_studio_vlcs(ctx)) < 0) - return ret; + init_studio_vlcs(); s->h263_pred = 1; s->low_delay = 0; /* default, might be overridden in the vol header during header parsing */ @@ -3561,20 +3560,6 @@ static av_cold int decode_init(AVCodecContext *avctx) return 0; } -static av_cold int decode_end(AVCodecContext *avctx) -{ - Mpeg4DecContext *ctx = avctx->priv_data; - int i; - - for (i = 0; i < 12; i++) - ff_free_vlc(&ctx->studio_intra_tab[i]); - - ff_free_vlc(&ctx->studio_luma_dc); - ff_free_vlc(&ctx->studio_chroma_dc); - - return ff_h263_decode_end(avctx); -} - static const AVOption mpeg4_options[] = { {"quarter_sample", "1/4 subpel MC", offsetof(MpegEncContext, quarter_sample), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, 0}, {"divx_packed", "divx style packed b frames", offsetof(MpegEncContext, divx_packed), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, 0}, @@ -3595,7 +3580,7 @@ AVCodec ff_mpeg4_decoder = { .id = AV_CODEC_ID_MPEG4, .priv_data_size = sizeof(Mpeg4DecContext), .init = decode_init, - .close = decode_end, + .close = ff_h263_decode_end, .decode = ff_h263_decode_frame, .capabilities = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_TRUNCATED | AV_CODEC_CAP_DELAY |