36#define VLC_BUFFER_SIZE 28150
38#define MAX_TABLE_DEPTH(table_bits, max_bits) \
39 ((max_bits + table_bits - 1) / table_bits)
45#define DC_VLC_MTD MAX_TABLE_DEPTH(DC_VLC_BITS, MAX_DC_VLC_BITS)
46#define AC_VLC_MTD MAX_TABLE_DEPTH(AC_VLC_BITS, MAX_AC_VLC_BITS)
47#define OR_VLC_MTD MAX_TABLE_DEPTH(OR_VLC_BITS, MAX_OR_VLC_BITS)
54 int nb_codes,
const uint8_t
table[][2])
57 &
table[0][0], 2, 1, 0, 0);
67 for (
int i = 0;
i < 2;
i++)
68 for (
int j = 0; j < 2; j++)
69 for (
int k = 0; k < 8; k++)
74 for (
int i = 0;
i < 2;
i++)
75 for (
int j = 0; j < 8; j++)
80 for (
i = 0;
i < 2;
i++)
83 for (
i = 0;
i < 4;
i++)
90 memset(
w->j_dc_vlc_table, 0,
sizeof(
w->j_dc_vlc_table));
91 memset(
w->j_ac_vlc_table, 0,
sizeof(
w->j_ac_vlc_table));
92 w->j_orient_vlc_table =
NULL;
101 if (
w->j_ac_vlc_table[
mode])
112 if (!
w->j_orient_vlc_table) {
113 int table_index =
get_bits(
w->gb, 1 + (
w->quant < 13));
120#define extra_bits(eb) (eb)
121#define extra_run (0xFF << 8)
122#define extra_level (0x00 << 8)
123#define run_offset(r) ((r) << 16)
124#define level_offset(l) ((l) << 24)
168 int *
const run,
int *
const level,
int *
const final)
197 l = (0xE50000 >> (
i & 0x1E)) & 3;
201 t = 0x01030F >> (l << 3);
217 *
run = (sm & 0xff) + (e &
mask);
219 *
final =
i > (58 - 46);
221 static const uint8_t crazy_mix_runlevel[32] = {
222 0x22, 0x32, 0x33, 0x53, 0x23, 0x42, 0x43, 0x63,
223 0x24, 0x52, 0x34, 0x73, 0x25, 0x62, 0x44, 0x83,
224 0x26, 0x72, 0x35, 0x54, 0x27, 0x82, 0x45, 0x64,
225 0x28, 0x92, 0x36, 0x74, 0x29, 0xa2, 0x46, 0x84,
230 *
run = crazy_mix_runlevel[e] >> 4;
231 *
level = crazy_mix_runlevel[e] & 0x0F;
244 0, 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
248 int *
const level,
int *
const final)
253 if (!
w->j_dc_vlc_table[
mode]) {
289 w->dsp.setup_spatial_compensation(
w->dest[
chroma],
w->scratchpad,
290 w->frame->linesize[
chroma > 0],
293 w->orient =
w->chroma_orient;
294 quant =
w->quant_dc_chroma;
308 w->predicted_dc = sum * 6899 >> 17;
316 if ((
w->edges & 3) == 0) {
326 static const uint8_t prediction_table[3][12] = {
327 { 0, 8, 4, 10, 11, 2, 6, 9, 1, 3, 5, 7 },
328 { 4, 0, 8, 11, 10, 3, 5, 2, 6, 9, 1, 7 },
329 { 8, 0, 4, 10, 11, 1, 7, 2, 6, 9, 3, 5 },
332 if (
w->raw_orient < 0)
336 w->orient=prediction_table[
w->orient][
w->raw_orient];
344 w->prediction_table[
w->mb_x * 2 + (
w->mb_y & 1)] = (est_run << 2) + 1 * (orient == 4) + 2 * (orient == 8);
353 w->edges = 1 * !(
w->mb_x >> 1);
354 w->edges |= 2 * !(
w->mb_y >> 1);
355 w->edges |= 4 * (
w->mb_x >= (2 *
w->mb_width - 1));
360 w->chroma_orient = 4 << ((0xCC >>
w->edges) & 1);
364 w->chroma_orient = (
w->prediction_table[2 *
w->mb_x - 2] & 0x03) << 2;
371 w->edges = 1 * !
w->mb_x;
372 w->edges |= 2 * !
w->mb_y;
373 w->edges |= 4 * (
w->mb_x >= (2 *
w->mb_width - 1));
375 switch (
w->edges & 3) {
380 w->est_run =
w->prediction_table[!(
w->mb_y & 1)] >> 2;
385 w->est_run =
w->prediction_table[2 *
w->mb_x - 2] >> 2;
394 b =
w->prediction_table[2 *
w->mb_x + !(
w->mb_y & 1)];
395 a =
w->prediction_table[2 *
w->mb_x - 2 + (
w->mb_y & 1)];
396 c =
w->prediction_table[2 *
w->mb_x - 2 + !(
w->mb_y & 1)];
402 if ((
w->mb_x &
w->mb_y) != 0)
410 i = (0xFFEAF4C4 >> (2 *
b + 8 *
a)) & 3;
414 w->orient = (0xFFEAD8 >> (2 *
c + 8 * (
w->quant > 12))) & 3;
440#define B(x,y) w->block[w->idsp.idct_permutation[(x) + (y) * 8]]
441#define T(x) ((x) * dc_level + 0x8000) >> 16;
502 const ptrdiff_t linesize)
505 for (k = 0; k < 8; k++) {
512 256, 256, 256, 256, 256, 256, 259, 262,
513 265, 269, 272, 275, 278, 282, 285, 288,
514 292, 295, 299, 303, 306, 310, 314, 317,
515 321, 325, 329, 333, 337, 341, 345, 349,
516 353, 358, 362, 366, 371, 375, 379, 384,
517 389, 393, 398, 403, 408, 413, 417, 422,
518 428, 433, 438, 443, 448, 454, 459, 465,
519 470, 476, 482, 488, 493, 499, 505, 511,
526 int ac_mode, dc_mode, est_run, dc_level;
529 int use_quant_matrix;
533 w->bdsp.clear_block(
w->block);
538 dc_mode = !!
w->est_run;
545 use_quant_matrix =
w->use_quant_matrix;
550 if (
w->raw_orient < 3)
551 use_quant_matrix = 0;
553 if (
w->raw_orient > 4) {
557 if (
w->est_run > 1) {
559 est_run =
w->est_run;
569 scantable =
w->permutated_scantable[(0x928548 >> (2 *
w->orient)) & 3];
591 if (use_quant_matrix)
597 if (
w->flat_dc && ((
unsigned) (dc_level + 1)) < 3) {
599 :
w->divide_quant_dc_chroma;
601 :
w->quant_dc_chroma;
605 dc_level += (
w->predicted_dc * divide_quant + (1 << 12)) >> 13;
613 zeros_only = dc_level == 0;
616 w->block[0] = dc_level *
w->quant;
618 w->block[0] = dc_level *
w->quant_dc_chroma;
621 if ((
unsigned int) (dc_level + 1) >= 3 && (
w->edges & 3) != 3) {
625 direction = (0x6A017C >> (
w->orient * 2)) & 3;
626 if (direction != 3) {
635 w->dsp.spatial_compensation[
w->orient](
w->scratchpad,
649 uint8_t *ptr =
w->dest[
chroma];
650 ptrdiff_t linesize =
w->frame->linesize[!!
chroma];
652 if (!((
w->edges & 2) || (zeros_only && (
w->orient | 4) == 4)))
653 w->dsp.h_loop_filter(ptr, linesize,
w->quant);
655 if (!((
w->edges & 1) || (zeros_only && (
w->orient | 8) == 8)))
656 w->dsp.v_loop_filter(ptr, linesize,
w->quant);
666 const ptrdiff_t linesize =
frame->linesize[0];
667 const ptrdiff_t uvlinesize =
frame->linesize[1];
669 w->dest[0] =
frame->data[0];
670 w->dest[1] =
frame->data[1];
671 w->dest[2] =
frame->data[2];
673 w->dest[0] +=
w->mb_y * linesize << 3;
675 w->dest[1] += (
w->mb_y & ~1) * uvlinesize << 2;
676 w->dest[2] += (
w->mb_y & ~1) * uvlinesize << 2;
682 int mb_width,
int mb_height)
687 w->mb_width = mb_width;
688 w->mb_height = mb_height;
693 if (!
w->prediction_table)
699 w->idsp.idct_permutation);
701 w->idsp.idct_permutation);
703 w->idsp.idct_permutation);
720 int dquant,
int quant_offset,
721 int loopfilter,
int lowdelay)
727 w->quant = dquant >> 1;
728 w->qsum = quant_offset;
730 w->loopfilter = loopfilter;
736 w->divide_quant_dc_luma = ((1 << 16) + (
w->quant >> 1)) /
w->quant;
738 w->quant_dc_chroma =
w->quant;
739 w->divide_quant_dc_chroma =
w->divide_quant_dc_luma;
741 w->quant_dc_chroma =
w->quant + ((
w->quant + 3) >> 3);
742 w->divide_quant_dc_chroma = ((1 << 16) + (
w->quant_dc_chroma >> 1)) /
w->quant_dc_chroma;
746 for (
w->mb_y = 0;
w->mb_y <
w->mb_height * 2;
w->mb_y++) {
748 mb_xy = (
w->mb_y >> 1) * (
w->mb_width + 1);
751 for (
w->mb_x = 0;
w->mb_x <
w->mb_width * 2;
w->mb_x++) {
758 if (
w->mb_x &
w->mb_y & 1) {
781 (
w->mb_y - 1) * 8, 16,
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Libavcodec external API header.
#define i(width, name, range_min, range_max)
static struct @346255127015250356166251341105367306144006377143 state
bitstream reader API header.
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
static int get_bits_left(GetBitContext *gb)
static unsigned int get_bits1(GetBitContext *s)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static void x8_update_predictions(IntraX8Context *const w, const int orient, const int est_run)
av_cold int ff_intrax8_common_init(AVCodecContext *avctx, IntraX8Context *w, int16_t block[64], int mb_width, int mb_height)
Initialize IntraX8 frame decoder.
static void x8_reset_vlc_tables(IntraX8Context *w)
static const VLCElem * j_dc_vlc[2][8]
static av_cold void x8_vlc_init(void)
static const int16_t quant_table[64]
av_cold void ff_intrax8_common_end(IntraX8Context *w)
Destroy IntraX8 frame structure.
int ff_intrax8_decode_picture(IntraX8Context *w, MPVPicture *pict, GetBitContext *gb, int *mb_x, int *mb_y, int dquant, int quant_offset, int loopfilter, int lowdelay)
Decode single IntraX8 frame.
static void x8_get_prediction_chroma(IntraX8Context *const w)
static const uint32_t ac_decode_table[]
static void dsp_x8_put_solidcolor(const uint8_t pix, uint8_t *dst, const ptrdiff_t linesize)
static int x8_get_orient_vlc(IntraX8Context *w)
static const VLCElem * j_ac_vlc[2][2][8]
static void x8_ac_compensation(IntraX8Context *const w, const int direction, const int dc_level)
static int x8_get_dc_rlf(IntraX8Context *const w, const int mode, int *const level, int *const final)
static const uint8_t dc_index_offset[]
static void x8_get_prediction(IntraX8Context *const w)
static void x8_select_ac_table(IntraX8Context *const w, int mode)
static const VLCElem * j_orient_vlc[2][4]
static int x8_setup_spatial_predictor(IntraX8Context *const w, const int chroma)
static int x8_decode_intra_mb(IntraX8Context *const w, const int chroma)
static void x8_init_block_index(IntraX8Context *w, AVFrame *frame)
static void x8_get_ac_rlf(IntraX8Context *const w, const int mode, int *const run, int *const level, int *const final)
static av_cold const VLCElem * x8_init_vlc(VLCInitState *state, int nb_bits, int nb_codes, const uint8_t table[][2])
av_cold void ff_intrax8dsp_init(IntraX8DSPContext *dsp)
static const uint8_t x8_dc_quant_table[2][8][34][2]
static const uint8_t x8_orient_lowquant_table[4][12][2]
static const uint8_t x8_orient_highquant_table[2][12][2]
static const uint8_t x8_ac_quant_table[2][2][8][77][2]
av_cold void ff_blockdsp_init(BlockDSPContext *c)
av_cold void ff_permute_scantable(uint8_t dst[64], const uint8_t src[64], const uint8_t permutation[64])
static int ff_thread_once(char *control, void(*routine)(void))
static const uint16_t mask[17]
Memory handling functions.
void ff_draw_horiz_band(AVCodecContext *avctx, const AVFrame *cur, const AVFrame *last, int y, int h, int picture_structure, int first_field, int low_delay)
Draw a horizontal band if supported.
const uint8_t ff_wmv1_scantable[WMV1_SCANTABLE_COUNT][64]
static const uint16_t table[]
main external API structure.
This structure describes decoded (raw) audio or video data.
For static VLCs, the number of bits can often be hardcoded at each get_vlc2() callsite.
static void error(const char *err)
av_cold const VLCElem * ff_vlc_init_tables_from_lengths(VLCInitState *state, int nb_bits, int nb_codes, const int8_t *lens, int lens_wrap, const void *symbols, int symbols_wrap, int symbols_size, int offset, int flags)
#define VLC_INIT_STATE(_table)
static const uint8_t quant[64]
av_cold void ff_wmv2dsp_init(IDCTDSPContext *c)