From patchwork Fri Jul 29 08:22:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 37036 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:1649:b0:8b:613a:194d with SMTP id no9csp735297pzb; Fri, 29 Jul 2022 01:23:04 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sqO2YdD/hjqZLML512tkSuiUUuPemPpxmr78DEjc7VRB4O2Z21h2Yo+2QoXLz7zEPy2chR X-Received: by 2002:a17:907:7209:b0:72b:924b:60a8 with SMTP id dr9-20020a170907720900b0072b924b60a8mr2159216ejc.442.1659082984357; Fri, 29 Jul 2022 01:23:04 -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 cs8-20020a0564020c4800b0043c2919cfcesi2584016edb.122.2022.07.29.01.23.03; Fri, 29 Jul 2022 01:23:04 -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=XRaLUZ9q; 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 3CE9868B862; Fri, 29 Jul 2022 11:23:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2060.outbound.protection.outlook.com [40.92.89.60]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 71BB568B862 for ; Fri, 29 Jul 2022 11:22:53 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NaQCoETB/UrgXkUJ5QuTFRfUvdU7kcaNoHzpGEpWydnLRvQB0y3XNi6aKTsGKG19s0kuI3aBJJB+47YYczW6klxqhzQGGdyTfJnjV7zxKhqSQ+VTcLpuqZEsPJC/7RlbQa03p27WVLd1L4RlNdLktlwjWCsSyW90TGOWE8/wK+877Hd7i9zdeYTqp2IpwyWkN/HZr5ON6m0xTl8gbo18sjGkXH6P20SWmUzuUmQYf+jkBJxqXX+rTIIV+UcOX+HtHS7+1Bnd4BWwmF0fenpE/bdUo42+yLit2VtbZDeCAk9vasLZpL4cr6Mc2vIij1xpgBUt7O+MXkoUGBEql6Xgfg== 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=iJOlCw0SOd8KbXjlLyX4vNSU819JReS7c0zWOrREpaI=; b=k04nl90ZYEGlhuyAyclnPgiSLTBHnUZ72S5ixyl7IjfPdxxqXmnhh3wJy/F+SnxoS6H1EpJYecsah7VHDcxBZZembRD7MwGUGDba0J7NbLffyWm1jTWIIF/IdPdMyP2+wNdNPneDk1+VohBJ9SpkMzphseKoqIhdD6oBAh2wCQ90Z0xw6aUmW8z5yO4I6u9TJ21h9vp5dXgR5YG7o2VXdFMgR/ceVU6uHAztFnIq2Z0NckzueowB9lMStcXZvaVxkVe6iFxGgy/fYoGszb1yumKqHMfeCdYJ4tk1I3xX0uO1RM5w9VSr5l+Smw1HyWSmQUQ4+E9v6DPPmBkoDMkiFA== 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=iJOlCw0SOd8KbXjlLyX4vNSU819JReS7c0zWOrREpaI=; b=XRaLUZ9q76T5H93DLi5mcKx+A2WETERrm3QMFC2x8gimITqDlhrxn0DLLoRfutg1kdEcesSBkdYBPubDFxn9JwE3lNmAnfjFtLg7q2wDDcqzcmNdFJ7ARixK6xkjOP9Zts/K5/3rb3W5zX7ZCK/NkChEpsGxOQzUWLOVeHYKZuhklPnNj6WwFyon2uQh0+HwAgdacbYH84rG/0nfuFCUbqeC3daQUZY7BhZ7NIdWs7KOOu8L7qPQW2nUIEcJNgZ78laZjmhEP0kU6lJhqyAnyR9BrdkP1ga9CU4IlxuvfPc5BRasbLX5+1XhhRPcy2JMS9qacKYEKRUmmbxpSC1g/g== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by VE1PR01MB6191.eurprd01.prod.exchangelabs.com (2603:10a6:803:10c::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5458.24; Fri, 29 Jul 2022 08:22:49 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::210e:b627:bcc9:8c46%11]) with mapi id 15.20.5458.025; Fri, 29 Jul 2022 08:22:49 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 29 Jul 2022 10:22:40 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [dwEkPcgvmRNJvx9xe83lD8V4VC8QvFYa] X-ClientProxiedBy: ZR0P278CA0095.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:23::10) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220729082240.3575714-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 62203e6b-99ec-4d65-16ec-08da713b8634 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiTOhQ2NjSgoe5pu00/Lkooun87PX7bHJRzDMPG5pDCgsoUAyYpmmpoPFcBPII06Ctnlx8HdUfygSb06RpffGyDXs2qWJmJRCDGkSFNUTxVrGC1bTKb8YOvII2CUaeWQ49Nua6xtHaJZLovY9lzz3UijUqfKDgzZkWibzkJwUa+MIQ0ropJB1c+xkCUoECVUGQmNV67ZPnIN9O06Q2PFoLbfhPbL0UxZTqNg9E3eB0tGtHzZ19ZuYA06jXIXiQkEsMXW4opyFh9dxK9gRweRe7EdOwzuKOlOHGewmgSURS2aR8geY4zYl5JVhI8y/M6Y+nPMj89hkDVIYtuPE0H3KCXJ6IpBpInpoTzL5zmXuxiGIZoek7qbxjdvkn7s8hkLLlNXnw1Xjof5N/UB/SekZ4KrVupDQyc84VcnEkocHamlp2v8uVnjzTAsxgss0gn3FwtJ0OGMvREKnJgKPzO3kYVxt5IeTRGKpEMA1xktaqJSE3Djpzqz/E0Y8KP61XsYpgmR58ebBhf3tT0QBNB/ivHThZE5AQAoYbH6cevkNEQSEfEHaQBOBCXs9DA5/QnZxlmB4kTVZDCJEq4t/y5bu61Rn2ViY4nVpXtu12atiSxCUxYNbLPXzRL5F6W6ExWfo0GQE74VbvEJM1Dq4AR1NKpXCeGw320deUJnGerCXiFg/d+4J2tymiROPb6KxPrKonJzHvcA+Z8LOpgbsm7kq0JCnvJZdkwbjAa4Wh7meMwg9pRL9IXzQ3vYdDgcSCz6q9g= X-MS-TrafficTypeDiagnostic: VE1PR01MB6191:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: WRqe3ncS61TA+ZGoK8Kg4NJhOP5EQXv18Rk0bMKxRu9j9T9vma8MRi+PqzkatPRBv+LGfMZdtmAzCYdvg9bDljltHeu54VsMwy4Rbt64qy/c3ISCqqW4ZMYYo1umugAwNq60JGAIF0LNgJlSKjiF7Yd1+9KAa+Cu0ARAOxBw1KEpJcai/vEeaBTmY5+i3vF437N6IAIQzHq3WO8MOtaWUle3sGc8ZZ07VAGT9hyHhGevIaewKv0hrQinv6Yzwya7+FdE28YFgKJ/BZv4GkOdg15vcyEZ9c0OYm9f543DgojwVufOcy8iBwylRkfkWonROLQQxweg797x67QVxA60STFi9FNtPqVgAxWuS7GG0kSLa41pVDAj/2MeGVwYMDVhQkritv8YktDkNFFtnK0Tvp0vyVn6rYEWQtGvla3SAOyG1Ql0qB5vjKb3OeLAKSE8PkuzJcOwyKx3M+I4g8nER3hF0yotJ2s+3JlCjVNjj7Jblq5ZHXzGKwVexiLdtfqqUzj260d8Jmj6cgtudVGbg2+ayRY+abqpAng0fSD3P+Lyhrat7H547CV1Rx8CTM8gLCAwJU3hPbS7qihWC5BgyTnWbNb9eEMyNfW2Mht9sA/cJ0ykuvMIUDXRQluXlk/1KxMBm+BZzJmm1LkAMgq6WQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: mYtjQZkDpmBpP7YU1SRSTubgv0hMF74EZhInM9LColBw7TmFlG5JIFbBnJk8siNwyJepFW/xY72chn5ZoQrBn/2mchh6niMPOi0cdzHNCpNjAIvS5P6ewdDDW/fC8j99iMRG5Z56URHW8fk5U1t2fbwVQE81n2rVEDKeun0pnH57vnoO4nQ7SkEjFY2H8OLvpgceG5CyChbBcsGjYlQov1NaZ2mqc2kJICo6m6FjTwRF+lhCPv6n+Zt70DGfbXds4pfSGnoxjYo9zqjeL2aKIpKHaqNzSscqDMvhubDwadh/X7bO64rSI0vyAqhYMbE2qVs1aKBwnIODG3NrqhkE0lHSwearKvF/OmUj5Od5B6qY5yE/0o/nhDSoZHhr6q/jsqSPWkvQX+kZ/bTazNTPvYxMc8MyVj05ey2kEB83kYykTDiVl7Vf9UA2LR8LZbiNp0Znf6WDzDq6O+ASg9FbRcEpLn6IW+TwQKECrBCrKugJ85/VNQkUT+4rtDKRr6oe0hFV9yyW+NGMjT4HswKAKLIIFinbQ9NQdAy+N2JiKrBfx8DhPaUPmIY+sFgRE4VfmArlhZktY/Pbj+lG8It+78IOea0BxZ83kGdFpQpwH2spOtSWM2uYCs7EikBrkTY7OhuJ0eVE0n83s2YK3ldb0dntJ3hyPBxV4zESyK/yYNOpA3XVtcDo+je3BLeo5T3mc58mvn8c5iGpm0ImKayMrci4OyL9/6m3grcSDf7BtvohJoaqQ9HCSMQ0r3rd8hOmCi9NxCRGSiyfPlNtJbODqXKx+Fn4P3IVwqfoUsLQk7x+4TfAhw/+dYRLtrEhLuFuje3QgTc8cJwHgXdktLMdEl9PWkzuxm5Xznb+RawGXXCFBUGJSYMbOa65DIVp/eJkYpXMwuqjc3p5xhzSq8sqTNImSkyMXq0GBxpCHdlcNnADpXtz2xiLzufvy/swJQl9bhjK+bed4rNY5UanYyoUlOZjCxp7e4db8sGwmCvW13s6VknFn+ANiB95Txw9pLDEruap+M0oo9WSu5BU60CBT/wg7viz4pxJkh26PnHnAiJZwyLmrQbaeP/PF7g2wxbJcR+uoyQBf2kXJ+v1U8BrBz+ct7YsDylrC1w83wJlnpbipnhaVn9c3+cgKEm2L1V87H6f/DmsZ4hUTOTw/igsSOje3sW+Di7JkLHFAEegiFaz3WPhT2c67jqfUx5xtHuUGwkQliFHFlts2MCnLr9DccXSx5c48iwXQjFm3h5W6h8kbIu6OF5vfDzA+R1Mootz9BraTdIMtXXgk5nWa5+R6jTw1NKSQqCXBdc8ZAyc8U0= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 62203e6b-99ec-4d65-16ec-08da713b8634 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jul 2022 08:22:49.8041 (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: VE1PR01MB6191 Subject: [FFmpeg-devel] [PATCH] avcodec/proresdata: Move data only used by ff_prores_ks_encoder to it 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: omGu1dRpAyug In this case, this allows to inline the initial run_cb and lev_cb values. Signed-off-by: Andreas Rheinhardt --- libavcodec/proresdata.c | 27 ------------------ libavcodec/proresdata.h | 4 --- libavcodec/proresenc_kostya.c | 54 ++++++++++++++++++++++++++--------- 3 files changed, 40 insertions(+), 45 deletions(-) diff --git a/libavcodec/proresdata.c b/libavcodec/proresdata.c index 9849b5cc00..4787907c71 100644 --- a/libavcodec/proresdata.c +++ b/libavcodec/proresdata.c @@ -43,30 +43,3 @@ const uint8_t ff_prores_interlaced_scan[64] = { 30, 23, 31, 38, 45, 52, 60, 53, 46, 39, 47, 54, 61, 62, 55, 63 }; - - -const uint8_t ff_prores_dc_codebook[4] = { - 0x04, // rice_order = 0, exp_golomb_order = 1, switch_bits = 0 - 0x28, // rice_order = 1, exp_golomb_order = 2, switch_bits = 0 - 0x4D, // rice_order = 2, exp_golomb_order = 3, switch_bits = 1 - 0x70 // rice_order = 3, exp_golomb_order = 4, switch_bits = 0 -}; - -const uint8_t ff_prores_ac_codebook[7] = { - 0x04, // rice_order = 0, exp_golomb_order = 1, switch_bits = 0 - 0x28, // rice_order = 1, exp_golomb_order = 2, switch_bits = 0 - 0x4C, // rice_order = 2, exp_golomb_order = 3, switch_bits = 0 - 0x05, // rice_order = 0, exp_golomb_order = 1, switch_bits = 1 - 0x29, // rice_order = 1, exp_golomb_order = 2, switch_bits = 1 - 0x06, // rice_order = 0, exp_golomb_order = 1, switch_bits = 2 - 0x0A, // rice_order = 0, exp_golomb_order = 2, switch_bits = 2 -}; - -/** - * Lookup tables for adaptive switching between codebooks - * according with previous run/level value. - */ -const uint8_t ff_prores_run_to_cb_index[16] = - { 5, 5, 3, 3, 0, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 2 }; - -const uint8_t ff_prores_lev_to_cb_index[10] = { 0, 6, 3, 5, 0, 1, 1, 1, 1, 2 }; diff --git a/libavcodec/proresdata.h b/libavcodec/proresdata.h index ee8278d5f4..d8c8786689 100644 --- a/libavcodec/proresdata.h +++ b/libavcodec/proresdata.h @@ -31,9 +31,5 @@ extern const uint8_t ff_prores_progressive_scan[64]; extern const uint8_t ff_prores_interlaced_scan[64]; #define FIRST_DC_CB 0xB8 // rice_order = 5, exp_golomb_order = 6, switch_bits = 0 -extern const uint8_t ff_prores_dc_codebook[4]; -extern const uint8_t ff_prores_ac_codebook[7]; -extern const uint8_t ff_prores_run_to_cb_index[16]; -extern const uint8_t ff_prores_lev_to_cb_index[10]; #endif /* AVCODEC_PRORESDATA_H */ diff --git a/libavcodec/proresenc_kostya.c b/libavcodec/proresenc_kostya.c index 391072d470..60bb2286f8 100644 --- a/libavcodec/proresenc_kostya.c +++ b/libavcodec/proresenc_kostya.c @@ -135,6 +135,32 @@ static const uint8_t prores_quant_matrices[][64] = { }, }; +static const uint8_t prores_dc_codebook[4] = { + 0x04, // rice_order = 0, exp_golomb_order = 1, switch_bits = 0 + 0x28, // rice_order = 1, exp_golomb_order = 2, switch_bits = 0 + 0x4D, // rice_order = 2, exp_golomb_order = 3, switch_bits = 1 + 0x70 // rice_order = 3, exp_golomb_order = 4, switch_bits = 0 +}; + +static const uint8_t prores_ac_codebook[7] = { + 0x04, // rice_order = 0, exp_golomb_order = 1, switch_bits = 0 + 0x28, // rice_order = 1, exp_golomb_order = 2, switch_bits = 0 + 0x4C, // rice_order = 2, exp_golomb_order = 3, switch_bits = 0 + 0x05, // rice_order = 0, exp_golomb_order = 1, switch_bits = 1 + 0x29, // rice_order = 1, exp_golomb_order = 2, switch_bits = 1 + 0x06, // rice_order = 0, exp_golomb_order = 1, switch_bits = 2 + 0x0A, // rice_order = 0, exp_golomb_order = 2, switch_bits = 2 +}; + +/** + * Lookup tables for adaptive switching between codebooks + * according with previous run/level value. + */ +static const uint8_t prores_run_to_cb_index[16] = + { 5, 5, 3, 3, 0, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 2 }; + +static const uint8_t prores_lev_to_cb_index[10] = { 0, 6, 3, 5, 0, 1, 1, 1, 1, 2 }; + #define NUM_MB_LIMITS 4 static const int prores_mb_limits[NUM_MB_LIMITS] = { 1620, // up to 720x576 @@ -423,7 +449,7 @@ static void encode_dcs(PutBitContext *pb, int16_t *blocks, new_sign = GET_SIGN(delta); delta = (delta ^ sign) - sign; code = MAKE_CODE(delta); - encode_vlc_codeword(pb, ff_prores_dc_codebook[codebook], code); + encode_vlc_codeword(pb, prores_dc_codebook[codebook], code); codebook = (code + (code & 1)) >> 1; codebook = FFMIN(codebook, 3); sign = new_sign; @@ -441,8 +467,8 @@ static void encode_acs(PutBitContext *pb, int16_t *blocks, int max_coeffs, abs_level; max_coeffs = blocks_per_slice << 6; - run_cb = ff_prores_run_to_cb_index[4]; - lev_cb = ff_prores_lev_to_cb_index[2]; + run_cb = prores_run_to_cb_index[4]; + lev_cb = prores_lev_to_cb_index[2]; run = 0; for (i = 1; i < 64; i++) { @@ -450,13 +476,13 @@ static void encode_acs(PutBitContext *pb, int16_t *blocks, level = blocks[idx] / qmat[scan[i]]; if (level) { abs_level = FFABS(level); - encode_vlc_codeword(pb, ff_prores_ac_codebook[run_cb], run); - encode_vlc_codeword(pb, ff_prores_ac_codebook[lev_cb], + encode_vlc_codeword(pb, prores_ac_codebook[run_cb], run); + encode_vlc_codeword(pb, prores_ac_codebook[lev_cb], abs_level - 1); put_sbits(pb, 1, GET_SIGN(level)); - run_cb = ff_prores_run_to_cb_index[FFMIN(run, 15)]; - lev_cb = ff_prores_lev_to_cb_index[FFMIN(abs_level, 9)]; + run_cb = prores_run_to_cb_index[FFMIN(run, 15)]; + lev_cb = prores_lev_to_cb_index[FFMIN(abs_level, 9)]; run = 0; } else { run++; @@ -667,7 +693,7 @@ static int estimate_dcs(int *error, int16_t *blocks, int blocks_per_slice, new_sign = GET_SIGN(delta); delta = (delta ^ sign) - sign; code = MAKE_CODE(delta); - bits += estimate_vlc(ff_prores_dc_codebook[codebook], code); + bits += estimate_vlc(prores_dc_codebook[codebook], code); codebook = (code + (code & 1)) >> 1; codebook = FFMIN(codebook, 3); sign = new_sign; @@ -687,8 +713,8 @@ static int estimate_acs(int *error, int16_t *blocks, int blocks_per_slice, int bits = 0; max_coeffs = blocks_per_slice << 6; - run_cb = ff_prores_run_to_cb_index[4]; - lev_cb = ff_prores_lev_to_cb_index[2]; + run_cb = prores_run_to_cb_index[4]; + lev_cb = prores_lev_to_cb_index[2]; run = 0; for (i = 1; i < 64; i++) { @@ -697,12 +723,12 @@ static int estimate_acs(int *error, int16_t *blocks, int blocks_per_slice, *error += FFABS(blocks[idx]) % qmat[scan[i]]; if (level) { abs_level = FFABS(level); - bits += estimate_vlc(ff_prores_ac_codebook[run_cb], run); - bits += estimate_vlc(ff_prores_ac_codebook[lev_cb], + bits += estimate_vlc(prores_ac_codebook[run_cb], run); + bits += estimate_vlc(prores_ac_codebook[lev_cb], abs_level - 1) + 1; - run_cb = ff_prores_run_to_cb_index[FFMIN(run, 15)]; - lev_cb = ff_prores_lev_to_cb_index[FFMIN(abs_level, 9)]; + run_cb = prores_run_to_cb_index[FFMIN(run, 15)]; + lev_cb = prores_lev_to_cb_index[FFMIN(abs_level, 9)]; run = 0; } else { run++;