[FFmpeg-cvslog] avcodec/ituh263enc: Simplify creating LUT
Andreas Rheinhardt
git at videolan.org
Thu Jul 3 21:55:09 EEST 2025
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Sun Jun 15 01:26:54 2025 +0200| [8a3566498e57d44e56c69f1f82b2ce58f5a79a83] | committer: Andreas Rheinhardt
avcodec/ituh263enc: Simplify creating LUT
Only very few combinations (2x102) of 16384 correspond to
valid codes; so just initialize all codes via memset
and then set the few valid codes explicitly instead of initializing
everything in the same way.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8a3566498e57d44e56c69f1f82b2ce58f5a79a83
---
libavcodec/h263data.h | 4 ++++
libavcodec/ituh263enc.c | 54 ++++++++++++++++++++-----------------------------
2 files changed, 26 insertions(+), 32 deletions(-)
diff --git a/libavcodec/h263data.h b/libavcodec/h263data.h
index 06554bdf0d..e733089e83 100644
--- a/libavcodec/h263data.h
+++ b/libavcodec/h263data.h
@@ -59,6 +59,10 @@ extern const uint16_t ff_inter_vlc[103][2];
extern const int8_t ff_inter_level[102];
extern const int8_t ff_inter_run[102];
+/* the following defines are valid for both ff_h263_rl_inter and ff_rl_intra_aic */
+#define H263_RL_NB_ELEMS 102 // does not include escape
+#define H263_RL_NON_LAST_CODES 58
+#define H263_ESCAPE_CODE_LENGTH 7
extern RLTable ff_h263_rl_inter;
extern RLTable ff_rl_intra_aic;
diff --git a/libavcodec/ituh263enc.c b/libavcodec/ituh263enc.c
index 903bb45fce..4ec851cab9 100644
--- a/libavcodec/ituh263enc.c
+++ b/libavcodec/ituh263enc.c
@@ -99,41 +99,31 @@ static uint8_t uni_h263_inter_rl_len [64*64*2*2];
static av_cold void init_uni_h263_rl_tab(const RLTable *rl, uint8_t *len_tab)
{
+ const uint16_t (*table_vlc)[2] = rl->table_vlc;
+ const uint8_t *table_run = rl->table_run;
+ const uint8_t *table_level = rl->table_level;
+
av_assert0(MAX_LEVEL >= 64);
av_assert0(MAX_RUN >= 63);
- for (int slevel = -64; slevel < 64; slevel++) {
- if (slevel == 0) continue;
- for (int run = 0; run < 64; run++) {
- for (int last = 0; last <= 1; last++) {
- const int index = UNI_MPEG4_ENC_INDEX(last, run, slevel + 64);
- int level = slevel < 0 ? -slevel : slevel;
- int sign = slevel < 0 ? 1 : 0;
- int bits, len, code;
-
- len_tab[index] = 100;
-
- /* ESC0 */
- code = get_rl_index(rl, last, run, level);
- bits = rl->table_vlc[code][0];
- len = rl->table_vlc[code][1];
- bits = bits * 2 + sign;
- len++;
-
- if (code != rl->n && len < len_tab[index])
- len_tab[index] = len;
-
- /* ESC */
- bits = rl->table_vlc[rl->n][0];
- len = rl->table_vlc[rl->n][1];
- bits = bits * 2 + last; len++;
- bits = bits * 64 + run; len += 6;
- bits = bits * 256 + (level & 0xff); len += 8;
-
- if (len < len_tab[index])
- len_tab[index] = len;
- }
- }
+ // Note: The LUT only covers level values for which the escape value
+ // is eight bits (not 8 + 5 + 6)
+ memset(len_tab, H263_ESCAPE_CODE_LENGTH + 1 + 6 + 8,
+ sizeof(uni_h263_intra_aic_rl_len));
+
+ len_tab += 64; // simplifies addressing
+ for (int i = 0; i < H263_RL_NB_ELEMS; ++i) {
+ int run = table_run[i];
+ int level = table_level[i];
+ int last = i >= H263_RL_NON_LAST_CODES;
+ int len = table_vlc[i][1];
+
+ len_tab[UNI_MPEG4_ENC_INDEX(last, run, level)] =
+ len_tab[UNI_MPEG4_ENC_INDEX(last, run, -level)] = len + 1 /* sign */;
+ }
+ for (int run = 0; run < MAX_RUN; ++run) {
+ len_tab[UNI_MPEG4_ENC_INDEX(0, run, 0)] =
+ len_tab[UNI_MPEG4_ENC_INDEX(1, run, 0)] = 0; // is this necessary?
}
}
#endif
More information about the ffmpeg-cvslog
mailing list