summaryrefslogtreecommitdiff
path: root/vp9/decoder/vp9_decodframe.c
diff options
context:
space:
mode:
authorJingning Han <jingning@google.com>2013-04-11 12:12:11 -0700
committerJingning Han <jingning@google.com>2013-04-11 16:45:57 -0700
commit815e95fbebdc8de7e5033cb60b6ae8d846d92152 (patch)
tree3764b6f9ff589a54388a9a4e8760e60b790fb234 /vp9/decoder/vp9_decodframe.c
parent2f19cd03aa528627f428a8e0571a6db5446df8ad (diff)
downloadlibvpx-815e95fbebdc8de7e5033cb60b6ae8d846d92152.tar
libvpx-815e95fbebdc8de7e5033cb60b6ae8d846d92152.tar.gz
libvpx-815e95fbebdc8de7e5033cb60b6ae8d846d92152.tar.bz2
libvpx-815e95fbebdc8de7e5033cb60b6ae8d846d92152.zip
Make intra predictor support rectangular blocks
The intra predictor supports configurable block sizes. It can handle intra prediction down to 4x4 sizes, when enabled in BLOCK_SIZE_TYPE. Change-Id: I7399ec2512393aa98aadda9813ca0c83e19af854
Diffstat (limited to 'vp9/decoder/vp9_decodframe.c')
-rw-r--r--vp9/decoder/vp9_decodframe.c50
1 files changed, 17 insertions, 33 deletions
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c
index 6013591f4..e952cc73a 100644
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -183,25 +183,15 @@ static void propagate_nzcs(VP9_COMMON *cm, MACROBLOCKD *xd) {
}
#endif
-/* skip_recon_mb() is Modified: Instead of writing the result to predictor buffer and then copying it
- * to dst buffer, we can write the result directly to dst buffer. This eliminates unnecessary copy.
- */
-static void skip_recon_mb(VP9D_COMP *pbi, MACROBLOCKD *xd,
- int mb_row, int mb_col) {
+static void skip_recon_sb(VP9D_COMP *pbi, MACROBLOCKD *xd,
+ int mb_row, int mb_col,
+ BLOCK_SIZE_TYPE bsize) {
MODE_INFO *m = xd->mode_info_context;
BLOCK_SIZE_TYPE sb_type = m->mbmi.sb_type;
if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
- if (sb_type == BLOCK_SIZE_SB64X64) {
- vp9_build_intra_predictors_sb64uv_s(xd);
- vp9_build_intra_predictors_sb64y_s(xd);
- } else if (sb_type == BLOCK_SIZE_SB32X32) {
- vp9_build_intra_predictors_sbuv_s(xd);
- vp9_build_intra_predictors_sby_s(xd);
- } else {
- vp9_build_intra_predictors_mbuv_s(xd);
- vp9_build_intra_predictors_mby_s(xd);
- }
+ vp9_build_intra_predictors_sbuv_s(xd, bsize);
+ vp9_build_intra_predictors_sby_s(xd, bsize);
} else {
if (sb_type == BLOCK_SIZE_SB64X64) {
vp9_build_inter64x64_predictors_sb(xd, mb_row, mb_col);
@@ -409,7 +399,7 @@ static void decode_4x4(VP9D_COMP *pbi, MACROBLOCKD *xd,
if (!xd->mode_info_context->mbmi.mb_skip_coeff)
vp9_decode_mb_tokens_4x4_uv(pbi, xd, bc);
#endif
- vp9_build_intra_predictors_mbuv_s(xd);
+ vp9_build_intra_predictors_sbuv_s(xd, BLOCK_SIZE_MB16X16);
xd->itxm_add_uv_block(xd->plane[1].qcoeff, xd->block[16].dequant,
xd->dst.u_buffer, xd->dst.uv_stride, xd->dst.u_buffer,
xd->dst.uv_stride, xd->plane[1].eobs);
@@ -709,27 +699,21 @@ static void decode_sb(VP9D_COMP *pbi, MACROBLOCKD *xd, int mb_row, int mb_col,
// Special case: Force the loopfilter to skip when eobtotal and
// mb_skip_coeff are zero.
- skip_recon_mb(pbi, xd, mb_row, mb_col);
+ skip_recon_sb(pbi, xd, mb_row, mb_col, bsize);
return;
}
- // TODO(jingning): need to combine intra/inter predictor functions and
+ // TODO(jingning): need to combine inter predictor functions and
// make them block size independent.
// generate prediction
- if (bsize == BLOCK_SIZE_SB64X64) {
- assert(bsize == BLOCK_SIZE_SB64X64);
- if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
- vp9_build_intra_predictors_sb64y_s(xd);
- vp9_build_intra_predictors_sb64uv_s(xd);
- } else {
- vp9_build_inter64x64_predictors_sb(xd, mb_row, mb_col);
- }
+ if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
+ vp9_build_intra_predictors_sby_s(xd, bsize);
+ vp9_build_intra_predictors_sbuv_s(xd, bsize);
} else {
- assert(bsize == BLOCK_SIZE_SB32X32);
- if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
- vp9_build_intra_predictors_sby_s(xd);
- vp9_build_intra_predictors_sbuv_s(xd);
+ if (bsize == BLOCK_SIZE_SB64X64) {
+ vp9_build_inter64x64_predictors_sb(xd, mb_row, mb_col);
} else {
+ assert(bsize == BLOCK_SIZE_SB32X32);
vp9_build_inter32x32_predictors_sb(xd, mb_row, mb_col);
}
}
@@ -804,7 +788,7 @@ static void decode_mb(VP9D_COMP *pbi, MACROBLOCKD *xd,
// Special case: Force the loopfilter to skip when eobtotal and
// mb_skip_coeff are zero.
xd->mode_info_context->mbmi.mb_skip_coeff = 1;
- skip_recon_mb(pbi, xd, mb_row, mb_col);
+ skip_recon_sb(pbi, xd, mb_row, mb_col, BLOCK_SIZE_MB16X16);
return;
}
#if 0 // def DEC_DEBUG
@@ -819,9 +803,9 @@ static void decode_mb(VP9D_COMP *pbi, MACROBLOCKD *xd,
// do prediction
if (xd->mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
if (mode != I8X8_PRED) {
- vp9_build_intra_predictors_mbuv_s(xd);
+ vp9_build_intra_predictors_sbuv_s(xd, BLOCK_SIZE_MB16X16);
if (mode != B_PRED)
- vp9_build_intra_predictors_mby_s(xd);
+ vp9_build_intra_predictors_sby_s(xd, BLOCK_SIZE_MB16X16);
}
} else {
#if 0 // def DEC_DEBUG