diff options
author | Yaowu Xu <yaowu@google.com> | 2013-02-13 10:26:58 -0800 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2013-02-13 10:26:58 -0800 |
commit | f01b08c96c108e1b73cd20db4319a5839101495c (patch) | |
tree | 1d14b6a4bfd827b28464b5f831bf18b4ab2ba1d2 /vp9/encoder | |
parent | d3de97794f37d10cff1c20fa9d71aa0ea9158543 (diff) | |
parent | 17db5d00be2f005f11428edf0fd23265d04d100f (diff) | |
download | libvpx-f01b08c96c108e1b73cd20db4319a5839101495c.tar libvpx-f01b08c96c108e1b73cd20db4319a5839101495c.tar.gz libvpx-f01b08c96c108e1b73cd20db4319a5839101495c.tar.bz2 libvpx-f01b08c96c108e1b73cd20db4319a5839101495c.zip |
Merge "enable bitstream lossless support" into experimental
Diffstat (limited to 'vp9/encoder')
-rw-r--r-- | vp9/encoder/vp9_bitstream.c | 8 | ||||
-rw-r--r-- | vp9/encoder/vp9_block.h | 12 | ||||
-rw-r--r-- | vp9/encoder/vp9_encodeintra.c | 10 | ||||
-rw-r--r-- | vp9/encoder/vp9_encodemb.c | 22 | ||||
-rw-r--r-- | vp9/encoder/vp9_onyx_if.c | 48 | ||||
-rw-r--r-- | vp9/encoder/vp9_quantize.c | 12 | ||||
-rw-r--r-- | vp9/encoder/vp9_rdopt.c | 20 |
7 files changed, 66 insertions, 66 deletions
diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c index c5f2a70c6..02dc4edfc 100644 --- a/vp9/encoder/vp9_bitstream.c +++ b/vp9/encoder/vp9_bitstream.c @@ -1668,7 +1668,13 @@ void vp9_pack_bitstream(VP9_COMP *cpi, unsigned char *dest, vp9_write_literal(&header_bc, pc->sb64_coded, 8); pc->sb32_coded = get_binary_prob(cpi->sb32_count[0], cpi->sb32_count[1]); vp9_write_literal(&header_bc, pc->sb32_coded, 8); - +#if CONFIG_LOSSLESS + vp9_write_bit(&header_bc, cpi->oxcf.lossless); + if (cpi->oxcf.lossless) { + pc->txfm_mode = ONLY_4X4; + } + else +#endif { if (pc->txfm_mode == TX_MODE_SELECT) { pc->prob_tx[0] = get_prob(cpi->txfm_count_32x32p[TX_4X4] + diff --git a/vp9/encoder/vp9_block.h b/vp9/encoder/vp9_block.h index 91d4c4530..d5110c810 100644 --- a/vp9/encoder/vp9_block.h +++ b/vp9/encoder/vp9_block.h @@ -169,14 +169,14 @@ typedef struct macroblock { PICK_MODE_CONTEXT sb32_context[4]; PICK_MODE_CONTEXT sb64_context; - void (*vp9_short_fdct4x4)(int16_t *input, int16_t *output, int pitch); - void (*vp9_short_fdct8x4)(int16_t *input, int16_t *output, int pitch); - void (*short_walsh4x4)(int16_t *input, int16_t *output, int pitch); + void (*fwd_txm4x4)(int16_t *input, int16_t *output, int pitch); + void (*fwd_txm8x4)(int16_t *input, int16_t *output, int pitch); + void (*fwd_2ndtxm4x4)(int16_t *input, int16_t *output, int pitch); + void (*fwd_txm8x8)(int16_t *input, int16_t *output, int pitch); + void (*fwd_txm16x16)(int16_t *input, int16_t *output, int pitch); + void (*fwd_2ndtxm2x2)(int16_t *input, int16_t *output, int pitch); void (*quantize_b_4x4)(BLOCK *b, BLOCKD *d); void (*quantize_b_4x4_pair)(BLOCK *b1, BLOCK *b2, BLOCKD *d0, BLOCKD *d1); - void (*vp9_short_fdct8x8)(int16_t *input, int16_t *output, int pitch); - void (*vp9_short_fdct16x16)(int16_t *input, int16_t *output, int pitch); - void (*short_fhaar2x2)(int16_t *input, int16_t *output, int pitch); void (*quantize_b_16x16)(BLOCK *b, BLOCKD *d); void (*quantize_b_8x8)(BLOCK *b, BLOCKD *d); void (*quantize_b_2x2)(BLOCK *b, BLOCKD *d); diff --git a/vp9/encoder/vp9_encodeintra.c b/vp9/encoder/vp9_encodeintra.c index 1dd30130a..a52763080 100644 --- a/vp9/encoder/vp9_encodeintra.c +++ b/vp9/encoder/vp9_encodeintra.c @@ -62,7 +62,7 @@ void vp9_encode_intra4x4block(MACROBLOCK *x, int ib) { vp9_ihtllm(b->dqcoeff, b->diff, 32, tx_type, 4, b->eob); #endif } else { - x->vp9_short_fdct4x4(be->src_diff, be->coeff, 32); + x->fwd_txm4x4(be->src_diff, be->coeff, 32); x->quantize_b_4x4(be, b) ; vp9_inverse_transform_b_4x4(&x->e_mbd, ib, 32); } @@ -165,7 +165,7 @@ void vp9_encode_intra8x8(MACROBLOCK *x, int ib) { tx_type, 8, xd->block[idx].eob); #endif } else { - x->vp9_short_fdct8x8(be->src_diff, (x->block + idx)->coeff, 32); + x->fwd_txm8x8(be->src_diff, (x->block + idx)->coeff, 32); x->quantize_b_8x8(x->block + idx, xd->block + idx); vp9_short_idct8x8(xd->block[idx].dqcoeff, xd->block[ib].diff, 32); } @@ -183,13 +183,13 @@ void vp9_encode_intra8x8(MACROBLOCK *x, int ib) { vp9_ihtllm(b->dqcoeff, b->diff, 32, tx_type, 4, b->eob); #endif } else if (!(i & 1) && get_tx_type_4x4(xd, b + 1) == DCT_DCT) { - x->vp9_short_fdct8x4(be->src_diff, be->coeff, 32); + x->fwd_txm8x4(be->src_diff, be->coeff, 32); x->quantize_b_4x4_pair(be, be + 1, b, b + 1); vp9_inverse_transform_b_4x4(xd, ib + iblock[i], 32); vp9_inverse_transform_b_4x4(xd, ib + iblock[i] + 1, 32); i++; } else { - x->vp9_short_fdct4x4(be->src_diff, be->coeff, 32); + x->fwd_txm4x4(be->src_diff, be->coeff, 32); x->quantize_b_4x4(be, b); vp9_inverse_transform_b_4x4(xd, ib + iblock[i], 32); } @@ -222,7 +222,7 @@ static void encode_intra_uv4x4(MACROBLOCK *x, int ib, vp9_subtract_b(be, b, 8); - x->vp9_short_fdct4x4(be->src_diff, be->coeff, 16); + x->fwd_txm4x4(be->src_diff, be->coeff, 16); x->quantize_b_4x4(be, b); vp9_inverse_transform_b_4x4(&x->e_mbd, ib, 16); diff --git a/vp9/encoder/vp9_encodemb.c b/vp9/encoder/vp9_encodemb.c index 52eabf129..fad55f776 100644 --- a/vp9/encoder/vp9_encodemb.c +++ b/vp9/encoder/vp9_encodemb.c @@ -188,11 +188,11 @@ void vp9_transform_mby_4x4(MACROBLOCK *x) { assert(has_2nd_order == 0); vp9_fht_c(b->src_diff, 32, b->coeff, tx_type, 4); } else if (!(i & 1) && get_tx_type_4x4(xd, &xd->block[i + 1]) == DCT_DCT) { - x->vp9_short_fdct8x4(&x->block[i].src_diff[0], + x->fwd_txm8x4(&x->block[i].src_diff[0], &x->block[i].coeff[0], 32); i++; } else { - x->vp9_short_fdct4x4(&x->block[i].src_diff[0], + x->fwd_txm4x4(&x->block[i].src_diff[0], &x->block[i].coeff[0], 32); } } @@ -202,7 +202,7 @@ void vp9_transform_mby_4x4(MACROBLOCK *x) { build_dcblock_4x4(x); // do 2nd order transform on the dc block - x->short_walsh4x4(&x->block[24].src_diff[0], + x->fwd_2ndtxm4x4(&x->block[24].src_diff[0], &x->block[24].coeff[0], 8); } else { vpx_memset(x->block[24].coeff, 0, 16 * sizeof(x->block[24].coeff[0])); @@ -213,7 +213,7 @@ void vp9_transform_mbuv_4x4(MACROBLOCK *x) { int i; for (i = 16; i < 24; i += 2) { - x->vp9_short_fdct8x4(&x->block[i].src_diff[0], + x->fwd_txm8x4(&x->block[i].src_diff[0], &x->block[i].coeff[0], 16); } } @@ -253,7 +253,7 @@ void vp9_transform_mby_8x8(MACROBLOCK *x) { assert(has_2nd_order == 0); vp9_fht_c(b->src_diff, 32, b->coeff, tx_type, 8); } else { - x->vp9_short_fdct8x8(&x->block[i].src_diff[0], + x->fwd_txm8x8(&x->block[i].src_diff[0], &x->block[i].coeff[0], 32); } } @@ -264,7 +264,7 @@ void vp9_transform_mby_8x8(MACROBLOCK *x) { assert(has_2nd_order == 0); vp9_fht_c(b->src_diff, 32, (b + 2)->coeff, tx_type, 8); } else { - x->vp9_short_fdct8x8(&x->block[i].src_diff[0], + x->fwd_txm8x8(&x->block[i].src_diff[0], &x->block[i + 2].coeff[0], 32); } } @@ -274,7 +274,7 @@ void vp9_transform_mby_8x8(MACROBLOCK *x) { build_dcblock_8x8(x); // do 2nd order transform on the dc block - x->short_fhaar2x2(&x->block[24].src_diff[0], + x->fwd_2ndtxm2x2(&x->block[24].src_diff[0], &x->block[24].coeff[0], 8); } else { vpx_memset(x->block[24].coeff, 0, 16 * sizeof(x->block[24].coeff[0])); @@ -285,7 +285,7 @@ void vp9_transform_mbuv_8x8(MACROBLOCK *x) { int i; for (i = 16; i < 24; i += 4) { - x->vp9_short_fdct8x8(&x->block[i].src_diff[0], + x->fwd_txm8x8(&x->block[i].src_diff[0], &x->block[i].coeff[0], 16); } } @@ -303,7 +303,7 @@ void vp9_transform_mby_16x16(MACROBLOCK *x) { if (tx_type != DCT_DCT) { vp9_fht_c(b->src_diff, 32, b->coeff, tx_type, 16); } else { - x->vp9_short_fdct16x16(&x->block[0].src_diff[0], + x->fwd_txm16x16(&x->block[0].src_diff[0], &x->block[0].coeff[0], 32); } } @@ -321,9 +321,9 @@ void vp9_transform_sby_32x32(MACROBLOCK *x) { void vp9_transform_sbuv_16x16(MACROBLOCK *x) { SUPERBLOCK * const x_sb = &x->sb_coeff_data; vp9_clear_system_state(); - x->vp9_short_fdct16x16(x_sb->src_diff + 1024, + x->fwd_txm16x16(x_sb->src_diff + 1024, x_sb->coeff + 1024, 32); - x->vp9_short_fdct16x16(x_sb->src_diff + 1280, + x->fwd_txm16x16(x_sb->src_diff + 1280, x_sb->coeff + 1280, 32); } diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c index 73b7b1f5f..b8993cf25 100644 --- a/vp9/encoder/vp9_onyx_if.c +++ b/vp9/encoder/vp9_onyx_if.c @@ -753,10 +753,10 @@ void vp9_set_speed_features(VP9_COMP *cpi) { sf->quarter_pixel_search = 1; sf->half_pixel_search = 1; sf->iterative_sub_pixel = 1; -#if CONFIG_LOSSLESS - sf->optimize_coefficients = 0; -#else sf->optimize_coefficients = 1; +#if CONFIG_LOSSLESS + if (cpi->oxcf.lossless) + sf->optimize_coefficients = 0; #endif sf->no_skip_block4x4_search = 1; sf->first_step = 0; @@ -841,20 +841,18 @@ void vp9_set_speed_features(VP9_COMP *cpi) { } } - cpi->mb.vp9_short_fdct16x16 = vp9_short_fdct16x16; - cpi->mb.vp9_short_fdct8x8 = vp9_short_fdct8x8; - cpi->mb.vp9_short_fdct8x4 = vp9_short_fdct8x4; - cpi->mb.vp9_short_fdct4x4 = vp9_short_fdct4x4; - cpi->mb.short_walsh4x4 = vp9_short_walsh4x4; - cpi->mb.short_fhaar2x2 = vp9_short_fhaar2x2; + cpi->mb.fwd_txm16x16 = vp9_short_fdct16x16; + cpi->mb.fwd_txm8x8 = vp9_short_fdct8x8; + cpi->mb.fwd_txm8x4 = vp9_short_fdct8x4; + cpi->mb.fwd_txm4x4 = vp9_short_fdct4x4; + cpi->mb.fwd_2ndtxm4x4 = vp9_short_walsh4x4; + cpi->mb.fwd_2ndtxm2x2 = vp9_short_fhaar2x2; #if CONFIG_LOSSLESS if (cpi->oxcf.lossless) { - cpi->mb.vp9_short_fdct8x4 = vp9_short_walsh8x4_x8; - cpi->mb.vp9_short_fdct4x4 = vp9_short_walsh4x4_x8; - cpi->mb.short_walsh4x4 = vp9_short_walsh4x4; - cpi->mb.short_fhaar2x2 = vp9_short_fhaar2x2; - cpi->mb.short_walsh4x4 = vp9_short_walsh4x4_lossless; + cpi->mb.fwd_txm8x4 = vp9_short_walsh8x4_x8; + cpi->mb.fwd_txm4x4 = vp9_short_walsh4x4_x8; + cpi->mb.fwd_2ndtxm4x4 = vp9_short_walsh4x4_lossless; } #endif @@ -1218,18 +1216,18 @@ void vp9_change_config(VP9_PTR ptr, VP9_CONFIG *oxcf) { cpi->oxcf.best_allowed_q = q_trans[oxcf->best_allowed_q]; cpi->oxcf.cq_level = q_trans[cpi->oxcf.cq_level]; - cpi->mb.e_mbd.inv_xform4x4_1_x8 = vp9_short_idct4x4llm_1; - cpi->mb.e_mbd.inv_xform4x4_x8 = vp9_short_idct4x4llm; - cpi->mb.e_mbd.inv_walsh4x4_1 = vp9_short_inv_walsh4x4_1; - cpi->mb.e_mbd.inv_walsh4x4_lossless = vp9_short_inv_walsh4x4; + cpi->mb.e_mbd.inv_txm4x4_1 = vp9_short_idct4x4llm_1; + cpi->mb.e_mbd.inv_txm4x4 = vp9_short_idct4x4llm; + cpi->mb.e_mbd.inv_2ndtxm4x4_1 = vp9_short_inv_walsh4x4_1; + cpi->mb.e_mbd.inv_2ndtxm4x4 = vp9_short_inv_walsh4x4; #if CONFIG_LOSSLESS cpi->oxcf.lossless = oxcf->lossless; if (cpi->oxcf.lossless) { - cpi->mb.e_mbd.inv_xform4x4_1_x8 = vp9_short_inv_walsh4x4_1_x8; - cpi->mb.e_mbd.inv_xform4x4_x8 = vp9_short_inv_walsh4x4_x8; - cpi->mb.e_mbd.inv_walsh4x4_1 = vp9_short_inv_walsh4x4_1_lossless; - cpi->mb.e_mbd.inv_walsh4x4_lossless = vp9_short_inv_walsh4x4_lossless; + cpi->mb.e_mbd.inv_txm4x4_1 = vp9_short_inv_walsh4x4_1_x8; + cpi->mb.e_mbd.inv_txm4x4 = vp9_short_inv_walsh4x4_x8; + cpi->mb.e_mbd.inv_2ndtxm4x4_1 = vp9_short_inv_walsh4x4_1_lossless; + cpi->mb.e_mbd.inv_2ndtxm4x4 = vp9_short_inv_walsh4x4_lossless; } #endif @@ -2632,10 +2630,10 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi, // For 2 Pass Only used where GF/ARF prediction quality // is above a threshold cpi->zbin_mode_boost = 0; -#if CONFIG_LOSSLESS - cpi->zbin_mode_boost_enabled = FALSE; -#else cpi->zbin_mode_boost_enabled = TRUE; +#if CONFIG_LOSSLESS + if (cpi->oxcf.lossless) + cpi->zbin_mode_boost_enabled = FALSE; #endif if (cpi->gfu_boost <= 400) { cpi->zbin_mode_boost_enabled = FALSE; diff --git a/vp9/encoder/vp9_quantize.c b/vp9/encoder/vp9_quantize.c index 066ca3a87..b2a83bc05 100644 --- a/vp9/encoder/vp9_quantize.c +++ b/vp9/encoder/vp9_quantize.c @@ -489,18 +489,14 @@ void vp9_init_quantizer(VP9_COMP *cpi) { static const int zbin_boost[16] = { 0, 0, 0, 8, 8, 8, 10, 12, 14, 16, 20, 24, 28, 32, 36, 40 }; - - int qrounding_factor = 48; - for (Q = 0; Q < QINDEX_RANGE; Q++) { int qzbin_factor = (vp9_dc_quant(Q, 0) < 148) ? 84 : 80; + int qrounding_factor = 48; #if CONFIG_LOSSLESS - if (cpi->oxcf.lossless) { - if (Q == 0) { - qzbin_factor = 64; - qrounding_factor = 64; - } + if (cpi->oxcf.lossless && Q == 0) { + qzbin_factor = 64; + qrounding_factor = 64; } #endif diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index a560e05ac..b7d566a67 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -1137,7 +1137,7 @@ static int64_t rd_pick_intra4x4block(VP9_COMP *cpi, MACROBLOCK *x, BLOCK *be, vp9_fht(be->src_diff, 32, be->coeff, tx_type, 4); vp9_ht_quantize_b_4x4(be, b, tx_type); } else { - x->vp9_short_fdct4x4(be->src_diff, be->coeff, 32); + x->fwd_txm4x4(be->src_diff, be->coeff, 32); x->quantize_b_4x4(be, b); } @@ -1173,7 +1173,7 @@ static int64_t rd_pick_intra4x4block(VP9_COMP *cpi, MACROBLOCK *x, BLOCK *be, vp9_ihtllm(best_dqcoeff, b->diff, 32, best_tx_type, 4, b->eob); #endif else - xd->inv_xform4x4_x8(best_dqcoeff, b->diff, 32); + xd->inv_txm4x4(best_dqcoeff, b->diff, 32); vp9_recon_b(best_predictor, b->diff, *(b->base_dst) + b->dst, b->dst_stride); @@ -1437,7 +1437,7 @@ static int64_t rd_pick_intra8x8block(VP9_COMP *cpi, MACROBLOCK *x, int ib, if (tx_type != DCT_DCT) vp9_fht(be->src_diff, 32, (x->block + idx)->coeff, tx_type, 8); else - x->vp9_short_fdct8x8(be->src_diff, (x->block + idx)->coeff, 32); + x->fwd_txm8x8(be->src_diff, (x->block + idx)->coeff, 32); x->quantize_b_8x8(x->block + idx, xd->block + idx); // compute quantization mse of 8x8 block @@ -1471,11 +1471,11 @@ static int64_t rd_pick_intra8x8block(VP9_COMP *cpi, MACROBLOCK *x, int ib, vp9_fht_c(be->src_diff, 32, be->coeff, tx_type, 4); vp9_ht_quantize_b_4x4(be, b, tx_type); } else if (!(i & 1) && get_tx_type_4x4(xd, b + 1) == DCT_DCT) { - x->vp9_short_fdct8x4(be->src_diff, be->coeff, 32); + x->fwd_txm8x4(be->src_diff, be->coeff, 32); x->quantize_b_4x4_pair(be, be + 1, b, b + 1); do_two = 1; } else { - x->vp9_short_fdct4x4(be->src_diff, be->coeff, 32); + x->fwd_txm4x4(be->src_diff, be->coeff, 32); x->quantize_b_4x4(be, b); } distortion += vp9_block_error_c(be->coeff, b->dqcoeff, 16 << do_two); @@ -2245,7 +2245,7 @@ static int64_t encode_inter_mb_segment(MACROBLOCK *x, if (xd->mode_info_context->mbmi.second_ref_frame > 0) vp9_build_2nd_inter_predictors_b(bd, 16, &xd->subpix); vp9_subtract_b(be, bd, 16); - x->vp9_short_fdct4x4(be->src_diff, be->coeff, 32); + x->fwd_txm4x4(be->src_diff, be->coeff, 32); x->quantize_b_4x4(be, bd); thisdistortion = vp9_block_error(be->coeff, bd->dqcoeff, 16); *distortion += thisdistortion; @@ -2297,7 +2297,7 @@ static int64_t encode_inter_mb_segment_8x8(MACROBLOCK *x, if (xd->mode_info_context->mbmi.txfm_size == TX_4X4) { if (otherrd) { - x->vp9_short_fdct8x8(be->src_diff, be2->coeff, 32); + x->fwd_txm8x8(be->src_diff, be2->coeff, 32); x->quantize_b_8x8(be2, bd2); thisdistortion = vp9_block_error_c(be2->coeff, bd2->dqcoeff, 64); otherdist += thisdistortion; @@ -2309,7 +2309,7 @@ static int64_t encode_inter_mb_segment_8x8(MACROBLOCK *x, for (j = 0; j < 4; j += 2) { bd = &xd->block[ib + iblock[j]]; be = &x->block[ib + iblock[j]]; - x->vp9_short_fdct8x4(be->src_diff, be->coeff, 32); + x->fwd_txm8x4(be->src_diff, be->coeff, 32); x->quantize_b_4x4_pair(be, be + 1, bd, bd + 1); thisdistortion = vp9_block_error_c(be->coeff, bd->dqcoeff, 32); *distortion += thisdistortion; @@ -2327,7 +2327,7 @@ static int64_t encode_inter_mb_segment_8x8(MACROBLOCK *x, for (j = 0; j < 4; j += 2) { BLOCKD *bd = &xd->block[ib + iblock[j]]; BLOCK *be = &x->block[ib + iblock[j]]; - x->vp9_short_fdct8x4(be->src_diff, be->coeff, 32); + x->fwd_txm8x4(be->src_diff, be->coeff, 32); x->quantize_b_4x4_pair(be, be + 1, bd, bd + 1); thisdistortion = vp9_block_error_c(be->coeff, bd->dqcoeff, 32); otherdist += thisdistortion; @@ -2341,7 +2341,7 @@ static int64_t encode_inter_mb_segment_8x8(MACROBLOCK *x, TX_4X4); } } - x->vp9_short_fdct8x8(be->src_diff, be2->coeff, 32); + x->fwd_txm8x8(be->src_diff, be2->coeff, 32); x->quantize_b_8x8(be2, bd2); thisdistortion = vp9_block_error_c(be2->coeff, bd2->dqcoeff, 64); *distortion += thisdistortion; |