• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
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 #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 
update_mode(vp8_writer * const w,int n,vp8_token tok[],vp8_tree tree,vp8_prob Pnew[],vp8_prob Pcur[],unsigned int bct[][2],const unsigned int num_events[])72 static 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 
update_mbintra_mode_probs(VP8_COMP * cpi)117 static 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 
write_ymode(vp8_writer * bc,int m,const vp8_prob * p)143 static 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 
kfwrite_ymode(vp8_writer * bc,int m,const vp8_prob * p)148 static 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 
write_uv_mode(vp8_writer * bc,int m,const vp8_prob * p)153 static 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 
write_bmode(vp8_writer * bc,int m,const vp8_prob * p)159 static 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 
write_split(vp8_writer * bc,int x)164 static 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 
171 static 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 
pack_tokens_c(vp8_writer * w,const TOKENEXTRA * p,int xcount)183 static 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 
write_partition_size(unsigned char * cx_data,int size)369 static 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 
pack_tokens_into_partitions_c(VP8_COMP * cpi,unsigned char * cx_data,int num_part,int * size)382 static 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 
pack_mb_row_tokens_c(VP8_COMP * cpi,vp8_writer * w)596 static 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 
write_mv_ref(vp8_writer * w,MB_PREDICTION_MODE m,const vp8_prob * p)787 static 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 
write_sub_mv_ref(vp8_writer * w,B_PREDICTION_MODE m,const vp8_prob * p)799 static 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 
write_mv(vp8_writer * w,const MV * mv,const MV * ref,const MV_CONTEXT * mvc)810 static 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 
write_mb_features(vp8_writer * w,const MB_MODE_INFO * mi,const MACROBLOCKD * x)822 static 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 
pack_inter_mode_mvs(VP8_COMP * const cpi)856 static 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 
write_kfmodes(VP8_COMP * cpi)1065 static 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 }
vp8_estimate_entropy_savings(VP8_COMP * cpi)1131 int 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 
update_coef_probs(VP8_COMP * cpi)1251 static 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
1345 FILE *vpxlogc = 0;
1346 #endif
1347 
put_delta_q(vp8_writer * bc,int delta_q)1348 static 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 
vp8_pack_bitstream(VP8_COMP * cpi,unsigned char * dest,unsigned long * size)1364 void 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
print_tree_update_probs()1683 void 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