Commit 9e6a9607 authored by Luc Trudeau's avatar Luc Trudeau

Merging robust and nodesync in PVQ

The variables robust and nodesync appear to represent the same concept.
In order to simplify, they are merged into nodesync. This change does
not alter the bitstream as this value is hard coded to 1.

Change-Id: If9b2eb52f628e3f615b6270e26569815d5e79ae0
parent 9a834c03
......@@ -90,27 +90,27 @@ typedef struct {
/** Decodes a single vector of integers (eg, a partition within a
* coefficient block) encoded using PVQ
*
* @param [in,out] ec range encoder
* @param [in] q0 scale/quantizer
* @param [in] n number of coefficients in partition
* @param [in,out] model entropy decoder state
* @param [in,out] adapt adaptation context
* @param [in,out] exg ExQ16 expectation of decoded gain value
* @param [in,out] ext ExQ16 expectation of decoded theta value
* @param [in] ref 'reference' (prediction) vector
* @param [out] out decoded partition
* @param [out] noref boolean indicating absence of reference
* @param [in] beta per-band activity masking beta param
* @param [in] robust stream is robust to error in the reference
* @param [in,out] ec range encoder
* @param [in] q0 scale/quantizer
* @param [in] n number of coefficients in partition
* @param [in,out] model entropy decoder state
* @param [in,out] adapt adaptation context
* @param [in,out] exg ExQ16 expectation of decoded gain value
* @param [in,out] ext ExQ16 expectation of decoded theta value
* @param [in] ref 'reference' (prediction) vector
* @param [out] out decoded partition
* @param [out] noref boolean indicating absence of reference
* @param [in] beta per-band activity masking beta param
* @param [in] nodesync stream is robust to error in the reference
* @param [in] is_keyframe whether we're encoding a keyframe
* @param [in] pli plane index
* @param [in] cdf_ctx selects which cdf context to use
* @param [in,out] skip_rest whether to skip further bands in each direction
* @param [in] band index of the band being decoded
* @param [in] band index of the band being decoded
* @param [out] skip skip flag with range [0,1]
* @param [in] qm QM with magnitude compensation
* @param [in] qm_inv Inverse of QM with magnitude compensation
* @param [in] pli plane index
* @param [in] cdf_ctx selects which cdf context to use
* @param [in,out] skip_rest whether to skip further bands in each direction
* @param [in] band index of the band being decoded
* @param [in] band index of the band being decoded
* @param [out] skip skip flag with range [0,1]
* @param [in] qm QM with magnitude compensation
* @param [in] qm_inv Inverse of QM with magnitude compensation
*/
static void pvq_decode_partition(aom_reader *r,
int q0,
......@@ -123,7 +123,7 @@ static void pvq_decode_partition(aom_reader *r,
od_coeff *out,
int *noref,
od_val16 beta,
int robust,
int nodesync,
int is_keyframe,
int pli,
int cdf_ctx,
......@@ -143,7 +143,6 @@ static void pvq_decode_partition(aom_reader *r,
od_val32 gain_offset;
od_coeff y[MAXN];
int qg;
int nodesync;
int id;
int i;
od_val16 ref16[MAXN];
......@@ -151,9 +150,6 @@ static void pvq_decode_partition(aom_reader *r,
theta = 0;
gr = 0;
gain_offset = 0;
/* We always use the robust bitstream for keyframes to avoid having
PVQ and entropy decoding depending on each other, hurting parallelism. */
nodesync = robust || is_keyframe;
/* Skip is per-direction. For band=0, we can use any of the flags. */
if (skip_rest[(band + 2) % 3]) {
qg = 0;
......@@ -278,19 +274,19 @@ static void pvq_decode_partition(aom_reader *r,
/** Decodes a coefficient block (except for DC) encoded using PVQ
*
* @param [in,out] dec daala decoder context
* @param [in] ref 'reference' (prediction) vector
* @param [out] out decoded partition
* @param [in] q0 quantizer
* @param [in] pli plane index
* @param [in] bs log of the block size minus two
* @param [in] beta per-band activity masking beta param
* @param [in] robust stream is robust to error in the reference
* @param [in,out] dec daala decoder context
* @param [in] ref 'reference' (prediction) vector
* @param [out] out decoded partition
* @param [in] q0 quantizer
* @param [in] pli plane index
* @param [in] bs log of the block size minus two
* @param [in] beta per-band activity masking beta param
* @param [in] nodesync stream is robust to error in the reference
* @param [in] is_keyframe whether we're encoding a keyframe
* @param [out] flags bitmask of the per band skip and noref flags
* @param [out] flags bitmask of the per band skip and noref flags
* @param [in] ac_dc_coded skip flag for the block (range 0-3)
* @param [in] qm QM with magnitude compensation
* @param [in] qm_inv Inverse of QM with magnitude compensation
* @param [in] qm QM with magnitude compensation
* @param [in] qm_inv Inverse of QM with magnitude compensation
*/
void od_pvq_decode(daala_dec_ctx *dec,
od_coeff *ref,
......@@ -299,7 +295,7 @@ void od_pvq_decode(daala_dec_ctx *dec,
int pli,
int bs,
const od_val16 *beta,
int robust,
int nodesync,
int is_keyframe,
unsigned int *flags,
PVQ_SKIP_TYPE ac_dc_coded,
......@@ -360,7 +356,7 @@ void od_pvq_decode(daala_dec_ctx *dec,
pvq_decode_partition(dec->r, q, size[i],
model, &dec->state.adapt, exg + i, ext + i, ref + off[i], out + off[i],
&noref[i], beta[i], robust, is_keyframe, pli,
&noref[i], beta[i], nodesync, is_keyframe, pli,
(pli != 0)*OD_TXSIZES*PVQ_MAX_PARTITIONS + bs*PVQ_MAX_PARTITIONS + i,
&cfl, i == 0 && (i < nb_bands - 1), skip_rest, i, &skip[i],
qm + off[i], qm_inv + off[i]);
......
......@@ -28,7 +28,7 @@ int aom_laplace_decode_special_(aom_reader *r, unsigned decay,
int max ACCT_STR_PARAM);
void od_pvq_decode(daala_dec_ctx *dec, od_coeff *ref, od_coeff *out, int q0,
int pli, int bs, const od_val16 *beta, int robust, int is_keyframe,
int pli, int bs, const od_val16 *beta, int nodesync, int is_keyframe,
unsigned int *flags, PVQ_SKIP_TYPE ac_dc_coded, const int16_t *qm,
const int16_t *qm_inv);
......
......@@ -2343,7 +2343,7 @@ static void write_tokens_b(AV1_COMP *cpi, const TileInfo *const tile,
const int is_keyframe = 0;
const int encode_flip = 0;
const int flip = 0;
const int robust = 1;
const int nodesync = 1;
int i;
const int has_dc_skip = 1;
int *exg = &adapt->pvq.pvq_exg[plane][tx_size][0];
......@@ -2366,7 +2366,7 @@ static void write_tokens_b(AV1_COMP *cpi, const TileInfo *const tile,
pvq_encode_partition(
w, pvq->qg[i], pvq->theta[i], pvq->max_theta[i],
pvq->y + pvq->off[i], pvq->size[i], pvq->k[i], model, adapt,
exg + i, ext + i, robust || is_keyframe,
exg + i, ext + i, nodesync,
(plane != 0) * OD_TXSIZES * PVQ_MAX_PARTITIONS +
pvq->bs * PVQ_MAX_PARTITIONS + i,
is_keyframe, i == 0 && (i < pvq->nb_bands - 1),
......
......@@ -290,33 +290,33 @@ int items_compare(pvq_search_item *a, pvq_search_item *b) {
* possible gains and angles. See draft-valin-videocodec-pvq and
* http://jmvalin.ca/slides/pvq.pdf for more details.
*
* @param [out] out coefficients after quantization
* @param [in] x0 coefficients before quantization
* @param [in] r0 reference, aka predicted coefficients
* @param [in] n number of dimensions
* @param [in] q0 quantization step size
* @param [out] y pulse vector (i.e. selected PVQ codevector)
* @param [out] itheta angle between input and reference (-1 if noref)
* @param [out] max_theta maximum value of itheta that could have been
* @param [out] vk total number of pulses
* @param [in] beta per-band activity masking beta param
* @param [out] skip_diff distortion cost of skipping this block
* (accumulated)
* @param [in] robust make stream robust to error in the reference
* @param [out] out coefficients after quantization
* @param [in] x0 coefficients before quantization
* @param [in] r0 reference, aka predicted coefficients
* @param [in] n number of dimensions
* @param [in] q0 quantization step size
* @param [out] y pulse vector (i.e. selected PVQ codevector)
* @param [out] itheta angle between input and reference (-1 if noref)
* @param [out] max_theta maximum value of itheta that could have been
* @param [out] vk total number of pulses
* @param [in] beta per-band activity masking beta param
* @param [out] skip_diff distortion cost of skipping this block
* (accumulated)
* @param [in] nodesync make stream robust to error in the reference
* @param [in] is_keyframe whether we're encoding a keyframe
* @param [in] pli plane index
* @param [in] adapt probability adaptation context
* @param [in] qm QM with magnitude compensation
* @param [in] qm_inv Inverse of QM with magnitude compensation
* @param [in] pli plane index
* @param [in] adapt probability adaptation context
* @param [in] qm QM with magnitude compensation
* @param [in] qm_inv Inverse of QM with magnitude compensation
* @param [in] pvq_norm_lambda enc->pvq_norm_lambda for quantized RDO
* @param [in] speed Make search faster by making approximations
* @return gain index of the quatized gain
* @param [in] speed Make search faster by making approximations
* @return gain index of the quatized gain
*/
static int pvq_theta(od_coeff *out, const od_coeff *x0, const od_coeff *r0,
int n, int q0, od_coeff *y, int *itheta, int *max_theta, int *vk,
od_val16 beta, double *skip_diff, int robust, int is_keyframe, int pli,
const od_adapt_ctx *adapt, const int16_t *qm,
const int16_t *qm_inv, double pvq_norm_lambda, int speed) {
int n, int q0, od_coeff *y, int *itheta, int *max_theta, int *vk,
od_val16 beta, double *skip_diff, int nodesync, int is_keyframe, int pli,
const od_adapt_ctx *adapt, const int16_t *qm, const int16_t *qm_inv,
double pvq_norm_lambda, int speed) {
od_val32 g;
od_val32 gr;
od_coeff y_tmp[MAXN + 3];
......@@ -468,7 +468,7 @@ static int pvq_theta(od_coeff *out, const od_coeff *x0, const od_coeff *r0,
for (j = theta_lower; j <= theta_upper; j++) {
od_val32 qtheta;
qtheta = od_pvq_compute_theta(j, ts);
k = od_pvq_compute_k(qcg, j, qtheta, 0, n, beta, robust || is_keyframe);
k = od_pvq_compute_k(qcg, j, qtheta, 0, n, beta, nodesync);
items[idx].gain = i;
items[idx].theta = j;
items[idx].k = k;
......@@ -560,7 +560,7 @@ static int pvq_theta(od_coeff *out, const od_coeff *x0, const od_coeff *r0,
double cost;
od_val32 qcg;
qcg = OD_SHL(i, OD_CGAIN_SHIFT);
k = od_pvq_compute_k(qcg, -1, -1, 1, n, beta, robust || is_keyframe);
k = od_pvq_compute_k(qcg, -1, -1, 1, n, beta, nodesync);
/* Compute the minimal possible distortion by not taking the PVQ
cos_dist into account. */
dist = gain_weight*(qcg - cg)*(qcg - cg);
......@@ -755,7 +755,7 @@ void od_encode_quantizer_scaling(daala_enc_ctx *enc, int q_scaling,
* @param [in] pli plane index
* @param [in] bs log of the block size minus two
* @param [in] beta per-band activity masking beta param
* @param [in] robust make stream robust to error in the reference
* @param [in] nodesync make stream robust to error in the reference
* @param [in] is_keyframe whether we're encoding a keyframe
* @param [in] q_scaling scaling factor to apply to quantizer
* @param [in] bx x-coordinate of this block
......@@ -777,7 +777,7 @@ PVQ_SKIP_TYPE od_pvq_encode(daala_enc_ctx *enc,
int pli,
int bs,
const od_val16 *beta,
int robust,
int nodesync,
int is_keyframe,
int q_scaling,
int bx,
......@@ -877,7 +877,7 @@ PVQ_SKIP_TYPE od_pvq_encode(daala_enc_ctx *enc,
qg[i] = pvq_theta(out + off[i], in + off[i], ref + off[i], size[i],
q, y + off[i], &theta[i], &max_theta[i],
&k[i], beta[i], &skip_diff, robust, is_keyframe, pli, &enc->state.adapt,
&k[i], beta[i], &skip_diff, nodesync, is_keyframe, pli, &enc->state.adapt,
qm + off[i], qm_inv + off[i], enc->pvq_norm_lambda, speed);
}
od_encode_checkpoint(enc, &buf);
......@@ -964,7 +964,7 @@ PVQ_SKIP_TYPE od_pvq_encode(daala_enc_ctx *enc,
if (i == 0 || (!skip_rest && !(skip_dir & (1 << ((i - 1)%3))))) {
pvq_encode_partition(&enc->w, qg[i], theta[i], max_theta[i], y + off[i],
size[i], k[i], model, &enc->state.adapt, exg + i, ext + i,
robust || is_keyframe, (pli != 0)*OD_TXSIZES*PVQ_MAX_PARTITIONS
nodesync, (pli != 0)*OD_TXSIZES*PVQ_MAX_PARTITIONS
+ bs*PVQ_MAX_PARTITIONS + i, is_keyframe, i == 0 && (i < nb_bands - 1),
skip_rest, encode_flip, flip);
}
......
......@@ -50,7 +50,7 @@ void pvq_encode_partition(aom_writer *w,
PVQ_SKIP_TYPE od_pvq_encode(daala_enc_ctx *enc, od_coeff *ref,
const od_coeff *in, od_coeff *out, int q_dc, int q_ac, int pli, int bs,
const od_val16 *beta, int robust, int is_keyframe, int q_scaling, int bx,
const od_val16 *beta, int nodesync, int is_keyframe, int q_scaling, int bx,
int by, const int16_t *qm, const int16_t *qm_inv, int speed,
PVQ_INFO *pvq_info);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment