ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinha...@outlook.com> | 
Thu Mar 13 21:43:37 2025 +0100| [997b33f64c98f3a195d19e2121c61907549313fc] | 
committer: Andreas Rheinhardt

avcodec/hqxvlc: Make dc9, dc10 VLC tables static

It allows to share them between frame threads.
dc11 can unfortunately not be made static without increasing
LOCALBUF_ELEMS in vlc.c.

Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=997b33f64c98f3a195d19e2121c61907549313fc
---

 libavcodec/hqx.c    | 17 +++++++----------
 libavcodec/hqxvlc.h | 18 +++++++++++-------
 2 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/libavcodec/hqx.c b/libavcodec/hqx.c
index aab28a2156..e5a727a609 100644
--- a/libavcodec/hqx.c
+++ b/libavcodec/hqx.c
@@ -70,7 +70,7 @@ typedef struct HQXContext {
 
     const VLCElem *dc_vlc;
 
-    VLC dc_vlcs[3];
+    VLC dc11_vlc;
 } HQXContext;
 
 #define HQX_HEADER_SIZE 59
@@ -481,7 +481,7 @@ static int hqx_decode_frame(AVCodecContext *avctx, AVFrame 
*frame,
         av_log(avctx, AV_LOG_ERROR, "Invalid DC precision 8.\n");
         return AVERROR_INVALIDDATA;
     }
-    ctx->dc_vlc = ctx->dc_vlcs[dcb_code - 1].table;
+    ctx->dc_vlc = dcb_code == 3 ? ctx->dc11_vlc.table : dc_vlc[dcb_code - 1];
     ctx->dcb    = dcb_code + 8;
     ret = av_image_check_size(ctx->width, ctx->height, 0, avctx);
     if (ret < 0) {
@@ -539,12 +539,9 @@ static int hqx_decode_frame(AVCodecContext *avctx, AVFrame 
*frame,
 
 static av_cold int hqx_decode_close(AVCodecContext *avctx)
 {
-    int i;
     HQXContext *ctx = avctx->priv_data;
 
-    for (i = 0; i < 3; i++) {
-        ff_vlc_free(&ctx->dc_vlcs[i]);
-    }
+    ff_vlc_free(&ctx->dc11_vlc);
 
     return 0;
 }
@@ -553,11 +550,11 @@ static av_cold int hqx_decode_init(AVCodecContext *avctx)
 {
     static AVOnce init_static_once = AV_ONCE_INIT;
     HQXContext *ctx = avctx->priv_data;
-    int ret;
+    int ret = vlc_init(&ctx->dc11_vlc, HQX_DC_VLC_BITS, 
FF_ARRAY_ELEMS(dc11_vlc_lens),
+                       dc11_vlc_lens, 1, 1, dc11_vlc_bits, 2, 2, 0);
 
-    INIT_DC_TABLE(0, dc9);
-    INIT_DC_TABLE(1, dc10);
-    INIT_DC_TABLE(2, dc11);
+    if (ret < 0)
+        return ret;
 
     ff_hqxdsp_init(&ctx->hqxdsp);
 
diff --git a/libavcodec/hqxvlc.h b/libavcodec/hqxvlc.h
index 4bdc3cd191..28c55b20e0 100644
--- a/libavcodec/hqxvlc.h
+++ b/libavcodec/hqxvlc.h
@@ -1529,16 +1529,17 @@ static const uint8_t hqx_ac_lens[] = {
 
 static const uint16_t hqx_ac_nb_elems[] = { 815, 907, 512, 354, 257, 194 };
 
-static VLCElem cbp_vlc[(1 << HQX_CBP_VLC_BITS) + 15630 /* RL_VLC_ELEMS for 
hqx_ac */];
+static VLCElem cbp_vlc[(1 << HQX_CBP_VLC_BITS) + 896 /* dc9 */ + 1344 /* dc10 
*/
+                       + 15630 /* RL_VLC_ELEMS for hqx_ac */];
+
+static const VLCElem *dc_vlc[2];
 
 #define INIT_DC_TABLE(idx, name)                                              \
     do {                                                                      \
-        ret = vlc_init(&ctx->dc_vlcs[idx], HQX_DC_VLC_BITS,                   \
-                       FF_ARRAY_ELEMS(name ## _vlc_lens),                     \
-                       name ## _vlc_lens, 1, 1,                               \
-                       name ## _vlc_bits, 2, 2, 0);                           \
-        if (ret < 0)                                                          \
-            return ret;                                                       \
+         dc_vlc[idx] = ff_vlc_init_tables(&state, HQX_DC_VLC_BITS,            \
+                                          FF_ARRAY_ELEMS(name ## _vlc_lens),  \
+                                          name ## _vlc_lens, 1, 1,            \
+                                          name ## _vlc_bits, 2, 2, 0);        \
     } while (0)
 
 static av_cold av_unused void hqx_init_static(void)
@@ -1550,6 +1551,9 @@ static av_cold av_unused void hqx_init_static(void)
     ff_vlc_init_tables(&state, HQX_CBP_VLC_BITS, FF_ARRAY_ELEMS(cbp_vlc_lens),
                        cbp_vlc_lens, 1, 1, cbp_vlc_bits, 1, 1, 0);
 
+    INIT_DC_TABLE(0, dc9);
+    INIT_DC_TABLE(1, dc10);
+
     for (int i = 0; i < NUM_HQX_AC; ++i) {
         RL_VLC_ELEM *lut = state.table;
         unsigned nb_codes = state.size;

_______________________________________________
ffmpeg-cvslog mailing list
ffmpeg-cvslog@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog

To unsubscribe, visit link above, or email
ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to