diff options
Diffstat (limited to 'vp8/common/postproc.c')
-rw-r--r-- | vp8/common/postproc.c | 219 |
1 files changed, 8 insertions, 211 deletions
diff --git a/vp8/common/postproc.c b/vp8/common/postproc.c index 280ce0294..50ed54309 100644 --- a/vp8/common/postproc.c +++ b/vp8/common/postproc.c @@ -17,7 +17,6 @@ #include "vpx_scale/yv12extend.h" #include "vpx_scale/vpxscale.h" #include "systemdependent.h" -#include "variance.h" #include <limits.h> #include <math.h> @@ -30,7 +29,6 @@ ( (0.439*(float)(t>>16)) - (0.368*(float)(t>>8&0xff)) - (0.071*(float)(t&0xff)) + 128) /* global constants */ -#define MFQE_PRECISION 4 #if CONFIG_POSTPROC_VISUALIZER static const unsigned char MB_PREDICTION_MODE_colors[MB_MODE_COUNT][3] = { @@ -362,6 +360,7 @@ void vp8_deblock(YV12_BUFFER_CONFIG *source, vp8_post_proc_down_and_across(source->v_buffer, post->v_buffer, source->uv_stride, post->uv_stride, source->uv_height, source->uv_width, ppl); } +#if !(CONFIG_TEMPORAL_DENOISING) void vp8_de_noise(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *post, int q, @@ -398,6 +397,7 @@ void vp8_de_noise(YV12_BUFFER_CONFIG *source, source->uv_width - 4, ppl); } +#endif double vp8_gaussian(double sigma, double mu, double x) { @@ -693,214 +693,7 @@ static void constrain_line (int x0, int *x1, int y0, int *y1, int width, int hei } } - -static void multiframe_quality_enhance_block -( - int blksize, /* Currently only values supported are 16, 8, 4 */ - int qcurr, - int qprev, - unsigned char *y, - unsigned char *u, - unsigned char *v, - int y_stride, - int uv_stride, - unsigned char *yd, - unsigned char *ud, - unsigned char *vd, - int yd_stride, - int uvd_stride -) -{ - static const unsigned char VP8_ZEROS[16]= - { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - }; - int blksizeby2 = blksize >> 1; - int qdiff = qcurr - qprev; - - int i, j; - unsigned char *yp; - unsigned char *ydp; - unsigned char *up; - unsigned char *udp; - unsigned char *vp; - unsigned char *vdp; - - unsigned int act, sse, sad, thr; - if (blksize == 16) - { - act = (vp8_variance16x16(yd, yd_stride, VP8_ZEROS, 0, &sse)+128)>>8; - sad = (vp8_sad16x16(y, y_stride, yd, yd_stride, INT_MAX)+128)>>8; - } - else if (blksize == 8) - { - act = (vp8_variance8x8(yd, yd_stride, VP8_ZEROS, 0, &sse)+32)>>6; - sad = (vp8_sad8x8(y, y_stride, yd, yd_stride, INT_MAX)+32)>>6; - } - else - { - act = (vp8_variance4x4(yd, yd_stride, VP8_ZEROS, 0, &sse)+8)>>4; - sad = (vp8_sad4x4(y, y_stride, yd, yd_stride, INT_MAX)+8)>>4; - } - /* thr = qdiff/8 + log2(act) + log4(qprev) */ - thr = (qdiff>>3); - while (act>>=1) thr++; - while (qprev>>=2) thr++; - if (sad < thr) - { - static const int roundoff = (1 << (MFQE_PRECISION - 1)); - int ifactor = (sad << MFQE_PRECISION) / thr; - ifactor >>= (qdiff >> 5); - // TODO: SIMD optimize this section - if (ifactor) - { - int icfactor = (1 << MFQE_PRECISION) - ifactor; - for (yp = y, ydp = yd, i = 0; i < blksize; ++i, yp += y_stride, ydp += yd_stride) - { - for (j = 0; j < blksize; ++j) - ydp[j] = (int)((yp[j] * ifactor + ydp[j] * icfactor + roundoff) >> MFQE_PRECISION); - } - for (up = u, udp = ud, i = 0; i < blksizeby2; ++i, up += uv_stride, udp += uvd_stride) - { - for (j = 0; j < blksizeby2; ++j) - udp[j] = (int)((up[j] * ifactor + udp[j] * icfactor + roundoff) >> MFQE_PRECISION); - } - for (vp = v, vdp = vd, i = 0; i < blksizeby2; ++i, vp += uv_stride, vdp += uvd_stride) - { - for (j = 0; j < blksizeby2; ++j) - vdp[j] = (int)((vp[j] * ifactor + vdp[j] * icfactor + roundoff) >> MFQE_PRECISION); - } - } - } - else - { - if (blksize == 16) - { - vp8_copy_mem16x16(y, y_stride, yd, yd_stride); - vp8_copy_mem8x8(u, uv_stride, ud, uvd_stride); - vp8_copy_mem8x8(v, uv_stride, vd, uvd_stride); - } - else if (blksize == 8) - { - vp8_copy_mem8x8(y, y_stride, yd, yd_stride); - for (up = u, udp = ud, i = 0; i < blksizeby2; ++i, up += uv_stride, udp += uvd_stride) - vpx_memcpy(udp, up, blksizeby2); - for (vp = v, vdp = vd, i = 0; i < blksizeby2; ++i, vp += uv_stride, vdp += uvd_stride) - vpx_memcpy(vdp, vp, blksizeby2); - } - else - { - for (yp = y, ydp = yd, i = 0; i < blksize; ++i, yp += y_stride, ydp += yd_stride) - vpx_memcpy(ydp, yp, blksize); - for (up = u, udp = ud, i = 0; i < blksizeby2; ++i, up += uv_stride, udp += uvd_stride) - vpx_memcpy(udp, up, blksizeby2); - for (vp = v, vdp = vd, i = 0; i < blksizeby2; ++i, vp += uv_stride, vdp += uvd_stride) - vpx_memcpy(vdp, vp, blksizeby2); - } - } -} - -void vp8_multiframe_quality_enhance -( - VP8_COMMON *cm -) -{ - YV12_BUFFER_CONFIG *show = cm->frame_to_show; - YV12_BUFFER_CONFIG *dest = &cm->post_proc_buffer; - - FRAME_TYPE frame_type = cm->frame_type; - /* Point at base of Mb MODE_INFO list has motion vectors etc */ - const MODE_INFO *mode_info_context = cm->mi; - int mb_row; - int mb_col; - int qcurr = cm->base_qindex; - int qprev = cm->postproc_state.last_base_qindex; - - unsigned char *y_ptr, *u_ptr, *v_ptr; - unsigned char *yd_ptr, *ud_ptr, *vd_ptr; - - /* Set up the buffer pointers */ - y_ptr = show->y_buffer; - u_ptr = show->u_buffer; - v_ptr = show->v_buffer; - yd_ptr = dest->y_buffer; - ud_ptr = dest->u_buffer; - vd_ptr = dest->v_buffer; - - /* postprocess each macro block */ - for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) - { - for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) - { - /* if motion is high there will likely be no benefit */ - if (((frame_type == INTER_FRAME && - abs(mode_info_context->mbmi.mv.as_mv.row) <= 10 && - abs(mode_info_context->mbmi.mv.as_mv.col) <= 10) || - (frame_type == KEY_FRAME))) - { - if (mode_info_context->mbmi.mode == B_PRED || mode_info_context->mbmi.mode == SPLITMV) - { - int i, j; - for (i=0; i<2; ++i) - for (j=0; j<2; ++j) - multiframe_quality_enhance_block(8, - qcurr, - qprev, - y_ptr + 8*(i*show->y_stride+j), - u_ptr + 4*(i*show->uv_stride+j), - v_ptr + 4*(i*show->uv_stride+j), - show->y_stride, - show->uv_stride, - yd_ptr + 8*(i*dest->y_stride+j), - ud_ptr + 4*(i*dest->uv_stride+j), - vd_ptr + 4*(i*dest->uv_stride+j), - dest->y_stride, - dest->uv_stride); - } - else - { - multiframe_quality_enhance_block(16, - qcurr, - qprev, - y_ptr, - u_ptr, - v_ptr, - show->y_stride, - show->uv_stride, - yd_ptr, - ud_ptr, - vd_ptr, - dest->y_stride, - dest->uv_stride); - - } - } - else - { - vp8_copy_mem16x16(y_ptr, show->y_stride, yd_ptr, dest->y_stride); - vp8_copy_mem8x8(u_ptr, show->uv_stride, ud_ptr, dest->uv_stride); - vp8_copy_mem8x8(v_ptr, show->uv_stride, vd_ptr, dest->uv_stride); - } - y_ptr += 16; - u_ptr += 8; - v_ptr += 8; - yd_ptr += 16; - ud_ptr += 8; - vd_ptr += 8; - mode_info_context++; /* step to next MB */ - } - - y_ptr += show->y_stride * 16 - 16 * cm->mb_cols; - u_ptr += show->uv_stride * 8 - 8 * cm->mb_cols; - v_ptr += show->uv_stride * 8 - 8 * cm->mb_cols; - yd_ptr += dest->y_stride * 16 - 16 * cm->mb_cols; - ud_ptr += dest->uv_stride * 8 - 8 * cm->mb_cols; - vd_ptr += dest->uv_stride * 8 - 8 * cm->mb_cols; - - mode_info_context++; /* Skip border mb */ - } -} - +#if CONFIG_POSTPROC int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *ppflags) { int q = oci->filter_level * 10 / 6; @@ -923,6 +716,7 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t dest->y_height = oci->Height; dest->uv_height = dest->y_height / 2; oci->postproc_state.last_base_qindex = oci->base_qindex; + oci->postproc_state.last_frame_valid = 1; return 0; } @@ -943,7 +737,7 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t // insure that postproc is set to all 0's so that post proc // doesn't pull random data in from edge - vpx_memset((&oci->post_proc_buffer_int)->buffer_alloc,126,(&oci->post_proc_buffer)->frame_size); + vpx_memset((&oci->post_proc_buffer_int)->buffer_alloc,128,(&oci->post_proc_buffer)->frame_size); } } @@ -953,6 +747,7 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t #endif if ((flags & VP8D_MFQE) && + oci->postproc_state.last_frame_valid && oci->current_video_frame >= 2 && oci->base_qindex - oci->postproc_state.last_base_qindex >= 10) { @@ -992,6 +787,7 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t vp8_yv12_copy_frame_ptr(oci->frame_to_show, &oci->post_proc_buffer); oci->postproc_state.last_base_qindex = oci->base_qindex; } + oci->postproc_state.last_frame_valid = 1; if (flags & VP8D_ADDNOISE) { @@ -1378,3 +1174,4 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t dest->uv_height = dest->y_height / 2; return 0; } +#endif |