You've already forked FFmpeg
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:
@ -68,7 +68,9 @@ typedef struct HQXContext {
|
||||
unsigned int data_size;
|
||||
uint32_t slice_off[17];
|
||||
|
||||
VLC dc_vlc[3];
|
||||
const VLCElem *dc_vlc;
|
||||
|
||||
VLC dc_vlcs[3];
|
||||
} HQXContext;
|
||||
|
||||
#define HQX_HEADER_SIZE 59
|
||||
@ -140,7 +142,7 @@ static inline void hqx_get_ac(GetBitContext *gb, const HQXAC *ac,
|
||||
*lev = level;
|
||||
}
|
||||
|
||||
static int decode_block(GetBitContext *gb, VLC *vlc,
|
||||
static int decode_block(GetBitContext *gb, const VLCElem vlc[],
|
||||
const int *quants, int dcb,
|
||||
int16_t block[64], int *last_dc)
|
||||
{
|
||||
@ -149,7 +151,7 @@ static int decode_block(GetBitContext *gb, VLC *vlc,
|
||||
int run, lev, pos = 0;
|
||||
|
||||
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;
|
||||
|
||||
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)];
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
int vlc_index = ctx->dcb - 9;
|
||||
if (i == 0 || i == 4 || i == 6)
|
||||
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);
|
||||
if (ret < 0)
|
||||
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)
|
||||
last_dc = 0;
|
||||
if (cbp & (1 << i)) {
|
||||
int vlc_index = ctx->dcb - 9;
|
||||
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);
|
||||
if (ret < 0)
|
||||
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)];
|
||||
|
||||
for (i = 0; i < 12; i++) {
|
||||
int vlc_index = ctx->dcb - 9;
|
||||
if (i == 0 || i == 4 || i == 8)
|
||||
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);
|
||||
if (ret < 0)
|
||||
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)
|
||||
last_dc = 0;
|
||||
if (cbp & (1 << i)) {
|
||||
int vlc_index = ctx->dcb - 9;
|
||||
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);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@ -434,7 +432,7 @@ static int hqx_decode_frame(AVCodecContext *avctx, AVFrame *frame,
|
||||
HQXContext *ctx = avctx->priv_data;
|
||||
const uint8_t *src = avpkt->data;
|
||||
uint32_t info_tag;
|
||||
int data_start;
|
||||
int data_start, dcb_code;
|
||||
int i, ret;
|
||||
|
||||
if (avpkt->size < 4 + 4) {
|
||||
@ -473,16 +471,18 @@ static int hqx_decode_frame(AVCodecContext *avctx, AVFrame *frame,
|
||||
}
|
||||
ctx->interlaced = !(src[2] & 0x80);
|
||||
ctx->format = src[2] & 7;
|
||||
ctx->dcb = (src[3] & 3) + 8;
|
||||
dcb_code = src[3] & 3;
|
||||
ctx->width = AV_RB16(src + 4);
|
||||
ctx->height = AV_RB16(src + 6);
|
||||
for (i = 0; i < 17; i++)
|
||||
ctx->slice_off[i] = AV_RB24(src + 8 + i * 3);
|
||||
|
||||
if (ctx->dcb == 8) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid DC precision %d.\n", ctx->dcb);
|
||||
if (dcb_code == 0) {
|
||||
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->dcb = dcb_code + 8;
|
||||
ret = av_image_check_size(ctx->width, ctx->height, 0, avctx);
|
||||
if (ret < 0) {
|
||||
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;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
ff_vlc_free(&ctx->dc_vlc[i]);
|
||||
ff_vlc_free(&ctx->dc_vlcs[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -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) \
|
||||
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), \
|
||||
name ## _vlc_lens, 1, 1, \
|
||||
name ## _vlc_bits, 2, 2, 0); \
|
||||
|
Reference in New Issue
Block a user