From patchwork Tue Sep 13 11:33:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 37896 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3b1c:b0:96:9ee8:5cfd with SMTP id c28csp628691pzh; Tue, 13 Sep 2022 04:35:12 -0700 (PDT) X-Google-Smtp-Source: AA6agR4VLPVasNYvkYltdx9AnQbKhjwTEa/atSqTTcPxaDbXD9Zfcy7rDShrGL1VfrYnsSDwnE81 X-Received: by 2002:a17:907:a07a:b0:77c:f98e:ab8c with SMTP id ia26-20020a170907a07a00b0077cf98eab8cmr7457167ejc.69.1663068912443; Tue, 13 Sep 2022 04:35:12 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y16-20020a056402359000b004518397040fsi7138774edc.352.2022.09.13.04.35.11; Tue, 13 Sep 2022 04:35:12 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@outlook.com header.s=selector1 header.b=u53244CH; arc=fail (body hash mismatch); spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 47D9468B613; Tue, 13 Sep 2022 14:33:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05olkn2070.outbound.protection.outlook.com [40.92.90.70]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D033268BB61 for ; Tue, 13 Sep 2022 14:33:30 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FS5gBGXI/Ps8G9Ke3jILRCvLvWHg4AGRaBDvoRlQQw+LZru6es7jdjmei/kXNUAciqpcxruxJ1vZO23uciePFC35Z8mFz/VefSuDfV9k0CPNI9z97eWHeaDQNVOv5kGMES6kaIobSqCzMqHH3vQM3jVp/WfWAlJZqnDnmrOpSBQNCH7/AqT3j8X3r78YU//CnpxjYPVAltLu+qV/SZ8cS7Rsf7dgdCpuPZ/a/Mm7ksmJxMkJZ8cRXKaNQl+ANtOukEcjNdJmLFs3UpNwiPXqOl/uUX4C1erjw4zjJCkihKazfr2t/OQ/OyZBvma6BFWrDU9LyS0t8nrKYeE1trKBWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ygzqTfQ6ymNFI0X6EdPwGtLbdSpxzMjAQkOo8BF99UM=; b=oGGE+htqX1/9frwxKZFp1YuHecW7epA5Ll5dyZJ/gkY+UJ62eRRzp0C9FC7yMmeR0XcsUX/sl3LkJXT8fuZ8wJM0/HTSgd3LxPVNiHL5TOf4gVUZUsSJzCg0yK7AeO8gheMavtLId77pBL/4hlzM1VmxSjNELc4Wy1xeySOBaKsOV20m6QiFQURr8cbZyeE2W7AjUQBpyEA1yaPec8SKRu8fBDlNlHwwplNxtkduQBS2kUUmefPWBN2KxX8gWyW97v1CrVLySHCkA2JwYE9OyCdWGlZIXg6FcVe2B7PCgpUXbyW+qAjA5Xbo7a0fvTIFSWV5tb/QQaqkCgZTmnmIgQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ygzqTfQ6ymNFI0X6EdPwGtLbdSpxzMjAQkOo8BF99UM=; b=u53244CHZ1pvHNYCqRYZFiONbLqwjuLHb0HplN1bDMDGt0gg+LwENyjFFpRp13GFLHgQ5q58XGzo3ibWDheRHjYe7W4KT84/c5WTO92OfJl6LWCyGyLw4zDdh7j1JvYRFhFe6ji1GDYpTfY+UQlh7BbMRH9KQzdXzerUIasUErBIbeJ/6v9r+U5aWS03onAkOHNlXhFeMgHfDDaIaHQIq1UNlvSilds0IhVkNdFmGEeniE7j7+mvUdz3isRe5L5fqCD4xp66y5Vut2G1WNAN5NDPDai0dWKzrXoLsaBIjg41yJEtV+KOrRSBwp4RBbeLSTNav/diX63+qVVRAEd/Tg== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by AS8P250MB0072.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:374::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5612.22; Tue, 13 Sep 2022 11:33:22 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::51a4:ed23:ea45:dfeb]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::51a4:ed23:ea45:dfeb%7]) with mapi id 15.20.5612.022; Tue, 13 Sep 2022 11:33:22 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 13 Sep 2022 13:33:03 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [xKEyed8ChV2O0yCyj6EUkxiyl9i+hCGSMR6eqbf9kWU=] X-ClientProxiedBy: AS9PR06CA0296.eurprd06.prod.outlook.com (2603:10a6:20b:45a::16) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20220913113310.451876-5-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|AS8P250MB0072:EE_ X-MS-Office365-Filtering-Correlation-Id: 04d7c22a-2386-486d-b4db-08da957bc369 X-MS-Exchange-SLBlob-MailProps: AZnQBsB9XmpEumVcsW5Tnf3Q/Hh5f4HA+IfOM4EgStqkarTjq6qqSYBx2tlUR93BAhYYy49PnzfKVdh5WBVVx9wqELF0iZykmaRnfyi8y3H6XXVSZ8VfxtOUR4hc7KfNYMA1W3O7L5FWv2XRx9/z3ptwd9qOz7F0fI3suenvg5dklFTPFFgbyxtX8V2cRMMSQmWVXqv3jH+f2LtkiSZzK19fkDTTNaWYro2YwlpshEivpzwtwmI1NiNjQl9i9Ka86ppsGZcTse99y/UvBqcjDQlYTW/JSg4Jv7UF7yvOOZLfrE3DFcG4A2EV1jaW/bc3ljzBMyE4mHMFgKZvYtFQ3SwXFD990tHwk0rxlHd7loFXiswC3Vq9KGW+XGTdxzI5s3vhDOXgYDePvjHfCLzSZ9ePADxaw17x+uclUn6STCRwBt2zoi75oi+II6l/miznRvp9kU8CXUtyPO3vxUR9gGyFyYKrRH4ou6dLFpQZR9c+82oTHc+0vUMbBaAXgS6ARdB7hBUKD2sO+f+kck0skqJzlGBK/duWBc6Rc28QSpjSKzcPix/fZmO/j02Qdep8b7X6rou5wxJx8ixNDLpbtAZAZAzJ7RCNgaQuDyOk41v/sZTKTVF77EvF5bMy7SgCRmo3xjM58MeTA1Q7zzu50sbYzq3pTiCne+b2zwCfHBDjLglXqrMmByBBPHFhmRHY+acQlVfAze5iSWCbCK3n+GI8rojaldhvoEcBzpHL/BBffyLmME4wbeg0nDvcIUHH4vETiHN1uO4= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: +37Oe6TOzwsVYxneVYeM3oxPkx6FM4kULLXBjmDMuSkNZ4pOa6Je4FO05j4cav5Nk4bL4xvhvn5k2XicKC+F4K8TJyL11B5ExpMjWAJmqvSH+WlTnauh55/5xA3xNPmunbPYxHXHokbOKtsz/N9S7ZMGX9Oemcc7kQQTj+L3FUbpXdxv+/LyTQxlSHiJk2JrfCTpVIYM1I2vbZJ26KDCOC8FrSPr/ag+SfNjCq6NSKVaCaHnnKD8XkdfC11R3u0Iubpnrfx9dVKb8TC032ke2FUsmwpWybTaVYdwRcQbUpoEFwKLwQyA/FRG+kqGIY8jwEVCFPQJs99plv1atFXPIIjK8wkf3Ce7LhWsCujgGTirfSyzDF9ZPq9j1Jw4gAMNPnpbz85305XJWhV9i8kODdHOrS7VHeLvq1tZd8+HoXNy20GFm2jYLK3pV+4uBLOO4RJX6XOYRpQJlF0706yzQ/MRD4tO2HFiBFzjVC0RadjVqqmKQUZoT+PZ3d9zGIEN0AQTqUdN2zjQ/iYp1KSwsI1ZuATDo91NF/Gt+BkwICSBEBskQROGK/IwCQr03RUolAcngQFdj6/SMbGmY/o39SNDd9gr1HCSfMcvXD05LhdyayuT+qi+/6SH8/bSx0JAx6gULosKN3zXWGNxMpw/EA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: IH5CXyHv8KA9MQsoXE992Dn+A2pDErrckm3OcyGs1GJelEDMp8+2a2GrEW+bIHFNrQDPn04v1mG0qkggX0PoQRgt4az+aA5gUX/pVoDA2WENEyAR/HG/J5XKrLhvVpEGXgjUigvZM8619kD5WchPbDPqrBPbcRubSvg4KOzdXjiUZiyh2p3FsyKikgG5B8qq4dtEbeEER3mGc+FdbzxgDDTKWyhXZsIiq9PK8IbJpzE3hBPVc+4JgUWc+xypTTOMus3XnxEiPULJemB9hAdjduDVpbJPCed8S1HEUFj7UukB1umfVvsSc5gsWKMbnxQPXj5uH7d06n2SoYdsmgS3MfSz2tvKvghQzjajSKQG04M945S8ISHZ2zy+BYJD5D683ArHKMYOS/zk8bNd6RdIPWqeqYnUNWvYCKiD9RzK0axBtuIOW9wN+QxX6cvzxReQWNfIeTOracfLfj5X4konzeCVzSq8KB3ueUkVU3qRDLtqQPHJ2cJorkQO0WjtpJyMKATtRIsDf1dHn9qtV4SCjSvfOOW22FO5YA/lQD2Dgwpb0ktjy679a8/8kVAjbJP/0iJAihCAfeXTsCyPgPESa15pMOEyIurGa+4sOi0Qf1btkzq8ge3VOmLj4eBO/CNqvY3nGCWsfmILpk1Oa/8gpg5xD6GrVYcCes6S2ys+5r5yV2jbqIfVK6ZdBJPmp+ech0MRX+wLh0mEoepd7Xc2grF11dlV1C2j6dZHu5zlKjTUCf2EigCYgMaX8IYPl/6+TID8yhIifu8M0+y8lp+jq1ftWxBIG+8K8NQ4698abD+1rgqoLe5E3MfO7MwWCt9kwG0YdpOoaSEcsujykjyDsGJQwcTh0E/keNtKHO3JnwrtCZ0uPwUbM5W1oAqXXIgeIHKtZRu9MnQV2Rkne0y7DapLipLW//hCVsm+Q8CIkdZrxiXDKjPjqF6FYen6DZov3mgZJpRuxOveT2RpGCVRzz9MtD3Oih1gzu0piT8CH/iMvjzALV4t76ttLael0yPcHEVXhgt50u7TjEhDlct7eRRn0uYcc9MxJEF61JvEA2ktJvpVr+OKfNsdhBc6FE7z6ba0p8cB20TvCb6TySU1K5+xVkipLWNKMAbSBqCHGNOeLJXM2dRTzK/0xThFgpIH1rsUEaICk+CoqE3mSQJl+ZuxEgQiaKBqkuJGycr+8s+XnuDKTMyIZOnKdzM3hVdrPducBWLBhTetMObhmWmeOJ9pjsg/b3OiENpFciLbIX+fPnJ/Tz2HV6pXQaNXXPJ3jMcZdPVxdEs8kz8c2XK12METBAXbaVNK6k+235HpBMvdUG6+TOrz+h1XKPatrKve X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 04d7c22a-2386-486d-b4db-08da957bc369 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Sep 2022 11:33:22.0534 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8P250MB0072 Subject: [FFmpeg-devel] [PATCH 06/13] avcodec/dcaenc: Create encoder-adapted tables X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: YZ6jMnLYwXs3 Up until now, the encoder used the same tables that the decoder uses to create its VLCs. These have the downside of requiring the encoder to offset the tables at runtime as well as having to read from separate tables for the length as well as the code of the symbol to encode. The former are uint8_t, the latter uint16_t, so using a joint table would require padding, but this doesn't matter when these tables are generated at runtime, because they live in the .bss segment. Also move these init functions as well as the functions that actually use them to dcaenc.c, because they are encoder-specific. This also allows to remove an inclusion of PutBitContext from dcahuff.h (and indirectly from all dca-decoder files). Signed-off-by: Andreas Rheinhardt --- libavcodec/dcaenc.c | 82 ++++++++++++++++++++++++++++++++++++++++---- libavcodec/dcahuff.c | 64 ++++++---------------------------- libavcodec/dcahuff.h | 16 ++++++--- 3 files changed, 96 insertions(+), 66 deletions(-) diff --git a/libavcodec/dcaenc.c b/libavcodec/dcaenc.c index d02602761b..4a02aa9d46 100644 --- a/libavcodec/dcaenc.c +++ b/libavcodec/dcaenc.c @@ -29,6 +29,7 @@ #include "libavutil/ffmath.h" #include "libavutil/mem_internal.h" #include "libavutil/opt.h" +#include "libavutil/thread.h" #include "avcodec.h" #include "codec_internal.h" #include "dca.h" @@ -159,8 +160,41 @@ static void subband_bufer_free(DCAEncContext *c) } } +static uint16_t bitalloc_12_table[DCA_BITALLOC_12_COUNT][12 + 1][2]; + +static uint16_t bitalloc_table[DCA_NUM_BITALLOC_CODES][2]; +static const uint16_t (*bitalloc_tables[DCA_CODE_BOOKS][8])[2]; + +static av_cold void create_enc_table(uint16_t dst[][2], unsigned count, + const uint8_t len[], const uint16_t codes[]) +{ + for (unsigned i = 0; i < count; i++) { + dst[i][0] = codes[i]; + dst[i][1] = len[i]; + } +} + +static av_cold void dcaenc_init_static_tables(void) +{ + uint16_t (*bitalloc_dst)[2] = bitalloc_table; + + for (unsigned i = 0; i < DCA_CODE_BOOKS; i++) { + for (unsigned j = 0; ff_dca_bitalloc_codes[i][j]; j++) { + create_enc_table(bitalloc_dst, ff_dca_bitalloc_sizes[i], + ff_dca_bitalloc_bits[i][j], ff_dca_bitalloc_codes[i][j]); + bitalloc_tables[i][j] = bitalloc_dst - ff_dca_bitalloc_offsets[i]; + bitalloc_dst += ff_dca_bitalloc_sizes[i]; + } + } + + for (unsigned i = 0; i < DCA_BITALLOC_12_COUNT; i++) + create_enc_table(&bitalloc_12_table[i][1], 12, + ff_dca_bitalloc_12_bits[i], ff_dca_bitalloc_12_codes[i]); +} + static int encode_init(AVCodecContext *avctx) { + static AVOnce init_static_once = AV_ONCE_INIT; DCAEncContext *c = avctx->priv_data; AVChannelLayout layout = avctx->ch_layout; int i, j, k, min_frame_bits; @@ -307,6 +341,7 @@ static int encode_init(AVCodecContext *avctx) c->band_spectrum_tab[1][j] = (int32_t)(200 * log10(accum)); } + ff_thread_once(&init_static_once, dcaenc_init_static_tables); return 0; } @@ -400,6 +435,39 @@ static void lfe_downsample(DCAEncContext *c, const int32_t *input) } } +static uint32_t dca_vlc_calc_alloc_bits(const int values[], uint8_t n, uint8_t sel) +{ + uint32_t sum = 0; + for (unsigned i = 0; i < n; i++) + sum += bitalloc_12_table[sel][values[i]][1]; + return sum; +} + +static void dca_vlc_enc_alloc(PutBitContext *pb, const int values[], + uint8_t n, uint8_t sel) +{ + for (unsigned i = 0; i < n; i++) + put_bits(pb, bitalloc_12_table[sel][values[i]][1], + bitalloc_12_table[sel][values[i]][0]); +} + +static uint32_t dca_vlc_calc_quant_bits(const int values[], uint8_t n, + uint8_t sel, uint8_t table) +{ + uint32_t sum = 0; + for (unsigned i = 0; i < n; i++) + sum += bitalloc_tables[table][sel][values[i]][1]; + return sum; +} + +static void dca_vlc_enc_quant(PutBitContext *pb, const int values[], + uint8_t n, uint8_t sel, uint8_t table) +{ + for (unsigned i = 0; i < n; i++) + put_bits(pb, bitalloc_tables[table][sel][values[i]][1], + bitalloc_tables[table][sel][values[i]][0]); +} + static int32_t get_cb(DCAEncContext *c, int32_t in) { int i, res = 0; @@ -695,8 +763,8 @@ static void accumulate_huff_bit_consumption(int abits, int32_t *quantized, { uint8_t sel, id = abits - 1; for (sel = 0; sel < ff_dca_quant_index_group_size[id]; sel++) - result[sel] += ff_dca_vlc_calc_quant_bits(quantized, SUBBAND_SAMPLES, - sel, id); + result[sel] += dca_vlc_calc_quant_bits(quantized, SUBBAND_SAMPLES, + sel, id); } static uint32_t set_best_code(uint32_t vlc_bits[DCA_CODE_BOOKS][7], @@ -757,7 +825,7 @@ static uint32_t set_best_abits_code(int abits[DCAENC_SUBBANDS], int bands, } for (i = 0; i < DCA_BITALLOC_12_COUNT; i++) { - t = ff_dca_vlc_calc_alloc_bits(abits, bands, i); + t = dca_vlc_calc_alloc_bits(abits, bands, i); if (t < best_bits) { best_bits = t; best_sel = i; @@ -1081,8 +1149,8 @@ static void put_subframe_samples(DCAEncContext *c, int ss, int band, int ch) sel = c->quant_index_sel[ch][c->abits[ch][band] - 1]; // Huffman codes if (sel < ff_dca_quant_index_group_size[c->abits[ch][band] - 1]) { - ff_dca_vlc_enc_quant(&c->pb, &c->quantized[ch][band][ss * 8], 8, - sel, c->abits[ch][band] - 1); + dca_vlc_enc_quant(&c->pb, &c->quantized[ch][band][ss * 8], 8, + sel, c->abits[ch][band] - 1); return; } @@ -1135,8 +1203,8 @@ static void put_subframe(DCAEncContext *c, int subframe) put_bits(&c->pb, 5, c->abits[ch][band]); } } else { - ff_dca_vlc_enc_alloc(&c->pb, c->abits[ch], DCAENC_SUBBANDS, - c->bit_allocation_sel[ch]); + dca_vlc_enc_alloc(&c->pb, c->abits[ch], DCAENC_SUBBANDS, + c->bit_allocation_sel[ch]); } } diff --git a/libavcodec/dcahuff.c b/libavcodec/dcahuff.c index 842b1401dd..d17b49a089 100644 --- a/libavcodec/dcahuff.c +++ b/libavcodec/dcahuff.c @@ -22,11 +22,9 @@ #include -#include "libavutil/avassert.h" #include "libavutil/macros.h" #include "dcahuff.h" -#include "put_bits.h" #define TMODE_COUNT 4 static const uint16_t tmode_codes[TMODE_COUNT][4] = { @@ -47,7 +45,7 @@ static const uint8_t bitalloc_12_vlc_bits[DCA_BITALLOC_12_COUNT] = { 9, 7, 7, 9, 9 }; -static const uint16_t bitalloc_12_codes[DCA_BITALLOC_12_COUNT][12] = { +const uint16_t ff_dca_bitalloc_12_codes[DCA_BITALLOC_12_COUNT][12] = { { 0x0000, 0x0002, 0x0006, 0x000E, 0x001E, 0x003E, 0x00FF, 0x00FE, 0x01FB, 0x01FA, 0x01F9, 0x01F8, }, { 0x0001, 0x0000, 0x0002, 0x000F, 0x000C, 0x001D, 0x0039, 0x0038, @@ -60,7 +58,7 @@ static const uint16_t bitalloc_12_codes[DCA_BITALLOC_12_COUNT][12] = { 0x0079, 0x0078, 0x00FB, 0x00FA, } }; -static const uint8_t bitalloc_12_bits[DCA_BITALLOC_12_COUNT][12] = { +const uint8_t ff_dca_bitalloc_12_bits[DCA_BITALLOC_12_COUNT][12] = { { 1, 2, 3, 4, 5, 6, 8, 8, 9, 9, 9, 9 }, { 1, 2, 3, 5, 5, 6, 7, 7, 7, 7, 7, 7 }, { 2, 3, 3, 3, 3, 4, 4, 4, 5, 6, 7, 7 }, @@ -980,11 +978,11 @@ static const uint8_t bitalloc_129_bits_g[129] = { 13, }; -static const uint8_t bitalloc_sizes[DCA_CODE_BOOKS] = { +const uint8_t ff_dca_bitalloc_sizes[DCA_CODE_BOOKS] = { 3, 5, 7, 9, 13, 17, 25, 33, 65, 129 }; -static const int8_t bitalloc_offsets[DCA_CODE_BOOKS] = { +const int8_t ff_dca_bitalloc_offsets[DCA_CODE_BOOKS] = { -1, -2, -3, -4, -6, -8, -12, -16, -32, -64 }; @@ -1001,7 +999,7 @@ static const uint8_t bitalloc_maxbits[DCA_CODE_BOOKS][7] = { { 9, 9, 9, 9, 9, 9, 9 } }; -static const uint16_t *const bitalloc_codes[DCA_CODE_BOOKS][8] = { +const uint16_t *const ff_dca_bitalloc_codes[DCA_CODE_BOOKS][8] = { { bitalloc_3_codes, NULL }, { bitalloc_5_codes_a, bitalloc_5_codes_b, bitalloc_5_codes_c, NULL }, { bitalloc_7_codes_a, bitalloc_7_codes_b, bitalloc_7_codes_c, NULL }, @@ -1019,7 +1017,7 @@ static const uint16_t *const bitalloc_codes[DCA_CODE_BOOKS][8] = { bitalloc_129_codes_e, bitalloc_129_codes_f, bitalloc_129_codes_g, NULL } }; -static const uint8_t *const bitalloc_bits[DCA_CODE_BOOKS][8] = { +const uint8_t *const ff_dca_bitalloc_bits[DCA_CODE_BOOKS][8] = { { bitalloc_3_bits, NULL }, { bitalloc_5_bits_a, bitalloc_5_bits_b, bitalloc_5_bits_c, NULL }, { bitalloc_7_bits_a, bitalloc_7_bits_b, bitalloc_7_bits_c, NULL }, @@ -1267,7 +1265,7 @@ av_cold void ff_dca_init_vlcs(void) ff_dca_vlc_bit_allocation.max_depth = 2; for (i = 0; i < 5; i++) DCA_INIT_VLC(ff_dca_vlc_bit_allocation.vlc[i], bitalloc_12_vlc_bits[i], 12, - bitalloc_12_bits[i], bitalloc_12_codes[i]); + ff_dca_bitalloc_12_bits[i], ff_dca_bitalloc_12_codes[i]); ff_dca_vlc_scale_factor.offset = -64; ff_dca_vlc_scale_factor.max_depth = 2; @@ -1280,11 +1278,11 @@ av_cold void ff_dca_init_vlcs(void) tmode_bits[i], tmode_codes[i]); for (i = 0; i < DCA_CODE_BOOKS; i++) { - ff_dca_vlc_quant_index[i].offset = bitalloc_offsets[i]; + ff_dca_vlc_quant_index[i].offset = ff_dca_bitalloc_offsets[i]; ff_dca_vlc_quant_index[i].max_depth = 1 + (i > 4); - for (j = 0; bitalloc_codes[i][j]; j++) + for (j = 0; ff_dca_bitalloc_codes[i][j]; j++) DCA_INIT_VLC(ff_dca_vlc_quant_index[i].vlc[j], bitalloc_maxbits[i][j], - bitalloc_sizes[i], bitalloc_bits[i][j], bitalloc_codes[i][j]); + ff_dca_bitalloc_sizes[i], ff_dca_bitalloc_bits[i][j], ff_dca_bitalloc_codes[i][j]); } #define LBR_INIT_VLC(vlc, tab, nb_bits) \ @@ -1316,45 +1314,3 @@ av_cold void ff_dca_init_vlcs(void) LBR_INIT_VLC(ff_dca_vlc_grid_3, grid_3, 9); LBR_INIT_VLC(ff_dca_vlc_rsd, rsd, 6); } - -uint32_t ff_dca_vlc_calc_quant_bits(int *values, uint8_t n, uint8_t sel, uint8_t table) -{ - uint8_t i, id; - uint32_t sum = 0; - for (i = 0; i < n; i++) { - id = values[i] - bitalloc_offsets[table]; - av_assert0(id < bitalloc_sizes[table]); - sum += bitalloc_bits[table][sel][id]; - } - return sum; -} - -void ff_dca_vlc_enc_quant(PutBitContext *pb, int *values, uint8_t n, uint8_t sel, uint8_t table) -{ - uint8_t i, id; - for (i = 0; i < n; i++) { - id = values[i] - bitalloc_offsets[table]; - av_assert0(id < bitalloc_sizes[table]); - put_bits(pb, bitalloc_bits[table][sel][id], bitalloc_codes[table][sel][id]); - } -} - -uint32_t ff_dca_vlc_calc_alloc_bits(int *values, uint8_t n, uint8_t sel) -{ - uint8_t i, id; - uint32_t sum = 0; - for (i = 0; i < n; i++) { - id = values[i] - 1; - sum += bitalloc_12_bits[sel][id]; - } - return sum; -} - -void ff_dca_vlc_enc_alloc(PutBitContext *pb, int *values, uint8_t n, uint8_t sel) -{ - uint8_t i, id; - for (i = 0; i < n; i++) { - id = values[i] - 1; - put_bits(pb, bitalloc_12_bits[sel][id], bitalloc_12_codes[sel][id]); - } -} diff --git a/libavcodec/dcahuff.h b/libavcodec/dcahuff.h index 1f13b6f443..68974d9965 100644 --- a/libavcodec/dcahuff.h +++ b/libavcodec/dcahuff.h @@ -27,11 +27,13 @@ #include "libavutil/attributes.h" -#include "put_bits.h" #include "vlc.h" #define DCA_CODE_BOOKS 10 #define DCA_BITALLOC_12_COUNT 5 +#define DCA_NUM_BITALLOC_CODES (1 * 3 + \ + 3 * (5 + 7 + 9 + 13) \ + + 7 * (17 + 25 + 33 + 65 + 129)) typedef struct DCAVLC { int offset; ///< Code values offset @@ -58,10 +60,14 @@ extern VLC ff_dca_vlc_grid_2; extern VLC ff_dca_vlc_grid_3; extern VLC ff_dca_vlc_rsd; +extern const int8_t ff_dca_bitalloc_offsets[DCA_CODE_BOOKS]; +extern const uint8_t ff_dca_bitalloc_sizes[DCA_CODE_BOOKS]; +extern const uint16_t *const ff_dca_bitalloc_codes[DCA_CODE_BOOKS][8]; +extern const uint8_t *const ff_dca_bitalloc_bits[DCA_CODE_BOOKS][8]; + +extern const uint8_t ff_dca_bitalloc_12_bits[DCA_BITALLOC_12_COUNT][12]; +extern const uint16_t ff_dca_bitalloc_12_codes[DCA_BITALLOC_12_COUNT][12]; + av_cold void ff_dca_init_vlcs(void); -uint32_t ff_dca_vlc_calc_quant_bits(int *values, uint8_t n, uint8_t sel, uint8_t abits); -void ff_dca_vlc_enc_quant(PutBitContext *pb, int *values, uint8_t n, uint8_t sel, uint8_t abits); -uint32_t ff_dca_vlc_calc_alloc_bits(int *values, uint8_t n, uint8_t sel); -void ff_dca_vlc_enc_alloc(PutBitContext *pb, int *values, uint8_t n, uint8_t sel); #endif /* AVCODEC_DCAHUFF_H */