diff options
author | Fritz Koenig <frkoenig@google.com> | 2010-10-27 13:20:56 -0700 |
---|---|---|
committer | Code Review <code-review@webmproject.org> | 2010-10-27 13:20:56 -0700 |
commit | 2b4913eb0d5722e38d9e28ef458e7e3318e87920 (patch) | |
tree | 2010f6fc93d8ba5acd80c3041d57912e84b3061e /vp8/common | |
parent | f26fe7d93bf72f5ce8548c6cfc8baf1f7a0af4fb (diff) | |
parent | a097e189641fcbbecc92661e2c87019845dc7b00 (diff) | |
download | libvpx-2b4913eb0d5722e38d9e28ef458e7e3318e87920.tar libvpx-2b4913eb0d5722e38d9e28ef458e7e3318e87920.tar.gz libvpx-2b4913eb0d5722e38d9e28ef458e7e3318e87920.tar.bz2 libvpx-2b4913eb0d5722e38d9e28ef458e7e3318e87920.zip |
Merge "postproc: Tweaks to line drawing and blending."
Diffstat (limited to 'vp8/common')
-rw-r--r-- | vp8/common/generic/systemdependent.c | 1 | ||||
-rw-r--r-- | vp8/common/postproc.c | 65 | ||||
-rw-r--r-- | vp8/common/postproc.h | 10 |
3 files changed, 55 insertions, 21 deletions
diff --git a/vp8/common/generic/systemdependent.c b/vp8/common/generic/systemdependent.c index 0c9b77e76..c624242a5 100644 --- a/vp8/common/generic/systemdependent.c +++ b/vp8/common/generic/systemdependent.c @@ -69,6 +69,7 @@ void vp8_machine_specific_config(VP8_COMMON *ctx) rtcd->postproc.across = vp8_mbpost_proc_across_ip_c; rtcd->postproc.downacross = vp8_post_proc_down_and_across_c; rtcd->postproc.addnoise = vp8_plane_add_noise_c; + rtcd->postproc.blend_mb = vp8_blend_mb_c; #endif #endif diff --git a/vp8/common/postproc.c b/vp8/common/postproc.c index 21e08638d..42e37da30 100644 --- a/vp8/common/postproc.c +++ b/vp8/common/postproc.c @@ -472,7 +472,10 @@ void vp8_plane_add_noise_c(unsigned char *Start, char *noise, } } -void vp8_blend_block_c (unsigned char *y, unsigned char *u, unsigned char *v, +// Blend the macro block with a solid colored square. Leave the +// edges unblended to give distinction to macro blocks in areas +// filled with the same color block. +void vp8_blend_mb_c (unsigned char *y, unsigned char *u, unsigned char *v, int y1, int u1, int v1, int alpha, int stride) { int i, j; @@ -480,63 +483,73 @@ void vp8_blend_block_c (unsigned char *y, unsigned char *u, unsigned char *v, int u1_const = u1*((1<<16)-alpha); int v1_const = v1*((1<<16)-alpha); - for (i = 0; i < 16; i++) + y += stride + 2; + for (i = 0; i < 14; i++) { - for (j = 0; j < 16; j++) + for (j = 0; j < 14; j++) { y[j] = (y[j]*alpha + y1_const)>>16; } y += stride; } - for (i = 0; i < 8; i++) + stride >>= 1; + + u += stride + 1; + v += stride + 1; + + for (i = 0; i < 6; i++) { - for (j = 0; j < 8; j++) + for (j = 0; j < 6; j++) { u[j] = (u[j]*alpha + u1_const)>>16; v[j] = (v[j]*alpha + v1_const)>>16; } - u += stride/2; - v += stride/2; + u += stride; + v += stride; } } static void constrain_line (int x0, int *x1, int y0, int *y1, int width, int height) { - int dx = *x1 - x0; - int dy = *y1 - y0; + int dx; + int dy; if (*x1 > width) { + dx = *x1 - x0; + dy = *y1 - y0; + *x1 = width; if (dy) *y1 = ((width-x0)*dy)/dx + y0; - dx = *x1 - x0; - dy = *y1 - y0; } if (*x1 < 0) { + dx = *x1 - x0; + dy = *y1 - y0; + *x1 = 0; if (dy) *y1 = ((0-x0)*dy)/dx + y0; - dx = *x1 - x0; - dy = *y1 - y0; } if (*y1 > height) { + dx = *x1 - x0; + dy = *y1 - y0; + *y1 = height; if (dx) *x1 = ((height-y0)*dx)/dy + x0; - dx = *x1 - x0; - dy = *y1 - y0; } if (*y1 < 0) { + dx = *x1 - x0; + dy = *y1 - y0; + *y1 = 0; if (dx) *x1 = ((0-y0)*dx)/dy + x0; - dx = *x1 - x0; - dy = *y1 - y0; } } @@ -747,8 +760,16 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, int deblock_l x1 = x0 + (mv->col >> 3); y1 = y0 + (mv->row >> 3); - constrain_line (x0, &x1, y0, &y1, width, height); - vp8_blit_line (x0, x1, y0, y1, y_buffer, y_stride); + if (x1 != x0 && y1 != y0) + { + constrain_line (x0, &x1, y0-1, &y1, width, height); + vp8_blit_line (x0, x1, y0-1, y1, y_buffer, y_stride); + + constrain_line (x0, &x1, y0+1, &y1, width, height); + vp8_blit_line (x0, x1, y0+1, y1, y_buffer, y_stride); + } + else + vp8_blit_line (x0, x1, y0, y1, y_buffer, y_stride); } mi++; } @@ -779,7 +800,8 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, int deblock_l U = MB_PREDICTION_MODE_colors[mi->mbmi.mode][1]; V = MB_PREDICTION_MODE_colors[mi->mbmi.mode][2]; - vp8_blend_block_c (&y_ptr[j], &u_ptr[j>>1], &v_ptr[j>>1], Y, U, V, 0xb000, y_stride); + POSTPROC_INVOKE(RTCD_VTABLE(oci), blend_mb) + (&y_ptr[j], &u_ptr[j>>1], &v_ptr[j>>1], Y, U, V, 0xc000, y_stride); mi++; } @@ -814,7 +836,8 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, int deblock_l U = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][1]; V = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][2]; - vp8_blend_block_c (&y_ptr[j], &u_ptr[j>>1], &v_ptr[j>>1], Y, U, V, 0xb000, y_stride); + POSTPROC_INVOKE(RTCD_VTABLE(oci), blend_mb) + (&y_ptr[j], &u_ptr[j>>1], &v_ptr[j>>1], Y, U, V, 0xc000, y_stride); mi++; } diff --git a/vp8/common/postproc.h b/vp8/common/postproc.h index 80337fc68..4a4493802 100644 --- a/vp8/common/postproc.h +++ b/vp8/common/postproc.h @@ -24,6 +24,10 @@ char whiteclamp[16], char bothclamp[16],\ unsigned int w, unsigned int h, int pitch) +#define prototype_postproc_blend_mb(sym)\ + void sym (unsigned char *y, unsigned char *u, unsigned char *v,\ + int y1, int u1, int v1, int alpha, int stride) + #if ARCH_X86 || ARCH_X86_64 #include "x86/postproc_x86.h" #endif @@ -48,16 +52,22 @@ extern prototype_postproc(vp8_postproc_downacross); #endif extern prototype_postproc_addnoise(vp8_postproc_addnoise); +#ifndef vp8_postproc_blend_mb +#define vp8_postproc_blend_mb vp8_blend_mb_c +#endif +extern prototype_postproc_blend_mb(vp8_postproc_blend_mb); typedef prototype_postproc((*vp8_postproc_fn_t)); typedef prototype_postproc_inplace((*vp8_postproc_inplace_fn_t)); typedef prototype_postproc_addnoise((*vp8_postproc_addnoise_fn_t)); +typedef prototype_postproc_blend_mb((*vp8_postproc_blend_mb_fn_t)); typedef struct { vp8_postproc_inplace_fn_t down; vp8_postproc_inplace_fn_t across; vp8_postproc_fn_t downacross; vp8_postproc_addnoise_fn_t addnoise; + vp8_postproc_blend_mb_fn_t blend_mb; } vp8_postproc_rtcd_vtable_t; #if CONFIG_RUNTIME_CPU_DETECT |