dixie: add intra prediction
This commit adds prediction functions for all the intra modes. Change-Id: I626e245318f96ee2ce0d965d7454ac7dce0cff79
This commit is contained in:
@@ -14,6 +14,7 @@
|
|||||||
#include "dequant_data.h"
|
#include "dequant_data.h"
|
||||||
#include "modemv.h"
|
#include "modemv.h"
|
||||||
#include "tokens.h"
|
#include "tokens.h"
|
||||||
|
#include "predict.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
@@ -374,12 +375,14 @@ decode_frame(struct vp8_decoder_ctx *ctx,
|
|||||||
|
|
||||||
vp8_dixie_modemv_init(ctx);
|
vp8_dixie_modemv_init(ctx);
|
||||||
vp8_dixie_tokens_init(ctx);
|
vp8_dixie_tokens_init(ctx);
|
||||||
|
vp8_dixie_predict_init(ctx);
|
||||||
dequant_init(ctx->dequant_factors, &ctx->segment_hdr, &ctx->quant_hdr);
|
dequant_init(ctx->dequant_factors, &ctx->segment_hdr, &ctx->quant_hdr);
|
||||||
|
|
||||||
for (row = 0, partition = 0; row < ctx->mb_rows; row++)
|
for (row = 0, partition = 0; row < ctx->mb_rows; row++)
|
||||||
{
|
{
|
||||||
vp8_dixie_modemv_process_row(ctx, &bool, row, 0, ctx->mb_cols);
|
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_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)
|
if (++partition == ctx->token_hdr.partitions)
|
||||||
partition = 0;
|
partition = 0;
|
||||||
|
@@ -142,7 +142,8 @@ enum reference_frame
|
|||||||
CURRENT_FRAME,
|
CURRENT_FRAME,
|
||||||
LAST_FRAME,
|
LAST_FRAME,
|
||||||
GOLDEN_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 ] */
|
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 vp8_decoder_ctx
|
||||||
{
|
{
|
||||||
struct vpx_internal_error_info error;
|
struct vpx_internal_error_info error;
|
||||||
@@ -249,6 +258,10 @@ struct vp8_decoder_ctx
|
|||||||
token_entropy_ctx_t *above_token_entropy_ctx;
|
token_entropy_ctx_t *above_token_entropy_ctx;
|
||||||
struct token_decoder tokens[MAX_PARTITIONS];
|
struct token_decoder tokens[MAX_PARTITIONS];
|
||||||
struct dequant_factors dequant_factors[MAX_MB_SEGMENTS];
|
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,
|
const unsigned char *data,
|
||||||
unsigned int sz);
|
unsigned int sz);
|
||||||
|
|
||||||
|
|
||||||
|
#define CLAMP_255(x) ((x)<0?0:((x)>255?255:(x)))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
805
vp8/dixie/predict.c
Normal file
805
vp8/dixie/predict.c
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
23
vp8/dixie/predict.h
Normal file
23
vp8/dixie/predict.h
Normal file
@@ -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
|
@@ -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/modemv_data.h
|
||||||
VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/tokens.c
|
VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/tokens.c
|
||||||
VP8_DX_SRCS-$(CONFIG_DIXIE) += dixie/tokens.h
|
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
|
CFLAGS+=-I$(SRC_PATH_BARE)/$(VP8_PREFIX)decoder
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user