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

avcodec/hqx: Include hqxvlc directly

This avoids having to expose HQXContext in a header
and allows to make several symbols static.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt
2025-03-13 20:42:30 +01:00
parent 09411fef3d
commit c9d87f4a85
4 changed files with 79 additions and 108 deletions

View File

@ -467,7 +467,7 @@ OBJS-$(CONFIG_HEVC_V4L2M2M_ENCODER) += v4l2_m2m_enc.o
OBJS-$(CONFIG_HEVC_VIDEOTOOLBOX_ENCODER) += videotoolboxenc.o OBJS-$(CONFIG_HEVC_VIDEOTOOLBOX_ENCODER) += videotoolboxenc.o
OBJS-$(CONFIG_HNM4_VIDEO_DECODER) += hnm4video.o OBJS-$(CONFIG_HNM4_VIDEO_DECODER) += hnm4video.o
OBJS-$(CONFIG_HQ_HQA_DECODER) += hq_hqa.o hq_hqadsp.o canopus.o OBJS-$(CONFIG_HQ_HQA_DECODER) += hq_hqa.o hq_hqadsp.o canopus.o
OBJS-$(CONFIG_HQX_DECODER) += hqx.o hqxvlc.o hqxdsp.o canopus.o OBJS-$(CONFIG_HQX_DECODER) += hqx.o hqxdsp.o canopus.o
OBJS-$(CONFIG_HUFFYUV_DECODER) += huffyuv.o huffyuvdec.o OBJS-$(CONFIG_HUFFYUV_DECODER) += huffyuv.o huffyuvdec.o
OBJS-$(CONFIG_HUFFYUV_ENCODER) += huffyuv.o huffyuvenc.o OBJS-$(CONFIG_HUFFYUV_ENCODER) += huffyuv.o huffyuvenc.o
OBJS-$(CONFIG_HYMT_DECODER) += huffyuv.o huffyuvdec.o OBJS-$(CONFIG_HYMT_DECODER) += huffyuv.o huffyuvdec.o

View File

@ -20,17 +20,21 @@
#include <inttypes.h> #include <inttypes.h>
#include "libavutil/frame.h"
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "libavutil/mem_internal.h"
#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "libavutil/thread.h"
#include "avcodec.h" #include "avcodec.h"
#include "canopus.h" #include "canopus.h"
#include "codec_internal.h" #include "codec_internal.h"
#include "get_bits.h" #include "get_bits.h"
#include "thread.h" #include "thread.h"
#include "vlc.h"
#include "hqx.h"
#include "hqxdsp.h" #include "hqxdsp.h"
#include "hqxvlc.h"
/* HQX has four modes - 422, 444, 422alpha and 444alpha - all 12-bit */ /* HQX has four modes - 422, 444, 422alpha and 444alpha - all 12-bit */
enum HQXFormat { enum HQXFormat {
@ -40,6 +44,34 @@ enum HQXFormat {
HQX_444A, HQX_444A,
}; };
struct HQXContext;
typedef int (*mb_decode_func)(struct HQXContext *ctx,
int slice_no, int x, int y);
typedef struct HQXSlice {
GetBitContext gb;
DECLARE_ALIGNED(16, int16_t, block)[16][64];
} HQXSlice;
typedef struct HQXContext {
HQXDSPContext hqxdsp;
HQXSlice slice[16];
AVFrame *pic;
mb_decode_func decode_func;
int format, dcb, width, height;
int interlaced;
const uint8_t *src;
unsigned int data_size;
uint32_t slice_off[17];
VLC cbp_vlc;
VLC dc_vlc[3];
} HQXContext;
#define HQX_HEADER_SIZE 59 #define HQX_HEADER_SIZE 59
/* macroblock selects a group of 4 possible quants and /* macroblock selects a group of 4 possible quants and
@ -138,7 +170,7 @@ static int decode_block(GetBitContext *gb, VLC *vlc,
ac_idx = HQX_AC_Q0; ac_idx = HQX_AC_Q0;
do { do {
hqx_get_ac(gb, &ff_hqx_ac[ac_idx], &run, &lev); hqx_get_ac(gb, &hqx_ac[ac_idx], &run, &lev);
pos += run; pos += run;
if (pos > 63) if (pos > 63)
break; break;
@ -521,11 +553,22 @@ static av_cold int hqx_decode_close(AVCodecContext *avctx)
static av_cold int hqx_decode_init(AVCodecContext *avctx) static av_cold int hqx_decode_init(AVCodecContext *avctx)
{ {
static AVOnce init_static_once = AV_ONCE_INIT;
HQXContext *ctx = avctx->priv_data; HQXContext *ctx = avctx->priv_data;
int ret = vlc_init(&ctx->cbp_vlc, HQX_CBP_VLC_BITS, FF_ARRAY_ELEMS(cbp_vlc_lens),
cbp_vlc_lens, 1, 1, cbp_vlc_bits, 1, 1, 0);
if (ret < 0)
return ret;
INIT_DC_TABLE(0, dc9);
INIT_DC_TABLE(1, dc10);
INIT_DC_TABLE(2, dc11);
ff_hqxdsp_init(&ctx->hqxdsp); ff_hqxdsp_init(&ctx->hqxdsp);
return ff_hqx_init_vlcs(ctx); ff_thread_once(&init_static_once, hqx_init_static);
return 0;
} }
const FFCodec ff_hqx_decoder = { const FFCodec ff_hqx_decoder = {

View File

@ -1,82 +0,0 @@
/*
* Canopus HQX decoder
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_HQX_H
#define AVCODEC_HQX_H
#include <stdint.h>
#include "libavutil/frame.h"
#include "libavutil/mem_internal.h"
#include "get_bits.h"
#include "hqxdsp.h"
enum HQXACMode {
HQX_AC_Q0 = 0,
HQX_AC_Q8,
HQX_AC_Q16,
HQX_AC_Q32,
HQX_AC_Q64,
HQX_AC_Q128,
NUM_HQX_AC
};
typedef struct HQXAC {
int bits;
const RL_VLC_ELEM *lut;
} HQXAC;
struct HQXContext;
typedef int (*mb_decode_func)(struct HQXContext *ctx,
int slice_no, int x, int y);
typedef struct HQXSlice {
GetBitContext gb;
DECLARE_ALIGNED(16, int16_t, block)[16][64];
} HQXSlice;
typedef struct HQXContext {
HQXDSPContext hqxdsp;
HQXSlice slice[16];
AVFrame *pic;
mb_decode_func decode_func;
int format, dcb, width, height;
int interlaced;
const uint8_t *src;
unsigned int data_size;
uint32_t slice_off[17];
VLC cbp_vlc;
VLC dc_vlc[3];
} HQXContext;
#define HQX_CBP_VLC_BITS 5
#define HQX_DC_VLC_BITS 9
extern HQXAC ff_hqx_ac[NUM_HQX_AC];
int ff_hqx_init_vlcs(HQXContext *ctx);
#endif /* AVCODEC_HQX_H */

View File

@ -18,8 +18,33 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "hqx.h" #ifndef AVCODEC_HQXVLC_H
#include "libavutil/thread.h" #define AVCODEC_HQXVLC_H
#include <stdint.h>
#include "vlc.h"
#include "libavutil/attributes.h"
#include "libavutil/macros.h"
#define HQX_CBP_VLC_BITS 5
#define HQX_DC_VLC_BITS 9
enum HQXACMode {
HQX_AC_Q0 = 0,
HQX_AC_Q8,
HQX_AC_Q16,
HQX_AC_Q32,
HQX_AC_Q64,
HQX_AC_Q128,
NUM_HQX_AC
};
typedef struct HQXAC {
int bits;
const RL_VLC_ELEM *lut;
} HQXAC;
static const uint8_t cbp_vlc_bits[16] = { static const uint8_t cbp_vlc_bits[16] = {
0x04, 0x1C, 0x1D, 0x09, 0x1E, 0x0B, 0x1B, 0x08, 0x04, 0x1C, 0x1D, 0x09, 0x1E, 0x0B, 0x1B, 0x08,
@ -721,7 +746,7 @@ static const uint8_t dc11_vlc_lens[2048] = {
}; };
HQXAC ff_hqx_ac[NUM_HQX_AC] = { static HQXAC hqx_ac[NUM_HQX_AC] = {
{ 10 }, { 11 }, { 11 }, { 11 }, { 12 }, { 11 }, { 10 }, { 11 }, { 11 }, { 11 }, { 12 }, { 11 },
}; };
@ -1516,7 +1541,7 @@ static RL_VLC_ELEM hqx_ac_rl_vlc[15630];
return ret; \ return ret; \
} while (0) } while (0)
static av_cold void hqx_init_static(void) static av_cold av_unused void hqx_init_static(void)
{ {
VLCInitState state = VLC_INIT_STATE(hqx_ac_rl_vlc); VLCInitState state = VLC_INIT_STATE(hqx_ac_rl_vlc);
const uint8_t *lens = hqx_ac_lens; const uint8_t *lens = hqx_ac_lens;
@ -1526,8 +1551,8 @@ static av_cold void hqx_init_static(void)
RL_VLC_ELEM *lut = state.table; RL_VLC_ELEM *lut = state.table;
unsigned nb_codes = state.size; unsigned nb_codes = state.size;
ff_hqx_ac[i].lut = hqx_ac[i].lut =
ff_vlc_init_tables_from_lengths(&state, ff_hqx_ac[i].bits, ff_vlc_init_tables_from_lengths(&state, hqx_ac[i].bits,
hqx_ac_nb_elems[i], lens, 1, hqx_ac_nb_elems[i], lens, 1,
run_level, 2, 2, 0, 0); run_level, 2, 2, 0, 0);
@ -1554,19 +1579,4 @@ static av_cold void hqx_init_static(void)
} }
} }
av_cold int ff_hqx_init_vlcs(HQXContext *ctx) #endif /* AVCODEC_HQXVLC_H*/
{
static AVOnce init_static_once = AV_ONCE_INIT;
int ret = vlc_init(&ctx->cbp_vlc, HQX_CBP_VLC_BITS, FF_ARRAY_ELEMS(cbp_vlc_lens),
cbp_vlc_lens, 1, 1, cbp_vlc_bits, 1, 1, 0);
if (ret < 0)
return ret;
INIT_DC_TABLE(0, dc9);
INIT_DC_TABLE(1, dc10);
INIT_DC_TABLE(2, dc11);
ff_thread_once(&init_static_once, hqx_init_static);
return 0;
}