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) 
   70     for (
int i = 0; 
i < 2; 
i++)
 
   71         for (
int j = 0; j < 2; j++)
 
   72             for (
int k = 0; k < 8; k++)
 
   77     for (
int i = 0; 
i < 2; 
i++)
 
   78         for (
int j = 0; j < 8; j++)
 
   83     for (
i = 0; 
i < 2; 
i++)
 
   86     for (
i = 0; 
i < 4; 
i++)
 
   95     memset(
w->j_dc_vlc_table, 0, 
sizeof(
w->j_dc_vlc_table));
 
   96     memset(
w->j_ac_vlc_table, 0, 
sizeof(
w->j_ac_vlc_table));
 
   97     w->j_orient_vlc_table = 
NULL;
 
  106     if (
w->j_ac_vlc_table[
mode])
 
  117     if (!
w->j_orient_vlc_table) {
 
  118         int table_index = 
get_bits(
w->gb, 1 + (
w->quant < 13));
 
  125 #define extra_bits(eb)  (eb)        // 3 bits 
  126 #define extra_run       (0xFF << 8) // 1 bit 
  127 #define extra_level     (0x00 << 8) // 1 bit 
  128 #define run_offset(r)   ((r) << 16) // 6 bits 
  129 #define level_offset(l) ((l) << 24) // 5 bits 
  173                           int *
const run, 
int *
const level, 
int *
const final)
 
  202         l = (0xE50000 >> (
i & 0x1E)) & 3; 
 
  206         t = 0x01030F >> (l << 3);
 
  222         *
run   = (sm &  0xff) + (e &  
mask);    
 
  224         *
final = 
i > (58 - 46);
 
  226         static const uint8_t crazy_mix_runlevel[32] = {
 
  227             0x22, 0x32, 0x33, 0x53, 0x23, 0x42, 0x43, 0x63,
 
  228             0x24, 0x52, 0x34, 0x73, 0x25, 0x62, 0x44, 0x83,
 
  229             0x26, 0x72, 0x35, 0x54, 0x27, 0x82, 0x45, 0x64,
 
  230             0x28, 0x92, 0x36, 0x74, 0x29, 0xa2, 0x46, 0x84,
 
  235         *
run   = crazy_mix_runlevel[e] >> 4;
 
  236         *
level = crazy_mix_runlevel[e] & 0x0F;
 
  249     0, 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
 
  253                          int *
const level, 
int *
const final)
 
  258     if (!
w->j_dc_vlc_table[
mode]) {
 
  294     w->dsp.setup_spatial_compensation(
w->dest[
chroma], 
w->scratchpad,
 
  295                                       w->frame->linesize[
chroma > 0],
 
  296                                       &range, &sum, 
w->edges);
 
  298         w->orient = 
w->chroma_orient;
 
  299         quant     = 
w->quant_dc_chroma;
 
  305     if (range < 
quant || range < 3) {
 
  313             w->predicted_dc = sum * 6899 >> 17;
 
  320     if (range < 2 * w->
quant) {
 
  321         if ((
w->edges & 3) == 0) {
 
  331         static const uint8_t prediction_table[3][12] = {
 
  332             { 0, 8, 4, 10, 11, 2, 6, 9, 1, 3, 5, 7 },
 
  333             { 4, 0, 8, 11, 10, 3, 5, 2, 6, 9, 1, 7 },
 
  334             { 8, 0, 4, 10, 11, 1, 7, 2, 6, 9, 3, 5 },
 
  337         if (
w->raw_orient < 0)
 
  341         w->orient=prediction_table[
w->orient][
w->raw_orient];
 
  349     w->prediction_table[
w->mb_x * 2 + (
w->mb_y & 1)] = (est_run << 2) + 1 * (orient == 4) + 2 * (orient == 8);
 
  358     w->edges  = 1 * !(
w->mb_x >> 1);
 
  359     w->edges |= 2 * !(
w->mb_y >> 1);
 
  360     w->edges |= 4 * (
w->mb_x >= (2 * 
w->mb_width - 1)); 
 
  365         w->chroma_orient = 4 << ((0xCC >> 
w->edges) & 1);
 
  369     w->chroma_orient = (
w->prediction_table[2 * 
w->mb_x - 2] & 0x03) << 2;
 
  376     w->edges  = 1 * !
w->mb_x;
 
  377     w->edges |= 2 * !
w->mb_y;
 
  378     w->edges |= 4 * (
w->mb_x >= (2 * 
w->mb_width - 1));
 
  380     switch (
w->edges & 3) {
 
  385         w->est_run = 
w->prediction_table[!(
w->mb_y & 1)] >> 2;
 
  390         w->est_run = 
w->prediction_table[2 * 
w->mb_x - 2] >> 2;
 
  399     b = 
w->prediction_table[2 * 
w->mb_x     + !(
w->mb_y & 1)]; 
 
  400     a = 
w->prediction_table[2 * 
w->mb_x - 2 +  (
w->mb_y & 1)]; 
 
  401     c = 
w->prediction_table[2 * 
w->mb_x - 2 + !(
w->mb_y & 1)]; 
 
  407     if ((
w->mb_x & 
w->mb_y) != 0)
 
  415     i = (0xFFEAF4C4 >> (2 * 
b + 8 * 
a)) & 3;
 
  419         w->orient = (0xFFEAD8 >> (2 * 
c + 8 * (
w->quant > 12))) & 3;
 
  445 #define B(x,y)  w->block[0][w->idct_permutation[(x) + (y) * 8]] 
  446 #define T(x)  ((x) * dc_level + 0x8000) >> 16; 
  489         w->block_last_index[0] = 
FFMAX(
w->block_last_index[0], 7 * 8);
 
  497         w->block_last_index[0] = 
FFMAX(
w->block_last_index[0], 7 * 8);
 
  505         w->block_last_index[0] = 
FFMAX(
w->block_last_index[0], 7);
 
  513                                   const ptrdiff_t linesize)
 
  516     for (k = 0; k < 8; k++) {
 
  523     256, 256, 256, 256, 256, 256, 259, 262,
 
  524     265, 269, 272, 275, 278, 282, 285, 288,
 
  525     292, 295, 299, 303, 306, 310, 314, 317,
 
  526     321, 325, 329, 333, 337, 341, 345, 349,
 
  527     353, 358, 362, 366, 371, 375, 379, 384,
 
  528     389, 393, 398, 403, 408, 413, 417, 422,
 
  529     428, 433, 438, 443, 448, 454, 459, 465,
 
  530     470, 476, 482, 488, 493, 499, 505, 511,
 
  537     int ac_mode, dc_mode, est_run, dc_level;
 
  540     int use_quant_matrix;
 
  544     w->bdsp.clear_block(
w->block[0]);
 
  549         dc_mode = !!
w->est_run; 
 
  556         use_quant_matrix = 
w->use_quant_matrix;
 
  561             if (
w->raw_orient < 3)
 
  562                 use_quant_matrix = 0;
 
  564             if (
w->raw_orient > 4) {
 
  568                 if (
w->est_run > 1) {
 
  570                     est_run = 
w->est_run;
 
  580         scantable = 
w->permutated_scantable[(0x928548 >> (2 * 
w->orient)) & 3];
 
  602             if (use_quant_matrix)
 
  608         w->block_last_index[0] = 
pos;
 
  610         w->block_last_index[0] = 0;
 
  611         if (
w->flat_dc && ((
unsigned) (dc_level + 1)) < 3) { 
 
  613                                            : 
w->divide_quant_dc_chroma;
 
  615                                            : 
w->quant_dc_chroma;
 
  619             dc_level += (
w->predicted_dc * divide_quant + (1 << 12)) >> 13;
 
  627         zeros_only = dc_level == 0;
 
  630         w->block[0][0] = dc_level * 
w->quant;
 
  632         w->block[0][0] = dc_level * 
w->quant_dc_chroma;
 
  635     if ((
unsigned int) (dc_level + 1) >= 3 && (
w->edges & 3) != 3) {
 
  639         direction = (0x6A017C >> (
w->orient * 2)) & 3;
 
  640         if (direction != 3) {
 
  650         w->dsp.spatial_compensation[
w->orient](
w->scratchpad,
 
  664         uint8_t *ptr = 
w->dest[
chroma];
 
  665         ptrdiff_t linesize = 
w->frame->linesize[!!
chroma];
 
  667         if (!((
w->edges & 2) || (zeros_only && (
w->orient | 4) == 4)))
 
  668             w->dsp.h_loop_filter(ptr, linesize, 
w->quant);
 
  670         if (!((
w->edges & 1) || (zeros_only && (
w->orient | 8) == 8)))
 
  671             w->dsp.v_loop_filter(ptr, linesize, 
w->quant);
 
  681     const ptrdiff_t linesize   = 
frame->linesize[0];
 
  682     const ptrdiff_t uvlinesize = 
frame->linesize[1];
 
  684     w->dest[0] = 
frame->data[0];
 
  685     w->dest[1] = 
frame->data[1];
 
  686     w->dest[2] = 
frame->data[2];
 
  688     w->dest[0] +=  
w->mb_y       * linesize   << 3;
 
  690     w->dest[1] += (
w->mb_y & ~1) * uvlinesize << 2;
 
  691     w->dest[2] += (
w->mb_y & ~1) * uvlinesize << 2;
 
  696                                    int16_t (*
block)[64],
 
  697                                    int block_last_index[12],
 
  698                                    int mb_width, 
int mb_height)
 
  703     w->mb_width  = mb_width;
 
  704     w->mb_height = mb_height;
 
  706     w->block_last_index = block_last_index;
 
  710     if (!
w->prediction_table)
 
  719                          w->idct_permutation);
 
  721                          w->idct_permutation);
 
  723                          w->idct_permutation);
 
  740                               int dquant, 
int quant_offset,
 
  741                               int loopfilter, 
int lowdelay)
 
  747     w->quant  = dquant >> 1;
 
  748     w->qsum   = quant_offset;
 
  750     w->loopfilter = loopfilter;
 
  756     w->divide_quant_dc_luma = ((1 << 16) + (
w->quant >> 1)) / 
w->quant;
 
  758         w->quant_dc_chroma        = 
w->quant;
 
  759         w->divide_quant_dc_chroma = 
w->divide_quant_dc_luma;
 
  761         w->quant_dc_chroma        = 
w->quant + ((
w->quant + 3) >> 3);
 
  762         w->divide_quant_dc_chroma = ((1 << 16) + (
w->quant_dc_chroma >> 1)) / 
w->quant_dc_chroma;
 
  766     for (
w->mb_y = 0; 
w->mb_y < 
w->mb_height * 2; 
w->mb_y++) {
 
  768         mb_xy = (
w->mb_y >> 1) * (
w->mb_width + 1);
 
  771         for (
w->mb_x = 0; 
w->mb_x < 
w->mb_width * 2; 
w->mb_x++) {
 
  778             if (
w->mb_x & 
w->mb_y & 1) {
 
  801                                (
w->mb_y - 1) * 8, 16,