You've already forked FFmpeg
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:
@ -467,7 +467,7 @@ OBJS-$(CONFIG_HEVC_V4L2M2M_ENCODER) += v4l2_m2m_enc.o
|
||||
OBJS-$(CONFIG_HEVC_VIDEOTOOLBOX_ENCODER) += videotoolboxenc.o
|
||||
OBJS-$(CONFIG_HNM4_VIDEO_DECODER) += hnm4video.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_ENCODER) += huffyuv.o huffyuvenc.o
|
||||
OBJS-$(CONFIG_HYMT_DECODER) += huffyuv.o huffyuvdec.o
|
||||
|
@ -20,17 +20,21 @@
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "libavutil/frame.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
#include "libavutil/mem_internal.h"
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "libavutil/thread.h"
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "canopus.h"
|
||||
#include "codec_internal.h"
|
||||
#include "get_bits.h"
|
||||
#include "thread.h"
|
||||
#include "vlc.h"
|
||||
|
||||
#include "hqx.h"
|
||||
#include "hqxdsp.h"
|
||||
#include "hqxvlc.h"
|
||||
|
||||
/* HQX has four modes - 422, 444, 422alpha and 444alpha - all 12-bit */
|
||||
enum HQXFormat {
|
||||
@ -40,6 +44,34 @@ enum HQXFormat {
|
||||
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
|
||||
|
||||
/* 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;
|
||||
|
||||
do {
|
||||
hqx_get_ac(gb, &ff_hqx_ac[ac_idx], &run, &lev);
|
||||
hqx_get_ac(gb, &hqx_ac[ac_idx], &run, &lev);
|
||||
pos += run;
|
||||
if (pos > 63)
|
||||
break;
|
||||
@ -521,11 +553,22 @@ static av_cold int hqx_decode_close(AVCodecContext *avctx)
|
||||
|
||||
static av_cold int hqx_decode_init(AVCodecContext *avctx)
|
||||
{
|
||||
static AVOnce init_static_once = AV_ONCE_INIT;
|
||||
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);
|
||||
|
||||
return ff_hqx_init_vlcs(ctx);
|
||||
ff_thread_once(&init_static_once, hqx_init_static);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const FFCodec ff_hqx_decoder = {
|
||||
|
@ -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 */
|
@ -18,8 +18,33 @@
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "hqx.h"
|
||||
#include "libavutil/thread.h"
|
||||
#ifndef AVCODEC_HQXVLC_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] = {
|
||||
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 },
|
||||
};
|
||||
|
||||
@ -1516,7 +1541,7 @@ static RL_VLC_ELEM hqx_ac_rl_vlc[15630];
|
||||
return ret; \
|
||||
} 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);
|
||||
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;
|
||||
unsigned nb_codes = state.size;
|
||||
|
||||
ff_hqx_ac[i].lut =
|
||||
ff_vlc_init_tables_from_lengths(&state, ff_hqx_ac[i].bits,
|
||||
hqx_ac[i].lut =
|
||||
ff_vlc_init_tables_from_lengths(&state, hqx_ac[i].bits,
|
||||
hqx_ac_nb_elems[i], lens, 1,
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
#endif /* AVCODEC_HQXVLC_H*/
|
Reference in New Issue
Block a user