Coverage Report

Created: 2025-08-28 07:12

/src/libvpx/vp9/encoder/vp9_bitstream.c
Line
Count
Source (jump to first uncovered line)
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
#include <assert.h>
12
#include <stdint.h>
13
#include <stdio.h>
14
#include <limits.h>
15
16
#include "vpx/vpx_encoder.h"
17
#include "vpx_dsp/bitwriter_buffer.h"
18
#include "vpx_dsp/vpx_dsp_common.h"
19
#include "vpx_mem/vpx_mem.h"
20
#include "vpx_ports/mem_ops.h"
21
#include "vpx_ports/system_state.h"
22
#if CONFIG_BITSTREAM_DEBUG
23
#include "vpx_util/vpx_debug_util.h"
24
#endif  // CONFIG_BITSTREAM_DEBUG
25
26
#include "vp9/common/vp9_entropy.h"
27
#include "vp9/common/vp9_entropymode.h"
28
#include "vp9/common/vp9_entropymv.h"
29
#include "vp9/common/vp9_mvref_common.h"
30
#include "vp9/common/vp9_pred_common.h"
31
#include "vp9/common/vp9_seg_common.h"
32
#include "vp9/common/vp9_tile_common.h"
33
34
#include "vp9/encoder/vp9_cost.h"
35
#include "vp9/encoder/vp9_bitstream.h"
36
#include "vp9/encoder/vp9_encodemv.h"
37
#include "vp9/encoder/vp9_mcomp.h"
38
#include "vp9/encoder/vp9_segmentation.h"
39
#include "vp9/encoder/vp9_subexp.h"
40
#include "vp9/encoder/vp9_tokenize.h"
41
42
static const struct vp9_token intra_mode_encodings[INTRA_MODES] = {
43
  { 0, 1 },  { 6, 3 },   { 28, 5 },  { 30, 5 }, { 58, 6 },
44
  { 59, 6 }, { 126, 7 }, { 127, 7 }, { 62, 6 }, { 2, 2 }
45
};
46
static const struct vp9_token
47
    switchable_interp_encodings[SWITCHABLE_FILTERS] = { { 0, 1 },
48
                                                        { 2, 2 },
49
                                                        { 3, 2 } };
50
static const struct vp9_token partition_encodings[PARTITION_TYPES] = {
51
  { 0, 1 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
52
};
53
static const struct vp9_token inter_mode_encodings[INTER_MODES] = {
54
  { 2, 2 }, { 6, 3 }, { 0, 1 }, { 7, 3 }
55
};
56
57
static void write_intra_mode(vpx_writer *w, PREDICTION_MODE mode,
58
5.13M
                             const vpx_prob *probs) {
59
5.13M
  vp9_write_token(w, vp9_intra_mode_tree, probs, &intra_mode_encodings[mode]);
60
5.13M
}
61
62
static void write_inter_mode(vpx_writer *w, PREDICTION_MODE mode,
63
1.03M
                             const vpx_prob *probs) {
64
1.03M
  assert(is_inter_mode(mode));
65
1.03M
  vp9_write_token(w, vp9_inter_mode_tree, probs,
66
1.03M
                  &inter_mode_encodings[INTER_OFFSET(mode)]);
67
1.03M
}
68
69
static void encode_unsigned_max(struct vpx_write_bit_buffer *wb, int data,
70
0
                                int max) {
71
0
  vpx_wb_write_literal(wb, data, get_unsigned_bits(max));
72
0
}
73
74
static void prob_diff_update(const vpx_tree_index *tree,
75
                             vpx_prob probs[/*n - 1*/],
76
                             const unsigned int counts[/*n - 1*/], int n,
77
1.14M
                             vpx_writer *w) {
78
1.14M
  int i;
79
1.14M
  unsigned int branch_ct[32][2];
80
81
  // Assuming max number of probabilities <= 32
82
1.14M
  assert(n <= 32);
83
84
1.14M
  vp9_tree_probs_from_distribution(tree, branch_ct, counts);
85
5.50M
  for (i = 0; i < n - 1; ++i)
86
4.36M
    vp9_cond_prob_diff_update(w, &probs[i], branch_ct[i]);
87
1.14M
}
88
89
static void write_selected_tx_size(const VP9_COMMON *cm,
90
444k
                                   const MACROBLOCKD *const xd, vpx_writer *w) {
91
444k
  TX_SIZE tx_size = xd->mi[0]->tx_size;
92
444k
  BLOCK_SIZE bsize = xd->mi[0]->sb_type;
93
444k
  const TX_SIZE max_tx_size = max_txsize_lookup[bsize];
94
444k
  const vpx_prob *const tx_probs =
95
444k
      get_tx_probs(max_tx_size, get_tx_size_context(xd), &cm->fc->tx_probs);
96
444k
  vpx_write(w, tx_size != TX_4X4, tx_probs[0]);
97
444k
  if (tx_size != TX_4X4 && max_tx_size >= TX_16X16) {
98
88.0k
    vpx_write(w, tx_size != TX_8X8, tx_probs[1]);
99
88.0k
    if (tx_size != TX_8X8 && max_tx_size >= TX_32X32)
100
39.7k
      vpx_write(w, tx_size != TX_16X16, tx_probs[2]);
101
88.0k
  }
102
444k
}
103
104
static int write_skip(const VP9_COMMON *cm, const MACROBLOCKD *const xd,
105
1.98M
                      int segment_id, const MODE_INFO *mi, vpx_writer *w) {
106
1.98M
  if (segfeature_active(&cm->seg, segment_id, SEG_LVL_SKIP)) {
107
0
    return 1;
108
1.98M
  } else {
109
1.98M
    const int skip = mi->skip;
110
1.98M
    vpx_write(w, skip, vp9_get_skip_prob(cm, xd));
111
1.98M
    return skip;
112
1.98M
  }
113
1.98M
}
114
115
static void update_skip_probs(VP9_COMMON *cm, vpx_writer *w,
116
53.1k
                              FRAME_COUNTS *counts) {
117
53.1k
  int k;
118
119
212k
  for (k = 0; k < SKIP_CONTEXTS; ++k)
120
159k
    vp9_cond_prob_diff_update(w, &cm->fc->skip_probs[k], counts->skip[k]);
121
53.1k
}
122
123
static void update_switchable_interp_probs(VP9_COMMON *cm, vpx_writer *w,
124
11.7k
                                           FRAME_COUNTS *counts) {
125
11.7k
  int j;
126
58.7k
  for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; ++j)
127
47.0k
    prob_diff_update(vp9_switchable_interp_tree,
128
47.0k
                     cm->fc->switchable_interp_prob[j],
129
47.0k
                     counts->switchable_interp[j], SWITCHABLE_FILTERS, w);
130
11.7k
}
131
132
static void pack_mb_tokens(vpx_writer *w, TOKENEXTRA **tp,
133
                           const TOKENEXTRA *const stop,
134
1.98M
                           vpx_bit_depth_t bit_depth) {
135
1.98M
  const TOKENEXTRA *p;
136
1.98M
  const vp9_extra_bit *const extra_bits =
137
1.98M
#if CONFIG_VP9_HIGHBITDEPTH
138
1.98M
      (bit_depth == VPX_BITS_12)   ? vp9_extra_bits_high12
139
1.98M
      : (bit_depth == VPX_BITS_10) ? vp9_extra_bits_high10
140
1.98M
                                   : vp9_extra_bits;
141
#else
142
      vp9_extra_bits;
143
  (void)bit_depth;
144
#endif  // CONFIG_VP9_HIGHBITDEPTH
145
146
102M
  for (p = *tp; p < stop && p->token != EOSB_TOKEN; ++p) {
147
100M
    if (p->token == EOB_TOKEN) {
148
5.10M
      vpx_write(w, 0, p->context_tree[0]);
149
5.10M
      continue;
150
5.10M
    }
151
95.8M
    vpx_write(w, 1, p->context_tree[0]);
152
125M
    while (p->token == ZERO_TOKEN) {
153
29.9M
      vpx_write(w, 0, p->context_tree[1]);
154
29.9M
      ++p;
155
29.9M
      if (p == stop || p->token == EOSB_TOKEN) {
156
0
        *tp = (TOKENEXTRA *)(uintptr_t)p + (p->token == EOSB_TOKEN);
157
0
        return;
158
0
      }
159
29.9M
    }
160
161
95.8M
    {
162
95.8M
      const int t = p->token;
163
95.8M
      const vpx_prob *const context_tree = p->context_tree;
164
95.8M
      assert(t != ZERO_TOKEN);
165
95.8M
      assert(t != EOB_TOKEN);
166
95.8M
      assert(t != EOSB_TOKEN);
167
95.8M
      vpx_write(w, 1, context_tree[1]);
168
95.8M
      if (t == ONE_TOKEN) {
169
18.6M
        vpx_write(w, 0, context_tree[2]);
170
18.6M
        vpx_write_bit(w, p->extra & 1);
171
77.1M
      } else {  // t >= TWO_TOKEN && t < EOB_TOKEN
172
77.1M
        const struct vp9_token *const a = &vp9_coef_encodings[t];
173
77.1M
        int v = a->value;
174
77.1M
        int n = a->len;
175
77.1M
        const int e = p->extra;
176
77.1M
        vpx_write(w, 1, context_tree[2]);
177
77.1M
        vp9_write_tree(w, vp9_coef_con_tree,
178
77.1M
                       vp9_pareto8_full[context_tree[PIVOT_NODE] - 1], v,
179
77.1M
                       n - UNCONSTRAINED_NODES, 0);
180
77.1M
        if (t >= CATEGORY1_TOKEN) {
181
53.7M
          const vp9_extra_bit *const b = &extra_bits[t];
182
53.7M
          const unsigned char *pb = b->prob;
183
53.7M
          v = e >> 1;
184
53.7M
          n = b->len;  // number of bits in v, assumed nonzero
185
206M
          do {
186
206M
            const int bb = (v >> --n) & 1;
187
206M
            vpx_write(w, bb, *pb++);
188
206M
          } while (n);
189
53.7M
        }
190
77.1M
        vpx_write_bit(w, e & 1);
191
77.1M
      }
192
95.8M
    }
193
95.8M
  }
194
1.98M
  *tp = (TOKENEXTRA *)(uintptr_t)p + (p->token == EOSB_TOKEN);
195
1.98M
}
196
197
static void write_segment_id(vpx_writer *w, const struct segmentation *seg,
198
0
                             int segment_id) {
199
0
  if (seg->enabled && seg->update_map)
200
0
    vp9_write_tree(w, vp9_segment_tree, seg->tree_probs, segment_id, 3, 0);
201
0
}
202
203
// This function encodes the reference frame
204
static void write_ref_frames(const VP9_COMMON *cm, const MACROBLOCKD *const xd,
205
497k
                             vpx_writer *w) {
206
497k
  const MODE_INFO *const mi = xd->mi[0];
207
497k
  const int is_compound = has_second_ref(mi);
208
497k
  const int segment_id = mi->segment_id;
209
210
  // If segment level coding of this signal is disabled...
211
  // or the segment allows multiple reference frame options
212
497k
  if (segfeature_active(&cm->seg, segment_id, SEG_LVL_REF_FRAME)) {
213
0
    assert(!is_compound);
214
0
    assert(mi->ref_frame[0] ==
215
0
           get_segdata(&cm->seg, segment_id, SEG_LVL_REF_FRAME));
216
497k
  } else {
217
    // does the feature use compound prediction or not
218
    // (if not specified at the frame/segment level)
219
497k
    if (cm->reference_mode == REFERENCE_MODE_SELECT) {
220
0
      vpx_write(w, is_compound, vp9_get_reference_mode_prob(cm, xd));
221
497k
    } else {
222
497k
      assert((!is_compound) == (cm->reference_mode == SINGLE_REFERENCE));
223
497k
    }
224
225
497k
    if (is_compound) {
226
0
      const int idx = cm->ref_frame_sign_bias[cm->comp_fixed_ref];
227
0
      vpx_write(w, mi->ref_frame[!idx] == cm->comp_var_ref[1],
228
0
                vp9_get_pred_prob_comp_ref_p(cm, xd));
229
497k
    } else {
230
497k
      const int bit0 = mi->ref_frame[0] != LAST_FRAME;
231
497k
      vpx_write(w, bit0, vp9_get_pred_prob_single_ref_p1(cm, xd));
232
497k
      if (bit0) {
233
180k
        const int bit1 = mi->ref_frame[0] != GOLDEN_FRAME;
234
180k
        vpx_write(w, bit1, vp9_get_pred_prob_single_ref_p2(cm, xd));
235
180k
      }
236
497k
    }
237
497k
  }
238
497k
}
239
240
static void pack_inter_mode_mvs(VP9_COMP *cpi, const MACROBLOCKD *const xd,
241
                                const MB_MODE_INFO_EXT *const mbmi_ext,
242
                                vpx_writer *w,
243
                                unsigned int *const max_mv_magnitude,
244
1.33M
                                int interp_filter_selected[][SWITCHABLE]) {
245
1.33M
  VP9_COMMON *const cm = &cpi->common;
246
1.33M
  const nmv_context *nmvc = &cm->fc->nmvc;
247
1.33M
  const struct segmentation *const seg = &cm->seg;
248
1.33M
  const MODE_INFO *const mi = xd->mi[0];
249
1.33M
  const PREDICTION_MODE mode = mi->mode;
250
1.33M
  const int segment_id = mi->segment_id;
251
1.33M
  const BLOCK_SIZE bsize = mi->sb_type;
252
1.33M
  const int allow_hp = cm->allow_high_precision_mv;
253
1.33M
  const int is_inter = is_inter_block(mi);
254
1.33M
  const int is_compound = has_second_ref(mi);
255
1.33M
  int skip, ref;
256
257
1.33M
  if (seg->update_map) {
258
0
    if (seg->temporal_update) {
259
0
      const int pred_flag = mi->seg_id_predicted;
260
0
      vpx_prob pred_prob = vp9_get_pred_prob_seg_id(seg, xd);
261
0
      vpx_write(w, pred_flag, pred_prob);
262
0
      if (!pred_flag) write_segment_id(w, seg, segment_id);
263
0
    } else {
264
0
      write_segment_id(w, seg, segment_id);
265
0
    }
266
0
  }
267
268
1.33M
  skip = write_skip(cm, xd, segment_id, mi, w);
269
270
1.33M
  if (!segfeature_active(seg, segment_id, SEG_LVL_REF_FRAME))
271
1.33M
    vpx_write(w, is_inter, vp9_get_intra_inter_prob(cm, xd));
272
273
1.33M
  if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT &&
274
1.33M
      !(is_inter && skip)) {
275
202k
    write_selected_tx_size(cm, xd, w);
276
202k
  }
277
278
1.33M
  if (!is_inter) {
279
836k
    if (bsize >= BLOCK_8X8) {
280
319k
      write_intra_mode(w, mode, cm->fc->y_mode_prob[size_group_lookup[bsize]]);
281
516k
    } else {
282
516k
      int idx, idy;
283
516k
      const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize];
284
516k
      const int num_4x4_h = num_4x4_blocks_high_lookup[bsize];
285
1.48M
      for (idy = 0; idy < 2; idy += num_4x4_h) {
286
2.67M
        for (idx = 0; idx < 2; idx += num_4x4_w) {
287
1.70M
          const PREDICTION_MODE b_mode = mi->bmi[idy * 2 + idx].as_mode;
288
1.70M
          write_intra_mode(w, b_mode, cm->fc->y_mode_prob[0]);
289
1.70M
        }
290
969k
      }
291
516k
    }
292
836k
    write_intra_mode(w, mi->uv_mode, cm->fc->uv_mode_prob[mode]);
293
836k
  } else {
294
497k
    const int mode_ctx = mbmi_ext->mode_context[mi->ref_frame[0]];
295
497k
    const vpx_prob *const inter_probs = cm->fc->inter_mode_probs[mode_ctx];
296
497k
    write_ref_frames(cm, xd, w);
297
298
    // If segment skip is not enabled code the mode.
299
497k
    if (!segfeature_active(seg, segment_id, SEG_LVL_SKIP)) {
300
497k
      if (bsize >= BLOCK_8X8) {
301
280k
        write_inter_mode(w, mode, inter_probs);
302
280k
      }
303
497k
    }
304
305
497k
    if (cm->interp_filter == SWITCHABLE) {
306
202k
      const int ctx = get_pred_context_switchable_interp(xd);
307
202k
      vp9_write_token(w, vp9_switchable_interp_tree,
308
202k
                      cm->fc->switchable_interp_prob[ctx],
309
202k
                      &switchable_interp_encodings[mi->interp_filter]);
310
202k
      ++interp_filter_selected[0][mi->interp_filter];
311
295k
    } else {
312
295k
      assert(mi->interp_filter == cm->interp_filter);
313
295k
    }
314
315
497k
    if (bsize < BLOCK_8X8) {
316
217k
      const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize];
317
217k
      const int num_4x4_h = num_4x4_blocks_high_lookup[bsize];
318
217k
      int idx, idy;
319
634k
      for (idy = 0; idy < 2; idy += num_4x4_h) {
320
1.16M
        for (idx = 0; idx < 2; idx += num_4x4_w) {
321
749k
          const int j = idy * 2 + idx;
322
749k
          const PREDICTION_MODE b_mode = mi->bmi[j].as_mode;
323
749k
          write_inter_mode(w, b_mode, inter_probs);
324
749k
          if (b_mode == NEWMV) {
325
374k
            for (ref = 0; ref < 1 + is_compound; ++ref)
326
187k
              vp9_encode_mv(cpi, w, &mi->bmi[j].as_mv[ref].as_mv,
327
187k
                            &mbmi_ext->ref_mvs[mi->ref_frame[ref]][0].as_mv,
328
187k
                            nmvc, allow_hp, max_mv_magnitude);
329
187k
          }
330
749k
        }
331
417k
      }
332
280k
    } else {
333
280k
      if (mode == NEWMV) {
334
166k
        for (ref = 0; ref < 1 + is_compound; ++ref)
335
83.1k
          vp9_encode_mv(cpi, w, &mi->mv[ref].as_mv,
336
83.1k
                        &mbmi_ext->ref_mvs[mi->ref_frame[ref]][0].as_mv, nmvc,
337
83.1k
                        allow_hp, max_mv_magnitude);
338
83.1k
      }
339
280k
    }
340
497k
  }
341
1.33M
}
342
343
static void write_mb_modes_kf(const VP9_COMMON *cm, const MACROBLOCKD *xd,
344
648k
                              vpx_writer *w) {
345
648k
  const struct segmentation *const seg = &cm->seg;
346
648k
  const MODE_INFO *const mi = xd->mi[0];
347
648k
  const MODE_INFO *const above_mi = xd->above_mi;
348
648k
  const MODE_INFO *const left_mi = xd->left_mi;
349
648k
  const BLOCK_SIZE bsize = mi->sb_type;
350
351
648k
  if (seg->update_map) write_segment_id(w, seg, mi->segment_id);
352
353
648k
  write_skip(cm, xd, mi->segment_id, mi, w);
354
355
648k
  if (bsize >= BLOCK_8X8 && cm->tx_mode == TX_MODE_SELECT)
356
242k
    write_selected_tx_size(cm, xd, w);
357
358
648k
  if (bsize >= BLOCK_8X8) {
359
274k
    write_intra_mode(w, mi->mode, get_y_mode_probs(mi, above_mi, left_mi, 0));
360
373k
  } else {
361
373k
    const int num_4x4_w = num_4x4_blocks_wide_lookup[bsize];
362
373k
    const int num_4x4_h = num_4x4_blocks_high_lookup[bsize];
363
373k
    int idx, idy;
364
365
1.08M
    for (idy = 0; idy < 2; idy += num_4x4_h) {
366
2.05M
      for (idx = 0; idx < 2; idx += num_4x4_w) {
367
1.34M
        const int block = idy * 2 + idx;
368
1.34M
        write_intra_mode(w, mi->bmi[block].as_mode,
369
1.34M
                         get_y_mode_probs(mi, above_mi, left_mi, block));
370
1.34M
      }
371
715k
    }
372
373k
  }
373
374
648k
  write_intra_mode(w, mi->uv_mode, vp9_kf_uv_mode_prob[mi->mode]);
375
648k
}
376
377
static void write_modes_b(VP9_COMP *cpi, MACROBLOCKD *const xd,
378
                          const TileInfo *const tile, vpx_writer *w,
379
                          TOKENEXTRA **tok, const TOKENEXTRA *const tok_end,
380
                          int mi_row, int mi_col,
381
                          unsigned int *const max_mv_magnitude,
382
1.98M
                          int interp_filter_selected[][SWITCHABLE]) {
383
1.98M
  const VP9_COMMON *const cm = &cpi->common;
384
1.98M
  const MB_MODE_INFO_EXT *const mbmi_ext =
385
1.98M
      cpi->td.mb.mbmi_ext_base + (mi_row * cm->mi_cols + mi_col);
386
1.98M
  MODE_INFO *m;
387
388
1.98M
  xd->mi = cm->mi_grid_visible + (mi_row * cm->mi_stride + mi_col);
389
1.98M
  m = xd->mi[0];
390
391
1.98M
  set_mi_row_col(xd, tile, mi_row, num_8x8_blocks_high_lookup[m->sb_type],
392
1.98M
                 mi_col, num_8x8_blocks_wide_lookup[m->sb_type], cm->mi_rows,
393
1.98M
                 cm->mi_cols);
394
1.98M
  if (frame_is_intra_only(cm)) {
395
648k
    write_mb_modes_kf(cm, xd, w);
396
1.33M
  } else {
397
1.33M
    pack_inter_mode_mvs(cpi, xd, mbmi_ext, w, max_mv_magnitude,
398
1.33M
                        interp_filter_selected);
399
1.33M
  }
400
401
1.98M
  assert(*tok < tok_end);
402
1.98M
  pack_mb_tokens(w, tok, tok_end, cm->bit_depth);
403
1.98M
}
404
405
static void write_partition(const VP9_COMMON *const cm,
406
                            const MACROBLOCKD *const xd, int hbs, int mi_row,
407
                            int mi_col, PARTITION_TYPE p, BLOCK_SIZE bsize,
408
2.66M
                            vpx_writer *w) {
409
2.66M
  const int ctx = partition_plane_context(xd, mi_row, mi_col, bsize);
410
2.66M
  const vpx_prob *const probs = xd->partition_probs[ctx];
411
2.66M
  const int has_rows = (mi_row + hbs) < cm->mi_rows;
412
2.66M
  const int has_cols = (mi_col + hbs) < cm->mi_cols;
413
414
2.66M
  if (has_rows && has_cols) {
415
2.46M
    vp9_write_token(w, vp9_partition_tree, probs, &partition_encodings[p]);
416
2.46M
  } else if (!has_rows && has_cols) {
417
111k
    assert(p == PARTITION_SPLIT || p == PARTITION_HORZ);
418
111k
    vpx_write(w, p == PARTITION_SPLIT, probs[1]);
419
111k
  } else if (has_rows && !has_cols) {
420
46.8k
    assert(p == PARTITION_SPLIT || p == PARTITION_VERT);
421
46.8k
    vpx_write(w, p == PARTITION_SPLIT, probs[2]);
422
46.8k
  } else {
423
42.9k
    assert(p == PARTITION_SPLIT);
424
42.9k
  }
425
2.66M
}
426
427
static void write_modes_sb(VP9_COMP *cpi, MACROBLOCKD *const xd,
428
                           const TileInfo *const tile, vpx_writer *w,
429
                           TOKENEXTRA **tok, const TOKENEXTRA *const tok_end,
430
                           int mi_row, int mi_col, BLOCK_SIZE bsize,
431
                           unsigned int *const max_mv_magnitude,
432
3.05M
                           int interp_filter_selected[][SWITCHABLE]) {
433
3.05M
  const VP9_COMMON *const cm = &cpi->common;
434
3.05M
  const int bsl = b_width_log2_lookup[bsize];
435
3.05M
  const int bs = (1 << bsl) / 4;
436
3.05M
  PARTITION_TYPE partition;
437
3.05M
  BLOCK_SIZE subsize;
438
3.05M
  const MODE_INFO *m = NULL;
439
440
3.05M
  if (mi_row >= cm->mi_rows || mi_col >= cm->mi_cols) return;
441
442
2.66M
  m = cm->mi_grid_visible[mi_row * cm->mi_stride + mi_col];
443
444
2.66M
  partition = partition_lookup[bsl][m->sb_type];
445
2.66M
  write_partition(cm, xd, bs, mi_row, mi_col, partition, bsize, w);
446
2.66M
  subsize = get_subsize(bsize, partition);
447
2.66M
  if (subsize < BLOCK_8X8) {
448
1.10M
    write_modes_b(cpi, xd, tile, w, tok, tok_end, mi_row, mi_col,
449
1.10M
                  max_mv_magnitude, interp_filter_selected);
450
1.55M
  } else {
451
1.55M
    switch (partition) {
452
739k
      case PARTITION_NONE:
453
739k
        write_modes_b(cpi, xd, tile, w, tok, tok_end, mi_row, mi_col,
454
739k
                      max_mv_magnitude, interp_filter_selected);
455
739k
        break;
456
52.9k
      case PARTITION_HORZ:
457
52.9k
        write_modes_b(cpi, xd, tile, w, tok, tok_end, mi_row, mi_col,
458
52.9k
                      max_mv_magnitude, interp_filter_selected);
459
52.9k
        if (mi_row + bs < cm->mi_rows)
460
33.3k
          write_modes_b(cpi, xd, tile, w, tok, tok_end, mi_row + bs, mi_col,
461
33.3k
                        max_mv_magnitude, interp_filter_selected);
462
52.9k
        break;
463
29.7k
      case PARTITION_VERT:
464
29.7k
        write_modes_b(cpi, xd, tile, w, tok, tok_end, mi_row, mi_col,
465
29.7k
                      max_mv_magnitude, interp_filter_selected);
466
29.7k
        if (mi_col + bs < cm->mi_cols)
467
19.5k
          write_modes_b(cpi, xd, tile, w, tok, tok_end, mi_row, mi_col + bs,
468
19.5k
                        max_mv_magnitude, interp_filter_selected);
469
29.7k
        break;
470
734k
      default:
471
734k
        assert(partition == PARTITION_SPLIT);
472
734k
        write_modes_sb(cpi, xd, tile, w, tok, tok_end, mi_row, mi_col, subsize,
473
734k
                       max_mv_magnitude, interp_filter_selected);
474
734k
        write_modes_sb(cpi, xd, tile, w, tok, tok_end, mi_row, mi_col + bs,
475
734k
                       subsize, max_mv_magnitude, interp_filter_selected);
476
734k
        write_modes_sb(cpi, xd, tile, w, tok, tok_end, mi_row + bs, mi_col,
477
734k
                       subsize, max_mv_magnitude, interp_filter_selected);
478
734k
        write_modes_sb(cpi, xd, tile, w, tok, tok_end, mi_row + bs, mi_col + bs,
479
734k
                       subsize, max_mv_magnitude, interp_filter_selected);
480
734k
        break;
481
1.55M
    }
482
1.55M
  }
483
484
  // update partition context
485
2.66M
  if (bsize >= BLOCK_8X8 &&
486
2.66M
      (bsize == BLOCK_8X8 || partition != PARTITION_SPLIT))
487
1.92M
    update_partition_context(xd, mi_row, mi_col, subsize, bsize);
488
2.66M
}
489
490
static void write_modes(VP9_COMP *cpi, MACROBLOCKD *const xd,
491
                        const TileInfo *const tile, vpx_writer *w, int tile_row,
492
                        int tile_col, unsigned int *const max_mv_magnitude,
493
57.7k
                        int interp_filter_selected[][SWITCHABLE]) {
494
57.7k
  const VP9_COMMON *const cm = &cpi->common;
495
57.7k
  int mi_row, mi_col, tile_sb_row;
496
57.7k
  TOKENEXTRA *tok = NULL;
497
57.7k
  TOKENEXTRA *tok_end = NULL;
498
499
57.7k
  set_partition_probs(cm, xd);
500
501
131k
  for (mi_row = tile->mi_row_start; mi_row < tile->mi_row_end;
502
74.2k
       mi_row += MI_BLOCK_SIZE) {
503
74.2k
    tile_sb_row = mi_cols_aligned_to_sb(mi_row - tile->mi_row_start) >>
504
74.2k
                  MI_BLOCK_SIZE_LOG2;
505
74.2k
    tok = cpi->tplist[tile_row][tile_col][tile_sb_row].start;
506
74.2k
    tok_end = tok + cpi->tplist[tile_row][tile_col][tile_sb_row].count;
507
508
74.2k
    vp9_zero(xd->left_seg_context);
509
187k
    for (mi_col = tile->mi_col_start; mi_col < tile->mi_col_end;
510
113k
         mi_col += MI_BLOCK_SIZE)
511
113k
      write_modes_sb(cpi, xd, tile, w, &tok, tok_end, mi_row, mi_col,
512
113k
                     BLOCK_64X64, max_mv_magnitude, interp_filter_selected);
513
514
74.2k
    assert(tok == cpi->tplist[tile_row][tile_col][tile_sb_row].stop);
515
74.2k
  }
516
57.7k
}
517
518
static void build_tree_distribution(VP9_COMP *cpi, TX_SIZE tx_size,
519
                                    vp9_coeff_stats *coef_branch_ct,
520
39.5k
                                    vp9_coeff_probs_model *coef_probs) {
521
39.5k
  vp9_coeff_count *coef_counts = cpi->td.rd_counts.coef_counts[tx_size];
522
39.5k
  unsigned int(*eob_branch_ct)[REF_TYPES][COEF_BANDS][COEFF_CONTEXTS] =
523
39.5k
      cpi->common.counts.eob_branch[tx_size];
524
39.5k
  int i, j, k, l, m;
525
526
118k
  for (i = 0; i < PLANE_TYPES; ++i) {
527
237k
    for (j = 0; j < REF_TYPES; ++j) {
528
1.10M
      for (k = 0; k < COEF_BANDS; ++k) {
529
6.17M
        for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
530
5.22M
          vp9_tree_probs_from_distribution(vp9_coef_tree,
531
5.22M
                                           coef_branch_ct[i][j][k][l],
532
5.22M
                                           coef_counts[i][j][k][l]);
533
5.22M
          coef_branch_ct[i][j][k][l][0][1] =
534
5.22M
              eob_branch_ct[i][j][k][l] - coef_branch_ct[i][j][k][l][0][0];
535
20.8M
          for (m = 0; m < UNCONSTRAINED_NODES; ++m)
536
15.6M
            coef_probs[i][j][k][l][m] =
537
15.6M
                get_binary_prob(coef_branch_ct[i][j][k][l][m][0],
538
15.6M
                                coef_branch_ct[i][j][k][l][m][1]);
539
5.22M
        }
540
949k
      }
541
158k
    }
542
79.1k
  }
543
39.5k
}
544
545
static void update_coef_probs_common(vpx_writer *const bc, VP9_COMP *cpi,
546
                                     TX_SIZE tx_size,
547
                                     vp9_coeff_stats *frame_branch_ct,
548
39.5k
                                     vp9_coeff_probs_model *new_coef_probs) {
549
39.5k
  vp9_coeff_probs_model *old_coef_probs = cpi->common.fc->coef_probs[tx_size];
550
39.5k
  const vpx_prob upd = DIFF_UPDATE_PROB;
551
39.5k
  const int entropy_nodes_update = UNCONSTRAINED_NODES;
552
39.5k
  int i, j, k, l, t;
553
39.5k
  int stepsize = cpi->sf.coeff_prob_appx_step;
554
555
39.5k
  switch (cpi->sf.use_fast_coef_updates) {
556
39.5k
    case TWO_LOOP: {
557
      /* dry run to see if there is any update at all needed */
558
39.5k
      int64_t savings = 0;
559
39.5k
      int update[2] = { 0, 0 };
560
118k
      for (i = 0; i < PLANE_TYPES; ++i) {
561
237k
        for (j = 0; j < REF_TYPES; ++j) {
562
1.10M
          for (k = 0; k < COEF_BANDS; ++k) {
563
6.17M
            for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
564
20.8M
              for (t = 0; t < entropy_nodes_update; ++t) {
565
15.6M
                vpx_prob newp = new_coef_probs[i][j][k][l][t];
566
15.6M
                const vpx_prob oldp = old_coef_probs[i][j][k][l][t];
567
15.6M
                int64_t s;
568
15.6M
                int u = 0;
569
15.6M
                if (t == PIVOT_NODE)
570
5.22M
                  s = vp9_prob_diff_update_savings_search_model(
571
5.22M
                      frame_branch_ct[i][j][k][l][0], oldp, &newp, upd,
572
5.22M
                      stepsize);
573
10.4M
                else
574
10.4M
                  s = vp9_prob_diff_update_savings_search(
575
10.4M
                      frame_branch_ct[i][j][k][l][t], oldp, &newp, upd);
576
15.6M
                if (s > 0 && newp != oldp) u = 1;
577
15.6M
                if (u)
578
560k
                  savings += s - (int)(vp9_cost_zero(upd));
579
15.1M
                else
580
15.1M
                  savings -= (int)(vp9_cost_zero(upd));
581
15.6M
                update[u]++;
582
15.6M
              }
583
5.22M
            }
584
949k
          }
585
158k
        }
586
79.1k
      }
587
588
      // printf("Update %d %d, savings %d\n", update[0], update[1], savings);
589
      /* Is coef updated at all */
590
39.5k
      if (update[1] == 0 || savings < 0) {
591
14.3k
        vpx_write_bit(bc, 0);
592
14.3k
        return;
593
14.3k
      }
594
25.2k
      vpx_write_bit(bc, 1);
595
75.8k
      for (i = 0; i < PLANE_TYPES; ++i) {
596
151k
        for (j = 0; j < REF_TYPES; ++j) {
597
707k
          for (k = 0; k < COEF_BANDS; ++k) {
598
3.94M
            for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
599
              // calc probs and branch cts for this frame only
600
13.3M
              for (t = 0; t < entropy_nodes_update; ++t) {
601
10.0M
                vpx_prob newp = new_coef_probs[i][j][k][l][t];
602
10.0M
                vpx_prob *oldp = old_coef_probs[i][j][k][l] + t;
603
10.0M
                int64_t s;
604
10.0M
                int u = 0;
605
10.0M
                if (t == PIVOT_NODE)
606
3.33M
                  s = vp9_prob_diff_update_savings_search_model(
607
3.33M
                      frame_branch_ct[i][j][k][l][0], *oldp, &newp, upd,
608
3.33M
                      stepsize);
609
6.67M
                else
610
6.67M
                  s = vp9_prob_diff_update_savings_search(
611
6.67M
                      frame_branch_ct[i][j][k][l][t], *oldp, &newp, upd);
612
10.0M
                if (s > 0 && newp != *oldp) u = 1;
613
10.0M
                vpx_write(bc, u, upd);
614
10.0M
                if (u) {
615
                  /* send/use new probability */
616
551k
                  vp9_write_prob_diff_update(bc, newp, *oldp);
617
551k
                  *oldp = newp;
618
551k
                }
619
10.0M
              }
620
3.33M
            }
621
606k
          }
622
101k
        }
623
50.5k
      }
624
25.2k
      return;
625
39.5k
    }
626
627
0
    default: {
628
0
      int updates = 0;
629
0
      int noupdates_before_first = 0;
630
0
      assert(cpi->sf.use_fast_coef_updates == ONE_LOOP_REDUCED);
631
0
      for (i = 0; i < PLANE_TYPES; ++i) {
632
0
        for (j = 0; j < REF_TYPES; ++j) {
633
0
          for (k = 0; k < COEF_BANDS; ++k) {
634
0
            for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
635
              // calc probs and branch cts for this frame only
636
0
              for (t = 0; t < entropy_nodes_update; ++t) {
637
0
                vpx_prob newp = new_coef_probs[i][j][k][l][t];
638
0
                vpx_prob *oldp = old_coef_probs[i][j][k][l] + t;
639
0
                int64_t s;
640
0
                int u = 0;
641
642
0
                if (t == PIVOT_NODE) {
643
0
                  s = vp9_prob_diff_update_savings_search_model(
644
0
                      frame_branch_ct[i][j][k][l][0], *oldp, &newp, upd,
645
0
                      stepsize);
646
0
                } else {
647
0
                  s = vp9_prob_diff_update_savings_search(
648
0
                      frame_branch_ct[i][j][k][l][t], *oldp, &newp, upd);
649
0
                }
650
651
0
                if (s > 0 && newp != *oldp) u = 1;
652
0
                updates += u;
653
0
                if (u == 0 && updates == 0) {
654
0
                  noupdates_before_first++;
655
0
                  continue;
656
0
                }
657
0
                if (u == 1 && updates == 1) {
658
0
                  int v;
659
                  // first update
660
0
                  vpx_write_bit(bc, 1);
661
0
                  for (v = 0; v < noupdates_before_first; ++v)
662
0
                    vpx_write(bc, 0, upd);
663
0
                }
664
0
                vpx_write(bc, u, upd);
665
0
                if (u) {
666
                  /* send/use new probability */
667
0
                  vp9_write_prob_diff_update(bc, newp, *oldp);
668
0
                  *oldp = newp;
669
0
                }
670
0
              }
671
0
            }
672
0
          }
673
0
        }
674
0
      }
675
0
      if (updates == 0) {
676
0
        vpx_write_bit(bc, 0);  // no updates
677
0
      }
678
0
      return;
679
39.5k
    }
680
39.5k
  }
681
39.5k
}
682
683
53.1k
static void update_coef_probs(VP9_COMP *cpi, vpx_writer *w) {
684
53.1k
  const TX_MODE tx_mode = cpi->common.tx_mode;
685
53.1k
  const TX_SIZE max_tx_size = tx_mode_to_biggest_tx_size[tx_mode];
686
53.1k
  TX_SIZE tx_size;
687
222k
  for (tx_size = TX_4X4; tx_size <= max_tx_size; ++tx_size) {
688
169k
    vp9_coeff_stats frame_branch_ct[PLANE_TYPES];
689
169k
    vp9_coeff_probs_model frame_coef_probs[PLANE_TYPES];
690
169k
    if (cpi->td.counts->tx.tx_totals[tx_size] <= 20 ||
691
169k
        (tx_size >= TX_16X16 && cpi->sf.tx_size_search_method == USE_TX_8X8)) {
692
130k
      vpx_write_bit(w, 0);
693
130k
    } else {
694
39.5k
      build_tree_distribution(cpi, tx_size, frame_branch_ct, frame_coef_probs);
695
39.5k
      update_coef_probs_common(w, cpi, tx_size, frame_branch_ct,
696
39.5k
                               frame_coef_probs);
697
39.5k
    }
698
169k
  }
699
53.1k
}
700
701
static void encode_loopfilter(struct loopfilter *lf,
702
53.1k
                              struct vpx_write_bit_buffer *wb) {
703
53.1k
  int i;
704
705
  // Encode the loop filter level and type
706
53.1k
  vpx_wb_write_literal(wb, lf->filter_level, 6);
707
53.1k
  vpx_wb_write_literal(wb, lf->sharpness_level, 3);
708
709
  // Write out loop filter deltas applied at the MB level based on mode or
710
  // ref frame (if they are enabled).
711
53.1k
  vpx_wb_write_bit(wb, lf->mode_ref_delta_enabled);
712
713
53.1k
  if (lf->mode_ref_delta_enabled) {
714
53.1k
    vpx_wb_write_bit(wb, lf->mode_ref_delta_update);
715
53.1k
    if (lf->mode_ref_delta_update) {
716
62.3k
      for (i = 0; i < MAX_REF_LF_DELTAS; i++) {
717
49.8k
        const int delta = lf->ref_deltas[i];
718
49.8k
        const int changed = delta != lf->last_ref_deltas[i];
719
49.8k
        vpx_wb_write_bit(wb, changed);
720
49.8k
        if (changed) {
721
37.3k
          lf->last_ref_deltas[i] = delta;
722
37.3k
          vpx_wb_write_literal(wb, abs(delta) & 0x3F, 6);
723
37.3k
          vpx_wb_write_bit(wb, delta < 0);
724
37.3k
        }
725
49.8k
      }
726
727
37.3k
      for (i = 0; i < MAX_MODE_LF_DELTAS; i++) {
728
24.9k
        const int delta = lf->mode_deltas[i];
729
24.9k
        const int changed = delta != lf->last_mode_deltas[i];
730
24.9k
        vpx_wb_write_bit(wb, changed);
731
24.9k
        if (changed) {
732
0
          lf->last_mode_deltas[i] = delta;
733
0
          vpx_wb_write_literal(wb, abs(delta) & 0x3F, 6);
734
0
          vpx_wb_write_bit(wb, delta < 0);
735
0
        }
736
24.9k
      }
737
12.4k
    }
738
53.1k
  }
739
53.1k
}
740
741
159k
static void write_delta_q(struct vpx_write_bit_buffer *wb, int delta_q) {
742
159k
  if (delta_q != 0) {
743
0
    vpx_wb_write_bit(wb, 1);
744
0
    vpx_wb_write_literal(wb, abs(delta_q), 4);
745
0
    vpx_wb_write_bit(wb, delta_q < 0);
746
159k
  } else {
747
159k
    vpx_wb_write_bit(wb, 0);
748
159k
  }
749
159k
}
750
751
static void encode_quantization(const VP9_COMMON *const cm,
752
53.1k
                                struct vpx_write_bit_buffer *wb) {
753
53.1k
  vpx_wb_write_literal(wb, cm->base_qindex, QINDEX_BITS);
754
53.1k
  write_delta_q(wb, cm->y_dc_delta_q);
755
53.1k
  write_delta_q(wb, cm->uv_dc_delta_q);
756
53.1k
  write_delta_q(wb, cm->uv_ac_delta_q);
757
53.1k
}
758
759
static void encode_segmentation(VP9_COMMON *cm, MACROBLOCKD *xd,
760
53.1k
                                struct vpx_write_bit_buffer *wb) {
761
53.1k
  int i, j;
762
763
53.1k
  const struct segmentation *seg = &cm->seg;
764
765
53.1k
  vpx_wb_write_bit(wb, seg->enabled);
766
53.1k
  if (!seg->enabled) return;
767
768
  // Segmentation map
769
0
  vpx_wb_write_bit(wb, seg->update_map);
770
0
  if (seg->update_map) {
771
    // Select the coding strategy (temporal or spatial)
772
0
    vp9_choose_segmap_coding_method(cm, xd);
773
    // Write out probabilities used to decode unpredicted  macro-block segments
774
0
    for (i = 0; i < SEG_TREE_PROBS; i++) {
775
0
      const int prob = seg->tree_probs[i];
776
0
      const int update = prob != MAX_PROB;
777
0
      vpx_wb_write_bit(wb, update);
778
0
      if (update) vpx_wb_write_literal(wb, prob, 8);
779
0
    }
780
781
    // Write out the chosen coding method.
782
0
    vpx_wb_write_bit(wb, seg->temporal_update);
783
0
    if (seg->temporal_update) {
784
0
      for (i = 0; i < PREDICTION_PROBS; i++) {
785
0
        const int prob = seg->pred_probs[i];
786
0
        const int update = prob != MAX_PROB;
787
0
        vpx_wb_write_bit(wb, update);
788
0
        if (update) vpx_wb_write_literal(wb, prob, 8);
789
0
      }
790
0
    }
791
0
  }
792
793
  // Segmentation data
794
0
  vpx_wb_write_bit(wb, seg->update_data);
795
0
  if (seg->update_data) {
796
0
    vpx_wb_write_bit(wb, seg->abs_delta);
797
798
0
    for (i = 0; i < MAX_SEGMENTS; i++) {
799
0
      for (j = 0; j < SEG_LVL_MAX; j++) {
800
0
        const int active = segfeature_active(seg, i, j);
801
0
        vpx_wb_write_bit(wb, active);
802
0
        if (active) {
803
0
          const int data = get_segdata(seg, i, j);
804
0
          const int data_max = vp9_seg_feature_data_max(j);
805
806
0
          if (vp9_is_segfeature_signed(j)) {
807
0
            encode_unsigned_max(wb, abs(data), data_max);
808
0
            vpx_wb_write_bit(wb, data < 0);
809
0
          } else {
810
0
            encode_unsigned_max(wb, data, data_max);
811
0
          }
812
0
        }
813
0
      }
814
0
    }
815
0
  }
816
0
}
817
818
static void encode_txfm_probs(VP9_COMMON *cm, vpx_writer *w,
819
45.8k
                              FRAME_COUNTS *counts) {
820
  // Mode
821
45.8k
  vpx_write_literal(w, VPXMIN(cm->tx_mode, ALLOW_32X32), 2);
822
45.8k
  if (cm->tx_mode >= ALLOW_32X32)
823
36.6k
    vpx_write_bit(w, cm->tx_mode == TX_MODE_SELECT);
824
825
  // Probabilities
826
45.8k
  if (cm->tx_mode == TX_MODE_SELECT) {
827
12.8k
    int i, j;
828
12.8k
    unsigned int ct_8x8p[TX_SIZES - 3][2];
829
12.8k
    unsigned int ct_16x16p[TX_SIZES - 2][2];
830
12.8k
    unsigned int ct_32x32p[TX_SIZES - 1][2];
831
832
38.6k
    for (i = 0; i < TX_SIZE_CONTEXTS; i++) {
833
25.7k
      tx_counts_to_branch_counts_8x8(counts->tx.p8x8[i], ct_8x8p);
834
51.5k
      for (j = 0; j < TX_SIZES - 3; j++)
835
25.7k
        vp9_cond_prob_diff_update(w, &cm->fc->tx_probs.p8x8[i][j], ct_8x8p[j]);
836
25.7k
    }
837
838
38.6k
    for (i = 0; i < TX_SIZE_CONTEXTS; i++) {
839
25.7k
      tx_counts_to_branch_counts_16x16(counts->tx.p16x16[i], ct_16x16p);
840
77.2k
      for (j = 0; j < TX_SIZES - 2; j++)
841
51.5k
        vp9_cond_prob_diff_update(w, &cm->fc->tx_probs.p16x16[i][j],
842
51.5k
                                  ct_16x16p[j]);
843
25.7k
    }
844
845
38.6k
    for (i = 0; i < TX_SIZE_CONTEXTS; i++) {
846
25.7k
      tx_counts_to_branch_counts_32x32(counts->tx.p32x32[i], ct_32x32p);
847
103k
      for (j = 0; j < TX_SIZES - 1; j++)
848
77.2k
        vp9_cond_prob_diff_update(w, &cm->fc->tx_probs.p32x32[i][j],
849
77.2k
                                  ct_32x32p[j]);
850
25.7k
    }
851
12.8k
  }
852
45.8k
}
853
854
static void write_interp_filter(INTERP_FILTER filter,
855
40.6k
                                struct vpx_write_bit_buffer *wb) {
856
40.6k
  const int filter_to_literal[] = { 1, 0, 2, 3 };
857
858
40.6k
  vpx_wb_write_bit(wb, filter == SWITCHABLE);
859
40.6k
  if (filter != SWITCHABLE)
860
28.9k
    vpx_wb_write_literal(wb, filter_to_literal[filter], 2);
861
40.6k
}
862
863
40.6k
static void fix_interp_filter(VP9_COMMON *cm, FRAME_COUNTS *counts) {
864
40.6k
  if (cm->interp_filter == SWITCHABLE) {
865
    // Check to see if only one of the filters is actually used
866
17.4k
    int count[SWITCHABLE_FILTERS];
867
17.4k
    int i, j, c = 0;
868
69.7k
    for (i = 0; i < SWITCHABLE_FILTERS; ++i) {
869
52.3k
      count[i] = 0;
870
261k
      for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; ++j)
871
209k
        count[i] += counts->switchable_interp[j][i];
872
52.3k
      c += (count[i] > 0);
873
52.3k
    }
874
17.4k
    if (c == 1) {
875
      // Only one filter is used. So set the filter at frame level
876
6.55k
      for (i = 0; i < SWITCHABLE_FILTERS; ++i) {
877
6.55k
        if (count[i]) {
878
5.67k
          cm->interp_filter = i;
879
5.67k
          break;
880
5.67k
        }
881
6.55k
      }
882
5.67k
    }
883
17.4k
  }
884
40.6k
}
885
886
static void write_tile_info(const VP9_COMMON *const cm,
887
53.1k
                            struct vpx_write_bit_buffer *wb) {
888
53.1k
  int min_log2_tile_cols, max_log2_tile_cols, ones;
889
53.1k
  vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols);
890
891
  // columns
892
53.1k
  ones = cm->log2_tile_cols - min_log2_tile_cols;
893
54.6k
  while (ones--) vpx_wb_write_bit(wb, 1);
894
895
53.1k
  if (cm->log2_tile_cols < max_log2_tile_cols) vpx_wb_write_bit(wb, 0);
896
897
  // rows
898
53.1k
  vpx_wb_write_bit(wb, cm->log2_tile_rows != 0);
899
53.1k
  if (cm->log2_tile_rows != 0) vpx_wb_write_bit(wb, cm->log2_tile_rows != 1);
900
53.1k
}
901
902
40.6k
int vp9_get_refresh_mask(VP9_COMP *cpi) {
903
40.6k
  if (cpi->ext_ratectrl.ready &&
904
40.6k
      (cpi->ext_ratectrl.funcs.rc_type & VPX_RC_GOP) != 0 &&
905
40.6k
      cpi->ext_ratectrl.funcs.get_gop_decision != NULL) {
906
0
    GF_GROUP *const gf_group = &cpi->twopass.gf_group;
907
0
    const int this_gf_index = gf_group->index;
908
0
    const int update_ref_idx = gf_group->update_ref_idx[this_gf_index];
909
910
0
    if (update_ref_idx != INVALID_IDX) {
911
0
      return (1 << update_ref_idx);
912
0
    } else {
913
0
      return 0;
914
0
    }
915
0
  }
916
40.6k
  if (vp9_preserve_existing_gf(cpi)) {
917
    // We have decided to preserve the previously existing golden frame as our
918
    // new ARF frame. However, in the short term we leave it in the GF slot and,
919
    // if we're updating the GF with the current decoded frame, we save it
920
    // instead to the ARF slot.
921
    // Later, in the function vp9_encoder.c:vp9_update_reference_frames() we
922
    // will swap gld_fb_idx and alt_fb_idx to achieve our objective. We do it
923
    // there so that it can be done outside of the recode loop.
924
    // Note: This is highly specific to the use of ARF as a forward reference,
925
    // and this needs to be generalized as other uses are implemented
926
    // (like RTC/temporal scalability).
927
0
    return (cpi->refresh_last_frame << cpi->lst_fb_idx) |
928
0
           (cpi->refresh_golden_frame << cpi->alt_fb_idx);
929
40.6k
  } else {
930
40.6k
    int arf_idx = cpi->alt_fb_idx;
931
40.6k
    GF_GROUP *const gf_group = &cpi->twopass.gf_group;
932
933
40.6k
    if (cpi->multi_layer_arf) {
934
0
      for (arf_idx = 0; arf_idx < REF_FRAMES; ++arf_idx) {
935
0
        if (arf_idx != cpi->alt_fb_idx && arf_idx != cpi->lst_fb_idx &&
936
0
            arf_idx != cpi->gld_fb_idx) {
937
0
          int idx;
938
0
          for (idx = 0; idx < gf_group->stack_size; ++idx)
939
0
            if (arf_idx == gf_group->arf_index_stack[idx]) break;
940
0
          if (idx == gf_group->stack_size) break;
941
0
        }
942
0
      }
943
0
    }
944
40.6k
    cpi->twopass.gf_group.top_arf_idx = arf_idx;
945
946
40.6k
    if (cpi->use_svc && cpi->svc.use_set_ref_frame_config &&
947
40.6k
        cpi->svc.temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS)
948
0
      return cpi->svc.update_buffer_slot[cpi->svc.spatial_layer_id];
949
40.6k
    return (cpi->refresh_last_frame << cpi->lst_fb_idx) |
950
40.6k
           (cpi->refresh_golden_frame << cpi->gld_fb_idx) |
951
40.6k
           (cpi->refresh_alt_ref_frame << arf_idx);
952
40.6k
  }
953
40.6k
}
954
955
0
static int encode_tile_worker(void *arg1, void *arg2) {
956
0
  VP9_COMP *cpi = (VP9_COMP *)arg1;
957
0
  VP9BitstreamWorkerData *data = (VP9BitstreamWorkerData *)arg2;
958
0
  MACROBLOCKD *const xd = &data->xd;
959
0
  const int tile_row = 0;
960
0
  vpx_start_encode(&data->bit_writer, data->dest, data->dest_size);
961
0
  write_modes(cpi, xd, &cpi->tile_data[data->tile_idx].tile_info,
962
0
              &data->bit_writer, tile_row, data->tile_idx,
963
0
              &data->max_mv_magnitude, data->interp_filter_selected);
964
0
  return vpx_stop_encode(&data->bit_writer) == 0;
965
0
}
966
967
3.99k
void vp9_bitstream_encode_tiles_buffer_dealloc(VP9_COMP *const cpi) {
968
3.99k
  if (cpi->vp9_bitstream_worker_data) {
969
0
    int i;
970
0
    for (i = 1; i < cpi->num_workers; ++i) {
971
0
      vpx_free(cpi->vp9_bitstream_worker_data[i].dest);
972
0
    }
973
0
    vpx_free(cpi->vp9_bitstream_worker_data);
974
0
    cpi->vp9_bitstream_worker_data = NULL;
975
0
  }
976
3.99k
}
977
978
0
static size_t encode_tiles_buffer_alloc_size(const VP9_COMP *cpi) {
979
0
  const VP9_COMMON *cm = &cpi->common;
980
0
  const int image_bps =
981
0
      (8 + 2 * (8 >> (cm->subsampling_x + cm->subsampling_y))) *
982
0
      (1 + (cm->bit_depth > 8));
983
0
  const int64_t size =
984
0
      (int64_t)cpi->oxcf.width * cpi->oxcf.height * image_bps / 8;
985
0
  return (size_t)size;
986
0
}
987
988
static void encode_tiles_buffer_alloc(VP9_COMP *const cpi,
989
0
                                      size_t buffer_alloc_size) {
990
0
  VP9_COMMON *const cm = &cpi->common;
991
0
  int i;
992
0
  const size_t worker_data_size =
993
0
      cpi->num_workers * sizeof(*cpi->vp9_bitstream_worker_data);
994
0
  CHECK_MEM_ERROR(&cm->error, cpi->vp9_bitstream_worker_data,
995
0
                  vpx_memalign(16, worker_data_size));
996
0
  memset(cpi->vp9_bitstream_worker_data, 0, worker_data_size);
997
0
  for (i = 1; i < cpi->num_workers; ++i) {
998
0
    CHECK_MEM_ERROR(&cm->error, cpi->vp9_bitstream_worker_data[i].dest,
999
0
                    vpx_malloc(buffer_alloc_size));
1000
0
    cpi->vp9_bitstream_worker_data[i].dest_size = buffer_alloc_size;
1001
0
  }
1002
0
}
1003
1004
static size_t encode_tiles_mt(VP9_COMP *cpi, uint8_t *data_ptr,
1005
0
                              size_t data_size) {
1006
0
  const VPxWorkerInterface *const winterface = vpx_get_worker_interface();
1007
0
  VP9_COMMON *const cm = &cpi->common;
1008
0
  const int tile_cols = 1 << cm->log2_tile_cols;
1009
0
  const int num_workers = cpi->num_workers;
1010
0
  size_t total_size = 0;
1011
0
  int tile_col = 0;
1012
0
  int error = 0;
1013
1014
0
  const size_t buffer_alloc_size = encode_tiles_buffer_alloc_size(cpi);
1015
0
  if (!cpi->vp9_bitstream_worker_data ||
1016
0
      cpi->vp9_bitstream_worker_data[1].dest_size != buffer_alloc_size) {
1017
0
    vp9_bitstream_encode_tiles_buffer_dealloc(cpi);
1018
0
    encode_tiles_buffer_alloc(cpi, buffer_alloc_size);
1019
0
  }
1020
1021
0
  while (tile_col < tile_cols) {
1022
0
    int i, j;
1023
0
    for (i = 0; i < num_workers && tile_col < tile_cols; ++i) {
1024
0
      VPxWorker *const worker = &cpi->workers[i];
1025
0
      VP9BitstreamWorkerData *const data = &cpi->vp9_bitstream_worker_data[i];
1026
1027
      // Populate the worker data.
1028
0
      data->xd = cpi->td.mb.e_mbd;
1029
0
      data->tile_idx = tile_col;
1030
0
      data->max_mv_magnitude = cpi->max_mv_magnitude;
1031
0
      memset(data->interp_filter_selected, 0,
1032
0
             sizeof(data->interp_filter_selected[0][0]) * SWITCHABLE);
1033
1034
      // First thread can directly write into the output buffer.
1035
0
      if (i == 0) {
1036
        // If this worker happens to be for the last tile, then do not offset it
1037
        // by 4 for the tile size.
1038
0
        const size_t offset = total_size + (tile_col == tile_cols - 1 ? 0 : 4);
1039
0
        if (data_size < offset) {
1040
0
          vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
1041
0
                             "encode_tiles_mt: output buffer full");
1042
0
        }
1043
0
        data->dest = data_ptr + offset;
1044
0
        data->dest_size = data_size - offset;
1045
0
      }
1046
0
      worker->data1 = cpi;
1047
0
      worker->data2 = data;
1048
0
      worker->hook = encode_tile_worker;
1049
0
      worker->had_error = 0;
1050
1051
0
      if (i < num_workers - 1) {
1052
0
        winterface->launch(worker);
1053
0
      } else {
1054
0
        winterface->execute(worker);
1055
0
      }
1056
0
      ++tile_col;
1057
0
    }
1058
0
    for (j = 0; j < i; ++j) {
1059
0
      VPxWorker *const worker = &cpi->workers[j];
1060
0
      VP9BitstreamWorkerData *const data =
1061
0
          (VP9BitstreamWorkerData *)worker->data2;
1062
0
      uint32_t tile_size;
1063
0
      int k;
1064
1065
0
      if (!winterface->sync(worker)) {
1066
0
        error = 1;
1067
0
        continue;
1068
0
      }
1069
1070
0
      tile_size = data->bit_writer.pos;
1071
1072
      // Aggregate per-thread bitstream stats.
1073
0
      cpi->max_mv_magnitude =
1074
0
          VPXMAX(cpi->max_mv_magnitude, data->max_mv_magnitude);
1075
0
      for (k = 0; k < SWITCHABLE; ++k) {
1076
0
        cpi->interp_filter_selected[0][k] += data->interp_filter_selected[0][k];
1077
0
      }
1078
1079
      // Prefix the size of the tile on all but the last.
1080
0
      if (tile_col != tile_cols || j < i - 1) {
1081
0
        if (data_size - total_size < 4) {
1082
0
          error = 1;
1083
0
          continue;
1084
0
        }
1085
0
        mem_put_be32(data_ptr + total_size, tile_size);
1086
0
        total_size += 4;
1087
0
      }
1088
0
      if (j > 0) {
1089
0
        if (data_size - total_size < tile_size) {
1090
0
          error = 1;
1091
0
          continue;
1092
0
        }
1093
0
        memcpy(data_ptr + total_size, data->dest, tile_size);
1094
0
      }
1095
0
      total_size += tile_size;
1096
0
    }
1097
0
    if (error) {
1098
0
      vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
1099
0
                         "encode_tiles_mt: output buffer full");
1100
0
    }
1101
0
  }
1102
0
  return total_size;
1103
0
}
1104
1105
53.1k
static size_t encode_tiles(VP9_COMP *cpi, uint8_t *data_ptr, size_t data_size) {
1106
53.1k
  VP9_COMMON *const cm = &cpi->common;
1107
53.1k
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
1108
53.1k
  vpx_writer residual_bc;
1109
53.1k
  int tile_row, tile_col;
1110
53.1k
  size_t total_size = 0;
1111
53.1k
  const int tile_cols = 1 << cm->log2_tile_cols;
1112
53.1k
  const int tile_rows = 1 << cm->log2_tile_rows;
1113
1114
53.1k
  memset(cm->above_seg_context, 0,
1115
53.1k
         sizeof(*cm->above_seg_context) * mi_cols_aligned_to_sb(cm->mi_cols));
1116
1117
  // Encoding tiles in parallel is done only for realtime mode now. In other
1118
  // modes the speed up is insignificant and requires further testing to ensure
1119
  // that it does not make the overall process worse in any case.
1120
53.1k
  if (cpi->oxcf.mode == REALTIME && cpi->num_workers > 1 && tile_rows == 1 &&
1121
53.1k
      tile_cols > 1) {
1122
0
    return encode_tiles_mt(cpi, data_ptr, data_size);
1123
0
  }
1124
1125
106k
  for (tile_row = 0; tile_row < tile_rows; tile_row++) {
1126
110k
    for (tile_col = 0; tile_col < tile_cols; tile_col++) {
1127
57.7k
      int tile_idx = tile_row * tile_cols + tile_col;
1128
1129
57.7k
      size_t offset;
1130
57.7k
      if (tile_col < tile_cols - 1 || tile_row < tile_rows - 1)
1131
4.58k
        offset = total_size + 4;
1132
53.1k
      else
1133
53.1k
        offset = total_size;
1134
57.7k
      if (data_size < offset) {
1135
0
        vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
1136
0
                           "encode_tiles: output buffer full");
1137
0
      }
1138
57.7k
      vpx_start_encode(&residual_bc, data_ptr + offset, data_size - offset);
1139
1140
57.7k
      write_modes(cpi, xd, &cpi->tile_data[tile_idx].tile_info, &residual_bc,
1141
57.7k
                  tile_row, tile_col, &cpi->max_mv_magnitude,
1142
57.7k
                  cpi->interp_filter_selected);
1143
1144
57.7k
      if (vpx_stop_encode(&residual_bc)) {
1145
81
        vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
1146
81
                           "encode_tiles: output buffer full");
1147
81
      }
1148
57.7k
      if (tile_col < tile_cols - 1 || tile_row < tile_rows - 1) {
1149
        // size of this tile
1150
4.58k
        mem_put_be32(data_ptr + total_size, residual_bc.pos);
1151
4.58k
        total_size += 4;
1152
4.58k
      }
1153
1154
57.7k
      total_size += residual_bc.pos;
1155
57.7k
    }
1156
53.1k
  }
1157
53.1k
  return total_size;
1158
53.1k
}
1159
1160
static void write_render_size(const VP9_COMMON *cm,
1161
53.1k
                              struct vpx_write_bit_buffer *wb) {
1162
53.1k
  const int scaling_active =
1163
53.1k
      cm->width != cm->render_width || cm->height != cm->render_height;
1164
53.1k
  vpx_wb_write_bit(wb, scaling_active);
1165
53.1k
  if (scaling_active) {
1166
0
    vpx_wb_write_literal(wb, cm->render_width - 1, 16);
1167
0
    vpx_wb_write_literal(wb, cm->render_height - 1, 16);
1168
0
  }
1169
53.1k
}
1170
1171
static void write_frame_size(const VP9_COMMON *cm,
1172
12.4k
                             struct vpx_write_bit_buffer *wb) {
1173
12.4k
  vpx_wb_write_literal(wb, cm->width - 1, 16);
1174
12.4k
  vpx_wb_write_literal(wb, cm->height - 1, 16);
1175
1176
12.4k
  write_render_size(cm, wb);
1177
12.4k
}
1178
1179
static void write_frame_size_with_refs(VP9_COMP *cpi,
1180
40.6k
                                       struct vpx_write_bit_buffer *wb) {
1181
40.6k
  VP9_COMMON *const cm = &cpi->common;
1182
40.6k
  int found = 0;
1183
1184
40.6k
  MV_REFERENCE_FRAME ref_frame;
1185
40.6k
  for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
1186
40.6k
    YV12_BUFFER_CONFIG *cfg = get_ref_frame_buffer(cpi, ref_frame);
1187
1188
    // Set "found" to 0 for temporal svc and for spatial svc key frame
1189
40.6k
    if (cpi->use_svc &&
1190
40.6k
        ((cpi->svc.number_temporal_layers > 1 &&
1191
0
          cpi->oxcf.rc_mode == VPX_CBR) ||
1192
0
         (cpi->svc.number_spatial_layers > 1 &&
1193
0
          cpi->svc.layer_context[cpi->svc.spatial_layer_id].is_key_frame))) {
1194
0
      found = 0;
1195
40.6k
    } else if (cfg != NULL) {
1196
40.6k
      found =
1197
40.6k
          cm->width == cfg->y_crop_width && cm->height == cfg->y_crop_height;
1198
40.6k
    }
1199
40.6k
    vpx_wb_write_bit(wb, found);
1200
40.6k
    if (found) {
1201
40.6k
      break;
1202
40.6k
    }
1203
40.6k
  }
1204
1205
40.6k
  if (!found) {
1206
0
    vpx_wb_write_literal(wb, cm->width - 1, 16);
1207
0
    vpx_wb_write_literal(wb, cm->height - 1, 16);
1208
0
  }
1209
1210
40.6k
  write_render_size(cm, wb);
1211
40.6k
}
1212
1213
12.4k
static void write_sync_code(struct vpx_write_bit_buffer *wb) {
1214
12.4k
  vpx_wb_write_literal(wb, VP9_SYNC_CODE_0, 8);
1215
12.4k
  vpx_wb_write_literal(wb, VP9_SYNC_CODE_1, 8);
1216
12.4k
  vpx_wb_write_literal(wb, VP9_SYNC_CODE_2, 8);
1217
12.4k
}
1218
1219
static void write_profile(BITSTREAM_PROFILE profile,
1220
53.1k
                          struct vpx_write_bit_buffer *wb) {
1221
53.1k
  switch (profile) {
1222
53.1k
    case PROFILE_0: vpx_wb_write_literal(wb, 0, 2); break;
1223
0
    case PROFILE_1: vpx_wb_write_literal(wb, 2, 2); break;
1224
0
    case PROFILE_2: vpx_wb_write_literal(wb, 1, 2); break;
1225
0
    default:
1226
0
      assert(profile == PROFILE_3);
1227
0
      vpx_wb_write_literal(wb, 6, 3);
1228
0
      break;
1229
53.1k
  }
1230
53.1k
}
1231
1232
static void write_bitdepth_colorspace_sampling(
1233
12.4k
    VP9_COMMON *const cm, struct vpx_write_bit_buffer *wb) {
1234
12.4k
  if (cm->profile >= PROFILE_2) {
1235
0
    assert(cm->bit_depth > VPX_BITS_8);
1236
0
    vpx_wb_write_bit(wb, cm->bit_depth == VPX_BITS_10 ? 0 : 1);
1237
0
  }
1238
12.4k
  vpx_wb_write_literal(wb, cm->color_space, 3);
1239
12.4k
  if (cm->color_space != VPX_CS_SRGB) {
1240
    // 0: [16, 235] (i.e. xvYCC), 1: [0, 255]
1241
12.4k
    vpx_wb_write_bit(wb, cm->color_range);
1242
12.4k
    if (cm->profile == PROFILE_1 || cm->profile == PROFILE_3) {
1243
0
      assert(cm->subsampling_x != 1 || cm->subsampling_y != 1);
1244
0
      vpx_wb_write_bit(wb, cm->subsampling_x);
1245
0
      vpx_wb_write_bit(wb, cm->subsampling_y);
1246
0
      vpx_wb_write_bit(wb, 0);  // unused
1247
12.4k
    } else {
1248
12.4k
      assert(cm->subsampling_x == 1 && cm->subsampling_y == 1);
1249
12.4k
    }
1250
12.4k
  } else {
1251
0
    assert(cm->profile == PROFILE_1 || cm->profile == PROFILE_3);
1252
0
    assert(cm->subsampling_x == 0 && cm->subsampling_y == 0);
1253
0
    vpx_wb_write_bit(wb, 0);  // unused
1254
0
  }
1255
12.4k
}
1256
1257
static void write_uncompressed_header(VP9_COMP *cpi,
1258
53.1k
                                      struct vpx_write_bit_buffer *wb) {
1259
53.1k
  VP9_COMMON *const cm = &cpi->common;
1260
53.1k
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
1261
1262
53.1k
  vpx_wb_write_literal(wb, VP9_FRAME_MARKER, 2);
1263
1264
53.1k
  write_profile(cm->profile, wb);
1265
1266
  // If to use show existing frame.
1267
53.1k
  vpx_wb_write_bit(wb, cm->show_existing_frame);
1268
53.1k
  if (cm->show_existing_frame) {
1269
0
    vpx_wb_write_literal(wb, cpi->alt_fb_idx, 3);
1270
0
    return;
1271
0
  }
1272
1273
53.1k
  vpx_wb_write_bit(wb, cm->frame_type);
1274
53.1k
  vpx_wb_write_bit(wb, cm->show_frame);
1275
53.1k
  vpx_wb_write_bit(wb, cm->error_resilient_mode);
1276
1277
53.1k
  if (cm->frame_type == KEY_FRAME) {
1278
12.4k
    write_sync_code(wb);
1279
12.4k
    write_bitdepth_colorspace_sampling(cm, wb);
1280
12.4k
    write_frame_size(cm, wb);
1281
40.6k
  } else {
1282
40.6k
    if (!cm->show_frame) vpx_wb_write_bit(wb, cm->intra_only);
1283
1284
40.6k
    if (!cm->error_resilient_mode)
1285
40.6k
      vpx_wb_write_literal(wb, cm->reset_frame_context, 2);
1286
1287
40.6k
    if (cm->intra_only) {
1288
0
      write_sync_code(wb);
1289
1290
      // Note for profile 0, 420 8bpp is assumed.
1291
0
      if (cm->profile > PROFILE_0) {
1292
0
        write_bitdepth_colorspace_sampling(cm, wb);
1293
0
      }
1294
1295
0
      vpx_wb_write_literal(wb, vp9_get_refresh_mask(cpi), REF_FRAMES);
1296
0
      write_frame_size(cm, wb);
1297
40.6k
    } else {
1298
40.6k
      MV_REFERENCE_FRAME ref_frame;
1299
40.6k
      vpx_wb_write_literal(wb, vp9_get_refresh_mask(cpi), REF_FRAMES);
1300
162k
      for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
1301
122k
        assert(get_ref_frame_map_idx(cpi, ref_frame) != INVALID_IDX);
1302
122k
        vpx_wb_write_literal(wb, get_ref_frame_map_idx(cpi, ref_frame),
1303
122k
                             REF_FRAMES_LOG2);
1304
122k
        vpx_wb_write_bit(wb, cm->ref_frame_sign_bias[ref_frame]);
1305
122k
      }
1306
1307
40.6k
      write_frame_size_with_refs(cpi, wb);
1308
1309
40.6k
      vpx_wb_write_bit(wb, cm->allow_high_precision_mv);
1310
1311
40.6k
      fix_interp_filter(cm, cpi->td.counts);
1312
40.6k
      write_interp_filter(cm->interp_filter, wb);
1313
40.6k
    }
1314
40.6k
  }
1315
1316
53.1k
  if (!cm->error_resilient_mode) {
1317
53.1k
    vpx_wb_write_bit(wb, cm->refresh_frame_context);
1318
53.1k
    vpx_wb_write_bit(wb, cm->frame_parallel_decoding_mode);
1319
53.1k
  }
1320
1321
53.1k
  vpx_wb_write_literal(wb, cm->frame_context_idx, FRAME_CONTEXTS_LOG2);
1322
1323
53.1k
  encode_loopfilter(&cm->lf, wb);
1324
53.1k
  encode_quantization(cm, wb);
1325
53.1k
  encode_segmentation(cm, xd, wb);
1326
1327
53.1k
  write_tile_info(cm, wb);
1328
53.1k
}
1329
1330
static size_t write_compressed_header(VP9_COMP *cpi, uint8_t *data,
1331
53.1k
                                      size_t data_size) {
1332
53.1k
  VP9_COMMON *const cm = &cpi->common;
1333
53.1k
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
1334
53.1k
  FRAME_CONTEXT *const fc = cm->fc;
1335
53.1k
  FRAME_COUNTS *counts = cpi->td.counts;
1336
53.1k
  vpx_writer header_bc;
1337
1338
53.1k
  vpx_start_encode(&header_bc, data, data_size);
1339
1340
53.1k
  if (xd->lossless)
1341
7.24k
    cm->tx_mode = ONLY_4X4;
1342
45.8k
  else
1343
45.8k
    encode_txfm_probs(cm, &header_bc, counts);
1344
1345
53.1k
  update_coef_probs(cpi, &header_bc);
1346
53.1k
  update_skip_probs(cm, &header_bc, counts);
1347
1348
53.1k
  if (!frame_is_intra_only(cm)) {
1349
40.6k
    int i;
1350
1351
325k
    for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
1352
284k
      prob_diff_update(vp9_inter_mode_tree, cm->fc->inter_mode_probs[i],
1353
284k
                       counts->inter_mode[i], INTER_MODES, &header_bc);
1354
1355
40.6k
    if (cm->interp_filter == SWITCHABLE)
1356
11.7k
      update_switchable_interp_probs(cm, &header_bc, counts);
1357
1358
203k
    for (i = 0; i < INTRA_INTER_CONTEXTS; i++)
1359
162k
      vp9_cond_prob_diff_update(&header_bc, &fc->intra_inter_prob[i],
1360
162k
                                counts->intra_inter[i]);
1361
1362
40.6k
    if (cpi->allow_comp_inter_inter) {
1363
0
      const int use_compound_pred = cm->reference_mode != SINGLE_REFERENCE;
1364
0
      const int use_hybrid_pred = cm->reference_mode == REFERENCE_MODE_SELECT;
1365
1366
0
      vpx_write_bit(&header_bc, use_compound_pred);
1367
0
      if (use_compound_pred) {
1368
0
        vpx_write_bit(&header_bc, use_hybrid_pred);
1369
0
        if (use_hybrid_pred)
1370
0
          for (i = 0; i < COMP_INTER_CONTEXTS; i++)
1371
0
            vp9_cond_prob_diff_update(&header_bc, &fc->comp_inter_prob[i],
1372
0
                                      counts->comp_inter[i]);
1373
0
      }
1374
0
    }
1375
1376
40.6k
    if (cm->reference_mode != COMPOUND_REFERENCE) {
1377
244k
      for (i = 0; i < REF_CONTEXTS; i++) {
1378
203k
        vp9_cond_prob_diff_update(&header_bc, &fc->single_ref_prob[i][0],
1379
203k
                                  counts->single_ref[i][0]);
1380
203k
        vp9_cond_prob_diff_update(&header_bc, &fc->single_ref_prob[i][1],
1381
203k
                                  counts->single_ref[i][1]);
1382
203k
      }
1383
40.6k
    }
1384
1385
40.6k
    if (cm->reference_mode != SINGLE_REFERENCE)
1386
0
      for (i = 0; i < REF_CONTEXTS; i++)
1387
0
        vp9_cond_prob_diff_update(&header_bc, &fc->comp_ref_prob[i],
1388
0
                                  counts->comp_ref[i]);
1389
1390
203k
    for (i = 0; i < BLOCK_SIZE_GROUPS; ++i)
1391
162k
      prob_diff_update(vp9_intra_mode_tree, cm->fc->y_mode_prob[i],
1392
162k
                       counts->y_mode[i], INTRA_MODES, &header_bc);
1393
1394
691k
    for (i = 0; i < PARTITION_CONTEXTS; ++i)
1395
650k
      prob_diff_update(vp9_partition_tree, fc->partition_prob[i],
1396
650k
                       counts->partition[i], PARTITION_TYPES, &header_bc);
1397
1398
40.6k
    vp9_write_nmv_probs(cm, cm->allow_high_precision_mv, &header_bc,
1399
40.6k
                        &counts->mv);
1400
40.6k
  }
1401
1402
53.1k
  if (vpx_stop_encode(&header_bc)) {
1403
0
    vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
1404
0
                       "write_compressed_header: output buffer full");
1405
0
  }
1406
1407
53.1k
  return header_bc.pos;
1408
53.1k
}
1409
1410
void vp9_pack_bitstream(VP9_COMP *cpi, uint8_t *dest, size_t dest_size,
1411
53.1k
                        size_t *size) {
1412
53.1k
  VP9_COMMON *const cm = &cpi->common;
1413
53.1k
  uint8_t *data = dest;
1414
53.1k
  size_t data_size = dest_size;
1415
53.1k
  size_t uncompressed_hdr_size, compressed_hdr_size;
1416
53.1k
  struct vpx_write_bit_buffer wb;
1417
53.1k
  struct vpx_write_bit_buffer saved_wb;
1418
1419
#if CONFIG_BITSTREAM_DEBUG
1420
  bitstream_queue_reset_write();
1421
#endif
1422
1423
53.1k
  vpx_wb_init(&wb, data, data_size);
1424
53.1k
  write_uncompressed_header(cpi, &wb);
1425
53.1k
  if (vpx_wb_has_error(&wb)) {
1426
0
    vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
1427
0
                       "vp9_pack_bitstream: output buffer full");
1428
0
  }
1429
1430
  // Skip the rest coding process if use show existing frame.
1431
53.1k
  if (cm->show_existing_frame) {
1432
0
    uncompressed_hdr_size = vpx_wb_bytes_written(&wb);
1433
0
    data += uncompressed_hdr_size;
1434
0
    *size = data - dest;
1435
0
    return;
1436
0
  }
1437
1438
53.1k
  saved_wb = wb;
1439
  // don't know in advance compressed header size
1440
53.1k
  vpx_wb_write_literal(&wb, 0, 16);
1441
53.1k
  if (vpx_wb_has_error(&wb)) {
1442
0
    vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
1443
0
                       "vp9_pack_bitstream: output buffer full");
1444
0
  }
1445
1446
53.1k
  uncompressed_hdr_size = vpx_wb_bytes_written(&wb);
1447
53.1k
  data += uncompressed_hdr_size;
1448
53.1k
  data_size -= uncompressed_hdr_size;
1449
1450
53.1k
  vpx_clear_system_state();
1451
1452
53.1k
  compressed_hdr_size = write_compressed_header(cpi, data, data_size);
1453
53.1k
  data += compressed_hdr_size;
1454
53.1k
  data_size -= compressed_hdr_size;
1455
53.1k
  if (compressed_hdr_size > UINT16_MAX) {
1456
0
    vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
1457
0
                       "compressed_hdr_size > 16 bits");
1458
0
  }
1459
53.1k
  vpx_wb_write_literal(&saved_wb, (int)compressed_hdr_size, 16);
1460
53.1k
  assert(!vpx_wb_has_error(&saved_wb));
1461
1462
53.1k
  data += encode_tiles(cpi, data, data_size);
1463
1464
53.1k
  *size = data - dest;
1465
53.1k
}