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) // 3 bits
121 #define extra_run (0xFF << 8) // 1 bit
122 #define extra_level (0x00 << 8) // 1 bit
123 #define run_offset(r) ((r) << 16) // 6 bits
124 #define level_offset(l) ((l) << 24) // 5 bits
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;
315 if (range < 2 * w->
quant) {
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[0][w->idct_permutation[(x) + (y) * 8]]
441 #define T(x) ((x) * dc_level + 0x8000) >> 16;
484 w->block_last_index[0] =
FFMAX(
w->block_last_index[0], 7 * 8);
492 w->block_last_index[0] =
FFMAX(
w->block_last_index[0], 7 * 8);
500 w->block_last_index[0] =
FFMAX(
w->block_last_index[0], 7);
508 const ptrdiff_t linesize)
511 for (k = 0; k < 8; k++) {
518 256, 256, 256, 256, 256, 256, 259, 262,
519 265, 269, 272, 275, 278, 282, 285, 288,
520 292, 295, 299, 303, 306, 310, 314, 317,
521 321, 325, 329, 333, 337, 341, 345, 349,
522 353, 358, 362, 366, 371, 375, 379, 384,
523 389, 393, 398, 403, 408, 413, 417, 422,
524 428, 433, 438, 443, 448, 454, 459, 465,
525 470, 476, 482, 488, 493, 499, 505, 511,
532 int ac_mode, dc_mode, est_run, dc_level;
535 int use_quant_matrix;
539 w->bdsp.clear_block(
w->block[0]);
544 dc_mode = !!
w->est_run;
551 use_quant_matrix =
w->use_quant_matrix;
556 if (
w->raw_orient < 3)
557 use_quant_matrix = 0;
559 if (
w->raw_orient > 4) {
563 if (
w->est_run > 1) {
565 est_run =
w->est_run;
575 scantable =
w->permutated_scantable[(0x928548 >> (2 *
w->orient)) & 3];
597 if (use_quant_matrix)
603 w->block_last_index[0] =
pos;
605 w->block_last_index[0] = 0;
606 if (
w->flat_dc && ((
unsigned) (dc_level + 1)) < 3) {
608 :
w->divide_quant_dc_chroma;
610 :
w->quant_dc_chroma;
614 dc_level += (
w->predicted_dc * divide_quant + (1 << 12)) >> 13;
622 zeros_only = dc_level == 0;
625 w->block[0][0] = dc_level *
w->quant;
627 w->block[0][0] = dc_level *
w->quant_dc_chroma;
630 if ((
unsigned int) (dc_level + 1) >= 3 && (
w->edges & 3) != 3) {
634 direction = (0x6A017C >> (
w->orient * 2)) & 3;
635 if (direction != 3) {
645 w->dsp.spatial_compensation[
w->orient](
w->scratchpad,
659 uint8_t *ptr =
w->dest[
chroma];
660 ptrdiff_t linesize =
w->frame->linesize[!!
chroma];
662 if (!((
w->edges & 2) || (zeros_only && (
w->orient | 4) == 4)))
663 w->dsp.h_loop_filter(ptr, linesize,
w->quant);
665 if (!((
w->edges & 1) || (zeros_only && (
w->orient | 8) == 8)))
666 w->dsp.v_loop_filter(ptr, linesize,
w->quant);
676 const ptrdiff_t linesize =
frame->linesize[0];
677 const ptrdiff_t uvlinesize =
frame->linesize[1];
679 w->dest[0] =
frame->data[0];
680 w->dest[1] =
frame->data[1];
681 w->dest[2] =
frame->data[2];
683 w->dest[0] +=
w->mb_y * linesize << 3;
685 w->dest[1] += (
w->mb_y & ~1) * uvlinesize << 2;
686 w->dest[2] += (
w->mb_y & ~1) * uvlinesize << 2;
691 int16_t (*
block)[64],
692 int block_last_index[12],
693 int mb_width,
int mb_height)
698 w->mb_width = mb_width;
699 w->mb_height = mb_height;
701 w->block_last_index = block_last_index;
705 if (!
w->prediction_table)
714 w->idct_permutation);
716 w->idct_permutation);
718 w->idct_permutation);
735 int dquant,
int quant_offset,
736 int loopfilter,
int lowdelay)
742 w->quant = dquant >> 1;
743 w->qsum = quant_offset;
745 w->loopfilter = loopfilter;
751 w->divide_quant_dc_luma = ((1 << 16) + (
w->quant >> 1)) /
w->quant;
753 w->quant_dc_chroma =
w->quant;
754 w->divide_quant_dc_chroma =
w->divide_quant_dc_luma;
756 w->quant_dc_chroma =
w->quant + ((
w->quant + 3) >> 3);
757 w->divide_quant_dc_chroma = ((1 << 16) + (
w->quant_dc_chroma >> 1)) /
w->quant_dc_chroma;
761 for (
w->mb_y = 0;
w->mb_y <
w->mb_height * 2;
w->mb_y++) {
763 mb_xy = (
w->mb_y >> 1) * (
w->mb_width + 1);
766 for (
w->mb_x = 0;
w->mb_x <
w->mb_width * 2;
w->mb_x++) {
773 if (
w->mb_x &
w->mb_y & 1) {
796 (
w->mb_y - 1) * 8, 16,