| Index: source/libvpx/vp9/encoder/vp9_bitstream.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_bitstream.c (revision 292608)
|
| +++ source/libvpx/vp9/encoder/vp9_bitstream.c (working copy)
|
| @@ -120,16 +120,28 @@
|
| }
|
|
|
| static void pack_mb_tokens(vp9_writer *w,
|
| - TOKENEXTRA **tp, const TOKENEXTRA *const stop) {
|
| + TOKENEXTRA **tp, const TOKENEXTRA *const stop,
|
| + vpx_bit_depth_t bit_depth) {
|
| TOKENEXTRA *p = *tp;
|
|
|
| while (p < stop && p->token != EOSB_TOKEN) {
|
| const int t = p->token;
|
| const struct vp9_token *const a = &vp9_coef_encodings[t];
|
| - const vp9_extra_bit *const b = &vp9_extra_bits[t];
|
| int i = 0;
|
| int v = a->value;
|
| int n = a->len;
|
| +#if CONFIG_VP9_HIGHBITDEPTH
|
| + const vp9_extra_bit *b;
|
| + if (bit_depth == VPX_BITS_12)
|
| + b = &vp9_extra_bits_high12[t];
|
| + else if (bit_depth == VPX_BITS_10)
|
| + b = &vp9_extra_bits_high10[t];
|
| + else
|
| + b = &vp9_extra_bits[t];
|
| +#else
|
| + const vp9_extra_bit *const b = &vp9_extra_bits[t];
|
| + (void) bit_depth;
|
| +#endif // CONFIG_VP9_HIGHBITDEPTH
|
|
|
| /* skip one or two nodes */
|
| if (p->skip_eob_node) {
|
| @@ -387,7 +399,7 @@
|
| }
|
|
|
| assert(*tok < tok_end);
|
| - pack_mb_tokens(w, tok, tok_end);
|
| + pack_mb_tokens(w, tok, tok_end, cm->bit_depth);
|
| }
|
|
|
| static void write_partition(const VP9_COMMON *const cm,
|
| @@ -419,7 +431,7 @@
|
| const VP9_COMMON *const cm = &cpi->common;
|
| MACROBLOCKD *const xd = &cpi->mb.e_mbd;
|
|
|
| - const int bsl = b_width_log2(bsize);
|
| + const int bsl = b_width_log2_lookup[bsize];
|
| const int bs = (1 << bsl) / 4;
|
| PARTITION_TYPE partition;
|
| BLOCK_SIZE subsize;
|
| @@ -923,26 +935,27 @@
|
| size_t total_size = 0;
|
| const int tile_cols = 1 << cm->log2_tile_cols;
|
| const int tile_rows = 1 << cm->log2_tile_rows;
|
| + TileInfo tile[4][1 << 6];
|
| + TOKENEXTRA *pre_tok = cpi->tok;
|
| + int tile_tok = 0;
|
|
|
| vpx_memset(cm->above_seg_context, 0, sizeof(*cm->above_seg_context) *
|
| mi_cols_aligned_to_sb(cm->mi_cols));
|
|
|
| - tok[0][0] = cpi->tok;
|
| - for (tile_row = 0; tile_row < tile_rows; tile_row++) {
|
| - if (tile_row)
|
| - tok[tile_row][0] = tok[tile_row - 1][tile_cols - 1] +
|
| - cpi->tok_count[tile_row - 1][tile_cols - 1];
|
| + for (tile_row = 0; tile_row < tile_rows; ++tile_row) {
|
| + for (tile_col = 0; tile_col < tile_cols; ++tile_col) {
|
| + vp9_tile_init(&tile[tile_row][tile_col], cm, tile_row, tile_col);
|
|
|
| - for (tile_col = 1; tile_col < tile_cols; tile_col++)
|
| - tok[tile_row][tile_col] = tok[tile_row][tile_col - 1] +
|
| - cpi->tok_count[tile_row][tile_col - 1];
|
| + tok[tile_row][tile_col] = pre_tok + tile_tok;
|
| + pre_tok = tok[tile_row][tile_col];
|
| + tile_tok = allocated_tokens(tile[tile_row][tile_col]);
|
| + }
|
| }
|
|
|
| for (tile_row = 0; tile_row < tile_rows; tile_row++) {
|
| for (tile_col = 0; tile_col < tile_cols; tile_col++) {
|
| - TileInfo tile;
|
| + const TileInfo * const ptile = &tile[tile_row][tile_col];
|
|
|
| - vp9_tile_init(&tile, cm, tile_row, tile_col);
|
| tok_end = tok[tile_row][tile_col] + cpi->tok_count[tile_row][tile_col];
|
|
|
| if (tile_col < tile_cols - 1 || tile_row < tile_rows - 1)
|
| @@ -950,7 +963,7 @@
|
| else
|
| vp9_start_encode(&residual_bc, data_ptr + total_size);
|
|
|
| - write_modes(cpi, &tile, &residual_bc, &tok[tile_row][tile_col], tok_end);
|
| + write_modes(cpi, ptile, &residual_bc, &tok[tile_row][tile_col], tok_end);
|
| assert(tok[tile_row][tile_col] == tok_end);
|
| vp9_stop_encode(&residual_bc);
|
| if (tile_col < tile_cols - 1 || tile_row < tile_rows - 1) {
|
| @@ -1001,7 +1014,11 @@
|
| ((cpi->svc.number_temporal_layers > 1 &&
|
| cpi->oxcf.rc_mode == VPX_CBR) ||
|
| (cpi->svc.number_spatial_layers > 1 &&
|
| - cpi->svc.layer_context[cpi->svc.spatial_layer_id].is_key_frame))) {
|
| + cpi->svc.layer_context[cpi->svc.spatial_layer_id].is_key_frame) ||
|
| + (is_two_pass_svc(cpi) &&
|
| + cpi->svc.encode_empty_frame_state == ENCODING &&
|
| + cpi->svc.layer_context[0].frames_from_key_frame <
|
| + cpi->svc.number_temporal_layers + 1))) {
|
| found = 0;
|
| }
|
| vp9_wb_write_bit(wb, found);
|
| @@ -1093,8 +1110,7 @@
|
| // will change to show_frame flag to 0, then add an one byte frame with
|
| // show_existing_frame flag which tells the decoder which frame we want to
|
| // show.
|
| - if (!cm->show_frame ||
|
| - (is_two_pass_svc(cpi) && cm->error_resilient_mode == 0))
|
| + if (!cm->show_frame)
|
| vp9_wb_write_bit(wb, cm->intra_only);
|
|
|
| if (!cm->error_resilient_mode)
|
|
|