34 #define MAX_TABLE_DEPTH(table_bits, max_bits) \
35 ((max_bits + table_bits - 1) / table_bits)
41 #define DC_VLC_MTD MAX_TABLE_DEPTH(DC_VLC_BITS, MAX_DC_VLC_BITS)
42 #define AC_VLC_MTD MAX_TABLE_DEPTH(AC_VLC_BITS, MAX_AC_VLC_BITS)
43 #define OR_VLC_MTD MAX_TABLE_DEPTH(OR_VLC_BITS, MAX_OR_VLC_BITS)
54 static const uint16_t
sizes[8 * 4 + 8 * 2 + 2 + 4] = {
55 576, 548, 582, 618, 546, 616, 560, 642,
56 584, 582, 704, 664, 512, 544, 656, 640,
57 512, 648, 582, 566, 532, 614, 596, 648,
58 586, 552, 584, 590, 544, 578, 584, 624,
60 528, 528, 526, 528, 536, 528, 526, 544,
61 544, 512, 512, 528, 528, 544, 512, 544,
63 128, 128, 128, 128, 128, 128,
69 #define init_ac_vlc(dst, src) \
71 dst.table = &table[offset]; \
72 dst.table_allocated = sizes[sizeidx]; \
73 offset += sizes[sizeidx++]; \
74 init_vlc(&dst, AC_VLC_BITS, 77, &src[1], 4, 2, &src[0], 4, 2, \
75 INIT_VLC_USE_NEW_STATIC); \
78 for (i = 0; i < 8; i++) {
87 #define init_dc_vlc(dst, src) \
89 dst.table = &table[offset]; \
90 dst.table_allocated = sizes[sizeidx]; \
91 offset += sizes[sizeidx++]; \
92 init_vlc(&dst, DC_VLC_BITS, 34, &src[1], 4, 2, &src[0], 4, 2, \
93 INIT_VLC_USE_NEW_STATIC); \
96 for (i = 0; i < 8; i++) {
103 #define init_or_vlc(dst, src) \
105 dst.table = &table[offset]; \
106 dst.table_allocated = sizes[sizeidx]; \
107 offset += sizes[sizeidx++]; \
108 init_vlc(&dst, OR_VLC_BITS, 12, &src[1], 4, 2, &src[0], 4, 2, \
109 INIT_VLC_USE_NEW_STATIC); \
112 for (i = 0; i < 2; i++)
114 for (i = 0; i < 4; i++)
118 if (offset !=
sizeof(table) /
sizeof(
VLC_TYPE) / 2) {
120 sizeof(table) /
sizeof(
VLC_TYPE) / 2, offset);
159 #define extra_bits(eb) (eb) // 3 bits
160 #define extra_run (0xFF << 8) // 1 bit
161 #define extra_level (0x00 << 8) // 1 bit
162 #define run_offset(r) ((r) << 16) // 6 bits
163 #define level_offset(l) ((l) << 24) // 5 bits
207 int *
const run,
int *
const level,
int *
const final)
236 l = (0xE50000 >> (i & 0x1E)) & 3;
240 t = 0x01030F >> (l << 3);
256 *run = (sm & 0xff) + (e & mask);
257 *level = (sm >> 8) + (e & ~mask);
258 *
final = i > (58 - 46);
260 static const uint8_t crazy_mix_runlevel[32] = {
261 0x22, 0x32, 0x33, 0x53, 0x23, 0x42, 0x43, 0x63,
262 0x24, 0x52, 0x34, 0x73, 0x25, 0x62, 0x44, 0x83,
263 0x26, 0x72, 0x35, 0x54, 0x27, 0x82, 0x45, 0x64,
264 0x28, 0x92, 0x36, 0x74, 0x29, 0xa2, 0x46, 0x84,
269 *run = crazy_mix_runlevel[e] >> 4;
270 *level = crazy_mix_runlevel[e] & 0x0F;
283 0, 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
287 int *
const level,
int *
const final)
316 *level = (i ^ e) - e;
330 &range, &sum, w->
edges);
339 if (range < quant || range < 3) {
354 if (range < 2 * w->quant) {
355 if ((w->
edges & 3) == 0) {
365 static const uint8_t prediction_table[3][12] = {
366 { 0, 8, 4, 10, 11, 2, 6, 9, 1, 3, 5, 7 },
367 { 4, 0, 8, 11, 10, 3, 5, 2, 6, 9, 1, 7 },
368 { 8, 0, 4, 10, 11, 1, 7, 2, 6, 9, 3, 5 },
414 switch (w->
edges & 3) {
449 i = (0xFFEAF4C4 >> (2 * b + 8 *
a)) & 3;
453 w->
orient = (0xFFEAD8 >> (2 * c + 8 * (w->
quant > 12))) & 3;
479 #define B(x,y) w->block[0][w->idct_permutation[(x) + (y) * 8]]
480 #define T(x) ((x) * dc_level + 0x8000) >> 16;
550 for (k = 0; k < 8; k++) {
557 256, 256, 256, 256, 256, 256, 259, 262,
558 265, 269, 272, 275, 278, 282, 285, 288,
559 292, 295, 299, 303, 306, 310, 314, 317,
560 321, 325, 329, 333, 337, 341, 345, 349,
561 353, 358, 362, 366, 371, 375, 379, 384,
562 389, 393, 398, 403, 408, 413, 417, 422,
563 428, 433, 438, 443, 448, 454, 459, 465,
564 470, 476, 482, 488, 493, 499, 505, 511,
571 int ac_mode, dc_mode, est_run, dc_level;
574 int use_quant_matrix;
596 use_quant_matrix = 0;
630 level = (level + 1) * w->
dquant;
634 level = (level ^ sign) - sign;
636 if (use_quant_matrix)
645 if (w->
flat_dc && ((
unsigned) (dc_level + 1)) < 3) {
653 dc_level += (w->
predicted_dc * divide_quant + (1 << 12)) >> 13;
661 zeros_only = dc_level == 0;
669 if ((
unsigned int) (dc_level + 1) >= 3 && (w->
edges & 3) != 3) {
673 direction = (0x6A017C >> (w->
orient * 2)) & 3;
674 if (direction != 3) {
701 if (!((w->
edges & 2) || (zeros_only && (w->
orient | 4) == 4)))
704 if (!((w->
edges & 1) || (zeros_only && (w->
orient | 8) == 8)))
715 const int linesize = frame->
linesize[0];
716 const int uvlinesize = frame->
linesize[1];
722 w->
dest[0] += w->
mb_y * linesize << 3;
724 w->
dest[1] += (w->
mb_y & ~1) * uvlinesize << 2;
725 w->
dest[2] += (w->
mb_y & ~1) * uvlinesize << 2;
730 int16_t (*
block)[64],
731 int block_last_index[12],
732 int mb_width,
int mb_height)
775 int dquant,
int quant_offset,
776 int loopfilter,
int lowdelay)
782 w->
quant = dquant >> 1;
783 w->
qsum = quant_offset;
834 (w->
mb_y - 1) * 8, 16,
static void x8_get_prediction(IntraX8Context *const w)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
void(* clear_block)(int16_t *block)
static void x8_update_predictions(IntraX8Context *const w, const int orient, const int est_run)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
void(* spatial_compensation[12])(uint8_t *src, uint8_t *dst, int linesize)
static void dsp_x8_put_solidcolor(const uint8_t pix, uint8_t *dst, const int linesize)
static const uint16_t x8_ac0_highquant_table[8][77][2]
static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
void ff_draw_horiz_band(AVCodecContext *avctx, AVFrame *cur, AVFrame *last, int y, int h, int picture_structure, int first_field, int low_delay)
Draw a horizontal band if supported.
av_cold int ff_intrax8_common_init(AVCodecContext *avctx, IntraX8Context *w, IDCTDSPContext *idsp, int16_t(*block)[64], int block_last_index[12], int mb_width, int mb_height)
Initialize IntraX8 frame decoder.
static void x8_reset_vlc_tables(IntraX8Context *w)
int ff_intrax8_decode_picture(IntraX8Context *const w, Picture *pict, GetBitContext *gb, int *mb_x, int *mb_y, int dquant, int quant_offset, int loopfilter, int lowdelay)
Decode single IntraX8 frame.
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
#define init_ac_vlc(dst, src)
static const uint16_t x8_orient_highquant_table[2][12][2]
bitstream reader API header.
static void x8_init_block_index(IntraX8Context *w, AVFrame *frame)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const uint16_t mask[17]
static const int sizes[][2]
static const struct endianess table[]
static int x8_get_orient_vlc(IntraX8Context *w)
static const int16_t quant_table[64]
static const uint16_t x8_ac0_lowquant_table[8][77][2]
int * block_last_index
last nonzero coefficient in block
simple assert() macros that are a bit more flexible than ISO C assert().
av_cold void ff_wmv2dsp_init(WMV2DSPContext *c)
static const uint8_t offset[127][2]
const uint8_t ff_wmv1_scantable[WMV1_SCANTABLE_COUNT][64]
static const uint16_t x8_orient_lowquant_table[4][12][2]
av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation, enum idct_permutation_type perm_type)
av_cold void ff_intrax8_common_end(IntraX8Context *w)
Destroy IntraX8 frame structure.
static VLC j_dc_vlc[2][8]
static const uint32_t ac_decode_table[]
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
static const uint16_t x8_dc_lowquant_table[8][34][2]
static const uint8_t dc_index_offset[]
void(* idct_add)(uint8_t *dest, int line_size, int16_t *block)
static VLC j_ac_vlc[2][2][8]
Libavcodec external API header.
av_cold void ff_blockdsp_init(BlockDSPContext *c, AVCodecContext *avctx)
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
#define init_dc_vlc(dst, src)
static const uint16_t x8_ac1_highquant_table[8][77][2]
main external API structure.
static const uint16_t x8_dc_highquant_table[8][34][2]
static unsigned int get_bits1(GetBitContext *s)
uint8_t idct_permutation[64]
av_cold void ff_intrax8dsp_init(IntraX8DSPContext *dsp)
static av_cold int x8_vlc_init(void)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
void(* setup_spatial_compensation)(uint8_t *src, uint8_t *dst, int linesize, int *range, int *sum, int edges)
static void x8_get_ac_rlf(IntraX8Context *const w, const int mode, int *const run, int *const level, int *const final)
static void x8_select_ac_table(IntraX8Context *const w, int mode)
#define init_or_vlc(dst, src)
static int x8_get_dc_rlf(IntraX8Context *const w, const int mode, int *const level, int *const final)
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
static const uint16_t x8_ac1_lowquant_table[8][77][2]
VLC_TYPE(* table)[2]
code, bits
static void x8_get_prediction_chroma(IntraX8Context *const w)
static int x8_setup_spatial_predictor(IntraX8Context *const w, const int chroma)
void(* h_loop_filter)(uint8_t *src, int stride, int qscale)
int divide_quant_dc_chroma
static VLC j_orient_vlc[2][4]
void(* v_loop_filter)(uint8_t *src, int stride, int qscale)
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
uint8_t * prediction_table
static void x8_ac_compensation(IntraX8Context *const w, const int direction, const int dc_level)