From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
To: ffmpeg-devel@ffmpeg.org
Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Subject: [FFmpeg-devel] [PATCH 72/73] avcodec/h261enc: Avoid RLTable when writing macroblock
Date: Sat, 15 Jun 2024 19:16:49 +0200
Message-ID: <GV1P250MB073717CE73BD6B8F5548620E8FC32@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM> (raw)
In-Reply-To: <GV1P250MB073785E3B3B4EEEE52B2FC1E8FC02@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM>
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 <andreas.rheinhardt@outlook.com>
---
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".
next prev parent reply other threads:[~2024-06-15 17:17 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-12 13:16 [FFmpeg-devel] [PATCH 01/57] avcodec/vc1: Combine identical checks Andreas Rheinhardt
2024-06-12 13:47 ` [FFmpeg-devel] [PATCH 02/57] avcodec/mpegvideo_enc: Avoid branches for flipping no_rounding Andreas Rheinhardt
2024-06-12 13:47 ` [FFmpeg-devel] [PATCH 03/57] avcodec/mpegvideo: Don't pretend dct_init can fail Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 04/57] avcodec/mpegvideo: Set dct_unquantize earlier Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 05/57] avcodec/mpegvideo_dec: Set dct_unquantize ptrs only once when possible Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 06/57] configure: Remove obsolete mpeg4_decoder->mpeg4video_parser dependency Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 07/57] avcodec/mpegutils: Remap MB_TYPE_ACPRED, add codec-specific MB_TYPE Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 08/57] avcodec/mpegutils: Remap MB_TYPE_{GMC, SKIP, CBP, QUANT} Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 09/57] avcodec/h261dec: Use VLC symbol table Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 10/57] avcodec/h261dec: Remove nonsense information from error message Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 11/57] avcodec/mpegutils: Remove always-false check Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 12/57] avcodec/mpegutils: Don't use MB_TYPE_L[01] for mpegvideo Andreas Rheinhardt
2024-06-13 8:23 ` Michael Niedermayer
2024-06-13 8:49 ` Andreas Rheinhardt
2024-06-13 9:56 ` Michael Niedermayer
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 13/57] avcodec/mpegutils: Move H.264-only macros to h264dec.h Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 14/57] avcodec/mpeg4videodec: Use VLC symbol table Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 15/57] avcodec/mpeg12dec: " Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 16/57] avcodec/ituh263dec: " Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 17/57] avcodec/mpegvideo_enc: Avoid excessive inlining Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 18/57] avcodec/mpegvideo_enc: Check for existence of ildct cmp functions Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 19/57] avcodec/dvenc: Check for availability of interlaced dct cmp func Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 20/57] avcodec/motion_est: Factor one-time initialization out of ff_init_me Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 21/57] avcodec/me_cmp: Constify ff_set_cmp() Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 22/57] avcodec/me_cmp, motion_est: Move me_(pre_)?_cmp etc. to MotionEstContext Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 23/57] avcodec/me_cmp, mpegvideo: Move frame_skip_cmp to MpegEncContext Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 24/57] avcodec/me_cmp, dvenc, mpegvideo: Move ildct_cmp to its users Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 25/57] avcodec/me_cmp, motion_est: Sanitize permissible cmp_funcs Andreas Rheinhardt
2024-06-13 7:49 ` Michael Niedermayer
2024-06-13 9:37 ` Andreas Rheinhardt
2024-06-13 21:11 ` Michael Niedermayer
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 26/57] avcodec/motion_est: Store remaining required me_cmp_funcs Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 27/57] avcodec/me_cmp: Zero MECmpContext in ff_me_cmp_init() Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 28/57] avcodec/mpegvideo_enc: Avoid branch for sse vs nsse cmp Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 29/57] avcodec/mpegvideo_enc: Only keep what is used from MECmpContext Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 30/57] avcodec/mpegvideo_enc: Initialize qscale tab for all codecs Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 31/57] avcodec/mpegvideo_enc: Don't update qscale unnecessarily Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 32/57] avcodec/mpegutils: Fix ff_draw_horiz_band() Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 33/57] avcodec/mpv_reconstruct_mb_template: Don't unnecessarily copy data Andreas Rheinhardt
2024-06-13 7:36 ` Michael Niedermayer
2024-06-13 8:50 ` Andreas Rheinhardt
2024-06-13 21:19 ` Michael Niedermayer
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 34/57] avcodec/mpeg12dec: Disable allocating scratchpad buffers when possible Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 35/57] avcodec/mpegvideo_dec: Don't alloc framesize-bufs in update_thread_ctx Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 36/57] avcodec/mpegvideo_dec: Don't keep droppable in sync " Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 37/57] avcodec/mpegutils: Don't output wrong mb skip values Andreas Rheinhardt
2024-06-13 7:27 ` Michael Niedermayer
2024-06-17 11:08 ` Andreas Rheinhardt
2024-06-18 22:08 ` Michael Niedermayer
2024-06-19 13:54 ` Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 38/57] avcodec/svq1enc: Stop copying PutBitContext unnecessarily Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 39/57] avcodec/ituh263enc: Inline constants Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 40/57] avcodec/h263enc: Remove no-output code Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 41/57] avcodec/mpeg4videodec: Inline constants Andreas Rheinhardt
2024-06-13 7:16 ` Michael Niedermayer
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 42/57] avcodec/mpeg4videodec: Don't initialize unused stuff Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 43/57] avcodec/vc1_block: Remove unnecessary assignments Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 44/57] avcodec/vc1_block: Simplify resetting coded_block Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 45/57] avcodec/mpeg4videodec: Remove always-false check Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 46/57] avcodec/mpeg12enc: Use AVCodecContext, not priv ctx as logctx Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 47/57] avcodec/mpeg12enc: Pass AVCodecContext* directly Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 48/57] avcodec/msmpeg4enc: Combine writing bits Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 49/57] avcodec/h261dec: Don't reset gob_start_code_skipped in h261_decode_init() Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 50/57] avcodec/h261dec: Fix UB NULL + 0, remove broken resync code Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 51/57] avcodec/h261dec: Simplify decoding GOB header Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 52/57] avcodec/mpv_reconstruct_mb_template: Optimize always-true branch away Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 53/57] avcodec/mpegvideo_dec: Remove unnecessary FFMIN Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 54/57] avcodec/mpegvideo: Join loops when initializing ScanTable Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 55/57] avcodec/mpv_reconstruct_mb_template: Optimize WMV2 code away if possible Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 56/57] avcodec/mpeg4videodec: Don't initialize unused inter_scantable Andreas Rheinhardt
2024-06-12 13:48 ` [FFmpeg-devel] [PATCH 57/57] avcodec/mpeg_er: Don't set block_index unnecessarily Andreas Rheinhardt
2024-06-14 18:25 ` [FFmpeg-devel] [PATCH 58/67] avcodec/h261enc, msmpeg4: Avoid setting dc_scale_tables unnecessarily Andreas Rheinhardt
2024-06-14 18:25 ` [FFmpeg-devel] [PATCH 59/67] avcodec/h261dec: Unquantize coefficients while parsing them Andreas Rheinhardt
2024-06-14 18:25 ` [FFmpeg-devel] [PATCH 60/67] avcodec/h261dec: Simplify decoding motion vectors Andreas Rheinhardt
2024-06-14 18:25 ` [FFmpeg-devel] [PATCH 61/67] avcodec/h261dec: Don't set framerate multiple times Andreas Rheinhardt
2024-06-14 18:25 ` [FFmpeg-devel] [PATCH 62/67] avcodec/rv10: Remove write-only assignments Andreas Rheinhardt
2024-06-14 18:25 ` [FFmpeg-devel] [PATCH 63/67] avcodec/mpeg_er: Simplify disabling IDCT Andreas Rheinhardt
2024-06-14 18:25 ` [FFmpeg-devel] [PATCH 64/67] avcodec/rv10: Use ff_h263_decode_init() Andreas Rheinhardt
2024-06-14 18:25 ` [FFmpeg-devel] [PATCH 65/67] avcodec/mpegvideo: Move quant_precision to Mpeg4DecContext Andreas Rheinhardt
2024-06-14 18:25 ` [FFmpeg-devel] [PATCH 66/67] avcodec/rv10: Avoid indirection Andreas Rheinhardt
2024-06-14 18:25 ` [FFmpeg-devel] [PATCH 67/67] avcodec/mpegvideo_dec: Move setting dct_unquant funcs to h263dec.c Andreas Rheinhardt
2024-06-15 17:16 ` [FFmpeg-devel] [PATCH 68/73] avcodec/h261enc: Inline constants Andreas Rheinhardt
2024-06-15 17:16 ` [FFmpeg-devel] [PATCH 69/73] avcodec/motion_est: Optimize dead code away Andreas Rheinhardt
2024-06-15 17:16 ` [FFmpeg-devel] [PATCH 70/73] avcodec/mpegvideo_enc: Constify pointers to static storage Andreas Rheinhardt
2024-06-15 17:16 ` [FFmpeg-devel] [PATCH 71/73] avcodec/h261data: Make some tables non-static Andreas Rheinhardt
2024-06-15 17:16 ` Andreas Rheinhardt [this message]
2024-06-15 17:16 ` [FFmpeg-devel] [PATCH 73/73] avcodec/h261enc: Fix ac_vlc_length tables Andreas Rheinhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=GV1P250MB073717CE73BD6B8F5548620E8FC32@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM \
--to=andreas.rheinhardt@outlook.com \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git