summaryrefslogtreecommitdiff
path: root/vp9/decoder/vp9_decodframe.c
diff options
context:
space:
mode:
authorDeb Mukherjee <debargha@google.com>2013-03-28 10:42:23 -0700
committerDeb Mukherjee <debargha@google.com>2013-04-22 09:27:59 -0700
commit70d9f116fd90f130ec7798b16c2083c9e3853050 (patch)
tree81ca57725ba81035969a4f15ae5ab372032f2b50 /vp9/decoder/vp9_decodframe.c
parentf82c61b8862f258bde802dd2a509a8718a718a6b (diff)
downloadlibvpx-70d9f116fd90f130ec7798b16c2083c9e3853050.tar
libvpx-70d9f116fd90f130ec7798b16c2083c9e3853050.tar.gz
libvpx-70d9f116fd90f130ec7798b16c2083c9e3853050.tar.bz2
libvpx-70d9f116fd90f130ec7798b16c2083c9e3853050.zip
End of orientation zero group experiment
Adds an experiment that codes an end-of-orientation symbol for every eligible zero encountered in scan order. This cleans out various other sub-experiments that were part of the origiinal patch, which will be later included if found useful. Results are slightly positive on all sets (0.1 - 0.2% range). Change-Id: I57765c605fefc7fb9d1b57f1b356843602abefaf
Diffstat (limited to 'vp9/decoder/vp9_decodframe.c')
-rw-r--r--vp9/decoder/vp9_decodframe.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c
index fdd40db46..8b3b3b10b 100644
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -995,6 +995,54 @@ static void init_frame(VP9D_COMP *pbi) {
xd->corrupted = 0;
}
+#if CONFIG_CODE_ZEROGROUP
+static void read_zpc_probs_common(VP9_COMMON *cm,
+ vp9_reader* bc,
+ TX_SIZE tx_size) {
+ int r, b, p, n;
+ vp9_zpc_probs *zpc_probs;
+ vp9_prob upd = ZPC_UPDATE_PROB;
+ if (!get_zpc_used(tx_size)) return;
+ if (!vp9_read_bit(bc)) return;
+
+ if (tx_size == TX_32X32) {
+ zpc_probs = &cm->fc.zpc_probs_32x32;
+ } else if (tx_size == TX_16X16) {
+ zpc_probs = &cm->fc.zpc_probs_16x16;
+ } else if (tx_size == TX_8X8) {
+ zpc_probs = &cm->fc.zpc_probs_8x8;
+ } else {
+ zpc_probs = &cm->fc.zpc_probs_4x4;
+ }
+ for (r = 0; r < REF_TYPES; ++r) {
+ for (b = 0; b < ZPC_BANDS; ++b) {
+ for (p = 0; p < ZPC_PTOKS; ++p) {
+ for (n = 0; n < ZPC_NODES; ++n) {
+ vp9_prob *q = &(*zpc_probs)[r][b][p][n];
+#if USE_ZPC_EXTRA == 0
+ if (n == 1) continue;
+#endif
+ if (vp9_read(bc, upd)) {
+ *q = read_prob_diff_update(bc, *q);
+ }
+ }
+ }
+ }
+ }
+}
+
+static void read_zpc_probs(VP9_COMMON *cm,
+ vp9_reader* bc) {
+ read_zpc_probs_common(cm, bc, TX_4X4);
+ if (cm->txfm_mode != ONLY_4X4)
+ read_zpc_probs_common(cm, bc, TX_8X8);
+ if (cm->txfm_mode > ALLOW_8X8)
+ read_zpc_probs_common(cm, bc, TX_16X16);
+ if (cm->txfm_mode > ALLOW_16X16)
+ read_zpc_probs_common(cm, bc, TX_32X32);
+}
+#endif // CONFIG_CODE_ZEROGROUP
+
#if CONFIG_CODE_NONZEROCOUNT
static void read_nzc_probs_common(VP9_COMMON *cm,
vp9_reader *rd,
@@ -1404,6 +1452,17 @@ static void update_frame_context(VP9D_COMP *pbi) {
vp9_zero(fc->nzc_counts_32x32);
vp9_zero(fc->nzc_pcat_counts);
#endif
+#if CONFIG_CODE_ZEROGROUP
+ vp9_copy(fc->pre_zpc_probs_4x4, fc->zpc_probs_4x4);
+ vp9_copy(fc->pre_zpc_probs_8x8, fc->zpc_probs_8x8);
+ vp9_copy(fc->pre_zpc_probs_16x16, fc->zpc_probs_16x16);
+ vp9_copy(fc->pre_zpc_probs_32x32, fc->zpc_probs_32x32);
+
+ vp9_zero(fc->zpc_counts_4x4);
+ vp9_zero(fc->zpc_counts_8x8);
+ vp9_zero(fc->zpc_counts_16x16);
+ vp9_zero(fc->zpc_counts_32x32);
+#endif
}
static void decode_tiles(VP9D_COMP *pbi,
@@ -1660,6 +1719,9 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
#if CONFIG_CODE_NONZEROCOUNT
read_nzc_probs(&pbi->common, &header_bc);
#endif
+#if CONFIG_CODE_ZEROGROUP
+ read_zpc_probs(&pbi->common, &header_bc);
+#endif
// Initialize xd pointers. Any reference should do for xd->pre, so use 0.
vpx_memcpy(&xd->pre, &pc->yv12_fb[pc->active_ref_idx[0]],
@@ -1712,6 +1774,9 @@ int vp9_decode_frame(VP9D_COMP *pbi, const uint8_t **p_data_end) {
#if CONFIG_CODE_NONZEROCOUNT
vp9_adapt_nzc_probs(pc);
#endif
+#if CONFIG_CODE_ZEROGROUP
+ vp9_adapt_zpc_probs(pc);
+#endif
}
if (pc->frame_type != KEY_FRAME) {