[FFmpeg-cvslog] avcodec/ituh263enc: Make SVQ1+Snowenc stop calling ff_h263_encode_init()
Andreas Rheinhardt
git at videolan.org
Fri Mar 7 16:21:34 EET 2025
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Mon Mar 3 22:32:40 2025 +0100| [607bc17b52d24adb860b2f1d29f87a1a639f56d2] | committer: Andreas Rheinhardt
avcodec/ituh263enc: Make SVQ1+Snowenc stop calling ff_h263_encode_init()
They only do it for the mv_penalty table. Factor initializating
the static tables out into a function of its own; also move
everything not needed by SVQ1 or Snow behind #if CONFIG_H263_ENCODER
(this involved moving ff_h263_encode_motion() which is used
by svq1enc).
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=607bc17b52d24adb860b2f1d29f87a1a639f56d2
---
libavcodec/h263enc.h | 2 +
libavcodec/ituh263enc.c | 247 ++++++++++++++++++++++++------------------------
libavcodec/snowenc.c | 2 +-
libavcodec/svq1enc.c | 2 +-
4 files changed, 127 insertions(+), 126 deletions(-)
diff --git a/libavcodec/h263enc.h b/libavcodec/h263enc.h
index 784500ca7a..71e30931aa 100644
--- a/libavcodec/h263enc.h
+++ b/libavcodec/h263enc.h
@@ -24,6 +24,8 @@
#include "h263data.h"
#include "mpegvideoenc.h"
+const uint8_t (*ff_h263_get_mv_penalty(void))[MAX_DMV*2+1];
+
void ff_h263_encode_init(MpegEncContext *s);
void ff_h263_encode_picture_header(MpegEncContext *s);
void ff_h263_encode_gob_header(MpegEncContext * s, int mb_line);
diff --git a/libavcodec/ituh263enc.c b/libavcodec/ituh263enc.c
index 02da090ba4..8313b2c2c1 100644
--- a/libavcodec/ituh263enc.c
+++ b/libavcodec/ituh263enc.c
@@ -65,6 +65,127 @@ static uint8_t uni_h263_inter_rl_len [64*64*2*2];
//#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run) + (level)*64)
#define UNI_MPEG4_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
+static av_cold void init_mv_penalty_and_fcode(void)
+{
+ for (int f_code = 1; f_code <= MAX_FCODE; f_code++) {
+ for (int mv = -MAX_DMV; mv <= MAX_DMV; mv++) {
+ int len;
+
+ if (mv == 0) len = 1; // ff_mvtab[0][1]
+ else {
+ int val, bit_size, code;
+
+ bit_size = f_code - 1;
+
+ val = mv;
+ if (val < 0)
+ val = -val;
+ val--;
+ code = (val >> bit_size) + 1;
+ if (code < 33) {
+ len = ff_mvtab[code][1] + 1 + bit_size;
+ } else {
+ len = 12 /* ff_mvtab[32][1] */ + av_log2(code>>5) + 2 + bit_size;
+ }
+ }
+
+ mv_penalty[f_code][mv + MAX_DMV] = len;
+ }
+ }
+
+ for (int mv = 0; mv < MAX_MV * 2 + 1; mv++)
+ umv_fcode_tab[mv]= 1;
+}
+
+static av_cold void init_uni_h263_rl_tab(const RLTable *rl, uint8_t *len_tab)
+{
+ 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;
+ }
+ }
+ }
+}
+
+static av_cold void h263_encode_init_static(void)
+{
+ static uint8_t rl_intra_table[2][2 * MAX_RUN + MAX_LEVEL + 3];
+
+ ff_rl_init(&ff_rl_intra_aic, rl_intra_table);
+ ff_h263_init_rl_inter();
+
+ init_uni_h263_rl_tab(&ff_rl_intra_aic, uni_h263_intra_aic_rl_len);
+ init_uni_h263_rl_tab(&ff_h263_rl_inter, uni_h263_inter_rl_len);
+
+ init_mv_penalty_and_fcode();
+}
+
+av_cold const uint8_t (*ff_h263_get_mv_penalty(void))[MAX_DMV*2+1]
+{
+ static AVOnce init_static_once = AV_ONCE_INIT;
+
+ ff_thread_once(&init_static_once, h263_encode_init_static);
+
+ return mv_penalty;
+}
+
+void ff_h263_encode_motion(PutBitContext *pb, int val, int f_code)
+{
+ if (val == 0) {
+ /* zero vector -- corresponds to ff_mvtab[0] */
+ put_bits(pb, 1, 1);
+ } else {
+ int sign, code, bits;
+ int bit_size = f_code - 1;
+ int range = 1 << bit_size;
+ /* modulo encoding */
+ val = sign_extend(val, 6 + bit_size);
+ sign = val>>31;
+ val= (val^sign)-sign;
+ sign&=1;
+
+ val--;
+ code = (val >> bit_size) + 1;
+ bits = val & (range - 1);
+
+ put_bits(pb, ff_mvtab[code][1] + 1, (ff_mvtab[code][0] << 1) | sign);
+ if (bit_size > 0) {
+ put_bits(pb, bit_size, bits);
+ }
+ }
+}
+
+#if CONFIG_H263_ENCODER // Snow and SVQ1 need the above
static const uint8_t wrong_run[102] = {
1, 2, 3, 5, 4, 10, 9, 8,
11, 15, 17, 16, 23, 22, 21, 20,
@@ -698,128 +819,9 @@ void ff_h263_update_mb(MpegEncContext *s)
ff_h263_update_motion_val(s);
}
-void ff_h263_encode_motion(PutBitContext *pb, int val, int f_code)
-{
- int range, bit_size, sign, code, bits;
-
- if (val == 0) {
- /* zero vector -- corresponds to ff_mvtab[0] */
- put_bits(pb, 1, 1);
- } else {
- bit_size = f_code - 1;
- range = 1 << bit_size;
- /* modulo encoding */
- val = sign_extend(val, 6 + bit_size);
- sign = val>>31;
- val= (val^sign)-sign;
- sign&=1;
-
- val--;
- code = (val >> bit_size) + 1;
- bits = val & (range - 1);
-
- put_bits(pb, ff_mvtab[code][1] + 1, (ff_mvtab[code][0] << 1) | sign);
- if (bit_size > 0) {
- put_bits(pb, bit_size, bits);
- }
- }
-}
-
-static av_cold void init_mv_penalty_and_fcode(void)
-{
- int f_code;
- int mv;
-
- for(f_code=1; f_code<=MAX_FCODE; f_code++){
- for(mv=-MAX_DMV; mv<=MAX_DMV; mv++){
- int len;
-
- if (mv==0) len = 1; // ff_mvtab[0][1]
- else{
- int val, bit_size, code;
-
- bit_size = f_code - 1;
-
- val=mv;
- if (val < 0)
- val = -val;
- val--;
- code = (val >> bit_size) + 1;
- if(code<33){
- len= ff_mvtab[code][1] + 1 + bit_size;
- }else{
- len = 12 /* ff_mvtab[32][1] */ + av_log2(code>>5) + 2 + bit_size;
- }
- }
-
- mv_penalty[f_code][mv+MAX_DMV]= len;
- }
- }
-
- for(mv=0; mv<MAX_MV*2+1; mv++){
- umv_fcode_tab[mv]= 1;
- }
-}
-
-static av_cold void init_uni_h263_rl_tab(const RLTable *rl, uint8_t *len_tab)
-{
- int slevel, run, last;
-
- av_assert0(MAX_LEVEL >= 64);
- av_assert0(MAX_RUN >= 63);
-
- for(slevel=-64; slevel<64; slevel++){
- if(slevel==0) continue;
- for(run=0; run<64; run++){
- for(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;
- }
- }
- }
-}
-
-static av_cold void h263_encode_init_static(void)
-{
- static uint8_t rl_intra_table[2][2 * MAX_RUN + MAX_LEVEL + 3];
-
- ff_rl_init(&ff_rl_intra_aic, rl_intra_table);
- ff_h263_init_rl_inter();
-
- init_uni_h263_rl_tab(&ff_rl_intra_aic, uni_h263_intra_aic_rl_len);
- init_uni_h263_rl_tab(&ff_h263_rl_inter, uni_h263_inter_rl_len);
-
- init_mv_penalty_and_fcode();
-}
-
av_cold void ff_h263_encode_init(MpegEncContext *s)
{
- static AVOnce init_static_once = AV_ONCE_INIT;
-
- s->me.mv_penalty= mv_penalty; // FIXME exact table for MSMPEG4 & H.263+
+ s->me.mv_penalty = ff_h263_get_mv_penalty(); // FIXME exact table for MSMPEG4 & H.263+
s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
s->intra_ac_vlc_last_length=s->inter_ac_vlc_last_length= uni_h263_inter_rl_len + 128*64;
@@ -862,11 +864,7 @@ av_cold void ff_h263_encode_init(MpegEncContext *s)
s->max_qcoeff= 127;
}
-#if CONFIG_H263_ENCODER // Snow and SVQ1 call this
ff_h263dsp_init(&s->h263dsp);
-#endif
-
- ff_thread_once(&init_static_once, h263_encode_init_static);
}
void ff_h263_encode_mba(MpegEncContext *s)
@@ -945,3 +943,4 @@ const FFCodec ff_h263p_encoder = {
FF_CODEC_ENCODE_CB(ff_mpv_encode_picture),
.close = ff_mpv_encode_end,
};
+#endif
diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c
index 0623c9d196..5f539a57df 100644
--- a/libavcodec/snowenc.c
+++ b/libavcodec/snowenc.c
@@ -240,7 +240,7 @@ static av_cold int encode_init(AVCodecContext *avctx)
return AVERROR(ENOMEM);
mpv->me.score_map = mpv->me.map + ME_MAP_SIZE;
- ff_h263_encode_init(mpv); //mv_penalty
+ mpv->me.mv_penalty = ff_h263_get_mv_penalty();
s->max_ref_frames = av_clip(avctx->refs, 1, MAX_REF_FRAMES);
diff --git a/libavcodec/svq1enc.c b/libavcodec/svq1enc.c
index d969be25c1..0d27a73500 100644
--- a/libavcodec/svq1enc.c
+++ b/libavcodec/svq1enc.c
@@ -631,7 +631,7 @@ static av_cold int svq1_encode_init(AVCodecContext *avctx)
ff_svq1enc_init(&s->svq1encdsp);
- ff_h263_encode_init(&s->m); // mv_penalty
+ s->m.me.mv_penalty = ff_h263_get_mv_penalty();
return write_ident(avctx, s->avctx->flags & AV_CODEC_FLAG_BITEXACT ? "Lavc" : LIBAVCODEC_IDENT);
}
More information about the ffmpeg-cvslog
mailing list