35 #define VLC_BUFFER_SIZE 28150
37 #define MAX_TABLE_DEPTH(table_bits, max_bits) \
38 ((max_bits + table_bits - 1) / table_bits)
44 #define DC_VLC_MTD MAX_TABLE_DEPTH(DC_VLC_BITS, MAX_DC_VLC_BITS)
45 #define AC_VLC_MTD MAX_TABLE_DEPTH(AC_VLC_BITS, MAX_AC_VLC_BITS)
46 #define OR_VLC_MTD MAX_TABLE_DEPTH(OR_VLC_BITS, MAX_OR_VLC_BITS)
53 int nb_codes,
const uint8_t
table[][2])
56 &
table[0][0], 2, 1, 0, 0);
66 for (
int i = 0;
i < 2;
i++)
67 for (
int j = 0; j < 2; j++)
68 for (
int k = 0; k < 8; k++)
73 for (
int i = 0;
i < 2;
i++)
74 for (
int j = 0; j < 8; j++)
79 for (
i = 0;
i < 2;
i++)
82 for (
i = 0;
i < 4;
i++)
89 memset(
w->j_dc_vlc_table, 0,
sizeof(
w->j_dc_vlc_table));
90 memset(
w->j_ac_vlc_table, 0,
sizeof(
w->j_ac_vlc_table));
91 w->j_orient_vlc_table =
NULL;
100 if (
w->j_ac_vlc_table[
mode])
111 if (!
w->j_orient_vlc_table) {
112 int table_index =
get_bits(
w->gb, 1 + (
w->quant < 13));
119 #define extra_bits(eb) (eb) // 3 bits
120 #define extra_run (0xFF << 8) // 1 bit
121 #define extra_level (0x00 << 8) // 1 bit
122 #define run_offset(r) ((r) << 16) // 6 bits
123 #define level_offset(l) ((l) << 24) // 5 bits
167 int *
const run,
int *
const level,
int *
const final)
196 l = (0xE50000 >> (
i & 0x1E)) & 3;
200 t = 0x01030F >> (l << 3);
216 *
run = (sm & 0xff) + (e &
mask);
218 *
final =
i > (58 - 46);
220 static const uint8_t crazy_mix_runlevel[32] = {
221 0x22, 0x32, 0x33, 0x53, 0x23, 0x42, 0x43, 0x63,
222 0x24, 0x52, 0x34, 0x73, 0x25, 0x62, 0x44, 0x83,
223 0x26, 0x72, 0x35, 0x54, 0x27, 0x82, 0x45, 0x64,
224 0x28, 0x92, 0x36, 0x74, 0x29, 0xa2, 0x46, 0x84,
229 *
run = crazy_mix_runlevel[e] >> 4;
230 *
level = crazy_mix_runlevel[e] & 0x0F;
243 0, 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
247 int *
const level,
int *
const final)
252 if (!
w->j_dc_vlc_table[
mode]) {
288 w->dsp.setup_spatial_compensation(
w->dest[
chroma],
w->scratchpad,
289 w->frame->linesize[
chroma > 0],
292 w->orient =
w->chroma_orient;
293 quant =
w->quant_dc_chroma;
307 w->predicted_dc = sum * 6899 >> 17;
314 if (range < 2 * w->
quant) {
315 if ((
w->edges & 3) == 0) {
325 static const uint8_t prediction_table[3][12] = {
326 { 0, 8, 4, 10, 11, 2, 6, 9, 1, 3, 5, 7 },
327 { 4, 0, 8, 11, 10, 3, 5, 2, 6, 9, 1, 7 },
328 { 8, 0, 4, 10, 11, 1, 7, 2, 6, 9, 3, 5 },
331 if (
w->raw_orient < 0)
335 w->orient=prediction_table[
w->orient][
w->raw_orient];
343 w->prediction_table[
w->mb_x * 2 + (
w->mb_y & 1)] = (est_run << 2) + 1 * (orient == 4) + 2 * (orient == 8);
352 w->edges = 1 * !(
w->mb_x >> 1);
353 w->edges |= 2 * !(
w->mb_y >> 1);
354 w->edges |= 4 * (
w->mb_x >= (2 *
w->mb_width - 1));
359 w->chroma_orient = 4 << ((0xCC >>
w->edges) & 1);
363 w->chroma_orient = (
w->prediction_table[2 *
w->mb_x - 2] & 0x03) << 2;
370 w->edges = 1 * !
w->mb_x;
371 w->edges |= 2 * !
w->mb_y;
372 w->edges |= 4 * (
w->mb_x >= (2 *
w->mb_width - 1));
374 switch (
w->edges & 3) {
379 w->est_run =
w->prediction_table[!(
w->mb_y & 1)] >> 2;
384 w->est_run =
w->prediction_table[2 *
w->mb_x - 2] >> 2;
393 b =
w->prediction_table[2 *
w->mb_x + !(
w->mb_y & 1)];
394 a =
w->prediction_table[2 *
w->mb_x - 2 + (
w->mb_y & 1)];
395 c =
w->prediction_table[2 *
w->mb_x - 2 + !(
w->mb_y & 1)];
401 if ((
w->mb_x &
w->mb_y) != 0)
409 i = (0xFFEAF4C4 >> (2 *
b + 8 *
a)) & 3;
413 w->orient = (0xFFEAD8 >> (2 *
c + 8 * (
w->quant > 12))) & 3;
439 #define B(x,y) w->block[0][w->idct_permutation[(x) + (y) * 8]]
440 #define T(x) ((x) * dc_level + 0x8000) >> 16;
483 w->block_last_index[0] =
FFMAX(
w->block_last_index[0], 7 * 8);
491 w->block_last_index[0] =
FFMAX(
w->block_last_index[0], 7 * 8);
499 w->block_last_index[0] =
FFMAX(
w->block_last_index[0], 7);
507 const ptrdiff_t linesize)
510 for (k = 0; k < 8; k++) {
517 256, 256, 256, 256, 256, 256, 259, 262,
518 265, 269, 272, 275, 278, 282, 285, 288,
519 292, 295, 299, 303, 306, 310, 314, 317,
520 321, 325, 329, 333, 337, 341, 345, 349,
521 353, 358, 362, 366, 371, 375, 379, 384,
522 389, 393, 398, 403, 408, 413, 417, 422,
523 428, 433, 438, 443, 448, 454, 459, 465,
524 470, 476, 482, 488, 493, 499, 505, 511,
531 int ac_mode, dc_mode, est_run, dc_level;
534 int use_quant_matrix;
538 w->bdsp.clear_block(
w->block[0]);
543 dc_mode = !!
w->est_run;
550 use_quant_matrix =
w->use_quant_matrix;
555 if (
w->raw_orient < 3)
556 use_quant_matrix = 0;
558 if (
w->raw_orient > 4) {
562 if (
w->est_run > 1) {
564 est_run =
w->est_run;
574 scantable =
w->permutated_scantable[(0x928548 >> (2 *
w->orient)) & 3];
596 if (use_quant_matrix)
602 w->block_last_index[0] =
pos;
604 w->block_last_index[0] = 0;
605 if (
w->flat_dc && ((
unsigned) (dc_level + 1)) < 3) {
607 :
w->divide_quant_dc_chroma;
609 :
w->quant_dc_chroma;
613 dc_level += (
w->predicted_dc * divide_quant + (1 << 12)) >> 13;
621 zeros_only = dc_level == 0;
624 w->block[0][0] = dc_level *
w->quant;
626 w->block[0][0] = dc_level *
w->quant_dc_chroma;
629 if ((
unsigned int) (dc_level + 1) >= 3 && (
w->edges & 3) != 3) {
633 direction = (0x6A017C >> (
w->orient * 2)) & 3;
634 if (direction != 3) {
644 w->dsp.spatial_compensation[
w->orient](
w->scratchpad,
658 uint8_t *ptr =
w->dest[
chroma];
659 ptrdiff_t linesize =
w->frame->linesize[!!
chroma];
661 if (!((
w->edges & 2) || (zeros_only && (
w->orient | 4) == 4)))
662 w->dsp.h_loop_filter(ptr, linesize,
w->quant);
664 if (!((
w->edges & 1) || (zeros_only && (
w->orient | 8) == 8)))
665 w->dsp.v_loop_filter(ptr, linesize,
w->quant);
682 w->dest[0] +=
w->mb_y * linesize << 3;
684 w->dest[1] += (
w->mb_y & ~1) * uvlinesize << 2;
685 w->dest[2] += (
w->mb_y & ~1) * uvlinesize << 2;
690 int16_t (*
block)[64],
691 int block_last_index[12],
692 int mb_width,
int mb_height)
697 w->mb_width = mb_width;
698 w->mb_height = mb_height;
700 w->block_last_index = block_last_index;
704 if (!
w->prediction_table)
713 w->idct_permutation);
715 w->idct_permutation);
717 w->idct_permutation);
734 int dquant,
int quant_offset,
735 int loopfilter,
int lowdelay)
741 w->quant = dquant >> 1;
742 w->qsum = quant_offset;
744 w->loopfilter = loopfilter;
750 w->divide_quant_dc_luma = ((1 << 16) + (
w->quant >> 1)) /
w->quant;
752 w->quant_dc_chroma =
w->quant;
753 w->divide_quant_dc_chroma =
w->divide_quant_dc_luma;
755 w->quant_dc_chroma =
w->quant + ((
w->quant + 3) >> 3);
756 w->divide_quant_dc_chroma = ((1 << 16) + (
w->quant_dc_chroma >> 1)) /
w->quant_dc_chroma;
760 for (
w->mb_y = 0;
w->mb_y <
w->mb_height * 2;
w->mb_y++) {
762 mb_xy = (
w->mb_y >> 1) * (
w->mb_width + 1);
765 for (
w->mb_x = 0;
w->mb_x <
w->mb_width * 2;
w->mb_x++) {
772 if (
w->mb_x &
w->mb_y & 1) {
795 (
w->mb_y - 1) * 8, 16,