diff --git a/vp8/dixie/dixie.c b/vp8/dixie/dixie.c index 1ea642ea2d146e38f7f106ba6863279f066e232a..cd61ff50e22dbbe1bd5d7af4bfb0ef3b17b5862a 100644 --- a/vp8/dixie/dixie.c +++ b/vp8/dixie/dixie.c @@ -14,6 +14,7 @@ #include "dequant_data.h" #include "modemv.h" #include "tokens.h" +#include "predict.h" #include <string.h> #include <assert.h> @@ -374,12 +375,14 @@ decode_frame(struct vp8_decoder_ctx *ctx, vp8_dixie_modemv_init(ctx); vp8_dixie_tokens_init(ctx); + vp8_dixie_predict_init(ctx); dequant_init(ctx->dequant_factors, &ctx->segment_hdr, &ctx->quant_hdr); for (row = 0, partition = 0; row < ctx->mb_rows; row++) { vp8_dixie_modemv_process_row(ctx, &bool, row, 0, ctx->mb_cols); vp8_dixie_tokens_process_row(ctx, partition, row, 0, ctx->mb_cols); + vp8_dixie_predict_process_row(ctx, row, 0, ctx->mb_cols); if (++partition == ctx->token_hdr.partitions) partition = 0; diff --git a/vp8/dixie/dixie.h b/vp8/dixie/dixie.h index 951e7816f0674bc3505330ab646192dbc98bff19..b21894531f5d688281b5786b23797df1e9902cfd 100644 --- a/vp8/dixie/dixie.h +++ b/vp8/dixie/dixie.h @@ -142,7 +142,8 @@ enum reference_frame CURRENT_FRAME, LAST_FRAME, GOLDEN_FRAME, - ALTREF_FRAME + ALTREF_FRAME, + NUM_REF_FRAMES }; @@ -224,6 +225,14 @@ struct dequant_factors short factor[TOKEN_BLOCK_TYPES][2]; /* [ Y1, UV, Y2 ] [ DC, AC ] */ }; + +struct ref_cnt_img +{ + vpx_image_t img; + unsigned int ref_cnt; +}; + + struct vp8_decoder_ctx { struct vpx_internal_error_info error; @@ -249,6 +258,10 @@ struct vp8_decoder_ctx token_entropy_ctx_t *above_token_entropy_ctx; struct token_decoder tokens[MAX_PARTITIONS]; struct dequant_factors dequant_factors[MAX_MB_SEGMENTS]; + + struct ref_cnt_img frame_strg[NUM_REF_FRAMES]; + struct ref_cnt_img *ref_frames[NUM_REF_FRAMES]; + ptrdiff_t ref_frame_offsets[4]; }; @@ -267,4 +280,7 @@ vp8_dixie_decode_frame(struct vp8_decoder_ctx *ctx, const unsigned char *data, unsigned int sz); + +#define CLAMP_255(x) ((x)<0?0:((x)>255?255:(x))) + #endif diff --git a/vp8/dixie/predict.c b/vp8/dixie/predict.c new file mode 100644 index 0000000000000000000000000000000000000000..b9ec106546e368413ad9eaf5b8263c0465afc482 --- /dev/null +++ b/vp8/dixie/predict.c @@ -0,0 +1,805 @@ +/* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#include "dixie.h" +#include "predict.h" +#include <assert.h> +#include <string.h> + +enum +{ + BORDER_PIXELS = 16, +}; + + +static void +predict_h_nxn(unsigned char *predict, + int stride, + int n) +{ + unsigned char *left = predict - 1; + int i; + + for (i = 0; i < n; i++) + { + predict[n-1] = *left; + predict += stride; + left += stride; + } +} + + +static void +predict_v_nxn(unsigned char *predict, + int stride, + int n) +{ + unsigned char *above = predict - stride; + int i; + + predict += (n - 1) * stride; + + for (i = 0; i < n; i++) + predict[i] = above[i]; +} + + +static void +predict_tm_nxn(unsigned char *predict, + int stride, + int n) +{ + /* Transposes the left column to the top row for later consumption + * by the idct/recon stage + */ + unsigned char *left = predict - 1; + unsigned char *above = predict - stride; + unsigned char p = above[-1]; + int i, j; + + for (j = 0; j < n; j++) + { + for (i = 0; i < n; i++) + predict[i] = CLAMP_255(*left + above[i] - p); + + predict += stride; + left += stride; + } +} + + +static void +predict_dc_16x16(unsigned char *predict, + int stride) +{ + unsigned char *left = predict - 1; + unsigned char *above = predict - stride; + int i, dc = 0; + + for (i = 0; i < 16; i++) + { + dc += *left + above[i]; + left += stride; + } + + dc = (dc + 16) >> 5; + predict[15] = dc; + predict[15+4*stride] = dc; + predict[15+8*stride] = dc; + predict[15+12*stride] = dc; +} + + +static void +predict_dc_8x8(unsigned char *predict, + int stride) +{ + unsigned char *left = predict - 1; + unsigned char *above = predict - stride; + int i, dc = 0; + + for (i = 0; i < 8; i++) + { + dc += *left + above[i]; + left += stride; + } + + dc = (dc + 8) >> 4; + predict[7] = dc; + predict[7+4*stride] = dc; +} + + +static void +predict_dc_4x4(unsigned char *predict, + int stride) +{ + unsigned char *left = predict - 1; + unsigned char *above = predict - stride; + int i, dc = 0; + + for (i = 0; i < 4; i++) + { + dc += *left + above[i]; + left += stride; + } + + dc = (dc + 4) >> 3; + predict[3] = dc; +} + + +static void +predict_ve_4x4(unsigned char *predict, + int stride) +{ + unsigned char *above = predict - stride; + + predict += 3 * stride; + predict[0] = (above[-1] + 2 * above[0] + above[1] + 2) >> 2; + predict[1] = (above[ 0] + 2 * above[1] + above[2] + 2) >> 2; + predict[2] = (above[ 1] + 2 * above[2] + above[3] + 2) >> 2; + predict[3] = (above[ 2] + 2 * above[3] + above[4] + 2) >> 2; +} + + +static void +predict_he_4x4(unsigned char *predict, + int stride) +{ + predict = predict - 1; + predict[4] = (predict[-stride] + 2 * predict[0] + predict[stride] + 2) >> 2; + predict += stride; + predict[4] = (predict[-stride] + 2 * predict[0] + predict[stride] + 2) >> 2; + predict += stride; + predict[4] = (predict[-stride] + 2 * predict[0] + predict[stride] + 2) >> 2; + predict += stride; + predict[4] = (predict[-stride] + 2 * predict[0] + predict[0] + 2) >> 2; +} + + +static void +predict_ld_4x4(unsigned char *predict, + int stride) +{ + unsigned char *above = predict - stride; + int pred0, pred1, pred2, pred3, pred4, pred5, pred6; + + predict[0] = pred0 = (above[0] + 2 * above[1] + above[2] + 2) >> 2; + predict[1] = pred1 = (above[1] + 2 * above[2] + above[3] + 2) >> 2; + predict[2] = pred2 = (above[2] + 2 * above[3] + above[4] + 2) >> 2; + predict[3] = pred3 = (above[3] + 2 * above[4] + above[5] + 2) >> 2; + predict += stride; + + predict[0] = pred1; + predict[1] = pred2; + predict[2] = pred3; + predict[3] = pred4 = (above[4] + 2 * above[5] + above[6] + 2) >> 2; + predict += stride; + + predict[0] = pred2; + predict[1] = pred3; + predict[2] = pred4; + predict[3] = pred5 = (above[5] + 2 * above[6] + above[7] + 2) >> 2; + predict += stride; + + predict[0] = pred3; + predict[1] = pred4; + predict[2] = pred5; + predict[3] = pred6 = (above[6] + 2 * above[7] + above[7] + 2) >> 2; +} + + +static void +predict_rd_4x4(unsigned char *predict, + int stride) +{ + unsigned char *left = predict - 1; + unsigned char *above = predict - stride; + int pred0, pred1, pred2, pred3, pred4, pred5, pred6; + + predict[0] = pred0 = (left[ 0] + 2 * above[-1] + above[0] + 2) >> 2; + predict[1] = pred1 = (above[-1] + 2 * above[ 0] + above[1] + 2) >> 2; + predict[2] = pred2 = (above[ 0] + 2 * above[ 1] + above[2] + 2) >> 2; + predict[3] = pred3 = (above[ 1] + 2 * above[ 2] + above[3] + 2) >> 2; + predict += stride; + + predict[0] = pred4 = (left[stride] + 2 * left[0] + above[-1] + 2) >> 2; + predict[1] = pred0; + predict[2] = pred1; + predict[3] = pred2; + predict += stride; + + predict[0] = pred5 = (left[stride*2] + 2 * left[stride] + left[0] + 2) >> 2; + predict[1] = pred4; + predict[2] = pred0; + predict[3] = pred1; + predict += stride; + + predict[0] = pred6 = (left[stride*3] + 2 * left[stride*2] + left[stride] + 2) >> 2; + predict[1] = pred5; + predict[2] = pred4; + predict[3] = pred0; +} + + +static void +predict_vr_4x4(unsigned char *predict, + int stride) +{ + unsigned char *left = predict - 1; + unsigned char *above = predict - stride; + int pred0, pred1, pred2, pred3, pred4, pred5, pred6, pred7, + pred8, pred9; + + predict[0] = pred0 = (above[-1] + above[0] + 1) >> 1; + predict[1] = pred1 = (above[ 0] + above[1] + 1) >> 1; + predict[2] = pred2 = (above[ 1] + above[2] + 1) >> 1; + predict[3] = pred3 = (above[ 2] + above[3] + 1) >> 1; + predict += stride; + + predict[0] = pred4 = (left[ 0] + 2 * above[-1] + above[0] + 2) >> 2; + predict[1] = pred5 = (above[-1] + 2 * above[ 0] + above[1] + 2) >> 2; + predict[2] = pred6 = (above[ 0] + 2 * above[ 1] + above[2] + 2) >> 2; + predict[3] = pred7 = (above[ 1] + 2 * above[ 2] + above[3] + 2) >> 2; + predict += stride; + + predict[0] = pred8 = (left[stride] + 2 * left[0] + above[-1] + 2) >> 2; + predict[1] = pred0; + predict[2] = pred1; + predict[3] = pred2; + predict += stride; + + predict[0] = pred9 = (left[stride*2] + 2 * left[stride] + left[0] + 2) >> 2; + predict[1] = pred4; + predict[2] = pred5; + predict[3] = pred6; +} + + +static void +predict_vl_4x4(unsigned char *predict, + int stride) +{ + unsigned char *above = predict - stride; + int pred0, pred1, pred2, pred3, pred4, pred5, pred6, pred7, + pred8, pred9; + + predict[0] = pred0 = (above[0] + above[1] + 1) >> 1; + predict[1] = pred1 = (above[1] + above[2] + 1) >> 1; + predict[2] = pred2 = (above[2] + above[3] + 1) >> 1; + predict[3] = pred3 = (above[3] + above[4] + 1) >> 1; + predict += stride; + + predict[0] = pred4 = (above[0] + 2 * above[1] + above[2] + 2) >> 2; + predict[1] = pred5 = (above[1] + 2 * above[2] + above[3] + 2) >> 2; + predict[2] = pred6 = (above[2] + 2 * above[3] + above[4] + 2) >> 2; + predict[3] = pred7 = (above[3] + 2 * above[4] + above[5] + 2) >> 2; + predict += stride; + + predict[0] = pred1; + predict[1] = pred2; + predict[2] = pred3; + predict[3] = pred8 = (above[4] + 2 * above[5] + above[6] + 2) >> 2; + predict += stride; + + predict[0] = pred5; + predict[1] = pred6; + predict[2] = pred7; + predict[3] = pred9 = (above[5] + 2 * above[6] + above[7] + 2) >> 2; +} + + +static void +predict_hd_4x4(unsigned char *predict, + int stride) +{ + unsigned char *left = predict - 1; + unsigned char *above = predict - stride; + int pred0, pred1, pred2, pred3, pred4, pred5, pred6, pred7, + pred8, pred9; + + predict[0] = pred0 = (left[ 0] + above[-1] + 1) >> 1; + predict[1] = pred1 = (left[ 0] + 2 * above[-1] + above[0] + 2) >> 2; + predict[2] = pred2 = (above[-1] + 2 * above[ 0] + above[1] + 2) >> 2; + predict[3] = pred3 = (above[ 0] + 2 * above[ 1] + above[2] + 2) >> 2; + predict += stride; + + predict[0] = pred4 = (left[stride] + left[0] + 1) >> 1; + predict[1] = pred5 = (left[stride] + 2 * left[0] + above[-1] + 2) >> 2; + predict[2] = pred0; + predict[3] = pred1; + predict += stride; + + predict[0] = pred6 = (left[stride*2] + left[stride] + 1) >> 1; + predict[1] = pred7 = (left[stride*2] + 2 * left[stride] + left[0] + 2) >> 2; + predict[2] = pred4; + predict[3] = pred5; + predict += stride; + + predict[0] = pred8 = (left[stride*3] + left[stride*2] + 1) >> 1; + predict[1] = pred9 = (left[stride*3] + 2 * left[stride*2] + left[stride] + 2) >> 2; + predict[2] = pred6; + predict[3] = pred7; +} + + +static void +predict_hu_4x4(unsigned char *predict, + int stride) +{ + unsigned char *left = predict - 1; + int pred0, pred1, pred2, pred3, pred4, pred5, pred6; + + predict[0] = pred0 = (left[stride*0] + left[stride*1] + 1) >> 1; + predict[1] = pred1 = (left[stride*0] + 2 * left[stride*1] + left[stride*2] + 2) >> 2; + predict[2] = pred2 = (left[stride*1] + left[stride*2] + 1) >> 1; + predict[3] = pred3 = (left[stride*1] + 2 * left[stride*2] + left[stride*3] + 2) >> 2; + predict += stride; + + predict[0] = pred2; + predict[1] = pred3; + predict[2] = pred4 = (left[stride*2] + left[stride*3] + 1) >> 1; + predict[3] = pred5 = (left[stride*2] + 2 * left[stride*3] + left[stride*3] + 2) >> 2; + predict += stride; + + predict[0] = pred4; + predict[1] = pred5; + predict[2] = pred6 = left[stride*3]; + predict[3] = pred6; + predict += stride; + + predict[0] = pred6; + predict[1] = pred6; + predict[2] = pred6; + predict[3] = pred6; +} + + +static void +predict_h_16x16(unsigned char *predict, int stride) +{ + predict_h_nxn(predict, stride, 16); +} + + +static void +predict_v_16x16(unsigned char *predict, int stride) +{ + predict_v_nxn(predict, stride, 16); +} + + +static void +predict_tm_16x16(unsigned char *predict, int stride) +{ + predict_tm_nxn(predict, stride, 16); +} + + +static void +predict_h_8x8(unsigned char *predict, int stride) +{ + predict_h_nxn(predict, stride, 8); +} + + +static void +predict_v_8x8(unsigned char *predict, int stride) +{ + predict_v_nxn(predict, stride, 8); +} + + +static void +predict_tm_8x8(unsigned char *predict, int stride) +{ + predict_tm_nxn(predict, stride, 8); +} + + +static void +predict_h_4x4(unsigned char *predict, int stride) +{ + predict_h_nxn(predict, stride, 4); +} + + +static void +predict_v_4x4(unsigned char *predict, int stride) +{ + predict_v_nxn(predict, stride, 4); +} + + +static void +predict_tm_4x4(unsigned char *predict, int stride) +{ + predict_tm_nxn(predict, stride, 4); +} + + +static void +copy_down(unsigned char *recon, + int stride) +{ + /* Copy the four pixels above-right of subblock 3 to + * above-right of subblocks 7, 11, and 15 + */ + uint32_t tmp, *copy = (void *)(recon + 16 - stride); + + stride = stride / sizeof(unsigned int); + tmp = *copy; + copy += stride * 4; + *copy = tmp; + copy += stride * 4; + *copy = tmp; + copy += stride * 4; + *copy = tmp; +} + + +static void +b_pred(unsigned char *predict, + int stride, + struct mb_info *mbi, + short *coeffs) +{ + int i; + + copy_down(predict, stride); + + for (i = 0; i < 16; i++) + { + unsigned char *b_predict = predict + (i & 3) * 4; + + switch (mbi->split.modes[i]) + { + case B_DC_PRED: + predict_dc_4x4(b_predict, stride); + break; + case B_TM_PRED: + predict_tm_4x4(b_predict, stride); + break; + case B_VE_PRED: + predict_ve_4x4(b_predict, stride); + break; + case B_HE_PRED: + predict_he_4x4(b_predict, stride); + break; + case B_LD_PRED: + predict_ld_4x4(b_predict, stride); + break; + case B_RD_PRED: + predict_rd_4x4(b_predict, stride); + break; + case B_VR_PRED: + predict_vr_4x4(b_predict, stride); + break; + case B_VL_PRED: + predict_vl_4x4(b_predict, stride); + break; + case B_HD_PRED: + predict_hd_4x4(b_predict, stride); + break; + case B_HU_PRED: + predict_hu_4x4(b_predict, stride); + break; + default: + assert(0); + } + + if ((i & 3) == 3) + { + predict += stride * 4; + } + } +} + +static void +predict_intra_luma(unsigned char *predict, + int stride, + struct mb_info *mbi, + const ptrdiff_t reference_offsets[4], + short *coeffs) +{ + if (mbi->base.y_mode == B_PRED) + b_pred(predict, stride, mbi, coeffs); + else + { + short y2[16]; + int i; + + switch (mbi->base.y_mode) + { + case DC_PRED: + predict_dc_16x16(predict, stride); + break; + case V_PRED: + predict_v_16x16(predict, stride); + break; + case H_PRED: + predict_h_16x16(predict, stride); + break; + case TM_PRED: + predict_tm_16x16(predict, stride); + break; + default: + assert(0); + } + + } +} + + +static void +predict_intra_chroma(unsigned char *predict_u, + unsigned char *predict_v, + int stride, + struct mb_info *mbi, + const ptrdiff_t reference_offsets[4], + short *coeffs) +{ + int i; + + switch (mbi->base.uv_mode) + { + case DC_PRED: + predict_dc_8x8(predict_u, stride); + predict_dc_8x8(predict_v, stride); + break; + case V_PRED: + predict_v_8x8(predict_u, stride); + predict_v_8x8(predict_v, stride); + break; + case H_PRED: + predict_h_8x8(predict_u, stride); + predict_h_8x8(predict_v, stride); + break; + case TM_PRED: + predict_tm_8x8(predict_u, stride); + predict_tm_8x8(predict_v, stride); + break; + + default: + assert(0); + } +} + +static void +release_ref_frame(struct ref_cnt_img *rcimg) +{ + if (rcimg) + { + assert(rcimg->ref_cnt); + rcimg->ref_cnt--; + } +} + + +static struct ref_cnt_img * +ref_frame(struct ref_cnt_img *rcimg) +{ + rcimg->ref_cnt++; + return rcimg; +} + + +static struct ref_cnt_img * +find_free_ref_frame(struct ref_cnt_img *frames) +{ + int i; + + for (i = 0; i < NUM_REF_FRAMES; i++) + if (frames[i].ref_cnt == 0) + { + frames[i].ref_cnt = 1; + return &frames[i]; + } + + assert(0); + return NULL; +} + + +static void +fixup_left(unsigned char *predict, + int width, + int stride, + unsigned int row, + enum prediction_mode mode) +{ + /* The left column of out-of-frame pixels is taken to be 129, + * unless we're doing DC_PRED, in which case we duplicate the + * above row, unless this is also row 0, in which case we use + * 129. + */ + unsigned char *left = predict - 1; + int i; + + if (mode == DC_PRED && row) + { + unsigned char *above = predict - stride; + + for (i = 0; i < width; i++) + { + *left = above[i]; + left += stride; + } + } + else + { + /* Need to re-set the above row, in case the above MB was + * DC_PRED. + */ + left -= stride; + + for (i = -1; i < width; i++) + { + *left = 129; + left += stride; + } + } +} + + +static void +fixup_above(unsigned char *predict, + int width, + int stride, + unsigned int col, + enum prediction_mode mode) +{ + /* The above row of out-of-frame pixels is taken to be 127, + * unless we're doing DC_PRED, in which case we duplicate the + * left col, unless this is also col 0, in which case we use + * 127. + */ + unsigned char *above = predict - stride; + int i; + + if (mode == DC_PRED && col) + { + unsigned char *left = predict - 1; + + for (i = 0; i < width; i++) + { + above[i] = *left; + left += stride; + } + } + else + /* Need to re-set the left col, in case the last MB was + * DC_PRED. + */ + memset(above - 1, 127, width + 1); + + memset(above + width, 127, 4); // for above-right subblock modes +} + + +void +vp8_dixie_predict_init(struct vp8_decoder_ctx *ctx) +{ + + int i; + unsigned char *this_frame_base; + + if (ctx->frame_hdr.frame_size_updated) + { + for (i = 0; i < NUM_REF_FRAMES; i++) + { + unsigned int w = ctx->mb_cols * 16 + BORDER_PIXELS * 2; + unsigned int h = ctx->mb_rows * 16 + BORDER_PIXELS * 2; + + vpx_img_free(&ctx->frame_strg[i].img); + ctx->frame_strg[i].ref_cnt = 0; + + if (!vpx_img_alloc(&ctx->frame_strg[i].img, + IMG_FMT_I420, w, h, 16)) + vpx_internal_error(&ctx->error, VPX_CODEC_MEM_ERROR, + "Failed to allocate %dx%d framebuffer", + w, h); + + vpx_img_set_rect(&ctx->frame_strg[i].img, + BORDER_PIXELS, BORDER_PIXELS, + ctx->frame_hdr.kf.w, ctx->frame_hdr.kf.h); + + } + } + + /* Find a free framebuffer to predict into */ + if (ctx->ref_frames[CURRENT_FRAME]) + release_ref_frame(ctx->ref_frames[CURRENT_FRAME]); + + ctx->ref_frames[CURRENT_FRAME] = find_free_ref_frame(ctx->frame_strg); + this_frame_base = ctx->ref_frames[CURRENT_FRAME]->img.img_data; + + /* Calculate offsets to the other reference frames */ + for (i = 0; i < NUM_REF_FRAMES; i++) + { + struct ref_cnt_img *ref = ctx->ref_frames[i]; + + ctx->ref_frame_offsets[i] = ref ? ref->img.img_data - this_frame_base + : 0; + } +} + + +void +vp8_dixie_predict_process_row(struct vp8_decoder_ctx *ctx, + unsigned int row, + unsigned int start_col, + unsigned int num_cols) +{ + unsigned char *y, *u, *v; + int stride, uv_stride; + struct mb_info *mbi; + unsigned int col; + short *coeffs; + + /* Adjust pointers based on row, start_col */ + stride = ctx->ref_frames[CURRENT_FRAME]->img.stride[PLANE_Y]; + uv_stride = ctx->ref_frames[CURRENT_FRAME]->img.stride[PLANE_U]; + y = ctx->ref_frames[CURRENT_FRAME]->img.planes[PLANE_Y]; + u = ctx->ref_frames[CURRENT_FRAME]->img.planes[PLANE_U]; + v = ctx->ref_frames[CURRENT_FRAME]->img.planes[PLANE_V]; + y += (stride * row + start_col) * 16; + u += (uv_stride * row + start_col) * 8; + v += (uv_stride * row + start_col) * 8; + mbi = ctx->mb_info_rows[row] + start_col; + coeffs = ctx->tokens[row & (ctx->token_hdr.partitions - 1)].coeffs; + + /* Fix up the out-of-frame pixels */ + if (start_col == 0) + { + fixup_left(y, 16, stride, row, mbi->base.y_mode); + fixup_left(u, 8, uv_stride, row, mbi->base.uv_mode); + fixup_left(v, 8, uv_stride, row, mbi->base.uv_mode); + + if (row == 0) + *(y - stride - 1) = 127; + } + + for (col = start_col; col < start_col + num_cols; col++) + { + if (row == 0) + { + fixup_above(y, 16, stride, col, mbi->base.y_mode); + fixup_above(u, 8, uv_stride, col, mbi->base.uv_mode); + fixup_above(v, 8, uv_stride, col, mbi->base.uv_mode); + } + + if (mbi->base.y_mode <= B_PRED) + { + predict_intra_luma(y, stride, mbi, ctx->ref_frame_offsets, coeffs); + predict_intra_chroma(u, v, uv_stride, mbi, ctx->ref_frame_offsets, + coeffs); + } + else + assert(0); + + /* Advance to the next macroblock */ + mbi++; + y += 16; + u += 8; + v += 8; + coeffs += 25 * 16; + } + + if (col == ctx->mb_cols) + { + /* Extend the last row by four pixels for intra prediction. This will + * be propagated later by copy_down. + */ + uint32_t *extend = (uint32_t *)(y + 15 * stride); + uint32_t val = 0x01010101 * y[-1 + 15 * stride]; + *extend = val; + } +} diff --git a/vp8/dixie/predict.h b/vp8/dixie/predict.h new file mode 100644 index 0000000000000000000000000000000000000000..95c118126a575cbad379d18cddc0d10d27c0acec --- /dev/null +++ b/vp8/dixie/predict.h @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ +#ifndef PREDICT_H +#define PREDICT_H + +void +vp8_dixie_predict_init(struct vp8_decoder_ctx *ctx); + + +void +vp8_dixie_predict_process_row(struct vp8_decoder_ctx *ctx, + unsigned int row, + unsigned int start_col, + unsigned int num_cols); + +#endif diff --git a/vp8/vp8dx.mk b/vp8/vp8dx.mk index 6d0eaa44a00f55b764b62261a89976a2bbf41b4a..8c80a0315153d6ba7be32e1dd0ff9a7856adad79 100644 --- a/vp8/vp8dx.mk +++ b/vp8/vp8dx.mk @@ -34,6 +34,8 @@ VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/modemv.h VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/modemv_data.h VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/tokens.c VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/tokens.h +VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/predict.c +VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/predict.h CFLAGS+=-I$(SRC_PATH_BARE)/$(VP8_PREFIX)decoder