1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

avcodec/hqx: Cache pointer to used dc table

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2025-03-13 22:17:03 +01:00
parent 5dd83ecfb2
commit 004367a0a3
2 changed files with 17 additions and 17 deletions

View File

@ -68,7 +68,9 @@ typedef struct HQXContext {
unsigned int data_size; unsigned int data_size;
uint32_t slice_off[17]; uint32_t slice_off[17];
VLC dc_vlc[3]; const VLCElem *dc_vlc;
VLC dc_vlcs[3];
} HQXContext; } HQXContext;
#define HQX_HEADER_SIZE 59 #define HQX_HEADER_SIZE 59
@ -140,7 +142,7 @@ static inline void hqx_get_ac(GetBitContext *gb, const HQXAC *ac,
*lev = level; *lev = level;
} }
static int decode_block(GetBitContext *gb, VLC *vlc, static int decode_block(GetBitContext *gb, const VLCElem vlc[],
const int *quants, int dcb, const int *quants, int dcb,
int16_t block[64], int *last_dc) int16_t block[64], int *last_dc)
{ {
@ -149,7 +151,7 @@ static int decode_block(GetBitContext *gb, VLC *vlc,
int run, lev, pos = 0; int run, lev, pos = 0;
memset(block, 0, 64 * sizeof(*block)); memset(block, 0, 64 * sizeof(*block));
dc = get_vlc2(gb, vlc->table, HQX_DC_VLC_BITS, 2); dc = get_vlc2(gb, vlc, HQX_DC_VLC_BITS, 2);
*last_dc += dc; *last_dc += dc;
block[0] = sign_extend(*last_dc << (12 - dcb), 12); block[0] = sign_extend(*last_dc << (12 - dcb), 12);
@ -196,10 +198,9 @@ static int hqx_decode_422(HQXContext *ctx, int slice_no, int x, int y)
quants = hqx_quants[get_bits(gb, 4)]; quants = hqx_quants[get_bits(gb, 4)];
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
int vlc_index = ctx->dcb - 9;
if (i == 0 || i == 4 || i == 6) if (i == 0 || i == 4 || i == 6)
last_dc = 0; last_dc = 0;
ret = decode_block(gb, &ctx->dc_vlc[vlc_index], quants, ret = decode_block(gb, ctx->dc_vlc, quants,
ctx->dcb, slice->block[i], &last_dc); ctx->dcb, slice->block[i], &last_dc);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -244,8 +245,7 @@ static int hqx_decode_422a(HQXContext *ctx, int slice_no, int x, int y)
if (i == 0 || i == 4 || i == 8 || i == 10) if (i == 0 || i == 4 || i == 8 || i == 10)
last_dc = 0; last_dc = 0;
if (cbp & (1 << i)) { if (cbp & (1 << i)) {
int vlc_index = ctx->dcb - 9; ret = decode_block(gb, ctx->dc_vlc, quants,
ret = decode_block(gb, &ctx->dc_vlc[vlc_index], quants,
ctx->dcb, slice->block[i], &last_dc); ctx->dcb, slice->block[i], &last_dc);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -280,10 +280,9 @@ static int hqx_decode_444(HQXContext *ctx, int slice_no, int x, int y)
quants = hqx_quants[get_bits(gb, 4)]; quants = hqx_quants[get_bits(gb, 4)];
for (i = 0; i < 12; i++) { for (i = 0; i < 12; i++) {
int vlc_index = ctx->dcb - 9;
if (i == 0 || i == 4 || i == 8) if (i == 0 || i == 4 || i == 8)
last_dc = 0; last_dc = 0;
ret = decode_block(gb, &ctx->dc_vlc[vlc_index], quants, ret = decode_block(gb, ctx->dc_vlc, quants,
ctx->dcb, slice->block[i], &last_dc); ctx->dcb, slice->block[i], &last_dc);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -327,8 +326,7 @@ static int hqx_decode_444a(HQXContext *ctx, int slice_no, int x, int y)
if (i == 0 || i == 4 || i == 8 || i == 12) if (i == 0 || i == 4 || i == 8 || i == 12)
last_dc = 0; last_dc = 0;
if (cbp & (1 << i)) { if (cbp & (1 << i)) {
int vlc_index = ctx->dcb - 9; ret = decode_block(gb, ctx->dc_vlc, quants,
ret = decode_block(gb, &ctx->dc_vlc[vlc_index], quants,
ctx->dcb, slice->block[i], &last_dc); ctx->dcb, slice->block[i], &last_dc);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -434,7 +432,7 @@ static int hqx_decode_frame(AVCodecContext *avctx, AVFrame *frame,
HQXContext *ctx = avctx->priv_data; HQXContext *ctx = avctx->priv_data;
const uint8_t *src = avpkt->data; const uint8_t *src = avpkt->data;
uint32_t info_tag; uint32_t info_tag;
int data_start; int data_start, dcb_code;
int i, ret; int i, ret;
if (avpkt->size < 4 + 4) { if (avpkt->size < 4 + 4) {
@ -473,16 +471,18 @@ static int hqx_decode_frame(AVCodecContext *avctx, AVFrame *frame,
} }
ctx->interlaced = !(src[2] & 0x80); ctx->interlaced = !(src[2] & 0x80);
ctx->format = src[2] & 7; ctx->format = src[2] & 7;
ctx->dcb = (src[3] & 3) + 8; dcb_code = src[3] & 3;
ctx->width = AV_RB16(src + 4); ctx->width = AV_RB16(src + 4);
ctx->height = AV_RB16(src + 6); ctx->height = AV_RB16(src + 6);
for (i = 0; i < 17; i++) for (i = 0; i < 17; i++)
ctx->slice_off[i] = AV_RB24(src + 8 + i * 3); ctx->slice_off[i] = AV_RB24(src + 8 + i * 3);
if (ctx->dcb == 8) { if (dcb_code == 0) {
av_log(avctx, AV_LOG_ERROR, "Invalid DC precision %d.\n", ctx->dcb); av_log(avctx, AV_LOG_ERROR, "Invalid DC precision 8.\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
ctx->dc_vlc = ctx->dc_vlcs[dcb_code - 1].table;
ctx->dcb = dcb_code + 8;
ret = av_image_check_size(ctx->width, ctx->height, 0, avctx); ret = av_image_check_size(ctx->width, ctx->height, 0, avctx);
if (ret < 0) { if (ret < 0) {
av_log(avctx, AV_LOG_ERROR, "Invalid stored dimensions %dx%d.\n", av_log(avctx, AV_LOG_ERROR, "Invalid stored dimensions %dx%d.\n",
@ -543,7 +543,7 @@ static av_cold int hqx_decode_close(AVCodecContext *avctx)
HQXContext *ctx = avctx->priv_data; HQXContext *ctx = avctx->priv_data;
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
ff_vlc_free(&ctx->dc_vlc[i]); ff_vlc_free(&ctx->dc_vlcs[i]);
} }
return 0; return 0;

View File

@ -1533,7 +1533,7 @@ static VLCElem cbp_vlc[(1 << HQX_CBP_VLC_BITS) + 15630 /* RL_VLC_ELEMS for hqx_a
#define INIT_DC_TABLE(idx, name) \ #define INIT_DC_TABLE(idx, name) \
do { \ do { \
ret = vlc_init(&ctx->dc_vlc[idx], HQX_DC_VLC_BITS, \ ret = vlc_init(&ctx->dc_vlcs[idx], HQX_DC_VLC_BITS, \
FF_ARRAY_ELEMS(name ## _vlc_lens), \ FF_ARRAY_ELEMS(name ## _vlc_lens), \
name ## _vlc_lens, 1, 1, \ name ## _vlc_lens, 1, 1, \
name ## _vlc_bits, 2, 2, 0); \ name ## _vlc_bits, 2, 2, 0); \