/* * Copyright (c) 2010 The WebM project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree.
*/
staticINLINEint read_coeff(vpx_reader *r, const vpx_prob *probs, int n,
BD_VALUE *value, int *count, unsignedint *range) { int i, val = 0; for (i = 0; i < n; ++i)
val = (val << 1) | read_bool(r, probs[i], value, count, range); return val;
}
staticint decode_coefs(const MACROBLOCKD *xd, PLANE_TYPE type,
tran_low_t *dqcoeff, TX_SIZE tx_size, const int16_t *dq, int ctx, const int16_t *scan, const int16_t *nb,
vpx_reader *r) {
FRAME_COUNTS *counts = xd->counts; constint max_eob = 16 << (tx_size << 1); const FRAME_CONTEXT *const fc = xd->fc; constint ref = is_inter_block(xd->mi[0]); int band, c = 0; const vpx_prob(*coef_probs)[COEFF_CONTEXTS][UNCONSTRAINED_NODES] =
fc->coef_probs[tx_size][type][ref]; const vpx_prob *prob; unsignedint(*coef_counts)[COEFF_CONTEXTS][UNCONSTRAINED_NODES + 1]; unsignedint(*eob_branch_count)[COEFF_CONTEXTS];
uint8_t token_cache[32 * 32]; const uint8_t *band_translate = get_band_translate(tx_size); constint dq_shift = (tx_size == TX_32X32); int v;
int16_t dqv = dq[0]; const uint8_t *const cat6_prob = #if CONFIG_VP9_HIGHBITDEPTH
(xd->bd == VPX_BITS_12) ? vp9_cat6_prob_high12
: (xd->bd == VPX_BITS_10) ? vp9_cat6_prob_high12 + 2
: #endif// CONFIG_VP9_HIGHBITDEPTH
vp9_cat6_prob; constint cat6_bits = #if CONFIG_VP9_HIGHBITDEPTH
(xd->bd == VPX_BITS_12) ? 18
: (xd->bd == VPX_BITS_10) ? 16
: #endif// CONFIG_VP9_HIGHBITDEPTH
14; // Keep value, range, and count as locals. The compiler produces better // results with the locals than using r directly.
BD_VALUE value = r->value; unsignedint range = r->range; int count = r->count;
if (counts) {
coef_counts = counts->coef[tx_size][type][ref];
eob_branch_count = counts->eob_branch[tx_size][type][ref];
}
while (c < max_eob) { int val = -1;
band = *band_translate++;
prob = coef_probs[band][ctx]; if (counts) ++eob_branch_count[band][ctx]; if (!read_bool(r, prob[EOB_CONTEXT_NODE], &value, &count, &range)) {
INCREMENT_COUNT(EOB_MODEL_TOKEN); break;
}
while (!read_bool(r, prob[ZERO_CONTEXT_NODE], &value, &count, &range)) {
INCREMENT_COUNT(ZERO_TOKEN);
dqv = dq[1];
token_cache[scan[c]] = 0;
++c; if (c >= max_eob) {
r->value = value;
r->range = range;
r->count = count; return c; // zero tokens at the end (no eob token)
}
ctx = get_coef_context(nb, token_cache, c);
band = *band_translate++;
prob = coef_probs[band][ctx];
}
staticvoid get_ctx_shift(MACROBLOCKD *xd, int *ctx_shift_a, int *ctx_shift_l, int x, int y, unsignedint tx_size_in_blocks) { if (xd->max_blocks_wide) { if (tx_size_in_blocks + x > xd->max_blocks_wide)
*ctx_shift_a = (tx_size_in_blocks - (xd->max_blocks_wide - x)) * 8;
} if (xd->max_blocks_high) { if (tx_size_in_blocks + y > xd->max_blocks_high)
*ctx_shift_l = (tx_size_in_blocks - (xd->max_blocks_high - y)) * 8;
}
}
int vp9_decode_block_tokens(TileWorkerData *twd, int plane, const ScanOrder *sc, int x, int y, TX_SIZE tx_size, int seg_id) {
vpx_reader *r = &twd->bit_reader;
MACROBLOCKD *xd = &twd->xd; struct macroblockd_plane *const pd = &xd->plane[plane]; const int16_t *const dequant = pd->seg_dequant[seg_id]; int eob;
ENTROPY_CONTEXT *a = pd->above_context + x;
ENTROPY_CONTEXT *l = pd->left_context + y; int ctx; int ctx_shift_a = 0; int ctx_shift_l = 0;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.