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:
commit
7904dfed73
@ -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, ©);
|
||||||
mode = check_intra_pred4x4_mode_emuedge(intra4x4[x], mb_x + x, mb_y + y, ©);
|
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));
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user