1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

Merge commit 'ef8c93e2f18c624d0c266687e43ab99af7921dd3'

* commit 'ef8c93e2f18c624d0c266687e43ab99af7921dd3':
  vp8: drop support for real (non-emulated) edges

Conflicts:
	tests/fate/vpx.mak

Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2014-01-09 14:32:09 +01:00
commit 7904dfed73
2 changed files with 30 additions and 68 deletions

View File

@ -959,16 +959,6 @@ int check_tm_pred8x8_mode(int mode, int mb_x, int mb_y)
} }
} }
static av_always_inline
int check_intra_pred8x8_mode(int mode, int mb_x, int mb_y)
{
if (mode == DC_PRED8x8) {
return check_dc_pred8x8_mode(mode, mb_x, mb_y);
} else {
return mode;
}
}
static av_always_inline static av_always_inline
int check_intra_pred8x8_mode_emuedge(int mode, int mb_x, int mb_y) int check_intra_pred8x8_mode_emuedge(int mode, int mb_x, int mb_y)
{ {
@ -1033,23 +1023,18 @@ static av_always_inline
void intra_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3], void intra_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3],
VP8Macroblock *mb, int mb_x, int mb_y) VP8Macroblock *mb, int mb_x, int mb_y)
{ {
AVCodecContext *avctx = s->avctx;
int x, y, mode, nnz; int x, y, mode, nnz;
uint32_t tr; uint32_t tr;
// for the first row, we need to run xchg_mb_border to init the top edge to 127 // for the first row, we need to run xchg_mb_border to init the top edge to 127
// otherwise, skip it if we aren't going to deblock // otherwise, skip it if we aren't going to deblock
if (!(avctx->flags & CODEC_FLAG_EMU_EDGE && !mb_y) && (s->deblock_filter || !mb_y) && td->thread_nr == 0) if (mb_y && (s->deblock_filter || !mb_y) && td->thread_nr == 0)
xchg_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2], xchg_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2],
s->linesize, s->uvlinesize, mb_x, mb_y, s->mb_width, s->linesize, s->uvlinesize, mb_x, mb_y, s->mb_width,
s->filter.simple, 1); s->filter.simple, 1);
if (mb->mode < MODE_I4x4) { if (mb->mode < MODE_I4x4) {
if (avctx->flags & CODEC_FLAG_EMU_EDGE) { // tested mode = check_intra_pred8x8_mode_emuedge(mb->mode, mb_x, mb_y);
mode = check_intra_pred8x8_mode_emuedge(mb->mode, mb_x, mb_y);
} else {
mode = check_intra_pred8x8_mode(mb->mode, mb_x, mb_y);
}
s->hpc.pred16x16[mode](dst[0], s->linesize); s->hpc.pred16x16[mode](dst[0], s->linesize);
} else { } else {
uint8_t *ptr = dst[0]; uint8_t *ptr = dst[0];
@ -1062,7 +1047,7 @@ void intra_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3],
// if we're on the right edge of the frame, said edge is extended // if we're on the right edge of the frame, said edge is extended
// from the top macroblock // from the top macroblock
if (!(!mb_y && avctx->flags & CODEC_FLAG_EMU_EDGE) && if (mb_y &&
mb_x == s->mb_width-1) { mb_x == s->mb_width-1) {
tr = tr_right[-1]*0x01010101u; tr = tr_right[-1]*0x01010101u;
tr_right = (uint8_t *)&tr; tr_right = (uint8_t *)&tr;
@ -1078,41 +1063,37 @@ void intra_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3],
uint8_t *dst = ptr+4*x; uint8_t *dst = ptr+4*x;
DECLARE_ALIGNED(4, uint8_t, copy_dst)[5*8]; DECLARE_ALIGNED(4, uint8_t, copy_dst)[5*8];
if ((y == 0 || x == 3) && mb_y == 0 && avctx->flags & CODEC_FLAG_EMU_EDGE) { if ((y == 0 || x == 3) && mb_y == 0) {
topright = tr_top; topright = tr_top;
} else if (x == 3) } else if (x == 3)
topright = tr_right; topright = tr_right;
if (avctx->flags & CODEC_FLAG_EMU_EDGE) { // mb_x+x or mb_y+y is a hack but works mode = check_intra_pred4x4_mode_emuedge(intra4x4[x], mb_x + x, mb_y + y, &copy);
mode = check_intra_pred4x4_mode_emuedge(intra4x4[x], mb_x + x, mb_y + y, &copy); if (copy) {
if (copy) { dst = copy_dst + 12;
dst = copy_dst + 12; linesize = 8;
linesize = 8; if (!(mb_y + y)) {
if (!(mb_y + y)) { copy_dst[3] = 127U;
copy_dst[3] = 127U; AV_WN32A(copy_dst+4, 127U * 0x01010101U);
AV_WN32A(copy_dst+4, 127U * 0x01010101U); } else {
} else { AV_COPY32(copy_dst+4, ptr+4*x-s->linesize);
AV_COPY32(copy_dst+4, ptr+4*x-s->linesize);
if (!(mb_x + x)) {
copy_dst[3] = 129U;
} else {
copy_dst[3] = ptr[4*x-s->linesize-1];
}
}
if (!(mb_x + x)) { if (!(mb_x + x)) {
copy_dst[11] = copy_dst[3] = 129U;
copy_dst[19] =
copy_dst[27] =
copy_dst[35] = 129U;
} else { } else {
copy_dst[11] = ptr[4*x -1]; copy_dst[3] = ptr[4*x-s->linesize-1];
copy_dst[19] = ptr[4*x+s->linesize -1];
copy_dst[27] = ptr[4*x+s->linesize*2-1];
copy_dst[35] = ptr[4*x+s->linesize*3-1];
} }
} }
} else { if (!(mb_x + x)) {
mode = intra4x4[x]; copy_dst[11] =
copy_dst[19] =
copy_dst[27] =
copy_dst[35] = 129U;
} else {
copy_dst[11] = ptr[4*x -1];
copy_dst[19] = ptr[4*x+s->linesize -1];
copy_dst[27] = ptr[4*x+s->linesize*2-1];
copy_dst[35] = ptr[4*x+s->linesize*3-1];
}
} }
s->hpc.pred4x4[mode](dst, topright, linesize); s->hpc.pred4x4[mode](dst, topright, linesize);
if (copy) { if (copy) {
@ -1137,15 +1118,11 @@ void intra_predict(VP8Context *s, VP8ThreadData *td, uint8_t *dst[3],
} }
} }
if (avctx->flags & CODEC_FLAG_EMU_EDGE) { mode = check_intra_pred8x8_mode_emuedge(mb->chroma_pred_mode, mb_x, mb_y);
mode = check_intra_pred8x8_mode_emuedge(mb->chroma_pred_mode, mb_x, mb_y);
} else {
mode = check_intra_pred8x8_mode(mb->chroma_pred_mode, mb_x, mb_y);
}
s->hpc.pred8x8[mode](dst[1], s->uvlinesize); s->hpc.pred8x8[mode](dst[1], s->uvlinesize);
s->hpc.pred8x8[mode](dst[2], s->uvlinesize); s->hpc.pred8x8[mode](dst[2], s->uvlinesize);
if (!(avctx->flags & CODEC_FLAG_EMU_EDGE && !mb_y) && (s->deblock_filter || !mb_y) && td->thread_nr == 0) if (mb_y && (s->deblock_filter || !mb_y) && td->thread_nr == 0)
xchg_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2], xchg_mb_border(s->top_border[mb_x+1], dst[0], dst[1], dst[2],
s->linesize, s->uvlinesize, mb_x, mb_y, s->mb_width, s->linesize, s->uvlinesize, mb_x, mb_y, s->mb_width,
s->filter.simple, 0); s->filter.simple, 0);
@ -1671,7 +1648,7 @@ static void vp8_decode_mb_row_no_filter(AVCodecContext *avctx, void *tdata,
VP8Context *s = avctx->priv_data; VP8Context *s = avctx->priv_data;
VP8ThreadData *prev_td, *next_td, *td = &s->thread_data[threadnr]; VP8ThreadData *prev_td, *next_td, *td = &s->thread_data[threadnr];
int mb_y = td->thread_mb_pos>>16; int mb_y = td->thread_mb_pos>>16;
int i, y, mb_x, mb_xy = mb_y*s->mb_width; int mb_x, mb_xy = mb_y*s->mb_width;
int num_jobs = s->num_jobs; int num_jobs = s->num_jobs;
VP8Frame *curframe = s->curframe, *prev_frame = s->prev_frame; VP8Frame *curframe = s->curframe, *prev_frame = s->prev_frame;
VP56RangeCoder *c = &s->coeff_partition[mb_y & (s->num_coeff_partitions-1)]; VP56RangeCoder *c = &s->coeff_partition[mb_y & (s->num_coeff_partitions-1)];
@ -1699,15 +1676,6 @@ static void vp8_decode_mb_row_no_filter(AVCodecContext *avctx, void *tdata,
} }
memset(td->left_nnz, 0, sizeof(td->left_nnz)); memset(td->left_nnz, 0, sizeof(td->left_nnz));
// left edge of 129 for intra prediction
if (!(avctx->flags & CODEC_FLAG_EMU_EDGE)) {
for (i = 0; i < 3; i++)
for (y = 0; y < 16>>!!i; y++)
dst[i][y*curframe->tf.f->linesize[i]-1] = 129;
if (mb_y == 1) {
s->top_border[0][15] = s->top_border[0][23] = s->top_border[0][31] = 129;
}
}
s->mv_min.x = -MARGIN; s->mv_min.x = -MARGIN;
s->mv_max.x = ((s->mb_width - 1) << 6) + MARGIN; s->mv_max.x = ((s->mb_width - 1) << 6) + MARGIN;
@ -1959,12 +1927,6 @@ int ff_vp8_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
if (!s->mb_layout && s->keyframe) if (!s->mb_layout && s->keyframe)
memset(s->intra4x4_pred_mode_top, DC_PRED, s->mb_width*4); memset(s->intra4x4_pred_mode_top, DC_PRED, s->mb_width*4);
// top edge of 127 for intra prediction
if (!(avctx->flags & CODEC_FLAG_EMU_EDGE)) {
s->top_border[0][15] = s->top_border[0][23] = 127;
s->top_border[0][31] = 127;
memset(s->top_border[1], 127, s->mb_width*sizeof(*s->top_border));
}
memset(s->ref_count, 0, sizeof(s->ref_count)); memset(s->ref_count, 0, sizeof(s->ref_count));

View File

@ -54,7 +54,7 @@ fate-vp8-size-change$(1): REF = $(SRC_PATH)/tests/ref/fate/vp8-size-change
endef endef
$(eval $(call FATE_VP8_FULL)) $(eval $(call FATE_VP8_FULL))
$(eval $(call FATE_VP8_FULL,-emu-edge,-flags +emu_edge))
FATE_SAMPLES_AVCONV-$(CONFIG_VP8_DECODER) += $(FATE_VP8-yes) FATE_SAMPLES_AVCONV-$(CONFIG_VP8_DECODER) += $(FATE_VP8-yes)
fate-vp8: $(FATE_VP8-yes) fate-vp8: $(FATE_VP8-yes)