diff options
author | Yaowu Xu <yaowu@google.com> | 2013-02-13 09:54:35 -0800 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2013-02-13 09:54:35 -0800 |
commit | d3de97794f37d10cff1c20fa9d71aa0ea9158543 (patch) | |
tree | fd950ddace41c37ff7bcb3e6f836c5236ee3473e /vp9/decoder | |
parent | 649be94cf0d2c4c1e9a6a65708b6289799643462 (diff) | |
parent | 16f25f9dc83a37f2a16c7652445b6a6ecf8034af (diff) | |
download | libvpx-d3de97794f37d10cff1c20fa9d71aa0ea9158543.tar libvpx-d3de97794f37d10cff1c20fa9d71aa0ea9158543.tar.gz libvpx-d3de97794f37d10cff1c20fa9d71aa0ea9158543.tar.bz2 libvpx-d3de97794f37d10cff1c20fa9d71aa0ea9158543.zip |
Merge "fix the lossless experiment" into experimental
Diffstat (limited to 'vp9/decoder')
-rw-r--r-- | vp9/decoder/vp9_decodframe.c | 73 | ||||
-rw-r--r-- | vp9/decoder/vp9_dequantize.h | 14 | ||||
-rw-r--r-- | vp9/decoder/vp9_idct_blk.c | 12 | ||||
-rw-r--r-- | vp9/decoder/vp9_onyxd_int.h | 6 |
4 files changed, 45 insertions, 60 deletions
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c index b8e867a0e..a29abe94e 100644 --- a/vp9/decoder/vp9_decodframe.c +++ b/vp9/decoder/vp9_decodframe.c @@ -125,37 +125,42 @@ static void mb_init_dequantizer(VP9D_COMP *pbi, MACROBLOCKD *xd) { } #if CONFIG_LOSSLESS + pbi->mb.lossless = 0; if (!QIndex) { pbi->mb.inv_xform4x4_1_x8 = vp9_short_inv_walsh4x4_1_x8; pbi->mb.inv_xform4x4_x8 = vp9_short_inv_walsh4x4_x8; pbi->mb.inv_walsh4x4_1 = vp9_short_inv_walsh4x4_1_lossless; pbi->mb.inv_walsh4x4_lossless = vp9_short_inv_walsh4x4_lossless; - pbi->idct_add = vp9_dequant_idct_add_lossless_c; - pbi->dc_idct_add = vp9_dequant_dc_idct_add_lossless_c; - pbi->dc_idct_add_y_block = vp9_dequant_dc_idct_add_y_block_lossless_c; - pbi->idct_add_y_block = vp9_dequant_idct_add_y_block_lossless_c; - pbi->idct_add_uv_block = vp9_dequant_idct_add_uv_block_lossless_c; + pbi->mb.idct_add = vp9_dequant_idct_add_lossless_c; + pbi->mb.dc_only_idct_add = vp9_dc_only_inv_walsh_add_c; + pbi->mb.dc_idct_add = vp9_dequant_dc_idct_add_lossless_c; + pbi->mb.dc_idct_add_y_block = vp9_dequant_dc_idct_add_y_block_lossless_c; + pbi->mb.idct_add_y_block = vp9_dequant_idct_add_y_block_lossless_c; + pbi->mb.idct_add_uv_block = vp9_dequant_idct_add_uv_block_lossless_c; + pbi->mb.lossless = 1; } else { pbi->mb.inv_xform4x4_1_x8 = vp9_short_idct4x4llm_1; pbi->mb.inv_xform4x4_x8 = vp9_short_idct4x4llm; pbi->mb.inv_walsh4x4_1 = vp9_short_inv_walsh4x4_1; pbi->mb.inv_walsh4x4_lossless = vp9_short_inv_walsh4x4; - pbi->idct_add = vp9_dequant_idct_add; - pbi->dc_idct_add = vp9_dequant_dc_idct_add; - pbi->dc_idct_add_y_block = vp9_dequant_dc_idct_add_y_block; - pbi->idct_add_y_block = vp9_dequant_idct_add_y_block; - pbi->idct_add_uv_block = vp9_dequant_idct_add_uv_block; + pbi->mb.idct_add = vp9_dequant_idct_add; + pbi->mb.dc_only_idct_add = vp9_dc_only_idct_add_c; + pbi->mb.dc_idct_add = vp9_dequant_dc_idct_add; + pbi->mb.dc_idct_add_y_block = vp9_dequant_dc_idct_add_y_block; + pbi->mb.idct_add_y_block = vp9_dequant_idct_add_y_block; + pbi->mb.idct_add_uv_block = vp9_dequant_idct_add_uv_block; } #else pbi->mb.inv_xform4x4_1_x8 = vp9_short_idct4x4llm_1; pbi->mb.inv_xform4x4_x8 = vp9_short_idct4x4llm; pbi->mb.inv_walsh4x4_1 = vp9_short_inv_walsh4x4_1; pbi->mb.inv_walsh4x4_lossless = vp9_short_inv_walsh4x4; - pbi->idct_add = vp9_dequant_idct_add; - pbi->dc_idct_add = vp9_dequant_dc_idct_add; - pbi->dc_idct_add_y_block = vp9_dequant_dc_idct_add_y_block; - pbi->idct_add_y_block = vp9_dequant_idct_add_y_block; - pbi->idct_add_uv_block = vp9_dequant_idct_add_uv_block; + pbi->mb.idct_add = vp9_dequant_idct_add; + pbi->mb.dc_only_idct_add = vp9_dc_only_idct_add_c; + pbi->mb.dc_idct_add = vp9_dequant_dc_idct_add; + pbi->mb.dc_idct_add_y_block = vp9_dequant_dc_idct_add_y_block; + pbi->mb.idct_add_y_block = vp9_dequant_idct_add_y_block; + pbi->mb.idct_add_uv_block = vp9_dequant_idct_add_uv_block; #endif for (i = 16; i < 24; i++) { @@ -345,15 +350,15 @@ static void decode_8x8(VP9D_COMP *pbi, MACROBLOCKD *xd, int i8x8mode = b->bmi.as_mode.first; b = &xd->block[16 + i]; vp9_intra_uv4x4_predict(xd, &xd->block[16 + i], i8x8mode, b->predictor); - pbi->idct_add(b->qcoeff, b->dequant, b->predictor, + xd->idct_add(b->qcoeff, b->dequant, b->predictor, *(b->base_dst) + b->dst, 8, b->dst_stride); b = &xd->block[20 + i]; vp9_intra_uv4x4_predict(xd, &xd->block[20 + i], i8x8mode, b->predictor); - pbi->idct_add(b->qcoeff, b->dequant, b->predictor, + xd->idct_add(b->qcoeff, b->dequant, b->predictor, *(b->base_dst) + b->dst, 8, b->dst_stride); } } else if (xd->mode_info_context->mbmi.mode == SPLITMV) { - pbi->idct_add_uv_block(xd->qcoeff + 16 * 16, xd->block[16].dequant, + xd->idct_add_uv_block(xd->qcoeff + 16 * 16, xd->block[16].dequant, xd->predictor + 16 * 16, xd->dst.u_buffer, xd->dst.v_buffer, xd->dst.uv_stride, xd->eobs + 16); } else { @@ -400,17 +405,17 @@ static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd, *(b->base_dst) + b->dst, 16, b->dst_stride, b->eob); } else { - vp9_dequant_idct_add(b->qcoeff, b->dequant, b->predictor, - *(b->base_dst) + b->dst, 16, b->dst_stride); + xd->idct_add(b->qcoeff, b->dequant, b->predictor, + *(b->base_dst) + b->dst, 16, b->dst_stride); } } b = &xd->block[16 + i]; vp9_intra_uv4x4_predict(xd, b, i8x8mode, b->predictor); - pbi->idct_add(b->qcoeff, b->dequant, b->predictor, + xd->idct_add(b->qcoeff, b->dequant, b->predictor, *(b->base_dst) + b->dst, 8, b->dst_stride); b = &xd->block[20 + i]; vp9_intra_uv4x4_predict(xd, b, i8x8mode, b->predictor); - pbi->idct_add(b->qcoeff, b->dequant, b->predictor, + xd->idct_add(b->qcoeff, b->dequant, b->predictor, *(b->base_dst) + b->dst, 8, b->dst_stride); } } else if (mode == B_PRED) { @@ -434,8 +439,8 @@ static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd, *(b->base_dst) + b->dst, 16, b->dst_stride, b->eob); } else { - vp9_dequant_idct_add(b->qcoeff, b->dequant, b->predictor, - *(b->base_dst) + b->dst, 16, b->dst_stride); + xd->idct_add(b->qcoeff, b->dequant, b->predictor, + *(b->base_dst) + b->dst, 16, b->dst_stride); } } if (!xd->mode_info_context->mbmi.mb_skip_coeff) { @@ -444,7 +449,7 @@ static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd, xd->above_context->y2 = 0; xd->left_context->y2 = 0; vp9_build_intra_predictors_mbuv(xd); - pbi->idct_add_uv_block(xd->qcoeff + 16 * 16, + xd->idct_add_uv_block(xd->qcoeff + 16 * 16, xd->block[16].dequant, xd->predictor + 16 * 16, xd->dst.u_buffer, @@ -453,13 +458,13 @@ static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd, xd->eobs + 16); } else if (mode == SPLITMV) { assert(get_2nd_order_usage(xd) == 0); - pbi->idct_add_y_block(xd->qcoeff, + xd->idct_add_y_block(xd->qcoeff, xd->block[0].dequant, xd->predictor, xd->dst.y_buffer, xd->dst.y_stride, xd->eobs); - pbi->idct_add_uv_block(xd->qcoeff + 16 * 16, + xd->idct_add_uv_block(xd->qcoeff + 16 * 16, xd->block[16].dequant, xd->predictor + 16 * 16, xd->dst.u_buffer, @@ -496,8 +501,8 @@ static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd, *(b->base_dst) + b->dst, 16, b->dst_stride, b->eob); } else { - vp9_dequant_idct_add(b->qcoeff, b->dequant, b->predictor, - *(b->base_dst) + b->dst, 16, b->dst_stride); + xd->idct_add(b->qcoeff, b->dequant, b->predictor, + *(b->base_dst) + b->dst, 16, b->dst_stride); } } } else { @@ -505,7 +510,7 @@ static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd, assert(get_2nd_order_usage(xd) == 1); vp9_dequantize_b(b); if (xd->eobs[24] > 1) { - vp9_short_inv_walsh4x4(&b->dqcoeff[0], b->diff); + xd->inv_walsh4x4_lossless(&b->dqcoeff[0], b->diff); ((int *)b->qcoeff)[0] = 0; ((int *)b->qcoeff)[1] = 0; ((int *)b->qcoeff)[2] = 0; @@ -519,7 +524,7 @@ static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd, ((int *)b->qcoeff)[0] = 0; } vp9_dequantize_b(b); - pbi->dc_idct_add_y_block(xd->qcoeff, + xd->dc_idct_add_y_block(xd->qcoeff, xd->block[0].dequant, xd->predictor, xd->dst.y_buffer, @@ -527,7 +532,7 @@ static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd, xd->eobs, xd->block[24].diff); } - pbi->idct_add_uv_block(xd->qcoeff + 16 * 16, + xd->idct_add_uv_block(xd->qcoeff + 16 * 16, xd->block[16].dequant, xd->predictor + 16 * 16, xd->dst.u_buffer, @@ -645,7 +650,7 @@ static void decode_4x4_sb(VP9D_COMP *pbi, MACROBLOCKD *xd, + x_idx * 16 + (i & 3) * 4, xd->dst.y_stride, xd->dst.y_stride, b->eob); } else { - vp9_dequant_idct_add_c( + xd->idct_add( b->qcoeff, b->dequant, xd->dst.y_buffer + (y_idx * 16 + (i / 4) * 4) * xd->dst.y_stride + x_idx * 16 + (i & 3) * 4, @@ -657,7 +662,7 @@ static void decode_4x4_sb(VP9D_COMP *pbi, MACROBLOCKD *xd, } else { vp9_dequantize_b(b); if (xd->eobs[24] > 1) { - vp9_short_inv_walsh4x4(&b->dqcoeff[0], b->diff); + xd->inv_walsh4x4_lossless(&b->dqcoeff[0], b->diff); ((int *)b->qcoeff)[0] = 0; ((int *)b->qcoeff)[1] = 0; ((int *)b->qcoeff)[2] = 0; diff --git a/vp9/decoder/vp9_dequantize.h b/vp9/decoder/vp9_dequantize.h index 2a0ae80e8..0fa5144a7 100644 --- a/vp9/decoder/vp9_dequantize.h +++ b/vp9/decoder/vp9_dequantize.h @@ -42,20 +42,6 @@ extern void vp9_dequant_idct_add_uv_block_lossless_c(int16_t *q, const int16_t * uint16_t *eobs); #endif -typedef void (*vp9_dequant_idct_add_fn_t)(int16_t *input, const int16_t *dq, - unsigned char *pred, unsigned char *output, int pitch, int stride); -typedef void(*vp9_dequant_dc_idct_add_fn_t)(int16_t *input, const int16_t *dq, - unsigned char *pred, unsigned char *output, int pitch, int stride, int dc); - -typedef void(*vp9_dequant_dc_idct_add_y_block_fn_t)(int16_t *q, const int16_t *dq, - unsigned char *pre, unsigned char *dst, int stride, uint16_t *eobs, - const int16_t *dc); -typedef void(*vp9_dequant_idct_add_y_block_fn_t)(int16_t *q, const int16_t *dq, - unsigned char *pre, unsigned char *dst, int stride, uint16_t *eobs); -typedef void(*vp9_dequant_idct_add_uv_block_fn_t)(int16_t *q, const int16_t *dq, - unsigned char *pre, unsigned char *dst_u, unsigned char *dst_v, int stride, - uint16_t *eobs); - void vp9_ht_dequant_idct_add_c(TX_TYPE tx_type, int16_t *input, const int16_t *dq, unsigned char *pred, unsigned char *dest, int pitch, int stride, uint16_t eobs); diff --git a/vp9/decoder/vp9_idct_blk.c b/vp9/decoder/vp9_idct_blk.c index 152527cff..ad93b49b1 100644 --- a/vp9/decoder/vp9_idct_blk.c +++ b/vp9/decoder/vp9_idct_blk.c @@ -51,9 +51,9 @@ void vp9_dequant_dc_idct_add_y_block_4x4_inplace_c(int16_t *q, for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { if (*eobs++ > 1) - vp9_dequant_dc_idct_add_c(q, dq, dst, dst, stride, stride, dc[0]); + xd->dc_idct_add(q, dq, dst, dst, stride, stride, dc[0]); else - vp9_dc_only_idct_add_c(dc[0], dst, dst, stride, stride); + xd->dc_only_idct_add(dc[0], dst, dst, stride, stride); q += 16; dst += 4; @@ -143,9 +143,9 @@ void vp9_dequant_idct_add_uv_block_4x4_inplace_c(int16_t *q, const int16_t *dq, for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) { if (*eobs++ > 1) { - vp9_dequant_idct_add_c(q, dq, dstu, dstu, stride, stride); + xd->idct_add(q, dq, dstu, dstu, stride, stride); } else { - vp9_dc_only_idct_add_c(q[0]*dq[0], dstu, dstu, stride, stride); + xd->dc_only_idct_add(q[0]*dq[0], dstu, dstu, stride, stride); ((int *)q)[0] = 0; } @@ -159,9 +159,9 @@ void vp9_dequant_idct_add_uv_block_4x4_inplace_c(int16_t *q, const int16_t *dq, for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) { if (*eobs++ > 1) { - vp9_dequant_idct_add_c(q, dq, dstv, dstv, stride, stride); + xd->idct_add(q, dq, dstv, dstv, stride, stride); } else { - vp9_dc_only_idct_add_c(q[0]*dq[0], dstv, dstv, stride, stride); + xd->dc_only_idct_add(q[0]*dq[0], dstv, dstv, stride, stride); ((int *)q)[0] = 0; } diff --git a/vp9/decoder/vp9_onyxd_int.h b/vp9/decoder/vp9_onyxd_int.h index e04b9f5e4..0b0b90356 100644 --- a/vp9/decoder/vp9_onyxd_int.h +++ b/vp9/decoder/vp9_onyxd_int.h @@ -70,12 +70,6 @@ typedef struct VP9Decompressor { DETOK detoken; - vp9_dequant_idct_add_fn_t idct_add; - vp9_dequant_dc_idct_add_fn_t dc_idct_add; - vp9_dequant_dc_idct_add_y_block_fn_t dc_idct_add_y_block; - vp9_dequant_idct_add_y_block_fn_t idct_add_y_block; - vp9_dequant_idct_add_uv_block_fn_t idct_add_uv_block; - int refresh_frame_flags; vp9_prob prob_skip_false; |