From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id B5BB04965B for ; Sat, 15 Jun 2024 17:17:55 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9A1B968D69E; Sat, 15 Jun 2024 20:17:46 +0300 (EEST) Received: from EUR02-DB5-obe.outbound.protection.outlook.com (mail-db5eur02olkn2062.outbound.protection.outlook.com [40.92.50.62]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5708268D69D for ; Sat, 15 Jun 2024 20:17:45 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hG4vq0j79q8aTCP8kLbAzfZZAciIZ22EZOvK0frEddfszcp1R9yLOodBmTM8atmYVkTVjubtuQRYjBGY6obAvNO4Or5UuuvTK68QtVzbjk8kER80U07hF51KYseOOD4EeWmK41W6YSs15FGFX0suzPf5DMFbjq0e8MxITvblah7XJ+TruZ63BLPR+mo0MVoa1oKDqmK7fki+CCp3Tsp68FgFuAVpfNFxSxPLgZyCWwe6rSrf1cXJVkdqNaEmLuPp5mt0QJyUtT9TQmZ6alHxMsOKvPrdduTS1BobkJmBYZs5IgAL43mBTVoIYi16aPBn2WgqQaPrqYgpFFkgtmerhA== 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=vqADdIU7p0qoveQziMCbxhL4s7zmTPmZN8bowufdUhY=; b=oYrgVb4bsHk30akq8jExzAFrxK6Mv6qwT1Uld8CmcRxLLjA30eIIzaGU9QZi0mJ3K1paVgOPAzyoMCy7nrvTiEOj6JdGyITgM4L9BpiTnwe99vgIG4qbJ3IVEql4RVk1R8vIemtImp3KLGk1wnowD63NXMhRrlzxDSKzb/v3dCw9F3AfuNsXw5pWe9nhjILMLepwnejPQLM83mOvKrBOFQTzjz+TLxvNtmApXLqIJBhx3fuAALHcX9t8UfDVrl5TVQjmW8t84RkE4m17vH0GTcEL2ScwBGs119NmiXuZy+6ChH3StPBU9jHFbefLUj/pSzVQd3hSiMiUIVy2fxaZPA== 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=vqADdIU7p0qoveQziMCbxhL4s7zmTPmZN8bowufdUhY=; b=PBiMPDlTBARINWPAgSri6XLL+k6JaW8yGbO9Tso4GGNcCEAN0PmkZZBtQ9iIsXahOGx6vA5n5zWtisxxLr8i4KtiJgfpmCewRxIoTQKzVplml9E5wGXBJ3FL0iFHYD1qlspvaSmmY5unWTGMlxiFhoEMdlTwMKuZ5kEZSJUNE2aKsipN7AjM15pIRA2X/3r1RpBDTN8oKaALElTS/rWlQiBQZ9dR0/o+iHKsursNUCkKYJGBle6VGRgvn6oNGd4FXsIx2ZF+Au/5O9aXgi0jS+ZBX60CGo7hHEtJ75th0UfuG2HbcrF6a1Gl7QmJlv6g+zqN5CVy4LpIKZGusRBhhg== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by PR3P250MB0131.EURP250.PROD.OUTLOOK.COM (2603:10a6:102:176::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7677.28; Sat, 15 Jun 2024 17:17:43 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614%5]) with mapi id 15.20.7677.026; Sat, 15 Jun 2024 17:17:43 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 15 Jun 2024 19:16:49 +0200 Message-ID: X-Mailer: git-send-email 2.40.1 In-Reply-To: References: X-TMN: [Qrd/leehYKuuLLjn9iVKrN7IrO6BsvoPsQ7lXAscXu8=] X-ClientProxiedBy: ZR0P278CA0099.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:23::14) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: <20240615171650.3721642-5-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|PR3P250MB0131:EE_ X-MS-Office365-Filtering-Correlation-Id: cad2a3b8-deca-4e6c-aea2-08dc8d5f1155 X-Microsoft-Antispam: BCL:0; ARA:14566002|461199025|440099025|3412199022|1710799023; X-Microsoft-Antispam-Message-Info: a9lKicfySnmOeLBow/Ctt+IPxoNxDgiAjPSxaImZyuezpsrPIJoO6qOb78iyQ9drTkRpjQbxpjZ7T3UaliRc23biNojw0cko0Uo+37nTwhT8ZoEaAbvD5cE5uRwE8bEuz7HJufQXyBl1nGSoDzShQl92a9Xem4qSIXbkq0/4Y1dqWEAWmQXeaIHr+SBgsC38UpxskFbsUostjmsCgoRwKfq1/78tvGzmanXkmncLKn4Vaz90ZnyhpZbx/9gL04pHfYI9JO1yJ6KZ9GZSHDZhUH4Kvqrn1K+zJldS8LoAQkOFXMkW0Cf8vNPL3AzfDIebF8OQDoFw6Wxt2NNWlsMhbTxpMpBLWoH2siTBZMHoNpEMLnZpmkQzFSFqqm7zXTQXkw868wn+T8tY2ZjZ0Y7qlYa259Z5GRzdQD6ELglky2zf35GsDYzuwpqYI4yS08ApYOzKDirj2tTEUyr/0WYcGoLFJby6SQyDjFqRRfcJ0Ae4ffhPWEynJyoEKbpLjoig/Oi7/7yu0R4Hmsl4AkX9WGEoidE/O4xMw5UixOsG4oW0gf0vIbD0BZYGJM/B16Hf6gP9gxtSb1WTXNYHKkCafOBgUfHaGktRxBCflQD1H5+g4gTwDCdvrlptBDRtPThT X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?uZDlGaMMQ8Eam/xgamEAy7msgJyh6QLTz50zNDZn1SzXO5r9z+gfG771JRq3?= =?us-ascii?Q?piRjW2d3sAEKi2b0N4xh7XIfCLrrE2eWD9jor2FCu80eAFoUSJ6XZDdLoY8Y?= =?us-ascii?Q?fom4IaAD1U9nO6f0j/Ailo01lAw9Bbk1jwC7/yyr1wPh5t/+ACBlwwCH5I8m?= =?us-ascii?Q?iQyQdD2iPg4agAb8/Eq5XDz2E455Wg+T2kXIQL9gIzLFbgH+bDvIN7DT/X+p?= =?us-ascii?Q?d0DhaVUJr7+yhvbA+KxK482MvhRngCn6C4epi4jI4XDmANtvTdEmNSSWJjJh?= =?us-ascii?Q?zbInwWEEwy2vxdOZ8AahLxfiWK+clMBa4zEUtPqCdgNqo5qq9PcZyUU6Cf+3?= =?us-ascii?Q?UxjAbHallHsQJfLdq5ClbgOaDi/jdeQFh3hK2JVOKFHmIKAlz/jLBlNDjn7w?= =?us-ascii?Q?CSOcFuddf4m3EF1+zpnEDvo0Ty990KZ3YUSsZTkFz8cymcfaVwc41YIybNBF?= =?us-ascii?Q?0P9xbwKaNBTxxSRUFxjJpUO7q6nIU6f20/oyAuMstd0dEbKV6EYv2djyy/Kd?= =?us-ascii?Q?Vl8JqKhJtO5BEOjKhFflZlAOJ1lvbPZSabhzHiLPyVZdqRpv47OKK99wI/1K?= =?us-ascii?Q?sEf89Xb4PlNWYW/+F/veiAyQ9Zwp4uwReYoXMcWP/JsQwEAzJckZLgYO5wCR?= =?us-ascii?Q?wHKkbfXjobPoa5DOr4uL2IsyQI2HZeUZPMWWdBCitdYJ7/anLrSUC8fibSGt?= =?us-ascii?Q?zxnQU1hPbTo+C9usDjFvqBcuJqeOXQq53mFM10WNljQE/tjsoFPgpVwZ57Lz?= =?us-ascii?Q?Uofhauf2ZmwJltuIwtnvTBVNYIJ9EN7rruVObbCV83/mJWsbbNy+kXa+pTWM?= =?us-ascii?Q?2hx5o/hd66K3dX+FwDk8NbWodrHtJm99jDSYXQy1B1TUL5gevOoTJFNKCoRU?= =?us-ascii?Q?1wmp5EXjAwQuLamtKlDV/YZ6YRDZ3JZlwhULBMzaKI73wYFpsvf/PZ6G4gXJ?= =?us-ascii?Q?el8iiqz1ZKuhXTi6ZhtI2s4PqgmUVjf5MrCp5kd5rMKFsoZ3aW91B+dpY18n?= =?us-ascii?Q?A+wOVVZ0FUO3UNrZrOYPuDtZbJt4eerO1bW4VTfjGGvFSYaehlEzZDRZaEbx?= =?us-ascii?Q?hf+/cYd6EO8ibTsxXSFF0kj2ORJxtb/KtZ/6cbEeYSO4QOBpyl7/vh9tIiGz?= =?us-ascii?Q?CZHrwwFyNA+BzaXf8Q2raUDEKrwQJ8KgGv2ZbT7BEkDAL2eY1cNn3RgGSHzp?= =?us-ascii?Q?/4tHMLwXNh5RR8VzYJdXJLp7w5u0UmpCAi9SIRE8IsrY8MSthrrzTomLxGHi?= =?us-ascii?Q?J8Uw3ToR38h89LY75TwTo1u8pxidBbY1ShZb80xJXg=3D=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: cad2a3b8-deca-4e6c-aea2-08dc8d5f1155 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Jun 2024 17:17:43.3867 (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: PR3P250MB0131 Subject: [FFmpeg-devel] [PATCH 72/73] avcodec/h261enc: Avoid RLTable when writing macroblock 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: The RLTable API in rl.c is not well designed for codecs with an explicit end-of-block code. ff_h261_rl_tcoeff's vlc has the EOB code as first element (presumably so that the decoder can check for it via "if (level == 0)") and this implies that the indices returned by get_rl_index() are off by one for run == 0 which is therefore explicitly checked. This commit changes this by adding a simple LUT for the values not requiring escaping. It is easy to directly include the sign bit into this, so this has also been done. Signed-off-by: Andreas Rheinhardt --- libavcodec/h261enc.c | 51 +++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/libavcodec/h261enc.c b/libavcodec/h261enc.c index 8e08c749d1..b19830d578 100644 --- a/libavcodec/h261enc.c +++ b/libavcodec/h261enc.c @@ -36,6 +36,14 @@ #include "h261enc.h" #include "mpegvideoenc.h" +#define H261_MAX_RUN 26 +#define H261_MAX_LEVEL 15 + +static struct VLCLUT { + uint8_t len; + uint16_t code; +} vlc_lut[H261_MAX_RUN + 1][32 /* 0..2 * H261_MAX_LEN are used */]; + static uint8_t uni_h261_rl_len [64*64*2*2]; #define UNI_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level)) @@ -165,10 +173,8 @@ static inline int get_cbp(MpegEncContext *s, int16_t block[6][64]) static void h261_encode_block(H261EncContext *h, int16_t *block, int n) { MpegEncContext *const s = &h->s; - int level, run, i, j, last_index, last_non_zero, sign, slevel, code; - const RLTable *rl; + int level, run, i, j, last_index, last_non_zero; - rl = &ff_h261_rl_tcoeff; if (s->mb_intra) { /* DC coef */ level = block[0]; @@ -204,24 +210,18 @@ static void h261_encode_block(H261EncContext *h, int16_t *block, int n) level = block[j]; if (level) { run = i - last_non_zero - 1; - sign = 0; - slevel = level; - if (level < 0) { - sign = 1; - level = -level; - } - code = get_rl_index(rl, 0 /*no last in H.261, EOB is used*/, - run, level); - if (run == 0 && level < 16) - code += 1; - put_bits(&s->pb, rl->table_vlc[code][1], rl->table_vlc[code][0]); - if (code == rl->n) { - put_bits(&s->pb, 6, run); - av_assert1(slevel != 0); - av_assert1(level <= 127); - put_sbits(&s->pb, 8, slevel); + + if (run <= H261_MAX_RUN && + (unsigned)(level + H261_MAX_LEVEL) <= 2 * H261_MAX_LEVEL && + vlc_lut[run][level + H261_MAX_LEVEL].len) { + put_bits(&s->pb, vlc_lut[run][level + H261_MAX_LEVEL].len, + vlc_lut[run][level + H261_MAX_LEVEL].code); } else { - put_bits(&s->pb, 1, sign); + /* Escape */ + put_bits(&s->pb, 6 + 6, (1 << 6) | run); + av_assert1(level != 0); + av_assert1(FFABS(level) <= 127); + put_sbits(&s->pb, 8, level); } last_non_zero = i; } @@ -365,6 +365,17 @@ static av_cold void h261_encode_init_static(void) ff_rl_init(&ff_h261_rl_tcoeff, h261_rl_table_store); init_uni_h261_rl_tab(&ff_h261_rl_tcoeff, uni_h261_rl_len); + + // The following loop is over the ordinary elements, not EOB or escape. + for (size_t i = 1; i < FF_ARRAY_ELEMS(ff_h261_tcoeff_vlc) - 1; i++) { + unsigned run = ff_h261_tcoeff_run[i]; + unsigned level = ff_h261_tcoeff_level[i]; + unsigned len = ff_h261_tcoeff_vlc[i][1] + 1 /* sign */; + unsigned code = ff_h261_tcoeff_vlc[i][0]; + + vlc_lut[run][H261_MAX_LEVEL + level] = (struct VLCLUT){ len, code << 1 }; + vlc_lut[run][H261_MAX_LEVEL - level] = (struct VLCLUT){ len, (code << 1) | 1 }; + } } av_cold int ff_h261_encode_init(MpegEncContext *s) -- 2.40.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".