
This is a debug tool used to detect bitstream error. On encoder side, it pushes each bit and probability into a queue before the bit is written into the Arithmetic coder. On decoder side, whenever a bit is read out from the Arithmetic coder, it pops up the reference bit and probability from the queue as well. If the two results do not match, this debug tool will report an error. This tool can be used to pin down the bitstream error precisely. By combining gdb's backtrace method, we can detect which module causes the bitstream error. Change-Id: I133a4371fafdd48c488f2ca47f9e395676c401f2
60 lines
1.8 KiB
C
60 lines
1.8 KiB
C
/*
|
|
* Copyright (c) 2016 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.
|
|
*/
|
|
|
|
#include "vpx_util/debug_util.h"
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#if CONFIG_BITSTREAM_DEBUG
|
|
#define QUEUE_MAX_SIZE 2000000
|
|
static int result_queue[QUEUE_MAX_SIZE];
|
|
static int prob_queue[QUEUE_MAX_SIZE];
|
|
static int queue_r = 0;
|
|
static int queue_w = 0;
|
|
static int queue_prev_w = -1;
|
|
static int skip_r = 0;
|
|
static int skip_w = 0;
|
|
|
|
void bitstream_queue_set_skip_write(int skip) { skip_w = skip; }
|
|
|
|
void bitstream_queue_set_skip_read(int skip) { skip_r = skip; }
|
|
|
|
void bitstream_queue_record_write(void) { queue_prev_w = queue_w; }
|
|
|
|
void bitstream_queue_reset_write(void) { queue_w = queue_prev_w; }
|
|
|
|
int bitstream_queue_get_write(void) { return queue_w; }
|
|
|
|
int bitstream_queue_get_read(void) { return queue_r; }
|
|
|
|
void bitstream_queue_pop(int* result, int* prob) {
|
|
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];
|
|
*prob = prob_queue[queue_r];
|
|
queue_r = (queue_r + 1) % QUEUE_MAX_SIZE;
|
|
}
|
|
}
|
|
|
|
void bitstream_queue_push(int result, int prob) {
|
|
if (!skip_w) {
|
|
result_queue[queue_w] = result;
|
|
prob_queue[queue_w] = prob;
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
#endif // CONFIG_BITSTREAM_DEBUG
|