From 84c0ec92ae793673b7584eaebc3cba09a2927dd5 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 24 Apr 2013 20:41:31 +0200 Subject: [PATCH] vc1dec: Implement intensity compensation for vc1_interp_mc() Signed-off-by: Michael Niedermayer --- libavcodec/vc1dec.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 050bd99405..048745d4e2 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -1918,7 +1918,7 @@ static void vc1_interp_mc(VC1Context *v) srcV = s->edge_emu_buffer + 18 * s->linesize; } - if (v->rangeredfrm || s->h_edge_pos < 22 || v_edge_pos < 22 + if (v->rangeredfrm || s->h_edge_pos < 22 || v_edge_pos < 22 || v->mv_mode == MV_PMODE_INTENSITY_COMP || (unsigned)(src_x - 1) > s->h_edge_pos - (mx & 3) - 16 - 3 || (unsigned)(src_y - 1) > v_edge_pos - (my & 3) - 16 - 3) { uint8_t *uvbuf = s->edge_emu_buffer + 19 * s->linesize; @@ -1957,6 +1957,30 @@ static void vc1_interp_mc(VC1Context *v) src2 += s->uvlinesize; } } + + if (v->mv_mode == MV_PMODE_INTENSITY_COMP) { + const uint8_t *luty = v->next_luty [v->ref_field_type[1]]; + const uint8_t *lutuv= v->next_lutuv[v->ref_field_type[1]]; + int i, j; + uint8_t *src, *src2; + + src = srcY; + for (j = 0; j < 17 + s->mspel * 2; j++) { + for (i = 0; i < 17 + s->mspel * 2; i++) + src[i] = luty[src[i]]; + src += s->linesize; + } + src = srcU; + src2 = srcV; + for (j = 0; j < 9; j++) { + for (i = 0; i < 9; i++) { + src[i] = lutuv[src[i]]; + src2[i] = lutuv[src2[i]]; + } + src += s->uvlinesize; + src2 += s->uvlinesize; + } + } srcY += s->mspel * (1 + s->linesize); }