Define RDCOST only once
[libvpx.git] / vp8 / encoder / bitstream.c
blobadbd106980e5f6efee411d53e2d680b6ef38d8f8
1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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 */
12 #include "vp8/common/header.h"
13 #include "encodemv.h"
14 #include "vp8/common/entropymode.h"
15 #include "vp8/common/findnearmv.h"
16 #include "mcomp.h"
17 #include "vp8/common/systemdependent.h"
18 #include <assert.h>
19 #include <stdio.h>
20 #include "vp8/common/pragmas.h"
21 #include "vpx_mem/vpx_mem.h"
22 #include "bitstream.h"
24 const int vp8cx_base_skip_false_prob[128] =
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,
43 #ifdef VP8REF
44 #define __int64 long long
45 #endif
47 #if defined(SECTIONBITS_OUTPUT)
48 unsigned __int64 Sectionbits[500];
49 #endif
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
57 #ifdef MODE_STATS
58 int count_mb_seg[4] = { 0, 0, 0, 0 };
59 #endif
62 static void update_mode(
63 vp8_writer *const w,
64 int n,
65 vp8_token tok [/* n */],
66 vp8_tree tree,
67 vp8_prob Pnew [/* n-1 */],
68 vp8_prob Pcur [/* n-1 */],
69 unsigned int bct [/* n-1 */] [2],
70 const unsigned int num_events[/* n */]
73 unsigned int new_b = 0, old_b = 0;
74 int i = 0;
76 vp8_tree_probs_from_distribution(
77 n--, tok, tree,
78 Pnew, bct, num_events,
79 256, 1
84 new_b += vp8_cost_branch(bct[i], Pnew[i]);
85 old_b += vp8_cost_branch(bct[i], Pcur[i]);
87 while (++i < n);
89 if (new_b + (n << 8) < old_b)
91 int i = 0;
93 vp8_write_bit(w, 1);
97 const vp8_prob p = Pnew[i];
99 vp8_write_literal(w, Pcur[i] = p ? p : 1, 8);
101 while (++i < n);
103 else
104 vp8_write_bit(w, 0);
107 static void update_mbintra_mode_probs(VP8_COMP *cpi)
109 VP8_COMMON *const x = & cpi->common;
111 vp8_writer *const w = & cpi->bc;
114 vp8_prob Pnew [VP8_YMODES-1];
115 unsigned int bct [VP8_YMODES-1] [2];
117 update_mode(
118 w, VP8_YMODES, vp8_ymode_encodings, vp8_ymode_tree,
119 Pnew, x->fc.ymode_prob, bct, (unsigned int *)cpi->ymode_count
123 vp8_prob Pnew [VP8_UV_MODES-1];
124 unsigned int bct [VP8_UV_MODES-1] [2];
126 update_mode(
127 w, VP8_UV_MODES, vp8_uv_mode_encodings, vp8_uv_mode_tree,
128 Pnew, x->fc.uv_mode_prob, bct, (unsigned int *)cpi->uv_mode_count
133 static void write_ymode(vp8_writer *bc, int m, const vp8_prob *p)
135 vp8_write_token(bc, vp8_ymode_tree, p, vp8_ymode_encodings + m);
138 static void kfwrite_ymode(vp8_writer *bc, int m, const vp8_prob *p)
140 vp8_write_token(bc, vp8_kf_ymode_tree, p, vp8_kf_ymode_encodings + m);
143 static void write_uv_mode(vp8_writer *bc, int m, const vp8_prob *p)
145 vp8_write_token(bc, vp8_uv_mode_tree, p, vp8_uv_mode_encodings + m);
149 static void write_bmode(vp8_writer *bc, int m, const vp8_prob *p)
151 vp8_write_token(bc, vp8_bmode_tree, p, vp8_bmode_encodings + m);
154 static void write_split(vp8_writer *bc, int x)
156 vp8_write_token(
157 bc, vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + x
161 static const unsigned int norm[256] =
163 0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
164 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
165 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
166 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
167 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
168 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
169 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
170 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
173 static void pack_tokens_c(vp8_writer *w, const TOKENEXTRA *p, int xcount)
175 const TOKENEXTRA *const stop = p + xcount;
176 unsigned int split;
177 unsigned int shift;
178 int count = w->count;
179 unsigned int range = w->range;
180 unsigned int lowvalue = w->lowvalue;
182 while (p < stop)
184 const int t = p->Token;
185 vp8_token *const a = vp8_coef_encodings + t;
186 const vp8_extra_bit_struct *const b = vp8_extra_bits + t;
187 int i = 0;
188 const unsigned char *pp = p->context_tree;
189 int v = a->value;
190 int n = a->Len;
192 if (p->skip_eob_node)
194 n--;
195 i = 2;
200 const int bb = (v >> --n) & 1;
201 split = 1 + (((range - 1) * pp[i>>1]) >> 8);
202 i = vp8_coef_tree[i+bb];
204 if (bb)
206 lowvalue += split;
207 range = range - split;
209 else
211 range = split;
214 shift = norm[range];
215 range <<= shift;
216 count += shift;
218 if (count >= 0)
220 int offset = shift - count;
222 if ((lowvalue << (offset - 1)) & 0x80000000)
224 int x = w->pos - 1;
226 while (x >= 0 && w->buffer[x] == 0xff)
228 w->buffer[x] = (unsigned char)0;
229 x--;
232 w->buffer[x] += 1;
235 w->buffer[w->pos++] = (lowvalue >> (24 - offset));
236 lowvalue <<= offset;
237 shift = count;
238 lowvalue &= 0xffffff;
239 count -= 8 ;
242 lowvalue <<= shift;
244 while (n);
247 if (b->base_val)
249 const int e = p->Extra, L = b->Len;
251 if (L)
253 const unsigned char *pp = b->prob;
254 int v = e >> 1;
255 int n = L; /* number of bits in v, assumed nonzero */
256 int i = 0;
260 const int bb = (v >> --n) & 1;
261 split = 1 + (((range - 1) * pp[i>>1]) >> 8);
262 i = b->tree[i+bb];
264 if (bb)
266 lowvalue += split;
267 range = range - split;
269 else
271 range = split;
274 shift = norm[range];
275 range <<= shift;
276 count += shift;
278 if (count >= 0)
280 int offset = shift - count;
282 if ((lowvalue << (offset - 1)) & 0x80000000)
284 int x = w->pos - 1;
286 while (x >= 0 && w->buffer[x] == 0xff)
288 w->buffer[x] = (unsigned char)0;
289 x--;
292 w->buffer[x] += 1;
295 w->buffer[w->pos++] = (lowvalue >> (24 - offset));
296 lowvalue <<= offset;
297 shift = count;
298 lowvalue &= 0xffffff;
299 count -= 8 ;
302 lowvalue <<= shift;
304 while (n);
310 split = (range + 1) >> 1;
312 if (e & 1)
314 lowvalue += split;
315 range = range - split;
317 else
319 range = split;
322 range <<= 1;
324 if ((lowvalue & 0x80000000))
326 int x = w->pos - 1;
328 while (x >= 0 && w->buffer[x] == 0xff)
330 w->buffer[x] = (unsigned char)0;
331 x--;
334 w->buffer[x] += 1;
338 lowvalue <<= 1;
340 if (!++count)
342 count = -8;
343 w->buffer[w->pos++] = (lowvalue >> 24);
344 lowvalue &= 0xffffff;
350 ++p;
353 w->count = count;
354 w->lowvalue = lowvalue;
355 w->range = range;
359 static void write_partition_size(unsigned char *cx_data, int size)
361 signed char csize;
363 csize = size & 0xff;
364 *cx_data = csize;
365 csize = (size >> 8) & 0xff;
366 *(cx_data + 1) = csize;
367 csize = (size >> 16) & 0xff;
368 *(cx_data + 2) = csize;
372 static void pack_tokens_into_partitions_c(VP8_COMP *cpi, unsigned char *cx_data, int num_part, int *size)
375 int i;
376 unsigned char *ptr = cx_data;
377 unsigned int shift;
378 vp8_writer *w = &cpi->bc2;
379 *size = 3 * (num_part - 1);
380 ptr = cx_data + (*size);
382 for (i = 0; i < num_part; i++)
384 vp8_start_encode(w, ptr);
386 unsigned int split;
387 int count = w->count;
388 unsigned int range = w->range;
389 unsigned int lowvalue = w->lowvalue;
390 int mb_row;
392 for (mb_row = i; mb_row < cpi->common.mb_rows; mb_row += num_part)
394 TOKENEXTRA *p = cpi->tplist[mb_row].start;
395 TOKENEXTRA *stop = cpi->tplist[mb_row].stop;
397 while (p < stop)
399 const int t = p->Token;
400 vp8_token *const a = vp8_coef_encodings + t;
401 const vp8_extra_bit_struct *const b = vp8_extra_bits + t;
402 int i = 0;
403 const unsigned char *pp = p->context_tree;
404 int v = a->value;
405 int n = a->Len;
407 if (p->skip_eob_node)
409 n--;
410 i = 2;
415 const int bb = (v >> --n) & 1;
416 split = 1 + (((range - 1) * pp[i>>1]) >> 8);
417 i = vp8_coef_tree[i+bb];
419 if (bb)
421 lowvalue += split;
422 range = range - split;
424 else
426 range = split;
429 shift = norm[range];
430 range <<= shift;
431 count += shift;
433 if (count >= 0)
435 int offset = shift - count;
437 if ((lowvalue << (offset - 1)) & 0x80000000)
439 int x = w->pos - 1;
441 while (x >= 0 && w->buffer[x] == 0xff)
443 w->buffer[x] = (unsigned char)0;
444 x--;
447 w->buffer[x] += 1;
450 w->buffer[w->pos++] = (lowvalue >> (24 - offset));
451 lowvalue <<= offset;
452 shift = count;
453 lowvalue &= 0xffffff;
454 count -= 8 ;
457 lowvalue <<= shift;
459 while (n);
462 if (b->base_val)
464 const int e = p->Extra, L = b->Len;
466 if (L)
468 const unsigned char *pp = b->prob;
469 int v = e >> 1;
470 int n = L; /* number of bits in v, assumed nonzero */
471 int i = 0;
475 const int bb = (v >> --n) & 1;
476 split = 1 + (((range - 1) * pp[i>>1]) >> 8);
477 i = b->tree[i+bb];
479 if (bb)
481 lowvalue += split;
482 range = range - split;
484 else
486 range = split;
489 shift = norm[range];
490 range <<= shift;
491 count += shift;
493 if (count >= 0)
495 int offset = shift - count;
497 if ((lowvalue << (offset - 1)) & 0x80000000)
499 int x = w->pos - 1;
501 while (x >= 0 && w->buffer[x] == 0xff)
503 w->buffer[x] = (unsigned char)0;
504 x--;
507 w->buffer[x] += 1;
510 w->buffer[w->pos++] = (lowvalue >> (24 - offset));
511 lowvalue <<= offset;
512 shift = count;
513 lowvalue &= 0xffffff;
514 count -= 8 ;
517 lowvalue <<= shift;
519 while (n);
523 split = (range + 1) >> 1;
525 if (e & 1)
527 lowvalue += split;
528 range = range - split;
530 else
532 range = split;
535 range <<= 1;
537 if ((lowvalue & 0x80000000))
539 int x = w->pos - 1;
541 while (x >= 0 && w->buffer[x] == 0xff)
543 w->buffer[x] = (unsigned char)0;
544 x--;
547 w->buffer[x] += 1;
551 lowvalue <<= 1;
553 if (!++count)
555 count = -8;
556 w->buffer[w->pos++] = (lowvalue >> 24);
557 lowvalue &= 0xffffff;
563 ++p;
567 w->count = count;
568 w->lowvalue = lowvalue;
569 w->range = range;
573 vp8_stop_encode(w);
574 *size += w->pos;
576 if (i < (num_part - 1))
578 write_partition_size(cx_data, w->pos);
579 cx_data += 3;
580 ptr += w->pos;
586 static void pack_mb_row_tokens_c(VP8_COMP *cpi, vp8_writer *w)
589 unsigned int split;
590 int count = w->count;
591 unsigned int range = w->range;
592 unsigned int lowvalue = w->lowvalue;
593 unsigned int shift;
594 int mb_row;
596 for (mb_row = 0; mb_row < cpi->common.mb_rows; mb_row++)
598 TOKENEXTRA *p = cpi->tplist[mb_row].start;
599 TOKENEXTRA *stop = cpi->tplist[mb_row].stop;
601 while (p < stop)
603 const int t = p->Token;
604 vp8_token *const a = vp8_coef_encodings + t;
605 const vp8_extra_bit_struct *const b = vp8_extra_bits + t;
606 int i = 0;
607 const unsigned char *pp = p->context_tree;
608 int v = a->value;
609 int n = a->Len;
611 if (p->skip_eob_node)
613 n--;
614 i = 2;
619 const int bb = (v >> --n) & 1;
620 split = 1 + (((range - 1) * pp[i>>1]) >> 8);
621 i = vp8_coef_tree[i+bb];
623 if (bb)
625 lowvalue += split;
626 range = range - split;
628 else
630 range = split;
633 shift = norm[range];
634 range <<= shift;
635 count += shift;
637 if (count >= 0)
639 int offset = shift - count;
641 if ((lowvalue << (offset - 1)) & 0x80000000)
643 int x = w->pos - 1;
645 while (x >= 0 && w->buffer[x] == 0xff)
647 w->buffer[x] = (unsigned char)0;
648 x--;
651 w->buffer[x] += 1;
654 w->buffer[w->pos++] = (lowvalue >> (24 - offset));
655 lowvalue <<= offset;
656 shift = count;
657 lowvalue &= 0xffffff;
658 count -= 8 ;
661 lowvalue <<= shift;
663 while (n);
666 if (b->base_val)
668 const int e = p->Extra, L = b->Len;
670 if (L)
672 const unsigned char *pp = b->prob;
673 int v = e >> 1;
674 int n = L; /* number of bits in v, assumed nonzero */
675 int i = 0;
679 const int bb = (v >> --n) & 1;
680 split = 1 + (((range - 1) * pp[i>>1]) >> 8);
681 i = b->tree[i+bb];
683 if (bb)
685 lowvalue += split;
686 range = range - split;
688 else
690 range = split;
693 shift = norm[range];
694 range <<= shift;
695 count += shift;
697 if (count >= 0)
699 int offset = shift - count;
701 if ((lowvalue << (offset - 1)) & 0x80000000)
703 int x = w->pos - 1;
705 while (x >= 0 && w->buffer[x] == 0xff)
707 w->buffer[x] = (unsigned char)0;
708 x--;
711 w->buffer[x] += 1;
714 w->buffer[w->pos++] = (lowvalue >> (24 - offset));
715 lowvalue <<= offset;
716 shift = count;
717 lowvalue &= 0xffffff;
718 count -= 8 ;
721 lowvalue <<= shift;
723 while (n);
727 split = (range + 1) >> 1;
729 if (e & 1)
731 lowvalue += split;
732 range = range - split;
734 else
736 range = split;
739 range <<= 1;
741 if ((lowvalue & 0x80000000))
743 int x = w->pos - 1;
745 while (x >= 0 && w->buffer[x] == 0xff)
747 w->buffer[x] = (unsigned char)0;
748 x--;
751 w->buffer[x] += 1;
755 lowvalue <<= 1;
757 if (!++count)
759 count = -8;
760 w->buffer[w->pos++] = (lowvalue >> 24);
761 lowvalue &= 0xffffff;
767 ++p;
771 w->count = count;
772 w->lowvalue = lowvalue;
773 w->range = range;
777 static void write_mv_ref
779 vp8_writer *w, MB_PREDICTION_MODE m, const vp8_prob *p
783 assert(NEARESTMV <= m && m <= SPLITMV);
785 vp8_write_token(w, vp8_mv_ref_tree, p,
786 vp8_mv_ref_encoding_array - NEARESTMV + m);
789 static void write_sub_mv_ref
791 vp8_writer *w, B_PREDICTION_MODE m, const vp8_prob *p
794 assert(LEFT4X4 <= m && m <= NEW4X4);
796 vp8_write_token(w, vp8_sub_mv_ref_tree, p,
797 vp8_sub_mv_ref_encoding_array - LEFT4X4 + m);
800 static void write_mv
802 vp8_writer *w, const MV *mv, const MV *ref, const MV_CONTEXT *mvc
805 MV e;
806 e.row = mv->row - ref->row;
807 e.col = mv->col - ref->col;
809 vp8_encode_motion_vector(w, &e, mvc);
812 static void write_mb_features(vp8_writer *w, const MB_MODE_INFO *mi, const MACROBLOCKD *x)
814 // Encode the MB segment id.
815 if (x->segmentation_enabled && x->update_mb_segmentation_map)
817 switch (mi->segment_id)
819 case 0:
820 vp8_write(w, 0, x->mb_segment_tree_probs[0]);
821 vp8_write(w, 0, x->mb_segment_tree_probs[1]);
822 break;
823 case 1:
824 vp8_write(w, 0, x->mb_segment_tree_probs[0]);
825 vp8_write(w, 1, x->mb_segment_tree_probs[1]);
826 break;
827 case 2:
828 vp8_write(w, 1, x->mb_segment_tree_probs[0]);
829 vp8_write(w, 0, x->mb_segment_tree_probs[2]);
830 break;
831 case 3:
832 vp8_write(w, 1, x->mb_segment_tree_probs[0]);
833 vp8_write(w, 1, x->mb_segment_tree_probs[2]);
834 break;
836 // TRAP.. This should not happen
837 default:
838 vp8_write(w, 0, x->mb_segment_tree_probs[0]);
839 vp8_write(w, 0, x->mb_segment_tree_probs[1]);
840 break;
846 static void pack_inter_mode_mvs(VP8_COMP *const cpi)
848 VP8_COMMON *const pc = & cpi->common;
849 vp8_writer *const w = & cpi->bc;
850 const MV_CONTEXT *mvc = pc->fc.mvc;
852 const int *const rfct = cpi->count_mb_ref_frame_usage;
853 const int rf_intra = rfct[INTRA_FRAME];
854 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
856 MODE_INFO *m = pc->mi, *ms;
857 const int mis = pc->mode_info_stride;
858 int mb_row = -1;
860 int prob_last_coded;
861 int prob_gf_coded;
862 int prob_skip_false = 0;
863 ms = pc->mi - 1;
865 cpi->mb.partition_info = cpi->mb.pi;
867 // Calculate the probabilities to be used to code the reference frame based on actual useage this frame
868 if (!(cpi->prob_intra_coded = rf_intra * 255 / (rf_intra + rf_inter)))
869 cpi->prob_intra_coded = 1;
871 prob_last_coded = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
873 if (!prob_last_coded)
874 prob_last_coded = 1;
876 prob_gf_coded = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
877 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
879 if (!prob_gf_coded)
880 prob_gf_coded = 1;
883 #ifdef ENTROPY_STATS
884 active_section = 1;
885 #endif
887 if (pc->mb_no_coeff_skip)
889 prob_skip_false = cpi->skip_false_count * 256 / (cpi->skip_false_count + cpi->skip_true_count);
891 if (prob_skip_false <= 1)
892 prob_skip_false = 1;
894 if (prob_skip_false > 255)
895 prob_skip_false = 255;
897 cpi->prob_skip_false = prob_skip_false;
898 vp8_write_literal(w, prob_skip_false, 8);
901 vp8_write_literal(w, cpi->prob_intra_coded, 8);
902 vp8_write_literal(w, prob_last_coded, 8);
903 vp8_write_literal(w, prob_gf_coded, 8);
905 update_mbintra_mode_probs(cpi);
907 vp8_write_mvprobs(cpi);
909 while (++mb_row < pc->mb_rows)
911 int mb_col = -1;
913 while (++mb_col < pc->mb_cols)
915 const MB_MODE_INFO *const mi = & m->mbmi;
916 const MV_REFERENCE_FRAME rf = mi->ref_frame;
917 const MB_PREDICTION_MODE mode = mi->mode;
919 MACROBLOCKD *xd = &cpi->mb.e_mbd;
921 // Distance of Mb to the various image edges.
922 // These specified to 8th pel as they are always compared to MV values that are in 1/8th pel units
923 xd->mb_to_left_edge = -((mb_col * 16) << 3);
924 xd->mb_to_right_edge = ((pc->mb_cols - 1 - mb_col) * 16) << 3;
925 xd->mb_to_top_edge = -((mb_row * 16)) << 3;
926 xd->mb_to_bottom_edge = ((pc->mb_rows - 1 - mb_row) * 16) << 3;
928 #ifdef ENTROPY_STATS
929 active_section = 9;
930 #endif
932 if (cpi->mb.e_mbd.update_mb_segmentation_map)
933 write_mb_features(w, mi, &cpi->mb.e_mbd);
935 if (pc->mb_no_coeff_skip)
936 vp8_encode_bool(w, m->mbmi.mb_skip_coeff, prob_skip_false);
938 if (rf == INTRA_FRAME)
940 vp8_write(w, 0, cpi->prob_intra_coded);
941 #ifdef ENTROPY_STATS
942 active_section = 6;
943 #endif
944 write_ymode(w, mode, pc->fc.ymode_prob);
946 if (mode == B_PRED)
948 int j = 0;
951 write_bmode(w, m->bmi[j].mode, pc->fc.bmode_prob);
953 while (++j < 16);
956 write_uv_mode(w, mi->uv_mode, pc->fc.uv_mode_prob);
958 else /* inter coded */
960 MV best_mv;
961 vp8_prob mv_ref_p [VP8_MVREFS-1];
963 vp8_write(w, 1, cpi->prob_intra_coded);
965 if (rf == LAST_FRAME)
966 vp8_write(w, 0, prob_last_coded);
967 else
969 vp8_write(w, 1, prob_last_coded);
970 vp8_write(w, (rf == GOLDEN_FRAME) ? 0 : 1, prob_gf_coded);
974 MV n1, n2;
975 int ct[4];
977 vp8_find_near_mvs(xd, m, &n1, &n2, &best_mv, ct, rf, cpi->common.ref_frame_sign_bias);
978 vp8_mv_ref_probs(mv_ref_p, ct);
980 #ifdef ENTROPY_STATS
981 accum_mv_refs(mode, ct);
982 #endif
986 #ifdef ENTROPY_STATS
987 active_section = 3;
988 #endif
990 write_mv_ref(w, mode, mv_ref_p);
992 switch (mode) /* new, split require MVs */
994 case NEWMV:
996 #ifdef ENTROPY_STATS
997 active_section = 5;
998 #endif
1000 write_mv(w, &mi->mv.as_mv, &best_mv, mvc);
1001 break;
1003 case SPLITMV:
1005 int j = 0;
1007 #ifdef MODE_STATS
1008 ++count_mb_seg [mi->partitioning];
1009 #endif
1011 write_split(w, mi->partitioning);
1015 const B_MODE_INFO *const b = cpi->mb.partition_info->bmi + j;
1016 const int *const L = vp8_mbsplits [mi->partitioning];
1017 int k = -1; /* first block in subset j */
1018 int mv_contz;
1020 while (j != L[++k])
1021 if (k >= 16)
1022 assert(0);
1024 mv_contz = vp8_mv_cont
1025 (&(vp8_left_bmi(m, k)->mv.as_mv),
1026 &(vp8_above_bmi(m, k, mis)->mv.as_mv));
1027 write_sub_mv_ref(w, b->mode, vp8_sub_mv_ref_prob2 [mv_contz]); //pc->fc.sub_mv_ref_prob);
1029 if (b->mode == NEW4X4)
1031 #ifdef ENTROPY_STATS
1032 active_section = 11;
1033 #endif
1034 write_mv(w, &b->mv.as_mv, &best_mv, (const MV_CONTEXT *) mvc);
1037 while (++j < cpi->mb.partition_info->count);
1039 break;
1040 default:
1041 break;
1045 ++m;
1046 cpi->mb.partition_info++;
1049 ++m; /* skip L prediction border */
1050 cpi->mb.partition_info++;
1055 static void write_kfmodes(VP8_COMP *cpi)
1057 vp8_writer *const bc = & cpi->bc;
1058 const VP8_COMMON *const c = & cpi->common;
1059 /* const */
1060 MODE_INFO *m = c->mi;
1062 int mb_row = -1;
1063 int prob_skip_false = 0;
1065 if (c->mb_no_coeff_skip)
1067 prob_skip_false = cpi->skip_false_count * 256 / (cpi->skip_false_count + cpi->skip_true_count);
1069 if (prob_skip_false <= 1)
1070 prob_skip_false = 1;
1072 if (prob_skip_false >= 255)
1073 prob_skip_false = 255;
1075 cpi->prob_skip_false = prob_skip_false;
1076 vp8_write_literal(bc, prob_skip_false, 8);
1079 while (++mb_row < c->mb_rows)
1081 int mb_col = -1;
1083 while (++mb_col < c->mb_cols)
1085 const int ym = m->mbmi.mode;
1087 if (cpi->mb.e_mbd.update_mb_segmentation_map)
1088 write_mb_features(bc, &m->mbmi, &cpi->mb.e_mbd);
1090 if (c->mb_no_coeff_skip)
1091 vp8_encode_bool(bc, m->mbmi.mb_skip_coeff, prob_skip_false);
1093 kfwrite_ymode(bc, ym, c->kf_ymode_prob);
1095 if (ym == B_PRED)
1097 const int mis = c->mode_info_stride;
1098 int i = 0;
1102 const B_PREDICTION_MODE A = vp8_above_bmi(m, i, mis)->mode;
1103 const B_PREDICTION_MODE L = vp8_left_bmi(m, i)->mode;
1104 const int bm = m->bmi[i].mode;
1106 #ifdef ENTROPY_STATS
1107 ++intra_mode_stats [A] [L] [bm];
1108 #endif
1110 write_bmode(bc, bm, c->kf_bmode_prob [A] [L]);
1112 while (++i < 16);
1115 write_uv_mode(bc, (m++)->mbmi.uv_mode, c->kf_uv_mode_prob);
1118 m++; // skip L prediction border
1121 int vp8_estimate_entropy_savings(VP8_COMP *cpi)
1123 int i = 0;
1124 int savings = 0;
1126 const int *const rfct = cpi->count_mb_ref_frame_usage;
1127 const int rf_intra = rfct[INTRA_FRAME];
1128 const int rf_inter = rfct[LAST_FRAME] + rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME];
1129 int new_intra, new_last, gf_last, oldtotal, newtotal;
1130 int ref_frame_cost[MAX_REF_FRAMES];
1132 vp8_clear_system_state(); //__asm emms;
1134 if (cpi->common.frame_type != KEY_FRAME)
1136 if (!(new_intra = rf_intra * 255 / (rf_intra + rf_inter)))
1137 new_intra = 1;
1139 new_last = rf_inter ? (rfct[LAST_FRAME] * 255) / rf_inter : 128;
1141 gf_last = (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME])
1142 ? (rfct[GOLDEN_FRAME] * 255) / (rfct[GOLDEN_FRAME] + rfct[ALTREF_FRAME]) : 128;
1144 // new costs
1145 ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(new_intra);
1146 ref_frame_cost[LAST_FRAME] = vp8_cost_one(new_intra)
1147 + vp8_cost_zero(new_last);
1148 ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(new_intra)
1149 + vp8_cost_one(new_last)
1150 + vp8_cost_zero(gf_last);
1151 ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(new_intra)
1152 + vp8_cost_one(new_last)
1153 + vp8_cost_one(gf_last);
1155 newtotal =
1156 rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] +
1157 rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] +
1158 rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] +
1159 rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME];
1162 // old costs
1163 ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(cpi->prob_intra_coded);
1164 ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
1165 + vp8_cost_zero(cpi->prob_last_coded);
1166 ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
1167 + vp8_cost_one(cpi->prob_last_coded)
1168 + vp8_cost_zero(cpi->prob_gf_coded);
1169 ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
1170 + vp8_cost_one(cpi->prob_last_coded)
1171 + vp8_cost_one(cpi->prob_gf_coded);
1173 oldtotal =
1174 rfct[INTRA_FRAME] * ref_frame_cost[INTRA_FRAME] +
1175 rfct[LAST_FRAME] * ref_frame_cost[LAST_FRAME] +
1176 rfct[GOLDEN_FRAME] * ref_frame_cost[GOLDEN_FRAME] +
1177 rfct[ALTREF_FRAME] * ref_frame_cost[ALTREF_FRAME];
1179 savings += (oldtotal - newtotal) / 256;
1185 int j = 0;
1189 int k = 0;
1193 /* at every context */
1195 /* calc probs and branch cts for this frame only */
1196 //vp8_prob new_p [vp8_coef_tokens-1];
1197 //unsigned int branch_ct [vp8_coef_tokens-1] [2];
1199 int t = 0; /* token/prob index */
1201 vp8_tree_probs_from_distribution(
1202 vp8_coef_tokens, vp8_coef_encodings, vp8_coef_tree,
1203 cpi->frame_coef_probs [i][j][k], cpi->frame_branch_ct [i][j][k], cpi->coef_counts [i][j][k],
1204 256, 1
1209 const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t];
1210 const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t];
1212 const vp8_prob old = cpi->common.fc.coef_probs [i][j][k][t];
1213 const vp8_prob upd = vp8_coef_update_probs [i][j][k][t];
1215 const int old_b = vp8_cost_branch(ct, old);
1216 const int new_b = vp8_cost_branch(ct, newp);
1218 const int update_b = 8 +
1219 ((vp8_cost_one(upd) - vp8_cost_zero(upd)) >> 8);
1221 const int s = old_b - new_b - update_b;
1223 if (s > 0)
1224 savings += s;
1228 while (++t < vp8_coef_tokens - 1);
1232 while (++k < PREV_COEF_CONTEXTS);
1234 while (++j < COEF_BANDS);
1236 while (++i < BLOCK_TYPES);
1238 return savings;
1241 static void update_coef_probs(VP8_COMP *cpi)
1243 int i = 0;
1244 vp8_writer *const w = & cpi->bc;
1245 int savings = 0;
1247 vp8_clear_system_state(); //__asm emms;
1252 int j = 0;
1256 int k = 0;
1260 //note: use result from vp8_estimate_entropy_savings, so no need to call vp8_tree_probs_from_distribution here.
1261 /* at every context */
1263 /* calc probs and branch cts for this frame only */
1264 //vp8_prob new_p [vp8_coef_tokens-1];
1265 //unsigned int branch_ct [vp8_coef_tokens-1] [2];
1267 int t = 0; /* token/prob index */
1269 //vp8_tree_probs_from_distribution(
1270 // vp8_coef_tokens, vp8_coef_encodings, vp8_coef_tree,
1271 // new_p, branch_ct, (unsigned int *)cpi->coef_counts [i][j][k],
1272 // 256, 1
1273 // );
1277 const unsigned int *ct = cpi->frame_branch_ct [i][j][k][t];
1278 const vp8_prob newp = cpi->frame_coef_probs [i][j][k][t];
1280 vp8_prob *Pold = cpi->common.fc.coef_probs [i][j][k] + t;
1281 const vp8_prob old = *Pold;
1282 const vp8_prob upd = vp8_coef_update_probs [i][j][k][t];
1284 const int old_b = vp8_cost_branch(ct, old);
1285 const int new_b = vp8_cost_branch(ct, newp);
1287 const int update_b = 8 +
1288 ((vp8_cost_one(upd) - vp8_cost_zero(upd)) >> 8);
1290 const int s = old_b - new_b - update_b;
1291 const int u = s > 0 ? 1 : 0;
1293 vp8_write(w, u, upd);
1296 #ifdef ENTROPY_STATS
1297 ++ tree_update_hist [i][j][k][t] [u];
1298 #endif
1300 if (u)
1302 /* send/use new probability */
1304 *Pold = newp;
1305 vp8_write_literal(w, newp, 8);
1307 savings += s;
1312 while (++t < vp8_coef_tokens - 1);
1314 /* Accum token counts for generation of default statistics */
1315 #ifdef ENTROPY_STATS
1316 t = 0;
1320 context_counters [i][j][k][t] += cpi->coef_counts [i][j][k][t];
1322 while (++t < vp8_coef_tokens);
1324 #endif
1327 while (++k < PREV_COEF_CONTEXTS);
1329 while (++j < COEF_BANDS);
1331 while (++i < BLOCK_TYPES);
1334 #ifdef PACKET_TESTING
1335 FILE *vpxlogc = 0;
1336 #endif
1338 static void put_delta_q(vp8_writer *bc, int delta_q)
1340 if (delta_q != 0)
1342 vp8_write_bit(bc, 1);
1343 vp8_write_literal(bc, abs(delta_q), 4);
1345 if (delta_q < 0)
1346 vp8_write_bit(bc, 1);
1347 else
1348 vp8_write_bit(bc, 0);
1350 else
1351 vp8_write_bit(bc, 0);
1354 void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size)
1356 int i, j;
1357 VP8_HEADER oh;
1358 VP8_COMMON *const pc = & cpi->common;
1359 vp8_writer *const bc = & cpi->bc;
1360 MACROBLOCKD *const xd = & cpi->mb.e_mbd;
1361 int extra_bytes_packed = 0;
1363 unsigned char *cx_data = dest;
1364 const int *mb_feature_data_bits;
1366 oh.show_frame = (int) pc->show_frame;
1367 oh.type = (int)pc->frame_type;
1368 oh.version = pc->version;
1369 oh.first_partition_length_in_bytes = 0;
1371 mb_feature_data_bits = vp8_mb_feature_data_bits;
1372 cx_data += 3;
1374 #if defined(SECTIONBITS_OUTPUT)
1375 Sectionbits[active_section = 1] += sizeof(VP8_HEADER) * 8 * 256;
1376 #endif
1378 //vp8_kf_default_bmode_probs() is called in vp8_setup_key_frame() once for each
1379 //K frame before encode frame. pc->kf_bmode_prob doesn't get changed anywhere
1380 //else. No need to call it again here. --yw
1381 //vp8_kf_default_bmode_probs( pc->kf_bmode_prob);
1383 // every keyframe send startcode, width, height, scale factor, clamp and color type
1384 if (oh.type == KEY_FRAME)
1386 int v;
1388 // Start / synch code
1389 cx_data[0] = 0x9D;
1390 cx_data[1] = 0x01;
1391 cx_data[2] = 0x2a;
1393 v = (pc->horiz_scale << 14) | pc->Width;
1394 cx_data[3] = v;
1395 cx_data[4] = v >> 8;
1397 v = (pc->vert_scale << 14) | pc->Height;
1398 cx_data[5] = v;
1399 cx_data[6] = v >> 8;
1401 extra_bytes_packed = 7;
1402 cx_data += extra_bytes_packed ;
1404 vp8_start_encode(bc, cx_data);
1406 // signal clr type
1407 vp8_write_bit(bc, pc->clr_type);
1408 vp8_write_bit(bc, pc->clamp_type);
1411 else
1412 vp8_start_encode(bc, cx_data);
1415 // Signal whether or not Segmentation is enabled
1416 vp8_write_bit(bc, (xd->segmentation_enabled) ? 1 : 0);
1418 // Indicate which features are enabled
1419 if (xd->segmentation_enabled)
1421 // Signal whether or not the segmentation map is being updated.
1422 vp8_write_bit(bc, (xd->update_mb_segmentation_map) ? 1 : 0);
1423 vp8_write_bit(bc, (xd->update_mb_segmentation_data) ? 1 : 0);
1425 if (xd->update_mb_segmentation_data)
1427 signed char Data;
1429 vp8_write_bit(bc, (xd->mb_segement_abs_delta) ? 1 : 0);
1431 // For each segmentation feature (Quant and loop filter level)
1432 for (i = 0; i < MB_LVL_MAX; i++)
1434 // For each of the segments
1435 for (j = 0; j < MAX_MB_SEGMENTS; j++)
1437 Data = xd->segment_feature_data[i][j];
1439 // Frame level data
1440 if (Data)
1442 vp8_write_bit(bc, 1);
1444 if (Data < 0)
1446 Data = - Data;
1447 vp8_write_literal(bc, Data, mb_feature_data_bits[i]);
1448 vp8_write_bit(bc, 1);
1450 else
1452 vp8_write_literal(bc, Data, mb_feature_data_bits[i]);
1453 vp8_write_bit(bc, 0);
1456 else
1457 vp8_write_bit(bc, 0);
1462 if (xd->update_mb_segmentation_map)
1464 // Write the probs used to decode the segment id for each macro block.
1465 for (i = 0; i < MB_FEATURE_TREE_PROBS; i++)
1467 int Data = xd->mb_segment_tree_probs[i];
1469 if (Data != 255)
1471 vp8_write_bit(bc, 1);
1472 vp8_write_literal(bc, Data, 8);
1474 else
1475 vp8_write_bit(bc, 0);
1480 // Code to determine whether or not to update the scan order.
1481 vp8_write_bit(bc, pc->filter_type);
1482 vp8_write_literal(bc, pc->filter_level, 6);
1483 vp8_write_literal(bc, pc->sharpness_level, 3);
1485 // Write out loop filter deltas applied at the MB level based on mode or ref frame (if they are enabled).
1486 vp8_write_bit(bc, (xd->mode_ref_lf_delta_enabled) ? 1 : 0);
1488 if (xd->mode_ref_lf_delta_enabled)
1490 // Do the deltas need to be updated
1491 int send_update = xd->mode_ref_lf_delta_update
1492 || cpi->oxcf.error_resilient_mode;
1494 vp8_write_bit(bc, send_update);
1495 if (send_update)
1497 int Data;
1499 // Send update
1500 for (i = 0; i < MAX_REF_LF_DELTAS; i++)
1502 Data = xd->ref_lf_deltas[i];
1504 // Frame level data
1505 if (xd->ref_lf_deltas[i] != xd->last_ref_lf_deltas[i]
1506 || cpi->oxcf.error_resilient_mode)
1508 xd->last_ref_lf_deltas[i] = xd->ref_lf_deltas[i];
1509 vp8_write_bit(bc, 1);
1511 if (Data > 0)
1513 vp8_write_literal(bc, (Data & 0x3F), 6);
1514 vp8_write_bit(bc, 0); // sign
1516 else
1518 Data = -Data;
1519 vp8_write_literal(bc, (Data & 0x3F), 6);
1520 vp8_write_bit(bc, 1); // sign
1523 else
1524 vp8_write_bit(bc, 0);
1527 // Send update
1528 for (i = 0; i < MAX_MODE_LF_DELTAS; i++)
1530 Data = xd->mode_lf_deltas[i];
1532 if (xd->mode_lf_deltas[i] != xd->last_mode_lf_deltas[i]
1533 || cpi->oxcf.error_resilient_mode)
1535 xd->last_mode_lf_deltas[i] = xd->mode_lf_deltas[i];
1536 vp8_write_bit(bc, 1);
1538 if (Data > 0)
1540 vp8_write_literal(bc, (Data & 0x3F), 6);
1541 vp8_write_bit(bc, 0); // sign
1543 else
1545 Data = -Data;
1546 vp8_write_literal(bc, (Data & 0x3F), 6);
1547 vp8_write_bit(bc, 1); // sign
1550 else
1551 vp8_write_bit(bc, 0);
1556 //signal here is multi token partition is enabled
1557 vp8_write_literal(bc, pc->multi_token_partition, 2);
1559 // Frame Qbaseline quantizer index
1560 vp8_write_literal(bc, pc->base_qindex, 7);
1562 // Transmit Dc, Second order and Uv quantizer delta information
1563 put_delta_q(bc, pc->y1dc_delta_q);
1564 put_delta_q(bc, pc->y2dc_delta_q);
1565 put_delta_q(bc, pc->y2ac_delta_q);
1566 put_delta_q(bc, pc->uvdc_delta_q);
1567 put_delta_q(bc, pc->uvac_delta_q);
1569 // When there is a key frame all reference buffers are updated using the new key frame
1570 if (pc->frame_type != KEY_FRAME)
1572 // Should the GF or ARF be updated using the transmitted frame or buffer
1573 vp8_write_bit(bc, pc->refresh_golden_frame);
1574 vp8_write_bit(bc, pc->refresh_alt_ref_frame);
1576 // If not being updated from current frame should either GF or ARF be updated from another buffer
1577 if (!pc->refresh_golden_frame)
1578 vp8_write_literal(bc, pc->copy_buffer_to_gf, 2);
1580 if (!pc->refresh_alt_ref_frame)
1581 vp8_write_literal(bc, pc->copy_buffer_to_arf, 2);
1583 // Indicate reference frame sign bias for Golden and ARF frames (always 0 for last frame buffer)
1584 vp8_write_bit(bc, pc->ref_frame_sign_bias[GOLDEN_FRAME]);
1585 vp8_write_bit(bc, pc->ref_frame_sign_bias[ALTREF_FRAME]);
1588 vp8_write_bit(bc, pc->refresh_entropy_probs);
1590 if (pc->frame_type != KEY_FRAME)
1591 vp8_write_bit(bc, pc->refresh_last_frame);
1593 #ifdef ENTROPY_STATS
1595 if (pc->frame_type == INTER_FRAME)
1596 active_section = 0;
1597 else
1598 active_section = 7;
1600 #endif
1602 vp8_clear_system_state(); //__asm emms;
1604 //************************************************
1605 // save a copy for later refresh
1607 vpx_memcpy(&cpi->common.lfc, &cpi->common.fc, sizeof(cpi->common.fc));
1610 update_coef_probs(cpi);
1612 #ifdef ENTROPY_STATS
1613 active_section = 2;
1614 #endif
1616 // Write out the mb_no_coeff_skip flag
1617 vp8_write_bit(bc, pc->mb_no_coeff_skip);
1619 if (pc->frame_type == KEY_FRAME)
1621 write_kfmodes(cpi);
1623 #ifdef ENTROPY_STATS
1624 active_section = 8;
1625 #endif
1627 else
1629 pack_inter_mode_mvs(cpi);
1631 #ifdef ENTROPY_STATS
1632 active_section = 1;
1633 #endif
1636 vp8_stop_encode(bc);
1638 oh.first_partition_length_in_bytes = cpi->bc.pos;
1640 /* update frame tag */
1642 int v = (oh.first_partition_length_in_bytes << 5) |
1643 (oh.show_frame << 4) |
1644 (oh.version << 1) |
1645 oh.type;
1647 dest[0] = v;
1648 dest[1] = v >> 8;
1649 dest[2] = v >> 16;
1652 *size = VP8_HEADER_SIZE + extra_bytes_packed + cpi->bc.pos;
1654 if (pc->multi_token_partition != ONE_PARTITION)
1656 int num_part;
1657 int asize;
1658 num_part = 1 << pc->multi_token_partition;
1660 pack_tokens_into_partitions(cpi, cx_data + bc->pos, num_part, &asize);
1662 *size += asize;
1664 else
1666 vp8_start_encode(&cpi->bc2, cx_data + bc->pos);
1668 #if CONFIG_MULTITHREAD
1669 if (cpi->b_multi_threaded)
1670 pack_mb_row_tokens(cpi, &cpi->bc2);
1671 else
1672 #endif
1673 pack_tokens(&cpi->bc2, cpi->tok, cpi->tok_count);
1675 vp8_stop_encode(&cpi->bc2);
1677 *size += cpi->bc2.pos;
1681 #ifdef ENTROPY_STATS
1682 void print_tree_update_probs()
1684 int i, j, k, l;
1685 FILE *f = fopen("context.c", "a");
1686 int Sum;
1687 fprintf(f, "\n/* Update probabilities for token entropy tree. */\n\n");
1688 fprintf(f, "const vp8_prob tree_update_probs[BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens-1] = {\n");
1690 for (i = 0; i < BLOCK_TYPES; i++)
1692 fprintf(f, " { \n");
1694 for (j = 0; j < COEF_BANDS; j++)
1696 fprintf(f, " {\n");
1698 for (k = 0; k < PREV_COEF_CONTEXTS; k++)
1700 fprintf(f, " {");
1702 for (l = 0; l < MAX_ENTROPY_TOKENS - 1; l++)
1704 Sum = tree_update_hist[i][j][k][l][0] + tree_update_hist[i][j][k][l][1];
1706 if (Sum > 0)
1708 if (((tree_update_hist[i][j][k][l][0] * 255) / Sum) > 0)
1709 fprintf(f, "%3ld, ", (tree_update_hist[i][j][k][l][0] * 255) / Sum);
1710 else
1711 fprintf(f, "%3ld, ", 1);
1713 else
1714 fprintf(f, "%3ld, ", 128);
1717 fprintf(f, "},\n");
1720 fprintf(f, " },\n");
1723 fprintf(f, " },\n");
1726 fprintf(f, "};\n");
1727 fclose(f);
1729 #endif