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