Home | History | Annotate | Download | only in encoder
      1 /*
      2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 
     12 #include "vp8/common/header.h"
     13 #include "encodemv.h"
     14 #include "vp8/common/entropymode.h"
     15 #include "vp8/common/findnearmv.h"
     16 #include "mcomp.h"
     17 #include "vp8/common/systemdependent.h"
     18 #include <assert.h>
     19 #include <stdio.h>
     20 #include "vp8/common/pragmas.h"
     21 #include "vpx_mem/vpx_mem.h"
     22 #include "bitstream.h"
     23 
     24 const int vp8cx_base_skip_false_prob[128] =
     25 {
     26     255, 255, 255, 255, 255, 255, 255, 255,
     27     255, 255, 255, 255, 255, 255, 255, 255,
     28     255, 255, 255, 255, 255, 255, 255, 255,
     29     255, 255, 255, 255, 255, 255, 255, 255,
     30     255, 255, 255, 255, 255, 255, 255, 255,
     31     255, 255, 255, 255, 255, 255, 255, 255,
     32     255, 255, 255, 255, 255, 255, 255, 255,
     33     251, 248, 244, 240, 236, 232, 229, 225,
     34     221, 217, 213, 208, 204, 199, 194, 190,
     35     187, 183, 179, 175, 172, 168, 164, 160,
     36     157, 153, 149, 145, 142, 138, 134, 130,
     37     127, 124, 120, 117, 114, 110, 107, 104,
     38     101, 98,  95,  92,  89,  86,  83, 80,
     39     77,  74,  71,  68,  65,  62,  59, 56,
     40     53,  50,  47,  44,  41,  38,  35, 32,
     41     30,  28,  26,  24,  22,  20,  18, 16,
     42 };
     43 #ifdef VP8REF
     44 #define __int64 long long
     45 #endif
     46 
     47 #if defined(SECTIONBITS_OUTPUT)
     48 unsigned __int64 Sectionbits[500];
     49 #endif
     50 
     51 #ifdef ENTROPY_STATS
     52 int intra_mode_stats[10][10][10];
     53 static unsigned int tree_update_hist [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens-1] [2];
     54 extern unsigned int active_section;
     55 #endif
     56 
     57 #ifdef MODE_STATS
     58 int count_mb_seg[4] = { 0, 0, 0, 0 };
     59 #endif
     60 
     61 
     62 static void update_mode(
     63     vp8_writer *const w,
     64     int n,
     65     vp8_token tok               [/* n */],
     66     vp8_tree tree,
     67     vp8_prob Pnew               [/* n-1 */],
     68     vp8_prob Pcur               [/* n-1 */],
     69     unsigned int bct            [/* n-1 */] [2],
     70     const unsigned int num_events[/* n */]
     71 )
     72 {
     73     unsigned int new_b = 0, old_b = 0;
     74     int i = 0;
     75 
     76     vp8_tree_probs_from_distribution(
     77         n--, tok, tree,
     78         Pnew, bct, num_events,
     79         256, 1
     80     );
     81 
     82     do
     83     {
     84         new_b += vp8_cost_branch(bct[i], Pnew[i]);
     85         old_b += vp8_cost_branch(bct[i], Pcur[i]);
     86     }
     87     while (++i < n);
     88 
     89     if (new_b + (n << 8) < old_b)
     90     {
     91         int i = 0;
     92 
     93         vp8_write_bit(w, 1);
     94 
     95         do
     96         {
     97             const vp8_prob p = Pnew[i];
     98 
     99             vp8_write_literal(w, Pcur[i] = p ? p : 1, 8);
    100         }
    101         while (++i < n);
    102     }
    103     else
    104         vp8_write_bit(w, 0);
    105 }
    106 
    107 static void update_mbintra_mode_probs(VP8_COMP *cpi)
    108 {
    109     VP8_COMMON *const x = & cpi->common;
    110 
    111     vp8_writer *const w = & cpi->bc;
    112 
    113     {
    114         vp8_prob Pnew   [VP8_YMODES-1];
    115         unsigned int bct [VP8_YMODES-1] [2];
    116 
    117         update_mode(
    118             w, VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree,
    119             Pnew, x->fc.ymode_prob, bct, (unsigned int *)cpi->ymode_count
    120         );
    121     }
    122     {
    123         vp8_prob Pnew   [VP8_UV_MODES-1];
    124         unsigned int bct [VP8_UV_MODES-1] [2];
    125 
    126         update_mode(
    127             w, VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree,
    128             Pnew, x->fc.uv_mode_prob, bct, (unsigned int *)cpi->uv_mode_count
    129         );
    130     }
    131 }
    132 
    133 static void write_ymode(vp8_writer *bc, int m, const vp8_prob *p)
    134 {
    135     vp8_write_token(bc, vp8_ymode_tree, p, vp8_ymode_encodings + m);
    136 }
    137 
    138 static void kfwrite_ymode(vp8_writer *bc, int m, const vp8_prob *p)
    139 {
    140     vp8_write_token(bc, vp8_kf_ymode_tree, p, vp8_kf_ymode_encodings + m);
    141 }
    142 
    143 static void write_uv_mode(vp8_writer *bc, int m, const vp8_prob *p)
    144 {
    145     vp8_write_token(bc, vp8_uv_mode_tree, p, vp8_uv_mode_encodings + m);
    146 }
    147 
    148 
    149 static void write_bmode(vp8_writer *bc, int m, const vp8_prob *p)
    150 {
    151     vp8_write_token(bc, vp8_bmode_tree, p, vp8_bmode_encodings + m);
    152 }
    153 
    154 static void write_split(vp8_writer *bc, int x)
    155 {
    156     vp8_write_token(
    157         bc, vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + x
    158     );
    159 }
    160 
    161 static const unsigned int norm[256] =
    162 {
    163     0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    164     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    165     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    166     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    167     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    168     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    169     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    170     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    171 };
    172 
    173 static void pack_tokens_c(vp8_writer *w, const TOKENEXTRA *p, int xcount)
    174 {
    175     const TOKENEXTRA *const stop = p + xcount;
    176     unsigned int split;
    177     unsigned int shift;
    178     int count = w->count;
    179     unsigned int range = w->range;
    180     unsigned int lowvalue = w->lowvalue;
    181 
    182     while (p < stop)
    183     {
    184         const int t = p->Token;
    185         vp8_token *const a = vp8_coef_encodings + t;
    186         const vp8_extra_bit_struct *const b = vp8_extra_bits + t;
    187         int i = 0;
    188         const unsigned char *pp = p->context_tree;
    189         int v = a->value;
    190         int n = a->Len;
    191 
    192         if (p->skip_eob_node)
    193         {
    194             n--;
    195             i = 2;
    196         }
    197 
    198         do
    199         {
    200             const int bb = (v >> --n) & 1;
    201             split = 1 + (((range - 1) * pp[i>>1]) >> 8);
    202             i = vp8_coef_tree[i+bb];
    203 
    204             if (bb)
    205             {
    206                 lowvalue += split;
    207                 range = range - split;
    208             }
    209             else
    210             {
    211                 range = split;
    212             }
    213 
    214             shift = norm[range];
    215             range <<= shift;
    216             count += shift;
    217 
    218             if (count >= 0)
    219             {
    220                 int offset = shift - count;
    221 
    222                 if ((lowvalue << (offset - 1)) & 0x80000000)
    223                 {
    224                     int x = w->pos - 1;
    225 
    226                     while (x >= 0 && w->buffer[x] == 0xff)
    227                     {
    228                         w->buffer[x] = (unsigned char)0;
    229                         x--;
    230                     }
    231 
    232                     w->buffer[x] += 1;
    233                 }
    234 
    235                 w->buffer[w->pos++] = (lowvalue >> (24 - offset));
    236                 lowvalue <<= offset;
    237                 shift = count;
    238                 lowvalue &= 0xffffff;
    239                 count -= 8 ;
    240             }
    241 
    242             lowvalue <<= shift;
    243         }
    244         while (n);
    245 
    246 
    247         if (b->base_val)
    248         {
    249             const int e = p->Extra, L = b->Len;
    250 
    251             if (L)
    252             {
    253                 const unsigned char *pp = b->prob;
    254                 int v = e >> 1;
    255                 int n = L;              /* number of bits in v, assumed nonzero */
    256                 int i = 0;
    257 
    258                 do
    259                 {
    260                     const int bb = (v >> --n) & 1;
    261                     split = 1 + (((range - 1) * pp[i>>1]) >> 8);
    262                     i = b->tree[i+bb];
    263 
    264                     if (bb)
    265                     {
    266                         lowvalue += split;
    267                         range = range - split;
    268                     }
    269                     else
    270                     {
    271                         range = split;
    272                     }
    273 
    274                     shift = norm[range];
    275                     range <<= shift;
    276                     count += shift;
    277 
    278                     if (count >= 0)
    279                     {
    280                         int offset = shift - count;
    281 
    282                         if ((lowvalue << (offset - 1)) & 0x80000000)
    283                         {
    284                             int x = w->pos - 1;
    285 
    286                             while (x >= 0 && w->buffer[x] == 0xff)
    287                             {
    288                                 w->buffer[x] = (unsigned char)0;
    289                                 x--;
    290                             }
    291 
    292                             w->buffer[x] += 1;
    293                         }
    294 
    295                         w->buffer[w->pos++] = (lowvalue >> (24 - offset));
    296                         lowvalue <<= offset;
    297                         shift = count;
    298                         lowvalue &= 0xffffff;
    299                         count -= 8 ;
    300                     }
    301 
    302                     lowvalue <<= shift;
    303                 }
    304                 while (n);
    305             }
    306 
    307 
    308             {
    309 
    310                 split = (range + 1) >> 1;
    311 
    312                 if (e & 1)
    313                 {
    314                     lowvalue += split;
    315                     range = range - split;
    316                 }
    317                 else
    318                 {
    319                     range = split;
    320                 }
    321 
    322                 range <<= 1;
    323 
    324                 if ((lowvalue & 0x80000000))
    325                 {
    326                     int x = w->pos - 1;
    327 
    328                     while (x >= 0 && w->buffer[x] == 0xff)
    329                     {
    330                         w->buffer[x] = (unsigned char)0;
    331                         x--;
    332                     }
    333 
    334                     w->buffer[x] += 1;
    335 
    336                 }
    337 
    338                 lowvalue  <<= 1;
    339 
    340                 if (!++count)
    341                 {
    342                     count = -8;
    343                     w->buffer[w->pos++] = (lowvalue >> 24);
    344                     lowvalue &= 0xffffff;
    345                 }
    346             }
    347 
    348         }
    349 
    350         ++p;
    351     }
    352 
    353     w->count = count;
    354     w->lowvalue = lowvalue;
    355     w->range = range;
    356 
    357 }
    358 
    359 static void write_partition_size(unsigned char *cx_data, int size)
    360 {
    361     signed char csize;
    362 
    363     csize = size & 0xff;
    364     *cx_data = csize;
    365     csize = (size >> 8) & 0xff;
    366     *(cx_data + 1) = csize;
    367     csize = (size >> 16) & 0xff;
    368     *(cx_data + 2) = csize;
    369 
    370 }
    371 
    372 static void pack_tokens_into_partitions_c(VP8_COMP *cpi, unsigned char *cx_data, int num_part, int *size)
    373 {
    374 
    375     int i;
    376     unsigned char *ptr = cx_data;
    377     unsigned int shift;
    378     vp8_writer *w = &cpi->bc2;
    379     *size = 3 * (num_part - 1);
    380     ptr = cx_data + (*size);
    381 
    382     for (i = 0; i < num_part; i++)
    383     {
    384         vp8_start_encode(w, ptr);
    385         {
    386             unsigned int split;
    387             int count = w->count;
    388             unsigned int range = w->range;
    389             unsigned int lowvalue = w->lowvalue;
    390             int mb_row;
    391 
    392             for (mb_row = i; mb_row < cpi->common.mb_rows; mb_row += num_part)
    393             {
    394                 TOKENEXTRA *p    = cpi->tplist[mb_row].start;
    395                 TOKENEXTRA *stop = cpi->tplist[mb_row].stop;
    396 
    397                 while (p < stop)
    398                 {
    399                     const int t = p->Token;
    400                     vp8_token *const a = vp8_coef_encodings + t;
    401                     const vp8_extra_bit_struct *const b = vp8_extra_bits + t;
    402                     int i = 0;
    403                     const unsigned char *pp = p->context_tree;
    404                     int v = a->value;
    405                     int n = a->Len;
    406 
    407                     if (p->skip_eob_node)
    408                     {
    409                         n--;
    410                         i = 2;
    411                     }
    412 
    413                     do
    414                     {
    415                         const int bb = (v >> --n) & 1;
    416                         split = 1 + (((range - 1) * pp[i>>1]) >> 8);
    417                         i = vp8_coef_tree[i+bb];
    418 
    419                         if (bb)
    420                         {
    421                             lowvalue += split;
    422                             range = range - split;
    423                         }
    424                         else
    425                         {
    426                             range = split;
    427                         }
    428 
    429                         shift = norm[range];
    430                         range <<= shift;
    431                         count += shift;
    432 
    433                         if (count >= 0)
    434                         {
    435                             int offset = shift - count;
    436 
    437                             if ((lowvalue << (offset - 1)) & 0x80000000)
    438                             {
    439                                 int x = w->pos - 1;
    440 
    441                                 while (x >= 0 && w->buffer[x] == 0xff)
    442                                 {
    443                                     w->buffer[x] = (unsigned char)0;
    444                                     x--;
    445                                 }
    446 
    447                                 w->buffer[x] += 1;
    448                             }
    449 
    450                             w->buffer[w->pos++] = (lowvalue >> (24 - offset));
    451                             lowvalue <<= offset;
    452                             shift = count;
    453                             lowvalue &= 0xffffff;
    454                             count -= 8 ;
    455                         }
    456 
    457                         lowvalue <<= shift;
    458                     }
    459                     while (n);
    460 
    461 
    462                     if (b->base_val)
    463                     {
    464                         const int e = p->Extra, L = b->Len;
    465 
    466                         if (L)
    467                         {
    468                             const unsigned char *pp = b->prob;
    469                             int v = e >> 1;
    470                             int n = L;              /* number of bits in v, assumed nonzero */
    471                             int i = 0;
    472 
    473                             do
    474                             {
    475                                 const int bb = (v >> --n) & 1;
    476                                 split = 1 + (((range - 1) * pp[i>>1]) >> 8);
    477                                 i = b->tree[i+bb];
    478 
    479                                 if (bb)
    480                                 {
    481                                     lowvalue += split;
    482                                     range = range - split;
    483                                 }
    484                                 else
    485                                 {
    486                                     range = split;
    487                                 }
    488 
    489                                 shift = norm[range];
    490                                 range <<= shift;
    491                                 count += shift;
    492 
    493                                 if (count >= 0)
    494                                 {
    495                                     int offset = shift - count;
    496 
    497                                     if ((lowvalue << (offset - 1)) & 0x80000000)
    498                                     {
    499                                         int x = w->pos - 1;
    500 
    501                                         while (x >= 0 && w->buffer[x] == 0xff)
    502                                         {
    503                                             w->buffer[x] = (unsigned char)0;
    504                                             x--;
    505                                         }
    506 
    507                                         w->buffer[x] += 1;
    508                                     }
    509 
    510                                     w->buffer[w->pos++] = (lowvalue >> (24 - offset));
    511                                     lowvalue <<= offset;
    512                                     shift = count;
    513                                     lowvalue &= 0xffffff;
    514                                     count -= 8 ;
    515                                 }
    516 
    517                                 lowvalue <<= shift;
    518                             }
    519                             while (n);
    520                         }
    521 
    522                         {
    523                             split = (range + 1) >> 1;
    524 
    525                             if (e & 1)
    526                             {
    527                                 lowvalue += split;
    528                                 range = range - split;
    529                             }
    530                             else
    531                             {
    532                                 range = split;
    533                             }
    534 
    535                             range <<= 1;
    536 
    537                             if ((lowvalue & 0x80000000))
    538                             {
    539                                 int x = w->pos - 1;
    540 
    541                                 while (x >= 0 && w->buffer[x] == 0xff)
    542                                 {
    543                                     w->buffer[x] = (unsigned char)0;
    544                                     x--;
    545                                 }
    546 
    547                                 w->buffer[x] += 1;
    548 
    549                             }
    550 
    551                             lowvalue  <<= 1;
    552 
    553                             if (!++count)
    554                             {
    555                                 count = -8;
    556                                 w->buffer[w->pos++] = (lowvalue >> 24);
    557                                 lowvalue &= 0xffffff;
    558                             }
    559                         }
    560 
    561                     }
    562 
    563                     ++p;
    564                 }
    565             }
    566 
    567             w->count    = count;
    568             w->lowvalue = lowvalue;
    569             w->range    = range;
    570 
    571         }
    572 
    573         vp8_stop_encode(w);
    574         *size +=   w->pos;
    575 
    576         if (i < (num_part - 1))
    577         {
    578             write_partition_size(cx_data, w->pos);
    579             cx_data += 3;
    580             ptr += w->pos;
    581         }
    582     }
    583 }
    584 
    585 
    586 static void pack_mb_row_tokens_c(VP8_COMP *cpi, vp8_writer *w)
    587 {
    588 
    589     unsigned int split;
    590     int count = w->count;
    591     unsigned int range = w->range;
    592     unsigned int lowvalue = w->lowvalue;
    593     unsigned int shift;
    594     int mb_row;
    595 
    596     for (mb_row = 0; mb_row < cpi->common.mb_rows; mb_row++)
    597     {
    598         TOKENEXTRA *p    = cpi->tplist[mb_row].start;
    599         TOKENEXTRA *stop = cpi->tplist[mb_row].stop;
    600 
    601         while (p < stop)
    602         {
    603             const int t = p->Token;
    604             vp8_token *const a = vp8_coef_encodings + t;
    605             const vp8_extra_bit_struct *const b = vp8_extra_bits + t;
    606             int i = 0;
    607             const unsigned char *pp = p->context_tree;
    608             int v = a->value;
    609             int n = a->Len;
    610 
    611             if (p->skip_eob_node)
    612             {
    613                 n--;
    614                 i = 2;
    615             }
    616 
    617             do
    618             {
    619                 const int bb = (v >> --n) & 1;
    620                 split = 1 + (((range - 1) * pp[i>>1]) >> 8);
    621                 i = vp8_coef_tree[i+bb];
    622 
    623                 if (bb)
    624                 {
    625                     lowvalue += split;
    626                     range = range - split;
    627                 }
    628                 else
    629                 {
    630                     range = split;
    631                 }
    632 
    633                 shift = norm[range];
    634                 range <<= shift;
    635                 count += shift;
    636 
    637                 if (count >= 0)
    638                 {
    639                     int offset = shift - count;
    640 
    641                     if ((lowvalue << (offset - 1)) & 0x80000000)
    642                     {
    643                         int x = w->pos - 1;
    644 
    645                         while (x >= 0 && w->buffer[x] == 0xff)
    646                         {
    647                             w->buffer[x] = (unsigned char)0;
    648                             x--;
    649                         }
    650 
    651                         w->buffer[x] += 1;
    652                     }
    653 
    654                     w->buffer[w->pos++] = (lowvalue >> (24 - offset));
    655                     lowvalue <<= offset;
    656                     shift = count;
    657                     lowvalue &= 0xffffff;
    658                     count -= 8 ;
    659                 }
    660 
    661                 lowvalue <<= shift;
    662             }
    663             while (n);
    664 
    665 
    666             if (b->base_val)
    667             {
    668                 const int e = p->Extra, L = b->Len;
    669 
    670                 if (L)
    671                 {
    672                     const unsigned char *pp = b->prob;
    673                     int v = e >> 1;
    674                     int n = L;              /* number of bits in v, assumed nonzero */
    675                     int i = 0;
    676 
    677                     do
    678                     {
    679                         const int bb = (v >> --n) & 1;
    680                         split = 1 + (((range - 1) * pp[i>>1]) >> 8);
    681                         i = b->tree[i+bb];
    682 
    683                         if (bb)
    684                         {
    685                             lowvalue += split;
    686                             range = range - split;
    687                         }
    688                         else
    689                         {
    690                             range = split;
    691                         }
    692 
    693                         shift = norm[range];
    694                         range <<= shift;
    695                         count += shift;
    696 
    697                         if (count >= 0)
    698                         {
    699                             int offset = shift - count;
    700 
    701                             if ((lowvalue << (offset - 1)) & 0x80000000)
    702                             {
    703                                 int x = w->pos - 1;
    704 
    705                                 while (x >= 0 && w->buffer[x] == 0xff)
    706                                 {
    707                                     w->buffer[x] = (unsigned char)0;
    708                                     x--;
    709                                 }
    710 
    711                                 w->buffer[x] += 1;
    712                             }
    713 
    714                             w->buffer[w->pos++] = (lowvalue >> (24 - offset));
    715                             lowvalue <<= offset;
    716                             shift = count;
    717                             lowvalue &= 0xffffff;
    718                             count -= 8 ;
    719                         }
    720 
    721                         lowvalue <<= shift;
    722                     }
    723                     while (n);
    724                 }
    725 
    726                 {
    727                     split = (range + 1) >> 1;
    728 
    729                     if (e & 1)
    730                     {
    731                         lowvalue += split;
    732                         range = range - split;
    733                     }
    734                     else
    735                     {
    736                         range = split;
    737                     }
    738 
    739                     range <<= 1;
    740 
    741                     if ((lowvalue & 0x80000000))
    742                     {
    743                         int x = w->pos - 1;
    744 
    745                         while (x >= 0 && w->buffer[x] == 0xff)
    746                         {
    747                             w->buffer[x] = (unsigned char)0;
    748                             x--;
    749                         }
    750 
    751                         w->buffer[x] += 1;
    752 
    753                     }
    754 
    755                     lowvalue  <<= 1;
    756 
    757                     if (!++count)
    758                     {
    759                         count = -8;
    760                         w->buffer[w->pos++] = (lowvalue >> 24);
    761                         lowvalue &= 0xffffff;
    762                     }
    763                 }
    764 
    765             }
    766 
    767             ++p;
    768         }
    769     }
    770 
    771     w->count = count;
    772     w->lowvalue = lowvalue;
    773     w->range = range;
    774 
    775 }
    776 
    777 static void write_mv_ref
    778 (
    779     vp8_writer *w, MB_PREDICTION_MODE m, const vp8_prob *p
    780 )
    781 {
    782 
    783     assert(NEARESTMV <= m  &&  m <= SPLITMV);
    784 
    785     vp8_write_token(w, vp8_mv_ref_tree, p,
    786                     vp8_mv_ref_encoding_array - NEARESTMV + m);
    787 }
    788 
    789 static void write_sub_mv_ref
    790 (
    791     vp8_writer *w, B_PREDICTION_MODE m, const vp8_prob *p
    792 )
    793 {
    794     assert(LEFT4X4 <= m  &&  m <= NEW4X4);
    795 
    796     vp8_write_token(w, vp8_sub_mv_ref_tree, p,
    797                     vp8_sub_mv_ref_encoding_array - LEFT4X4 + m);
    798 }
    799 
    800 static void write_mv
    801 (
    802     vp8_writer *w, const MV *mv, const MV *ref, const MV_CONTEXT *mvc
    803 )
    804 {
    805     MV e;
    806     e.row = mv->row - ref->row;
    807     e.col = mv->col - ref->col;
    808 
    809     vp8_encode_motion_vector(w, &e, mvc);
    810 }
    811 
    812 static void write_mb_features(vp8_writer *w, const MB_MODE_INFO *mi, const MACROBLOCKD *x)
    813 {
    814     // Encode the MB segment id.
    815     if (x->segmentation_enabled && x->update_mb_segmentation_map)
    816     {
    817         switch (mi->segment_id)
    818         {
    819         case 0:
    820             vp8_write(w, 0, x->mb_segment_tree_probs[0]);
    821             vp8_write(w, 0, x->mb_segment_tree_probs[1]);
    822             break;
    823         case 1:
    824             vp8_write(w, 0, x->mb_segment_tree_probs[0]);
    825             vp8_write(w, 1, x->mb_segment_tree_probs[1]);
    826             break;
    827         case 2:
    828             vp8_write(w, 1, x->mb_segment_tree_probs[0]);
    829             vp8_write(w, 0, x->mb_segment_tree_probs[2]);
    830             break;
    831         case 3:
    832             vp8_write(w, 1, x->mb_segment_tree_probs[0]);
    833             vp8_write(w, 1, x->mb_segment_tree_probs[2]);
    834             break;
    835 
    836             // TRAP.. This should not happen
    837         default:
    838             vp8_write(w, 0, x->mb_segment_tree_probs[0]);
    839             vp8_write(w, 0, x->mb_segment_tree_probs[1]);
    840             break;
    841         }
    842     }
    843 }
    844 
    845 
    846 static void pack_inter_mode_mvs(VP8_COMP *const cpi)
    847 {
    848     VP8_COMMON *const pc = & cpi->common;
    849     vp8_writer *const w = & cpi->bc;
    850     const MV_CONTEXT *mvc = pc->fc.mvc;
    851 
    852     const int *const rfct = cpi->count_mb_ref_frame_usage;
    853     const int rf_intra = rfct[INTRA_FRAME];
    854     const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
    855 
    856     MODE_INFO *m = pc->mi, *ms;
    857     const int mis = pc->mode_info_stride;
    858     int mb_row = -1;
    859 
    860     int prob_last_coded;
    861     int prob_gf_coded;
    862     int prob_skip_false = 0;
    863     ms = pc->mi - 1;
    864 
    865     cpi->mb.partition_info = cpi->mb.pi;
    866 
    867     // Calculate the probabilities to be used to code the reference frame based on actual useage this frame
    868     if (!(cpi->prob_intra_coded = rf_intra * 255 / (rf_intra + rf_inter)))
    869         cpi->prob_intra_coded = 1;
    870 
    871     prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
    872 
    873     if (!prob_last_coded)
    874         prob_last_coded = 1;
    875 
    876     prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
    877                     ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
    878 
    879     if (!prob_gf_coded)
    880         prob_gf_coded = 1;
    881 
    882 
    883 #ifdef ENTROPY_STATS
    884     active_section = 1;
    885 #endif
    886 
    887     if (pc->mb_no_coeff_skip)
    888     {
    889         prob_skip_false = cpi->skip_false_count * 256 / (cpi->skip_false_count + cpi->skip_true_count);
    890 
    891         if (prob_skip_false <= 1)
    892             prob_skip_false = 1;
    893 
    894         if (prob_skip_false > 255)
    895             prob_skip_false = 255;
    896 
    897         cpi->prob_skip_false = prob_skip_false;
    898         vp8_write_literal(w, prob_skip_false, 8);
    899     }
    900 
    901     vp8_write_literal(w, cpi->prob_intra_coded, 8);
    902     vp8_write_literal(w, prob_last_coded, 8);
    903     vp8_write_literal(w, prob_gf_coded, 8);
    904 
    905     update_mbintra_mode_probs(cpi);
    906 
    907     vp8_write_mvprobs(cpi);
    908 
    909     while (++mb_row < pc->mb_rows)
    910     {
    911         int mb_col = -1;
    912 
    913         while (++mb_col < pc->mb_cols)
    914         {
    915             const MB_MODE_INFO *const mi = & m->mbmi;
    916             const MV_REFERENCE_FRAME rf = mi->ref_frame;
    917             const MB_PREDICTION_MODE mode = mi->mode;
    918 
    919             MACROBLOCKD *xd = &cpi->mb.e_mbd;
    920 
    921             // Distance of Mb to the various image edges.
    922             // These specified to 8th pel as they are always compared to MV values that are in 1/8th pel units
    923             xd->mb_to_left_edge = -((mb_col * 16) << 3);
    924             xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3;
    925             xd->mb_to_top_edge = -((mb_row * 16)) << 3;
    926             xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3;
    927 
    928 #ifdef ENTROPY_STATS
    929             active_section = 9;
    930 #endif
    931 
    932             if (cpi->mb.e_mbd.update_mb_segmentation_map)
    933                 write_mb_features(w, mi, &cpi->mb.e_mbd);
    934 
    935             if (pc->mb_no_coeff_skip)
    936                 vp8_encode_bool(w, m->mbmi.mb_skip_coeff, prob_skip_false);
    937 
    938             if (rf == INTRA_FRAME)
    939             {
    940                 vp8_write(w, 0, cpi->prob_intra_coded);
    941 #ifdef ENTROPY_STATS
    942                 active_section = 6;
    943 #endif
    944                 write_ymode(w, mode, pc->fc.ymode_prob);
    945 
    946                 if (mode == B_PRED)
    947                 {
    948                     int j = 0;
    949 
    950                     do
    951                         write_bmode(w, m->bmi[j].mode, pc->fc.bmode_prob);
    952 
    953                     while (++j < 16);
    954                 }
    955 
    956                 write_uv_mode(w, mi->uv_mode, pc->fc.uv_mode_prob);
    957             }
    958             else    /* inter coded */
    959             {
    960                 MV best_mv;
    961                 vp8_prob mv_ref_p [VP8_MVREFS-1];
    962 
    963                 vp8_write(w, 1, cpi->prob_intra_coded);
    964 
    965                 if (rf == LAST_FRAME)
    966                     vp8_write(w, 0, prob_last_coded);
    967                 else
    968                 {
    969                     vp8_write(w, 1, prob_last_coded);
    970                     vp8_write(w, (rf == GOLDEN_FRAME) ? 0 : 1, prob_gf_coded);
    971                 }
    972 
    973                 {
    974                     MV n1, n2;
    975                     int ct[4];
    976 
    977                     vp8_find_near_mvs(xd, m, &n1, &n2, &best_mv, ct, rf, cpi->common.ref_frame_sign_bias);
    978                     vp8_mv_ref_probs(mv_ref_p, ct);
    979 
    980 #ifdef ENTROPY_STATS
    981                     accum_mv_refs(mode, ct);
    982 #endif
    983 
    984                 }
    985 
    986 #ifdef ENTROPY_STATS
    987                 active_section = 3;
    988 #endif
    989 
    990                 write_mv_ref(w, mode, mv_ref_p);
    991 
    992                 switch (mode)   /* new, split require MVs */
    993                 {
    994                 case NEWMV:
    995 
    996 #ifdef ENTROPY_STATS
    997                     active_section = 5;
    998 #endif
    999 
   1000                     write_mv(w, &mi->mv.as_mv, &best_mv, mvc);
   1001                     break;
   1002 
   1003                 case SPLITMV:
   1004                 {
   1005                     int j = 0;
   1006 
   1007 #ifdef MODE_STATS
   1008                     ++count_mb_seg [mi->partitioning];
   1009 #endif
   1010 
   1011                     write_split(w, mi->partitioning);
   1012 
   1013                     do
   1014                     {
   1015                         const B_MODE_INFO *const b = cpi->mb.partition_info->bmi + j;
   1016                         const int *const  L = vp8_mbsplits [mi->partitioning];
   1017                         int k = -1;  /* first block in subset j */
   1018                         int mv_contz;
   1019 
   1020                         while (j != L[++k])
   1021                             if (k >= 16)
   1022                                 assert(0);
   1023 
   1024                         mv_contz = vp8_mv_cont
   1025                                    (&(vp8_left_bmi(m, k)->mv.as_mv),
   1026                                     &(vp8_above_bmi(m, k, mis)->mv.as_mv));
   1027                         write_sub_mv_ref(w, b->mode, vp8_sub_mv_ref_prob2 [mv_contz]); //pc->fc.sub_mv_ref_prob);
   1028 
   1029                         if (b->mode == NEW4X4)
   1030                         {
   1031 #ifdef ENTROPY_STATS
   1032                             active_section = 11;
   1033 #endif
   1034                             write_mv(w, &b->mv.as_mv, &best_mv, (const MV_CONTEXT *) mvc);
   1035                         }
   1036                     }
   1037                     while (++j < cpi->mb.partition_info->count);
   1038                 }
   1039                 break;
   1040                 default:
   1041                     break;
   1042                 }
   1043             }
   1044 
   1045             ++m;
   1046             cpi->mb.partition_info++;
   1047         }
   1048 
   1049         ++m;  /* skip L prediction border */
   1050         cpi->mb.partition_info++;
   1051     }
   1052 }
   1053 
   1054 
   1055 static void write_kfmodes(VP8_COMP *cpi)
   1056 {
   1057     vp8_writer *const bc = & cpi->bc;
   1058     const VP8_COMMON *const c = & cpi->common;
   1059     /* const */
   1060     MODE_INFO *m = c->mi;
   1061 
   1062     int mb_row = -1;
   1063     int prob_skip_false = 0;
   1064 
   1065     if (c->mb_no_coeff_skip)
   1066     {
   1067         prob_skip_false = cpi->skip_false_count * 256 / (cpi->skip_false_count + cpi->skip_true_count);
   1068 
   1069         if (prob_skip_false <= 1)
   1070             prob_skip_false = 1;
   1071 
   1072         if (prob_skip_false >= 255)
   1073             prob_skip_false = 255;
   1074 
   1075         cpi->prob_skip_false = prob_skip_false;
   1076         vp8_write_literal(bc, prob_skip_false, 8);
   1077     }
   1078 
   1079     while (++mb_row < c->mb_rows)
   1080     {
   1081         int mb_col = -1;
   1082 
   1083         while (++mb_col < c->mb_cols)
   1084         {
   1085             const int ym = m->mbmi.mode;
   1086 
   1087             if (cpi->mb.e_mbd.update_mb_segmentation_map)
   1088                 write_mb_features(bc, &m->mbmi, &cpi->mb.e_mbd);
   1089 
   1090             if (c->mb_no_coeff_skip)
   1091                 vp8_encode_bool(bc, m->mbmi.mb_skip_coeff, prob_skip_false);
   1092 
   1093             kfwrite_ymode(bc, ym, c->kf_ymode_prob);
   1094 
   1095             if (ym == B_PRED)
   1096             {
   1097                 const int mis = c->mode_info_stride;
   1098                 int i = 0;
   1099 
   1100                 do
   1101                 {
   1102                     const B_PREDICTION_MODE A = vp8_above_bmi(m, i, mis)->mode;
   1103                     const B_PREDICTION_MODE L = vp8_left_bmi(m, i)->mode;
   1104                     const int bm = m->bmi[i].mode;
   1105 
   1106 #ifdef ENTROPY_STATS
   1107                     ++intra_mode_stats [A] [L] [bm];
   1108 #endif
   1109 
   1110                     write_bmode(bc, bm, c->kf_bmode_prob [A] [L]);
   1111                 }
   1112                 while (++i < 16);
   1113             }
   1114 
   1115             write_uv_mode(bc, (m++)->mbmi.uv_mode, c->kf_uv_mode_prob);
   1116         }
   1117 
   1118         m++;    // skip L prediction border
   1119     }
   1120 }
   1121 int vp8_estimate_entropy_savings(VP8_COMP *cpi)
   1122 {
   1123     int i = 0;
   1124     int savings = 0;
   1125 
   1126     const int *const rfct = cpi->count_mb_ref_frame_usage;
   1127     const int rf_intra = rfct[INTRA_FRAME];
   1128     const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
   1129     int new_intra, new_last, gf_last, oldtotal, newtotal;
   1130     int ref_frame_cost[MAX_REF_FRAMES];
   1131 
   1132     vp8_clear_system_state(); //__asm emms;
   1133 
   1134     if (cpi->common.frame_type != KEY_FRAME)
   1135     {
   1136         if (!(new_intra = rf_intra * 255 / (rf_intra + rf_inter)))
   1137             new_intra = 1;
   1138 
   1139         new_last = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
   1140 
   1141         gf_last = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
   1142                   ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
   1143 
   1144         // new costs
   1145         ref_frame_cost[INTRA_FRAME]   = vp8_cost_zero(new_intra);
   1146         ref_frame_cost[LAST_FRAME]    = vp8_cost_one(new_intra)
   1147                                         + vp8_cost_zero(new_last);
   1148         ref_frame_cost[GOLDEN_FRAME]  = vp8_cost_one(new_intra)
   1149                                         + vp8_cost_one(new_last)
   1150                                         + vp8_cost_zero(gf_last);
   1151         ref_frame_cost[ALTREF_FRAME]  = vp8_cost_one(new_intra)
   1152                                         + vp8_cost_one(new_last)
   1153                                         + vp8_cost_one(gf_last);
   1154 
   1155         newtotal =
   1156             rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] +
   1157             rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] +
   1158             rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] +
   1159             rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME];
   1160 
   1161 
   1162         // old costs
   1163         ref_frame_cost[INTRA_FRAME]   = vp8_cost_zero(cpi->prob_intra_coded);
   1164         ref_frame_cost[LAST_FRAME]    = vp8_cost_one(cpi->prob_intra_coded)
   1165                                         + vp8_cost_zero(cpi->prob_last_coded);
   1166         ref_frame_cost[GOLDEN_FRAME]  = vp8_cost_one(cpi->prob_intra_coded)
   1167                                         + vp8_cost_one(cpi->prob_last_coded)
   1168                                         + vp8_cost_zero(cpi->prob_gf_coded);
   1169         ref_frame_cost[ALTREF_FRAME]  = vp8_cost_one(cpi->prob_intra_coded)
   1170                                         + vp8_cost_one(cpi->prob_last_coded)
   1171                                         + vp8_cost_one(cpi->prob_gf_coded);
   1172 
   1173         oldtotal =
   1174             rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] +
   1175             rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] +
   1176             rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] +
   1177             rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME];
   1178 
   1179         savings += (oldtotal - newtotal) / 256;
   1180     }
   1181 
   1182 
   1183     do
   1184     {
   1185         int j = 0;
   1186 
   1187         do
   1188         {
   1189             int k = 0;
   1190 
   1191             do
   1192             {
   1193                 /* at every context */
   1194 
   1195                 /* calc probs and branch cts for this frame only */
   1196                 //vp8_prob new_p           [vp8_coef_tokens-1];
   1197                 //unsigned int branch_ct   [vp8_coef_tokens-1] [2];
   1198 
   1199                 int t = 0;      /* token/prob index */
   1200 
   1201                 vp8_tree_probs_from_distribution(
   1202                     vp8_coef_tokens, vp8_coef_encodings, vp8_coef_tree,
   1203                     cpi->frame_coef_probs [i][j][k], cpi->frame_branch_ct [i][j][k], cpi->coef_counts [i][j][k],
   1204                     256, 1
   1205                 );
   1206 
   1207                 do
   1208                 {
   1209                     const unsigned int *ct  = cpi->frame_branch_ct [i][j][k][t];
   1210                     const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t];
   1211 
   1212                     const vp8_prob old = cpi->common.fc.coef_probs [i][j][k][t];
   1213                     const vp8_prob upd = vp8_coef_update_probs [i][j][k][t];
   1214 
   1215                     const int old_b = vp8_cost_branch(ct, old);
   1216                     const int new_b = vp8_cost_branch(ct, newp);
   1217 
   1218                     const int update_b = 8 +
   1219                                          ((vp8_cost_one(upd) - vp8_cost_zero(upd)) >> 8);
   1220 
   1221                     const int s = old_b - new_b - update_b;
   1222 
   1223                     if (s > 0)
   1224                         savings += s;
   1225 
   1226 
   1227                 }
   1228                 while (++t < vp8_coef_tokens - 1);
   1229 
   1230 
   1231             }
   1232             while (++k < PREV_COEF_CONTEXTS);
   1233         }
   1234         while (++j < COEF_BANDS);
   1235     }
   1236     while (++i < BLOCK_TYPES);
   1237 
   1238     return savings;
   1239 }
   1240 
   1241 static void update_coef_probs(VP8_COMP *cpi)
   1242 {
   1243     int i = 0;
   1244     vp8_writer *const w = & cpi->bc;
   1245     int savings = 0;
   1246 
   1247     vp8_clear_system_state(); //__asm emms;
   1248 
   1249 
   1250     do
   1251     {
   1252         int j = 0;
   1253 
   1254         do
   1255         {
   1256             int k = 0;
   1257 
   1258             do
   1259             {
   1260                 //note: use result from vp8_estimate_entropy_savings, so no need to call vp8_tree_probs_from_distribution here.
   1261                 /* at every context */
   1262 
   1263                 /* calc probs and branch cts for this frame only */
   1264                 //vp8_prob new_p           [vp8_coef_tokens-1];
   1265                 //unsigned int branch_ct   [vp8_coef_tokens-1] [2];
   1266 
   1267                 int t = 0;      /* token/prob index */
   1268 
   1269                 //vp8_tree_probs_from_distribution(
   1270                 //    vp8_coef_tokens, vp8_coef_encodings, vp8_coef_tree,
   1271                 //    new_p, branch_ct, (unsigned int *)cpi->coef_counts [i][j][k],
   1272                 //    256, 1
   1273                 //    );
   1274 
   1275                 do
   1276                 {
   1277                     const unsigned int *ct  = cpi->frame_branch_ct [i][j][k][t];
   1278                     const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t];
   1279 
   1280                     vp8_prob *Pold = cpi->common.fc.coef_probs [i][j][k] + t;
   1281                     const vp8_prob old = *Pold;
   1282                     const vp8_prob upd = vp8_coef_update_probs [i][j][k][t];
   1283 
   1284                     const int old_b = vp8_cost_branch(ct, old);
   1285                     const int new_b = vp8_cost_branch(ct, newp);
   1286 
   1287                     const int update_b = 8 +
   1288                                          ((vp8_cost_one(upd) - vp8_cost_zero(upd)) >> 8);
   1289 
   1290                     const int s = old_b - new_b - update_b;
   1291                     const int u = s > 0 ? 1 : 0;
   1292 
   1293                     vp8_write(w, u, upd);
   1294 
   1295 
   1296 #ifdef ENTROPY_STATS
   1297                     ++ tree_update_hist [i][j][k][t] [u];
   1298 #endif
   1299 
   1300                     if (u)
   1301                     {
   1302                         /* send/use new probability */
   1303 
   1304                         *Pold = newp;
   1305                         vp8_write_literal(w, newp, 8);
   1306 
   1307                         savings += s;
   1308 
   1309                     }
   1310 
   1311                 }
   1312                 while (++t < vp8_coef_tokens - 1);
   1313 
   1314                 /* Accum token counts for generation of default statistics */
   1315 #ifdef ENTROPY_STATS
   1316                 t = 0;
   1317 
   1318                 do
   1319                 {
   1320                     context_counters [i][j][k][t] += cpi->coef_counts [i][j][k][t];
   1321                 }
   1322                 while (++t < vp8_coef_tokens);
   1323 
   1324 #endif
   1325 
   1326             }
   1327             while (++k < PREV_COEF_CONTEXTS);
   1328         }
   1329         while (++j < COEF_BANDS);
   1330     }
   1331     while (++i < BLOCK_TYPES);
   1332 
   1333 }
   1334 #ifdef PACKET_TESTING
   1335 FILE *vpxlogc = 0;
   1336 #endif
   1337 
   1338 static void put_delta_q(vp8_writer *bc, int delta_q)
   1339 {
   1340     if (delta_q != 0)
   1341     {
   1342         vp8_write_bit(bc, 1);
   1343         vp8_write_literal(bc, abs(delta_q), 4);
   1344 
   1345         if (delta_q < 0)
   1346             vp8_write_bit(bc, 1);
   1347         else
   1348             vp8_write_bit(bc, 0);
   1349     }
   1350     else
   1351         vp8_write_bit(bc, 0);
   1352 }
   1353 
   1354 void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size)
   1355 {
   1356     int i, j;
   1357     VP8_HEADER oh;
   1358     VP8_COMMON *const pc = & cpi->common;
   1359     vp8_writer *const bc = & cpi->bc;
   1360     MACROBLOCKD *const xd = & cpi->mb.e_mbd;
   1361     int extra_bytes_packed = 0;
   1362 
   1363     unsigned char *cx_data = dest;
   1364     const int *mb_feature_data_bits;
   1365 
   1366     oh.show_frame = (int) pc->show_frame;
   1367     oh.type = (int)pc->frame_type;
   1368     oh.version = pc->version;
   1369     oh.first_partition_length_in_bytes = 0;
   1370 
   1371     mb_feature_data_bits = vp8_mb_feature_data_bits;
   1372     cx_data += 3;
   1373 
   1374 #if defined(SECTIONBITS_OUTPUT)
   1375     Sectionbits[active_section = 1] += sizeof(VP8_HEADER) * 8 * 256;
   1376 #endif
   1377 
   1378     //vp8_kf_default_bmode_probs() is called in vp8_setup_key_frame() once for each
   1379     //K frame before encode frame. pc->kf_bmode_prob doesn't get changed anywhere
   1380     //else. No need to call it again here. --yw
   1381     //vp8_kf_default_bmode_probs( pc->kf_bmode_prob);
   1382 
   1383     // every keyframe send startcode, width, height, scale factor, clamp and color type
   1384     if (oh.type == KEY_FRAME)
   1385     {
   1386         int v;
   1387 
   1388         // Start / synch code
   1389         cx_data[0] = 0x9D;
   1390         cx_data[1] = 0x01;
   1391         cx_data[2] = 0x2a;
   1392 
   1393         v = (pc->horiz_scale << 14) | pc->Width;
   1394         cx_data[3] = v;
   1395         cx_data[4] = v >> 8;
   1396 
   1397         v = (pc->vert_scale << 14) | pc->Height;
   1398         cx_data[5] = v;
   1399         cx_data[6] = v >> 8;
   1400 
   1401         extra_bytes_packed = 7;
   1402         cx_data += extra_bytes_packed ;
   1403 
   1404         vp8_start_encode(bc, cx_data);
   1405 
   1406         // signal clr type
   1407         vp8_write_bit(bc, pc->clr_type);
   1408         vp8_write_bit(bc, pc->clamp_type);
   1409 
   1410     }
   1411     else
   1412         vp8_start_encode(bc, cx_data);
   1413 
   1414 
   1415     // Signal whether or not Segmentation is enabled
   1416     vp8_write_bit(bc, (xd->segmentation_enabled) ? 1 : 0);
   1417 
   1418     // Indicate which features are enabled
   1419     if (xd->segmentation_enabled)
   1420     {
   1421         // Signal whether or not the segmentation map is being updated.
   1422         vp8_write_bit(bc, (xd->update_mb_segmentation_map) ? 1 : 0);
   1423         vp8_write_bit(bc, (xd->update_mb_segmentation_data) ? 1 : 0);
   1424 
   1425         if (xd->update_mb_segmentation_data)
   1426         {
   1427             signed char Data;
   1428 
   1429             vp8_write_bit(bc, (xd->mb_segement_abs_delta) ? 1 : 0);
   1430 
   1431             // For each segmentation feature (Quant and loop filter level)
   1432             for (i = 0; i < MB_LVL_MAX; i++)
   1433             {
   1434                 // For each of the segments
   1435                 for (j = 0; j < MAX_MB_SEGMENTS; j++)
   1436                 {
   1437                     Data = xd->segment_feature_data[i][j];
   1438 
   1439                     // Frame level data
   1440                     if (Data)
   1441                     {
   1442                         vp8_write_bit(bc, 1);
   1443 
   1444                         if (Data < 0)
   1445                         {
   1446                             Data = - Data;
   1447                             vp8_write_literal(bc, Data, mb_feature_data_bits[i]);
   1448                             vp8_write_bit(bc, 1);
   1449                         }
   1450                         else
   1451                         {
   1452                             vp8_write_literal(bc, Data, mb_feature_data_bits[i]);
   1453                             vp8_write_bit(bc, 0);
   1454                         }
   1455                     }
   1456                     else
   1457                         vp8_write_bit(bc, 0);
   1458                 }
   1459             }
   1460         }
   1461 
   1462         if (xd->update_mb_segmentation_map)
   1463         {
   1464             // Write the probs used to decode the segment id for each macro block.
   1465             for (i = 0; i < MB_FEATURE_TREE_PROBS; i++)
   1466             {
   1467                 int Data = xd->mb_segment_tree_probs[i];
   1468 
   1469                 if (Data != 255)
   1470                 {
   1471                     vp8_write_bit(bc, 1);
   1472                     vp8_write_literal(bc, Data, 8);
   1473                 }
   1474                 else
   1475                     vp8_write_bit(bc, 0);
   1476             }
   1477         }
   1478     }
   1479 
   1480     // Code to determine whether or not to update the scan order.
   1481     vp8_write_bit(bc, pc->filter_type);
   1482     vp8_write_literal(bc, pc->filter_level, 6);
   1483     vp8_write_literal(bc, pc->sharpness_level, 3);
   1484 
   1485     // Write out loop filter deltas applied at the MB level based on mode or ref frame (if they are enabled).
   1486     vp8_write_bit(bc, (xd->mode_ref_lf_delta_enabled) ? 1 : 0);
   1487 
   1488     if (xd->mode_ref_lf_delta_enabled)
   1489     {
   1490         // Do the deltas need to be updated
   1491         int send_update = xd->mode_ref_lf_delta_update
   1492                           || cpi->oxcf.error_resilient_mode;
   1493 
   1494         vp8_write_bit(bc, send_update);
   1495         if (send_update)
   1496         {
   1497             int Data;
   1498 
   1499             // Send update
   1500             for (i = 0; i < MAX_REF_LF_DELTAS; i++)
   1501             {
   1502                 Data = xd->ref_lf_deltas[i];
   1503 
   1504                 // Frame level data
   1505                 if (xd->ref_lf_deltas[i] != xd->last_ref_lf_deltas[i]
   1506                     || cpi->oxcf.error_resilient_mode)
   1507                 {
   1508                     xd->last_ref_lf_deltas[i] = xd->ref_lf_deltas[i];
   1509                     vp8_write_bit(bc, 1);
   1510 
   1511                     if (Data > 0)
   1512                     {
   1513                         vp8_write_literal(bc, (Data & 0x3F), 6);
   1514                         vp8_write_bit(bc, 0);    // sign
   1515                     }
   1516                     else
   1517                     {
   1518                         Data = -Data;
   1519                         vp8_write_literal(bc, (Data & 0x3F), 6);
   1520                         vp8_write_bit(bc, 1);    // sign
   1521                     }
   1522                 }
   1523                 else
   1524                     vp8_write_bit(bc, 0);
   1525             }
   1526 
   1527             // Send update
   1528             for (i = 0; i < MAX_MODE_LF_DELTAS; i++)
   1529             {
   1530                 Data = xd->mode_lf_deltas[i];
   1531 
   1532                 if (xd->mode_lf_deltas[i] != xd->last_mode_lf_deltas[i]
   1533                     || cpi->oxcf.error_resilient_mode)
   1534                 {
   1535                     xd->last_mode_lf_deltas[i] = xd->mode_lf_deltas[i];
   1536                     vp8_write_bit(bc, 1);
   1537 
   1538                     if (Data > 0)
   1539                     {
   1540                         vp8_write_literal(bc, (Data & 0x3F), 6);
   1541                         vp8_write_bit(bc, 0);    // sign
   1542                     }
   1543                     else
   1544                     {
   1545                         Data = -Data;
   1546                         vp8_write_literal(bc, (Data & 0x3F), 6);
   1547                         vp8_write_bit(bc, 1);    // sign
   1548                     }
   1549                 }
   1550                 else
   1551                     vp8_write_bit(bc, 0);
   1552             }
   1553         }
   1554     }
   1555 
   1556     //signal here is multi token partition is enabled
   1557     vp8_write_literal(bc, pc->multi_token_partition, 2);
   1558 
   1559     // Frame Qbaseline quantizer index
   1560     vp8_write_literal(bc, pc->base_qindex, 7);
   1561 
   1562     // Transmit Dc, Second order and Uv quantizer delta information
   1563     put_delta_q(bc, pc->y1dc_delta_q);
   1564     put_delta_q(bc, pc->y2dc_delta_q);
   1565     put_delta_q(bc, pc->y2ac_delta_q);
   1566     put_delta_q(bc, pc->uvdc_delta_q);
   1567     put_delta_q(bc, pc->uvac_delta_q);
   1568 
   1569     // When there is a key frame all reference buffers are updated using the new key frame
   1570     if (pc->frame_type != KEY_FRAME)
   1571     {
   1572         // Should the GF or ARF be updated using the transmitted frame or buffer
   1573         vp8_write_bit(bc, pc->refresh_golden_frame);
   1574         vp8_write_bit(bc, pc->refresh_alt_ref_frame);
   1575 
   1576         // If not being updated from current frame should either GF or ARF be updated from another buffer
   1577         if (!pc->refresh_golden_frame)
   1578             vp8_write_literal(bc, pc->copy_buffer_to_gf, 2);
   1579 
   1580         if (!pc->refresh_alt_ref_frame)
   1581             vp8_write_literal(bc, pc->copy_buffer_to_arf, 2);
   1582 
   1583         // Indicate reference frame sign bias for Golden and ARF frames (always 0 for last frame buffer)
   1584         vp8_write_bit(bc, pc->ref_frame_sign_bias[GOLDEN_FRAME]);
   1585         vp8_write_bit(bc, pc->ref_frame_sign_bias[ALTREF_FRAME]);
   1586     }
   1587 
   1588     vp8_write_bit(bc, pc->refresh_entropy_probs);
   1589 
   1590     if (pc->frame_type != KEY_FRAME)
   1591         vp8_write_bit(bc, pc->refresh_last_frame);
   1592 
   1593 #ifdef ENTROPY_STATS
   1594 
   1595     if (pc->frame_type == INTER_FRAME)
   1596         active_section = 0;
   1597     else
   1598         active_section = 7;
   1599 
   1600 #endif
   1601 
   1602     vp8_clear_system_state();  //__asm emms;
   1603 
   1604     //************************************************
   1605     // save a copy for later refresh
   1606     {
   1607         vpx_memcpy(&cpi->common.lfc, &cpi->common.fc, sizeof(cpi->common.fc));
   1608     }
   1609 
   1610     update_coef_probs(cpi);
   1611 
   1612 #ifdef ENTROPY_STATS
   1613     active_section = 2;
   1614 #endif
   1615 
   1616     // Write out the mb_no_coeff_skip flag
   1617     vp8_write_bit(bc, pc->mb_no_coeff_skip);
   1618 
   1619     if (pc->frame_type == KEY_FRAME)
   1620     {
   1621         write_kfmodes(cpi);
   1622 
   1623 #ifdef ENTROPY_STATS
   1624         active_section = 8;
   1625 #endif
   1626     }
   1627     else
   1628     {
   1629         pack_inter_mode_mvs(cpi);
   1630 
   1631 #ifdef ENTROPY_STATS
   1632         active_section = 1;
   1633 #endif
   1634     }
   1635 
   1636     vp8_stop_encode(bc);
   1637 
   1638     oh.first_partition_length_in_bytes = cpi->bc.pos;
   1639 
   1640     /* update frame tag */
   1641     {
   1642         int v = (oh.first_partition_length_in_bytes << 5) |
   1643                 (oh.show_frame << 4) |
   1644                 (oh.version << 1) |
   1645                 oh.type;
   1646 
   1647         dest[0] = v;
   1648         dest[1] = v >> 8;
   1649         dest[2] = v >> 16;
   1650     }
   1651 
   1652     *size = VP8_HEADER_SIZE + extra_bytes_packed + cpi->bc.pos;
   1653 
   1654     if (pc->multi_token_partition != ONE_PARTITION)
   1655     {
   1656         int num_part;
   1657         int asize;
   1658         num_part = 1 << pc->multi_token_partition;
   1659 
   1660         pack_tokens_into_partitions(cpi, cx_data + bc->pos, num_part, &asize);
   1661 
   1662         *size += asize;
   1663     }
   1664     else
   1665     {
   1666         vp8_start_encode(&cpi->bc2, cx_data + bc->pos);
   1667 
   1668 #if CONFIG_MULTITHREAD
   1669         if (cpi->b_multi_threaded)
   1670             pack_mb_row_tokens(cpi, &cpi->bc2);
   1671         else
   1672 #endif
   1673             pack_tokens(&cpi->bc2, cpi->tok, cpi->tok_count);
   1674 
   1675         vp8_stop_encode(&cpi->bc2);
   1676 
   1677         *size += cpi->bc2.pos;
   1678     }
   1679 }
   1680 
   1681 #ifdef ENTROPY_STATS
   1682 void print_tree_update_probs()
   1683 {
   1684     int i, j, k, l;
   1685     FILE *f = fopen("context.c", "a");
   1686     int Sum;
   1687     fprintf(f, "\n/* Update probabilities for token entropy tree. */\n\n");
   1688     fprintf(f, "const vp8_prob tree_update_probs[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens-1] = {\n");
   1689 
   1690     for (i = 0; i < BLOCK_TYPES; i++)
   1691     {
   1692         fprintf(f, "  { \n");
   1693 
   1694         for (j = 0; j < COEF_BANDS; j++)
   1695         {
   1696             fprintf(f, "    {\n");
   1697 
   1698             for (k = 0; k < PREV_COEF_CONTEXTS; k++)
   1699             {
   1700                 fprintf(f, "      {");
   1701 
   1702                 for (l = 0; l < MAX_ENTROPY_TOKENS - 1; l++)
   1703                 {
   1704                     Sum = tree_update_hist[i][j][k][l][0] + tree_update_hist[i][j][k][l][1];
   1705 
   1706                     if (Sum > 0)
   1707                     {
   1708                         if (((tree_update_hist[i][j][k][l][0] * 255) / Sum) > 0)
   1709                             fprintf(f, "%3ld, ", (tree_update_hist[i][j][k][l][0] * 255) / Sum);
   1710                         else
   1711                             fprintf(f, "%3ld, ", 1);
   1712                     }
   1713                     else
   1714                         fprintf(f, "%3ld, ", 128);
   1715                 }
   1716 
   1717                 fprintf(f, "},\n");
   1718             }
   1719 
   1720             fprintf(f, "    },\n");
   1721         }
   1722 
   1723         fprintf(f, "  },\n");
   1724     }
   1725 
   1726     fprintf(f, "};\n");
   1727     fclose(f);
   1728 }
   1729 #endif
   1730