Merge lossless experiment
authorYaowu Xu <yaowu@google.com>
Wed, 20 Feb 2013 15:27:35 +0000 (07:27 -0800)
committerYaowu Xu <yaowu@google.com>
Wed, 20 Feb 2013 15:54:28 +0000 (07:54 -0800)
Change-Id: I7b7b8d4fda3a23699e0c920d727f8c15d37d43aa

14 files changed:
configure
vp9/common/vp9_blockd.h
vp9/common/vp9_idctllm.c
vp9/common/vp9_rtcd_defs.sh
vp9/decoder/vp9_decodframe.c
vp9/decoder/vp9_dequantize.c
vp9/decoder/vp9_dequantize.h
vp9/decoder/vp9_idct_blk.c
vp9/encoder/vp9_bitstream.c
vp9/encoder/vp9_dct.c
vp9/encoder/vp9_encodeframe.c
vp9/encoder/vp9_onyx_if.c
vp9/vp9_cx_iface.c
vpxenc.c

index 8ea2523..f02213f 100755 (executable)
--- a/configure
+++ b/configure
@@ -238,7 +238,6 @@ HAVE_LIST="
 "
 EXPERIMENT_LIST="
     csm
-    lossless
     new_mvref
     implicit_segmentation
     newbintramodes
index 5854818..1849c17 100644 (file)
@@ -139,9 +139,7 @@ typedef enum {
 
 #define VP9_MVREFS (1 + SPLITMV - NEARESTMV)
 
-#if CONFIG_LOSSLESS
 #define WHT_UPSCALE_FACTOR 2
-#endif
 
 typedef enum {
   B_DC_PRED,          /* average of above and left pixels */
@@ -367,9 +365,7 @@ typedef struct macroblockd {
   unsigned int frames_since_golden;
   unsigned int frames_till_alt_ref_frame;
 
-#if CONFIG_LOSSLESS
   int lossless;
-#endif
   /* Inverse transform function pointers. */
   void (*inv_txm4x4_1)(int16_t *input, int16_t *output, int pitch);
   void (*inv_txm4x4)(int16_t *input, int16_t *output, int pitch);
@@ -492,10 +488,8 @@ static TX_TYPE get_tx_type_4x4(const MACROBLOCKD *xd, const BLOCKD *b) {
   int ib = (int)(b - xd->block);
   if (ib >= 16)
     return tx_type;
-#if CONFIG_LOSSLESS
   if (xd->lossless)
     return DCT_DCT;
-#endif
   // TODO(rbultje, debargha): Explore ADST usage for superblocks
   if (xd->mode_info_context->mbmi.sb_type)
     return tx_type;
index 4ac18ae..8eb9801 100644 (file)
@@ -298,7 +298,6 @@ void vp9_ihtllm_c(const int16_t *input, int16_t *output, int pitch,
   }
 }
 
-#if CONFIG_LOSSLESS
 void vp9_short_inv_walsh4x4_x8_c(int16_t *input, int16_t *output, int pitch) {
   int i;
   int a1, b1, c1, d1;
@@ -378,7 +377,6 @@ void vp9_dc_only_inv_walsh_add_c(int input_dc, uint8_t *pred_ptr,
     pred_ptr += pitch;
   }
 }
-#endif
 
 void idct4_1d(int16_t *input, int16_t *output) {
   int16_t step[4];
index 71e9254..066e22d 100644 (file)
@@ -308,14 +308,12 @@ specialize vp9_ihtllm
 prototype void vp9_dc_only_idct_add "int input_dc, uint8_t *pred_ptr, uint8_t *dst_ptr, int pitch, int stride"
 specialize vp9_dc_only_idct_add
 
-if [ "$CONFIG_LOSSLESS" = "yes" ]; then
 prototype void vp9_short_inv_walsh4x4_1_x8 "int16_t *input, int16_t *output, int pitch"
 specialize vp9_short_inv_walsh4x4_1_x8
 prototype void vp9_short_inv_walsh4x4_x8 "int16_t *input, int16_t *output, int pitch"
 specialize vp9_short_inv_walsh4x4_x8
 prototype void vp9_dc_only_inv_walsh_add "int input_dc, uint8_t *pred_ptr, uint8_t *dst_ptr, int pitch, int stride"
 specialize vp9_dc_only_inv_walsh_add
-fi
 
 prototype unsigned int vp9_sad32x3 "const uint8_t *src_ptr, int  src_stride, const uint8_t *ref_ptr, int ref_stride, int max_sad"
 specialize vp9_sad32x3
index e619c3e..4833322 100644 (file)
@@ -128,7 +128,6 @@ static void mb_init_dequantizer(VP9D_COMP *pbi, MACROBLOCKD *xd) {
   xd->dc_only_itxm_add    = vp9_dc_only_idct_add_c;
   xd->itxm_add_y_block    = vp9_dequant_idct_add_y_block;
   xd->itxm_add_uv_block   = vp9_dequant_idct_add_uv_block;
-#if CONFIG_LOSSLESS
   if (xd->lossless) {
     assert(QIndex == 0);
     xd->inv_txm4x4_1        = vp9_short_inv_walsh4x4_1_x8;
@@ -138,7 +137,6 @@ static void mb_init_dequantizer(VP9D_COMP *pbi, MACROBLOCKD *xd) {
     xd->itxm_add_y_block    = vp9_dequant_idct_add_y_block_lossless_c;
     xd->itxm_add_uv_block   = vp9_dequant_idct_add_uv_block_lossless_c;
   }
-#endif
 
   for (i = 16; i < 24; i++) {
     xd->block[i].dequant = pc->UVdequant[QIndex];
@@ -1418,14 +1416,10 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) {
 
   pc->sb64_coded = vp9_read_literal(&header_bc, 8);
   pc->sb32_coded = vp9_read_literal(&header_bc, 8);
-#if CONFIG_LOSSLESS
   xd->lossless = vp9_read_bit(&header_bc);
   if (xd->lossless) {
     pc->txfm_mode = ONLY_4X4;
-  }
-  else
-#endif
-  {
+  } else {
     /* Read the loop filter level and type */
     pc->txfm_mode = vp9_read_literal(&header_bc, 2);
     if (pc->txfm_mode == 3)
index 3761475..3807a8c 100644 (file)
@@ -145,7 +145,6 @@ void vp9_dequant_dc_idct_add_c(int16_t *input, const int16_t *dq, uint8_t *pred,
   add_residual(diff_ptr, pred, pitch, dest, stride, 4, 4);
 }
 
-#if CONFIG_LOSSLESS
 void vp9_dequant_idct_add_lossless_c(int16_t *input, const int16_t *dq,
                                      uint8_t *pred, uint8_t *dest,
                                      int pitch, int stride) {
@@ -183,7 +182,6 @@ void vp9_dequant_dc_idct_add_lossless_c(int16_t *input, const int16_t *dq,
 
   add_residual(diff_ptr, pred, pitch, dest, stride, 4, 4);
 }
-#endif
 
 void vp9_dequant_idct_add_8x8_c(int16_t *input, const int16_t *dq,
                                 uint8_t *pred, uint8_t *dest, int pitch,
index b7efb44..0207e79 100644 (file)
@@ -13,7 +13,7 @@
 #define VP9_DECODER_VP9_DEQUANTIZE_H_
 #include "vp9/common/vp9_blockd.h"
 
-#if CONFIG_LOSSLESS
+
 extern void vp9_dequant_idct_add_lossless_c(int16_t *input, const int16_t *dq,
                                             unsigned char *pred,
                                             unsigned char *output,
@@ -40,7 +40,6 @@ extern void vp9_dequant_idct_add_uv_block_lossless_c(int16_t *q, const int16_t *
                                                      unsigned char *dst_v,
                                                      int stride,
                                                      uint16_t *eobs);
-#endif
 
 void vp9_ht_dequant_idct_add_c(TX_TYPE tx_type, int16_t *input, const int16_t *dq,
                                     unsigned char *pred, unsigned char *dest,
index b2caf45..85bbdc6 100644 (file)
@@ -10,9 +10,7 @@
 
 #include "vp9_rtcd.h"
 #include "vp9/common/vp9_blockd.h"
-#if CONFIG_LOSSLESS
 #include "vp9/decoder/vp9_dequantize.h"
-#endif
 
 void vp9_dequant_idct_add_y_block_4x4_inplace_c(int16_t *q,
                                                 const int16_t *dq,
@@ -214,7 +212,7 @@ void vp9_dequant_idct_add_uv_block_8x8_inplace_c(int16_t *q, const int16_t *dq,
                              xd->eobs[20]);
 }
 
-#if CONFIG_LOSSLESS
+
 void vp9_dequant_idct_add_y_block_lossless_c(int16_t *q, const int16_t *dq,
                                              uint8_t *pre,
                                              uint8_t *dst,
@@ -284,5 +282,4 @@ void vp9_dequant_idct_add_uv_block_lossless_c(int16_t *q, const int16_t *dq,
     dstv += 4 * stride - 8;
   }
 }
-#endif
 
index 8d6cfe9..a9d8aee 100644 (file)
@@ -1672,14 +1672,11 @@ 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->mb.e_mbd.lossless);
   if (cpi->mb.e_mbd.lossless) {
     pc->txfm_mode = ONLY_4X4;
-  }
-  else
-#endif
-  {
+  } else {
     if (pc->txfm_mode == TX_MODE_SELECT) {
       pc->prob_tx[0] = get_prob(cpi->txfm_count_32x32p[TX_4X4] +
                                 cpi->txfm_count_16x16p[TX_4X4] +
index 97794e3..b964863 100644 (file)
@@ -896,7 +896,6 @@ void vp9_short_fdct8x8_c(int16_t *input, int16_t *output, int pitch) {
 }
 #endif
 
-#if CONFIG_LOSSLESS
 void vp9_short_walsh4x4_x8_c(short *input, short *output, int pitch) {
   int i;
   int a1, b1, c1, d1;
@@ -941,7 +940,6 @@ void vp9_short_walsh8x4_x8_c(short *input, short *output, int pitch) {
   vp9_short_walsh4x4_x8_c(input,   output,    pitch);
   vp9_short_walsh4x4_x8_c(input + 4, output + 16, pitch);
 }
-#endif
 
 #define TEST_INT_16x16_DCT 1
 #if !TEST_INT_16x16_DCT
index 4cf1022..bedd10f 100644 (file)
@@ -1225,7 +1225,7 @@ static void init_encode_frame_mb_context(VP9_COMP *cpi) {
   if (cm->full_pixel)
     xd->fullpixel_mask = 0xfffffff8;
 }
-#if CONFIG_LOSSLESS
+
 static void switch_lossless_mode(VP9_COMP *cpi, int lossless) {
   if (lossless) {
     cpi->mb.fwd_txm8x4            = vp9_short_walsh8x4_x8;
@@ -1243,7 +1243,7 @@ static void switch_lossless_mode(VP9_COMP *cpi, int lossless) {
     cpi->mb.e_mbd.inv_txm4x4      = vp9_short_idct4x4llm;
   }
 }
-#endif
+
 
 static void encode_frame_internal(VP9_COMP *cpi) {
   int mb_row;
@@ -1301,14 +1301,14 @@ static void encode_frame_internal(VP9_COMP *cpi) {
   vp9_zero(cpi->mb_mv_ref_count);
 #endif
 
-#if CONFIG_LOSSLESS
+
   // force lossless mode when Q0 is selected
   cpi->mb.e_mbd.lossless = (cm->base_qindex == 0 &&
                             cm->y1dc_delta_q == 0 &&
                             cm->uvdc_delta_q == 0 &&
                             cm->uvac_delta_q == 0);
   switch_lossless_mode(cpi, cpi->mb.e_mbd.lossless);
-#endif
+
   vp9_frame_init_quantizer(cpi);
 
   vp9_initialize_rd_consts(cpi, cm->base_qindex + cm->y1dc_delta_q);
@@ -1561,13 +1561,12 @@ void vp9_encode_frame(VP9_COMP *cpi) {
       pred_type = HYBRID_PREDICTION;
 
     /* transform size (4x4, 8x8, 16x16 or select-per-mb) selection */
-#if CONFIG_LOSSLESS
+
     cpi->mb.e_mbd.lossless = 0;
     if (cpi->oxcf.lossless) {
       txfm_type = ONLY_4X4;
       cpi->mb.e_mbd.lossless = 1;
     } else
-#endif
     /* FIXME (rbultje)
      * this is a hack (no really), basically to work around the complete
      * nonsense coefficient cost prediction for keyframes. The probabilities
index 2528122..2950fc2 100644 (file)
@@ -753,12 +753,12 @@ void vp9_set_speed_features(VP9_COMP *cpi) {
   sf->quarter_pixel_search = 1;
   sf->half_pixel_search = 1;
   sf->iterative_sub_pixel = 1;
-  sf->optimize_coefficients = 1;
-#if CONFIG_LOSSLESS
+  sf->no_skip_block4x4_search = 1;
   if (cpi->oxcf.lossless)
     sf->optimize_coefficients = 0;
-#endif
-  sf->no_skip_block4x4_search = 1;
+  else
+    sf->optimize_coefficients = 1;
+
   sf->first_step = 0;
   sf->max_step_search_steps = MAX_MVSEARCH_STEPS;
   sf->static_segmentation = 1;
@@ -845,13 +845,10 @@ void vp9_set_speed_features(VP9_COMP *cpi) {
   cpi->mb.fwd_txm8x8    = vp9_short_fdct8x8;
   cpi->mb.fwd_txm8x4    = vp9_short_fdct8x4;
   cpi->mb.fwd_txm4x4    = vp9_short_fdct4x4;
-
-#if CONFIG_LOSSLESS
   if (cpi->oxcf.lossless || cpi->mb.e_mbd.lossless) {
     cpi->mb.fwd_txm8x4    = vp9_short_walsh8x4_x8;
     cpi->mb.fwd_txm4x4    = vp9_short_walsh4x4_x8;
   }
-#endif
 
   cpi->mb.quantize_b_4x4      = vp9_regular_quantize_b_4x4;
   cpi->mb.quantize_b_4x4_pair = vp9_regular_quantize_b_4x4_pair;
@@ -1216,16 +1213,14 @@ 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_txm4x4_1    = vp9_short_idct4x4llm_1;
-  cpi->mb.e_mbd.inv_txm4x4      = vp9_short_idct4x4llm;
-
-#if CONFIG_LOSSLESS
   cpi->oxcf.lossless = oxcf->lossless;
   if (cpi->oxcf.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;
+  } else {
+    cpi->mb.e_mbd.inv_txm4x4_1    = vp9_short_idct4x4llm_1;
+    cpi->mb.e_mbd.inv_txm4x4      = vp9_short_idct4x4llm;
   }
-#endif
 
   cpi->baseline_gf_interval = DEFAULT_GF_INTERVAL;
 
@@ -2465,15 +2460,9 @@ static void update_reference_frames(VP9_COMP * const cpi) {
 }
 
 static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
-  if (cm->no_lpf) {
+  if (cm->no_lpf || cpi->mb.e_mbd.lossless) {
     cm->filter_level = 0;
-  }
-#if CONFIG_LOSSLESS
-  else if (cpi->mb.e_mbd.lossless) {
-    cm->filter_level = 0;
-  }
-#endif
-  else {
+  } else {
     struct vpx_usec_timer timer;
 
     vp9_clear_system_state();
@@ -2625,11 +2614,12 @@ 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;
-  cpi->zbin_mode_boost_enabled = TRUE;
-#if CONFIG_LOSSLESS
+
   if (cpi->oxcf.lossless)
     cpi->zbin_mode_boost_enabled = FALSE;
-#endif
+  else
+    cpi->zbin_mode_boost_enabled = TRUE;
+
   if (cpi->gfu_boost <= 400) {
     cpi->zbin_mode_boost_enabled = FALSE;
   }
index 81f02ee..2653954 100644 (file)
@@ -35,9 +35,7 @@ struct vp8_extracfg {
   vp8e_tuning                 tuning;
   unsigned int                cq_level;         /* constrained quality level */
   unsigned int                rc_max_intra_bitrate_pct;
-#if CONFIG_LOSSLESS
   unsigned int                lossless;
-#endif
 };
 
 struct extraconfig_map {
@@ -64,9 +62,7 @@ static const struct extraconfig_map extracfg_map[] = {
       0,                          /* tuning*/
       10,                         /* cq_level */
       0,                          /* rc_max_intra_bitrate_pct */
-#if CONFIG_LOSSLESS
       0,                          /* lossless */
-#endif
     }
   }
 };
@@ -138,13 +134,11 @@ static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t      *ctx,
 
   RANGE_CHECK_HI(cfg, rc_max_quantizer,   63);
   RANGE_CHECK_HI(cfg, rc_min_quantizer,   cfg->rc_max_quantizer);
-#if CONFIG_LOSSLESS
   RANGE_CHECK_BOOL(vp8_cfg, lossless);
   if (vp8_cfg->lossless) {
     RANGE_CHECK_HI(cfg, rc_max_quantizer, 0);
     RANGE_CHECK_HI(cfg, rc_min_quantizer, 0);
   }
-#endif
 
   RANGE_CHECK_HI(cfg, g_threads,          64);
   RANGE_CHECK_HI(cfg, g_lag_in_frames,    MAX_LAG_BUFFERS);
@@ -314,9 +308,7 @@ static vpx_codec_err_t set_vp8e_config(VP9_CONFIG *oxcf,
   oxcf->tile_columns = vp8_cfg.tile_columns;
   oxcf->tile_rows = vp8_cfg.tile_rows;
 
-#if CONFIG_LOSSLESS
   oxcf->lossless = vp8_cfg.lossless;
-#endif
 
   oxcf->error_resilient_mode = cfg.g_error_resilient;
   oxcf->frame_parallel_decoding_mode = cfg.g_frame_parallel_decoding;
@@ -428,9 +420,7 @@ static vpx_codec_err_t set_param(vpx_codec_alg_priv_t *ctx,
       MAP(VP8E_SET_TUNING,                xcfg.tuning);
       MAP(VP8E_SET_CQ_LEVEL,              xcfg.cq_level);
       MAP(VP8E_SET_MAX_INTRA_BITRATE_PCT, xcfg.rc_max_intra_bitrate_pct);
-#if CONFIG_LOSSLESS
       MAP(VP9E_SET_LOSSLESS,              xcfg.lossless);
-#endif
   }
 
   res = validate_config(ctx, &ctx->cfg, &xcfg);
@@ -1020,9 +1010,7 @@ static vpx_codec_ctrl_fn_map_t vp8e_ctf_maps[] = {
   {VP8E_SET_TUNING,                   set_param},
   {VP8E_SET_CQ_LEVEL,                 set_param},
   {VP8E_SET_MAX_INTRA_BITRATE_PCT,    set_param},
-#if CONFIG_LOSSLESS
   {VP9E_SET_LOSSLESS,                 set_param},
-#endif
   { -1, NULL},
 };
 
index bf6e466..719f04f 100644 (file)
--- a/vpxenc.c
+++ b/vpxenc.c
@@ -1106,9 +1106,7 @@ static const arg_def_t cq_level = ARG_DEF(NULL, "cq-level", 1,
                                           "Constrained Quality Level");
 static const arg_def_t max_intra_rate_pct = ARG_DEF(NULL, "max-intra-rate", 1,
                                                     "Max I-frame bitrate (pct)");
-#if CONFIG_LOSSLESS
 static const arg_def_t lossless = ARG_DEF(NULL, "lossless", 1, "Lossless mode");
-#endif
 
 #if CONFIG_VP8_ENCODER
 static const arg_def_t *vp8_args[] = {
@@ -1131,10 +1129,7 @@ static const int vp8_arg_ctrl_map[] = {
 static const arg_def_t *vp9_args[] = {
   &cpu_used, &auto_altref, &noise_sens, &sharpness, &static_thresh,
   &tile_cols, &tile_rows, &arnr_maxframes, &arnr_strength, &arnr_type,
-  &tune_ssim, &cq_level, &max_intra_rate_pct,
-#if CONFIG_LOSSLESS
-  &lossless,
-#endif
+  &tune_ssim, &cq_level, &max_intra_rate_pct, &lossless,
   NULL
 };
 static const int vp9_arg_ctrl_map[] = {
@@ -1143,9 +1138,7 @@ static const int vp9_arg_ctrl_map[] = {
   VP9E_SET_TILE_COLUMNS, VP9E_SET_TILE_ROWS,
   VP8E_SET_ARNR_MAXFRAMES, VP8E_SET_ARNR_STRENGTH, VP8E_SET_ARNR_TYPE,
   VP8E_SET_TUNING, VP8E_SET_CQ_LEVEL, VP8E_SET_MAX_INTRA_BITRATE_PCT,
-#if CONFIG_LOSSLESS
   VP9E_SET_LOSSLESS,
-#endif
   0
 };
 #endif