Implement bitstream debug for daala_ec
Change-Id: I809eb52e8a632189c49b8ea0a2b5de760cc2a34c
diff --git a/aom_dsp/aom_dsp.mk b/aom_dsp/aom_dsp.mk
index a06326d..97cd15f 100644
--- a/aom_dsp/aom_dsp.mk
+++ b/aom_dsp/aom_dsp.mk
@@ -24,16 +24,24 @@
DSP_SRCS-$(CONFIG_ANS) += ans.c
ifeq ($(CONFIG_ENCODERS),yes)
-DSP_SRCS-$(CONFIG_ANS) += answriter.h
-DSP_SRCS-yes += bitwriter.h
+ifeq ($(CONFIG_ANS),yes)
+DSP_SRCS-yes += answriter.h
+DSP_SRCS-yes += buf_ans.h
+DSP_SRCS-yes += buf_ans.c
+else ifeq ($(CONFIG_DAALA_EC),yes)
+DSP_SRCS-yes += entenc.c
+DSP_SRCS-yes += entenc.h
+DSP_SRCS-yes += daalaboolwriter.c
+DSP_SRCS-yes += daalaboolwriter.h
+else
DSP_SRCS-yes += dkboolwriter.h
DSP_SRCS-yes += dkboolwriter.c
+endif
+DSP_SRCS-yes += bitwriter.h
DSP_SRCS-yes += bitwriter_buffer.c
DSP_SRCS-yes += bitwriter_buffer.h
DSP_SRCS-yes += psnr.c
DSP_SRCS-yes += psnr.h
-DSP_SRCS-$(CONFIG_ANS) += buf_ans.h
-DSP_SRCS-$(CONFIG_ANS) += buf_ans.c
DSP_SRCS-$(CONFIG_INTERNAL_STATS) += ssim.c
DSP_SRCS-$(CONFIG_INTERNAL_STATS) += ssim.h
DSP_SRCS-$(CONFIG_INTERNAL_STATS) += psnrhvs.c
@@ -41,10 +49,18 @@
endif
ifeq ($(CONFIG_DECODERS),yes)
-DSP_SRCS-$(CONFIG_ANS) += ansreader.h
-DSP_SRCS-yes += bitreader.h
+ifeq ($(CONFIG_ANS),yes)
+DSP_SRCS-yes += ansreader.h
+else ifeq ($(CONFIG_DAALA_EC),yes)
+DSP_SRCS-yes += entdec.c
+DSP_SRCS-yes += entdec.h
+DSP_SRCS-yes += daalaboolreader.c
+DSP_SRCS-yes += daalaboolreader.h
+else
DSP_SRCS-yes += dkboolreader.h
DSP_SRCS-yes += dkboolreader.c
+endif
+DSP_SRCS-yes += bitreader.h
DSP_SRCS-yes += bitreader_buffer.c
DSP_SRCS-yes += bitreader_buffer.h
endif
@@ -53,16 +69,8 @@
DSP_SRCS-yes += intrapred.c
ifeq ($(CONFIG_DAALA_EC),yes)
-DSP_SRCS-yes += entenc.c
-DSP_SRCS-yes += entenc.h
-DSP_SRCS-yes += entdec.c
-DSP_SRCS-yes += entdec.h
DSP_SRCS-yes += entcode.c
DSP_SRCS-yes += entcode.h
-DSP_SRCS-yes += daalaboolreader.c
-DSP_SRCS-yes += daalaboolreader.h
-DSP_SRCS-yes += daalaboolwriter.c
-DSP_SRCS-yes += daalaboolwriter.h
endif
DSP_SRCS-$(HAVE_SSE) += x86/intrapred_sse2.asm
diff --git a/aom_dsp/daalaboolreader.h b/aom_dsp/daalaboolreader.h
index 8977995..d3b6679 100644
--- a/aom_dsp/daalaboolreader.h
+++ b/aom_dsp/daalaboolreader.h
@@ -18,6 +18,10 @@
#if CONFIG_ACCOUNTING
#include "av1/common/accounting.h"
#endif
+#if CONFIG_BITSTREAM_DEBUG
+#include <stdio.h>
+#include "aom_util/debug_util.h"
+#endif // CONFIG_BITSTREAM_DEBUG
#ifdef __cplusplus
extern "C" {
@@ -40,12 +44,60 @@
uint32_t aom_daala_reader_tell_frac(const daala_reader *r);
static INLINE int aom_daala_read(daala_reader *r, int prob) {
- if (prob == 128) {
- return od_ec_dec_bits(&r->ec, 1, "aom_bits");
- } else {
- int p = ((prob << 15) + (256 - prob)) >> 8;
- return od_ec_decode_bool_q15(&r->ec, p);
+ int bit;
+ int p = ((prob << 15) + (256 - prob)) >> 8;
+#if CONFIG_BITSTREAM_DEBUG
+ {
+ const int queue_r = bitstream_queue_get_read();
+ const int frame_idx = bitstream_queue_get_frame_read();
+ if (frame_idx == 3 && queue_r == 72877) {
+ fprintf(stderr, "\n *** bitstream queue at frame_idx_r %d queue_r %d\n",
+ frame_idx, queue_r);
+ }
}
+#endif
+
+ if (prob == 128) {
+ bit = od_ec_dec_bits(&r->ec, 1, "aom_bits");
+ } else {
+ bit = od_ec_decode_bool_q15(&r->ec, p);
+ }
+
+#if CONFIG_BITSTREAM_DEBUG
+ {
+ int i;
+ int ref_bit, ref_nsymbs;
+ aom_cdf_prob ref_cdf[16];
+ const int queue_r = bitstream_queue_get_read();
+ const int frame_idx = bitstream_queue_get_frame_read();
+ bitstream_queue_pop(&ref_bit, ref_cdf, &ref_nsymbs);
+ if (ref_nsymbs != 2) {
+ fprintf(stderr,
+ "\n *** [bit] nsymbs error, frame_idx_r %d nsymbs %d ref_nsymbs "
+ "%d queue_r %d\n",
+ frame_idx, 2, ref_nsymbs, queue_r);
+ assert(0);
+ }
+ if ((ref_nsymbs != 2) || (ref_cdf[0] != (aom_cdf_prob)p) ||
+ (ref_cdf[1] != 32767)) {
+ fprintf(stderr,
+ "\n *** [bit] cdf error, frame_idx_r %d cdf {%d, %d} ref_cdf {%d",
+ frame_idx, p, 32767, ref_cdf[0]);
+ for (i = 1; i < ref_nsymbs; ++i) fprintf(stderr, ", %d", ref_cdf[i]);
+ fprintf(stderr, "} queue_r %d\n", queue_r);
+ assert(0);
+ }
+ if (bit != ref_bit) {
+ fprintf(stderr,
+ "\n *** [bit] symb error, frame_idx_r %d symb %d ref_symb %d "
+ "queue_r %d\n",
+ frame_idx, bit, ref_bit, queue_r);
+ assert(0);
+ }
+ }
+#endif
+
+ return bit;
}
static INLINE int aom_daala_read_bit(daala_reader *r) {
@@ -56,6 +108,52 @@
return r->ec.error;
}
+static INLINE int daala_read_symbol(daala_reader *r, const aom_cdf_prob *cdf,
+ int nsymbs) {
+ int symb = od_ec_decode_cdf_q15(&r->ec, cdf, nsymbs);
+
+#if CONFIG_BITSTREAM_DEBUG
+ {
+ int i;
+ int cdf_error = 0;
+ int ref_symb, ref_nsymbs;
+ aom_cdf_prob ref_cdf[16];
+ const int queue_r = bitstream_queue_get_read();
+ const int frame_idx = bitstream_queue_get_frame_read();
+ bitstream_queue_pop(&ref_symb, ref_cdf, &ref_nsymbs);
+ if (nsymbs != ref_nsymbs) {
+ fprintf(stderr,
+ "\n *** nsymbs error, frame_idx_r %d nsymbs %d ref_nsymbs %d "
+ "queue_r %d\n",
+ frame_idx, nsymbs, ref_nsymbs, queue_r);
+ cdf_error = 0;
+ assert(0);
+ } else {
+ for (i = 0; i < nsymbs; ++i)
+ if (cdf[i] != ref_cdf[i]) cdf_error = 1;
+ }
+ if (cdf_error) {
+ fprintf(stderr, "\n *** cdf error, frame_idx_r %d cdf {%d", frame_idx,
+ cdf[0]);
+ for (i = 1; i < nsymbs; ++i) fprintf(stderr, ", %d", cdf[i]);
+ fprintf(stderr, "} ref_cdf {%d", ref_cdf[0]);
+ for (i = 1; i < ref_nsymbs; ++i) fprintf(stderr, ", %d", ref_cdf[i]);
+ fprintf(stderr, "} queue_r %d\n", queue_r);
+ assert(0);
+ }
+ if (symb != ref_symb) {
+ fprintf(
+ stderr,
+ "\n *** symb error, frame_idx_r %d symb %d ref_symb %d queue_r %d\n",
+ frame_idx, symb, ref_symb, queue_r);
+ assert(0);
+ }
+ }
+#endif
+
+ return symb;
+}
+
static INLINE int daala_read_tree_bits(daala_reader *r,
const aom_tree_index *tree,
const aom_prob *probs) {
@@ -68,18 +166,13 @@
int nsymbs;
int symb;
nsymbs = tree_to_cdf(tree, probs, i, cdf, index, path, dist);
- symb = od_ec_decode_cdf_q15(&r->ec, cdf, nsymbs);
+ symb = daala_read_symbol(r, cdf, nsymbs);
OD_ASSERT(symb >= 0 && symb < nsymbs);
i = index[symb];
} while (i > 0);
return -i;
}
-static INLINE int daala_read_symbol(daala_reader *r, const aom_cdf_prob *cdf,
- int nsymbs) {
- return od_ec_decode_cdf_q15(&r->ec, cdf, nsymbs);
-}
-
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/aom_dsp/daalaboolwriter.h b/aom_dsp/daalaboolwriter.h
index 5183a90..5386c83 100644
--- a/aom_dsp/daalaboolwriter.h
+++ b/aom_dsp/daalaboolwriter.h
@@ -12,8 +12,13 @@
#ifndef AOM_DSP_DAALABOOLWRITER_H_
#define AOM_DSP_DAALABOOLWRITER_H_
+#include <stdio.h>
+
#include "aom_dsp/entenc.h"
#include "aom_dsp/prob.h"
+#if CONFIG_BITSTREAM_DEBUG
+#include "aom_util/debug_util.h"
+#endif // CONFIG_BITSTREAM_DEBUG
#ifdef __cplusplus
extern "C" {
@@ -31,14 +36,44 @@
void aom_daala_stop_encode(daala_writer *w);
static INLINE void aom_daala_write(daala_writer *w, int bit, int prob) {
+ int p = ((prob << 15) + (256 - prob)) >> 8;
+#if CONFIG_BITSTREAM_DEBUG
+ aom_cdf_prob cdf[2] = { (aom_cdf_prob)p, 32767 };
+ /*int queue_r = 0;
+ int frame_idx_r = 0;
+ int queue_w = bitstream_queue_get_write();
+ int frame_idx_w = bitstream_queue_get_frame_write();
+ if (frame_idx_w == frame_idx_r && queue_w == queue_r) {
+ fprintf(stderr, "\n *** bitstream queue at frame_idx_w %d queue_w %d\n",
+ frame_idx_w, queue_w);
+ }*/
+ bitstream_queue_push(bit, cdf, 2);
+#endif
+
if (prob == 128) {
od_ec_enc_bits(&w->ec, bit, 1);
} else {
- int p = ((prob << 15) + (256 - prob)) >> 8;
od_ec_encode_bool_q15(&w->ec, bit, p);
}
}
+static INLINE void daala_write_symbol(daala_writer *w, int symb,
+ const aom_cdf_prob *cdf, int nsymbs) {
+#if CONFIG_BITSTREAM_DEBUG
+ /*int queue_r = 0;
+ int frame_idx_r = 0;
+ int queue_w = bitstream_queue_get_write();
+ int frame_idx_w = bitstream_queue_get_frame_write();
+ if (frame_idx_w == frame_idx_r && queue_w == queue_r) {
+ fprintf(stderr, "\n *** bitstream queue at frame_idx_w %d queue_w %d\n",
+ frame_idx_w, queue_w);
+ }*/
+ bitstream_queue_push(symb, cdf, nsymbs);
+#endif
+
+ od_ec_encode_cdf_q15(&w->ec, symb, cdf, nsymbs);
+}
+
static INLINE void daala_write_tree_bits(daala_writer *w,
const aom_tree_index *tree,
const aom_prob *probs, int bits,
@@ -72,17 +107,12 @@
}
}
OD_ASSERT(symb != -1);
- od_ec_encode_cdf_q15(&w->ec, symb, cdf, nsymbs);
+ daala_write_symbol(w, symb, cdf, nsymbs);
bits &= (1 << (len - dist[symb])) - 1;
len -= dist[symb];
} while (len);
}
-static INLINE void daala_write_symbol(daala_writer *w, int symb,
- const aom_cdf_prob *cdf, int nsymbs) {
- od_ec_encode_cdf_q15(&w->ec, symb, cdf, nsymbs);
-}
-
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/aom_util/debug_util.c b/aom_util/debug_util.c
index 52389d0..d0589ca 100644
--- a/aom_util/debug_util.c
+++ b/aom_util/debug_util.c
@@ -11,10 +11,18 @@
#include <assert.h>
#include <stdio.h>
+#include <string.h>
#include "aom_util/debug_util.h"
+
#define QUEUE_MAX_SIZE 2000000
static int result_queue[QUEUE_MAX_SIZE];
+#if CONFIG_DAALA_EC
+static int nsymbs_queue[QUEUE_MAX_SIZE];
+static aom_cdf_prob cdf_queue[QUEUE_MAX_SIZE][16];
+#else
static int prob_queue[QUEUE_MAX_SIZE];
+#endif
+
static int queue_r = 0;
static int queue_w = 0;
static int queue_prev_w = -1;
@@ -45,6 +53,33 @@
int bitstream_queue_get_read(void) { return queue_r; }
+#if CONFIG_DAALA_EC
+void bitstream_queue_pop(int *result, aom_cdf_prob *cdf, int *nsymbs) {
+ if (!skip_r) {
+ if (queue_w == queue_r) {
+ printf("buffer underflow queue_w %d queue_r %d\n", queue_w, queue_r);
+ assert(0);
+ }
+ *result = result_queue[queue_r];
+ *nsymbs = nsymbs_queue[queue_r];
+ memcpy(cdf, cdf_queue[queue_r], *nsymbs * sizeof(*cdf));
+ queue_r = (queue_r + 1) % QUEUE_MAX_SIZE;
+ }
+}
+
+void bitstream_queue_push(int result, const aom_cdf_prob *cdf, int nsymbs) {
+ if (!skip_w) {
+ result_queue[queue_w] = result;
+ nsymbs_queue[queue_w] = nsymbs;
+ memcpy(cdf_queue[queue_w], cdf, nsymbs * sizeof(*cdf));
+ queue_w = (queue_w + 1) % QUEUE_MAX_SIZE;
+ if (queue_w == queue_r) {
+ printf("buffer overflow queue_w %d queue_r %d\n", queue_w, queue_r);
+ assert(0);
+ }
+ }
+}
+#else
void bitstream_queue_pop(int *result, int *prob) {
if (!skip_r) {
if (queue_w == queue_r) {
@@ -68,3 +103,4 @@
}
}
}
+#endif
diff --git a/aom_util/debug_util.h b/aom_util/debug_util.h
index c52e385..2ed56ea 100644
--- a/aom_util/debug_util.h
+++ b/aom_util/debug_util.h
@@ -13,6 +13,9 @@
#define AOM_UTIL_DEBUG_UTIL_H_
#include "./aom_config.h"
+#if CONFIG_DAALA_EC
+#include "aom_dsp/prob.h"
+#endif
#ifdef __cplusplus
extern "C" {
@@ -30,8 +33,13 @@
int bitstream_queue_get_read(void);
void bitstream_queue_record_write(void);
void bitstream_queue_reset_write(void);
+#if CONFIG_DAALA_EC
+void bitstream_queue_pop(int *result, aom_cdf_prob *cdf, int *nsymbs);
+void bitstream_queue_push(int result, const aom_cdf_prob *cdf, int nsymbs);
+#else
void bitstream_queue_pop(int *result, int *prob);
void bitstream_queue_push(int result, int prob);
+#endif
void bitstream_queue_set_skip_write(int skip);
void bitstream_queue_set_skip_read(int skip);
void bitstream_queue_set_frame_write(int frame_idx);