1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_config.h" 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vp8_rtcd.h" 14233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_scale_rtcd.h" 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_scale/yv12config.h" 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "postproc.h" 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "common.h" 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "vpx_scale/vpx_scale.h" 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "systemdependent.h" 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <limits.h> 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <math.h> 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdlib.h> 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <stdio.h> 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan#define RGB_TO_YUV(t) \ 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan ( (0.257*(float)(t>>16)) + (0.504*(float)(t>>8&0xff)) + (0.098*(float)(t&0xff)) + 16), \ 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan (-(0.148*(float)(t>>16)) - (0.291*(float)(t>>8&0xff)) + (0.439*(float)(t&0xff)) + 128), \ 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan ( (0.439*(float)(t>>16)) - (0.368*(float)(t>>8&0xff)) - (0.071*(float)(t&0xff)) + 128) 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* global constants */ 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_POSTPROC_VISUALIZER 33233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const unsigned char MB_PREDICTION_MODE_colors[MB_MODE_COUNT][3] = 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x98FB98) }, /* PaleGreen */ 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x00FF00) }, /* Green */ 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xADFF2F) }, /* GreenYellow */ 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x228B22) }, /* ForestGreen */ 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x006400) }, /* DarkGreen */ 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x98F5FF) }, /* Cadet Blue */ 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x6CA6CD) }, /* Sky Blue */ 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x00008B) }, /* Dark blue */ 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x551A8B) }, /* Purple */ 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xFF0000) } /* Red */ 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan 47233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const unsigned char B_PREDICTION_MODE_colors[B_MODE_COUNT][3] = 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x6633ff) }, /* Purple */ 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xcc33ff) }, /* Magenta */ 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xff33cc) }, /* Pink */ 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xff3366) }, /* Coral */ 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x3366ff) }, /* Blue */ 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xed00f5) }, /* Dark Blue */ 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x2e00b8) }, /* Dark Purple */ 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xff6633) }, /* Orange */ 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x33ccff) }, /* Light Blue */ 58233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x8ab800) }, /* Green */ 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xffcc33) }, /* Light Orange */ 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x33ffcc) }, /* Aqua */ 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x66ff33) }, /* Light Green */ 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xccff33) }, /* Yellow */ 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 64233d2500723e5594f3e7c70896ffeeef32b9c950ywan 65233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic const unsigned char MV_REFERENCE_FRAME_colors[MAX_REF_FRAMES][3] = 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x00ff00) }, /* Blue */ 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0x0000ff) }, /* Green */ 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xffff00) }, /* Yellow */ 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan { RGB_TO_YUV(0xff0000) }, /* Red */ 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan 74233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst short vp8_rv[] = 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan 8, 5, 2, 2, 8, 12, 4, 9, 8, 3, 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, 3, 9, 0, 0, 0, 8, 3, 14, 4, 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan 10, 1, 11, 14, 1, 14, 9, 6, 12, 11, 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan 8, 6, 10, 0, 0, 8, 9, 0, 3, 14, 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan 8, 11, 13, 4, 2, 9, 0, 3, 9, 6, 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1, 2, 3, 14, 13, 1, 8, 2, 9, 7, 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3, 3, 1, 13, 13, 6, 6, 5, 2, 7, 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11, 9, 11, 8, 7, 3, 2, 0, 13, 13, 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan 14, 4, 12, 5, 12, 10, 8, 10, 13, 10, 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan 4, 14, 4, 10, 0, 8, 11, 1, 13, 7, 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan 7, 14, 6, 14, 13, 2, 13, 5, 4, 4, 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, 10, 0, 5, 13, 2, 12, 7, 11, 13, 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan 8, 0, 4, 10, 7, 2, 7, 2, 2, 5, 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3, 4, 7, 3, 3, 14, 14, 5, 9, 13, 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3, 14, 3, 6, 3, 0, 11, 8, 13, 1, 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan 13, 1, 12, 0, 10, 9, 7, 6, 2, 8, 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan 5, 2, 13, 7, 1, 13, 14, 7, 6, 7, 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan 9, 6, 10, 11, 7, 8, 7, 5, 14, 8, 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan 4, 4, 0, 8, 7, 10, 0, 8, 14, 11, 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3, 12, 5, 7, 14, 3, 14, 5, 2, 6, 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11, 12, 12, 8, 0, 11, 13, 1, 2, 0, 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan 5, 10, 14, 7, 8, 0, 4, 11, 0, 8, 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, 3, 10, 5, 8, 0, 11, 6, 7, 8, 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan 10, 7, 13, 9, 2, 5, 1, 5, 10, 2, 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan 4, 3, 5, 6, 10, 8, 9, 4, 11, 14, 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, 10, 0, 5, 13, 2, 12, 7, 11, 13, 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan 8, 0, 4, 10, 7, 2, 7, 2, 2, 5, 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3, 4, 7, 3, 3, 14, 14, 5, 9, 13, 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3, 14, 3, 6, 3, 0, 11, 8, 13, 1, 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan 13, 1, 12, 0, 10, 9, 7, 6, 2, 8, 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan 5, 2, 13, 7, 1, 13, 14, 7, 6, 7, 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan 9, 6, 10, 11, 7, 8, 7, 5, 14, 8, 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan 4, 4, 0, 8, 7, 10, 0, 8, 14, 11, 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3, 12, 5, 7, 14, 3, 14, 5, 2, 6, 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11, 12, 12, 8, 0, 11, 13, 1, 2, 0, 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan 5, 10, 14, 7, 8, 0, 4, 11, 0, 8, 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, 3, 10, 5, 8, 0, 11, 6, 7, 8, 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan 10, 7, 13, 9, 2, 5, 1, 5, 10, 2, 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan 4, 3, 5, 6, 10, 8, 9, 4, 11, 14, 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan 3, 8, 3, 7, 8, 5, 11, 4, 12, 3, 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11, 9, 14, 8, 14, 13, 4, 3, 1, 2, 117233d2500723e5594f3e7c70896ffeeef32b9c950ywan 14, 6, 5, 4, 4, 11, 4, 6, 2, 1, 118233d2500723e5594f3e7c70896ffeeef32b9c950ywan 5, 8, 8, 12, 13, 5, 14, 10, 12, 13, 119233d2500723e5594f3e7c70896ffeeef32b9c950ywan 0, 9, 5, 5, 11, 10, 13, 9, 10, 13, 120233d2500723e5594f3e7c70896ffeeef32b9c950ywan}; 121233d2500723e5594f3e7c70896ffeeef32b9c950ywan 122233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern void vp8_blit_text(const char *msg, unsigned char *address, const int pitch); 123233d2500723e5594f3e7c70896ffeeef32b9c950ywanextern void vp8_blit_line(int x0, int x1, int y0, int y1, unsigned char *image, const int pitch); 124233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*********************************************************************************************************** 125233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 126233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_post_proc_down_and_across_mb_row_c 127233d2500723e5594f3e7c70896ffeeef32b9c950ywan( 128233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *src_ptr, 129233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *dst_ptr, 130233d2500723e5594f3e7c70896ffeeef32b9c950ywan int src_pixels_per_line, 131233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dst_pixels_per_line, 132233d2500723e5594f3e7c70896ffeeef32b9c950ywan int cols, 133233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *f, 134233d2500723e5594f3e7c70896ffeeef32b9c950ywan int size 135233d2500723e5594f3e7c70896ffeeef32b9c950ywan) 136233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 137233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *p_src, *p_dst; 138233d2500723e5594f3e7c70896ffeeef32b9c950ywan int row; 139233d2500723e5594f3e7c70896ffeeef32b9c950ywan int col; 140233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char v; 141233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char d[4]; 142233d2500723e5594f3e7c70896ffeeef32b9c950ywan 143233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (row = 0; row < size; row++) 144233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 145233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* post_proc_down for one row */ 146233d2500723e5594f3e7c70896ffeeef32b9c950ywan p_src = src_ptr; 147233d2500723e5594f3e7c70896ffeeef32b9c950ywan p_dst = dst_ptr; 148233d2500723e5594f3e7c70896ffeeef32b9c950ywan 149233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (col = 0; col < cols; col++) 150233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 151233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char p_above2 = p_src[col - 2 * src_pixels_per_line]; 152233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char p_above1 = p_src[col - src_pixels_per_line]; 153233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char p_below1 = p_src[col + src_pixels_per_line]; 154233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char p_below2 = p_src[col + 2 * src_pixels_per_line]; 155233d2500723e5594f3e7c70896ffeeef32b9c950ywan 156233d2500723e5594f3e7c70896ffeeef32b9c950ywan v = p_src[col]; 157233d2500723e5594f3e7c70896ffeeef32b9c950ywan 158233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((abs(v - p_above2) < f[col]) && (abs(v - p_above1) < f[col]) 159233d2500723e5594f3e7c70896ffeeef32b9c950ywan && (abs(v - p_below1) < f[col]) && (abs(v - p_below2) < f[col])) 160233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 161233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char k1, k2, k3; 162233d2500723e5594f3e7c70896ffeeef32b9c950ywan k1 = (p_above2 + p_above1 + 1) >> 1; 163233d2500723e5594f3e7c70896ffeeef32b9c950ywan k2 = (p_below2 + p_below1 + 1) >> 1; 164233d2500723e5594f3e7c70896ffeeef32b9c950ywan k3 = (k1 + k2 + 1) >> 1; 165233d2500723e5594f3e7c70896ffeeef32b9c950ywan v = (k3 + v + 1) >> 1; 166233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 167233d2500723e5594f3e7c70896ffeeef32b9c950ywan 168233d2500723e5594f3e7c70896ffeeef32b9c950ywan p_dst[col] = v; 169233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 170233d2500723e5594f3e7c70896ffeeef32b9c950ywan 171233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* now post_proc_across */ 172233d2500723e5594f3e7c70896ffeeef32b9c950ywan p_src = dst_ptr; 173233d2500723e5594f3e7c70896ffeeef32b9c950ywan p_dst = dst_ptr; 174233d2500723e5594f3e7c70896ffeeef32b9c950ywan 175233d2500723e5594f3e7c70896ffeeef32b9c950ywan p_src[-2] = p_src[-1] = p_src[0]; 176233d2500723e5594f3e7c70896ffeeef32b9c950ywan p_src[cols] = p_src[cols + 1] = p_src[cols - 1]; 177233d2500723e5594f3e7c70896ffeeef32b9c950ywan 178233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (col = 0; col < cols; col++) 179233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 180233d2500723e5594f3e7c70896ffeeef32b9c950ywan v = p_src[col]; 181233d2500723e5594f3e7c70896ffeeef32b9c950ywan 182233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((abs(v - p_src[col - 2]) < f[col]) 183233d2500723e5594f3e7c70896ffeeef32b9c950ywan && (abs(v - p_src[col - 1]) < f[col]) 184233d2500723e5594f3e7c70896ffeeef32b9c950ywan && (abs(v - p_src[col + 1]) < f[col]) 185233d2500723e5594f3e7c70896ffeeef32b9c950ywan && (abs(v - p_src[col + 2]) < f[col])) 186233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 187233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char k1, k2, k3; 188233d2500723e5594f3e7c70896ffeeef32b9c950ywan k1 = (p_src[col - 2] + p_src[col - 1] + 1) >> 1; 189233d2500723e5594f3e7c70896ffeeef32b9c950ywan k2 = (p_src[col + 2] + p_src[col + 1] + 1) >> 1; 190233d2500723e5594f3e7c70896ffeeef32b9c950ywan k3 = (k1 + k2 + 1) >> 1; 191233d2500723e5594f3e7c70896ffeeef32b9c950ywan v = (k3 + v + 1) >> 1; 192233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 193233d2500723e5594f3e7c70896ffeeef32b9c950ywan 194233d2500723e5594f3e7c70896ffeeef32b9c950ywan d[col & 3] = v; 195233d2500723e5594f3e7c70896ffeeef32b9c950ywan 196233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (col >= 2) 197233d2500723e5594f3e7c70896ffeeef32b9c950ywan p_dst[col - 2] = d[(col - 2) & 3]; 198233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 199233d2500723e5594f3e7c70896ffeeef32b9c950ywan 200233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* handle the last two pixels */ 201233d2500723e5594f3e7c70896ffeeef32b9c950ywan p_dst[col - 2] = d[(col - 2) & 3]; 202233d2500723e5594f3e7c70896ffeeef32b9c950ywan p_dst[col - 1] = d[(col - 1) & 3]; 203233d2500723e5594f3e7c70896ffeeef32b9c950ywan 204233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* next row */ 205233d2500723e5594f3e7c70896ffeeef32b9c950ywan src_ptr += src_pixels_per_line; 206233d2500723e5594f3e7c70896ffeeef32b9c950ywan dst_ptr += dst_pixels_per_line; 207233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 208233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 209233d2500723e5594f3e7c70896ffeeef32b9c950ywan 210233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic int q2mbl(int x) 211233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 212233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (x < 20) x = 20; 213233d2500723e5594f3e7c70896ffeeef32b9c950ywan 214233d2500723e5594f3e7c70896ffeeef32b9c950ywan x = 50 + (x - 50) * 10 / 8; 215233d2500723e5594f3e7c70896ffeeef32b9c950ywan return x * x / 3; 216233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 217233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_mbpost_proc_across_ip_c(unsigned char *src, int pitch, int rows, int cols, int flimit) 218233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 219233d2500723e5594f3e7c70896ffeeef32b9c950ywan int r, c, i; 220233d2500723e5594f3e7c70896ffeeef32b9c950ywan 221233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *s = src; 222233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char d[16]; 223233d2500723e5594f3e7c70896ffeeef32b9c950ywan 224233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < rows; r++) 225233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 226233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sumsq = 0; 227233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sum = 0; 228233d2500723e5594f3e7c70896ffeeef32b9c950ywan 229233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = -8; i<0; i++) 230233d2500723e5594f3e7c70896ffeeef32b9c950ywan s[i]=s[0]; 231233d2500723e5594f3e7c70896ffeeef32b9c950ywan 232233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 17 avoids valgrind warning - we buffer values in c in d 233233d2500723e5594f3e7c70896ffeeef32b9c950ywan * and only write them when we've read 8 ahead... 234233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 235233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = cols; i<cols+17; i++) 236233d2500723e5594f3e7c70896ffeeef32b9c950ywan s[i]=s[cols-1]; 237233d2500723e5594f3e7c70896ffeeef32b9c950ywan 238233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = -8; i <= 6; i++) 239233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 240233d2500723e5594f3e7c70896ffeeef32b9c950ywan sumsq += s[i] * s[i]; 241233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum += s[i]; 242233d2500723e5594f3e7c70896ffeeef32b9c950ywan d[i+8] = 0; 243233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 244233d2500723e5594f3e7c70896ffeeef32b9c950ywan 245233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (c = 0; c < cols + 8; c++) 246233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 247233d2500723e5594f3e7c70896ffeeef32b9c950ywan int x = s[c+7] - s[c-8]; 248233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y = s[c+7] + s[c-8]; 249233d2500723e5594f3e7c70896ffeeef32b9c950ywan 250233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum += x; 251233d2500723e5594f3e7c70896ffeeef32b9c950ywan sumsq += x * y; 252233d2500723e5594f3e7c70896ffeeef32b9c950ywan 253233d2500723e5594f3e7c70896ffeeef32b9c950ywan d[c&15] = s[c]; 254233d2500723e5594f3e7c70896ffeeef32b9c950ywan 255233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (sumsq * 15 - sum * sum < flimit) 256233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 257233d2500723e5594f3e7c70896ffeeef32b9c950ywan d[c&15] = (8 + sum + s[c]) >> 4; 258233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 259233d2500723e5594f3e7c70896ffeeef32b9c950ywan 260233d2500723e5594f3e7c70896ffeeef32b9c950ywan s[c-8] = d[(c-8)&15]; 261233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 262233d2500723e5594f3e7c70896ffeeef32b9c950ywan 263233d2500723e5594f3e7c70896ffeeef32b9c950ywan s += pitch; 264233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 265233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 266233d2500723e5594f3e7c70896ffeeef32b9c950ywan 267233d2500723e5594f3e7c70896ffeeef32b9c950ywan 268233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols, int flimit) 269233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 270233d2500723e5594f3e7c70896ffeeef32b9c950ywan int r, c, i; 271233d2500723e5594f3e7c70896ffeeef32b9c950ywan const short *rv3 = &vp8_rv[63&rand()]; 272233d2500723e5594f3e7c70896ffeeef32b9c950ywan 273233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (c = 0; c < cols; c++ ) 274233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 275233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *s = &dst[c]; 276233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sumsq = 0; 277233d2500723e5594f3e7c70896ffeeef32b9c950ywan int sum = 0; 278233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char d[16]; 279233d2500723e5594f3e7c70896ffeeef32b9c950ywan const short *rv2 = rv3 + ((c * 17) & 127); 280233d2500723e5594f3e7c70896ffeeef32b9c950ywan 281233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = -8; i < 0; i++) 282233d2500723e5594f3e7c70896ffeeef32b9c950ywan s[i*pitch]=s[0]; 283233d2500723e5594f3e7c70896ffeeef32b9c950ywan 284233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* 17 avoids valgrind warning - we buffer values in c in d 285233d2500723e5594f3e7c70896ffeeef32b9c950ywan * and only write them when we've read 8 ahead... 286233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 287233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = rows; i < rows+17; i++) 288233d2500723e5594f3e7c70896ffeeef32b9c950ywan s[i*pitch]=s[(rows-1)*pitch]; 289233d2500723e5594f3e7c70896ffeeef32b9c950ywan 290233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = -8; i <= 6; i++) 291233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 292233d2500723e5594f3e7c70896ffeeef32b9c950ywan sumsq += s[i*pitch] * s[i*pitch]; 293233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum += s[i*pitch]; 294233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 295233d2500723e5594f3e7c70896ffeeef32b9c950ywan 296233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (r = 0; r < rows + 8; r++) 297233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 298233d2500723e5594f3e7c70896ffeeef32b9c950ywan sumsq += s[7*pitch] * s[ 7*pitch] - s[-8*pitch] * s[-8*pitch]; 299233d2500723e5594f3e7c70896ffeeef32b9c950ywan sum += s[7*pitch] - s[-8*pitch]; 300233d2500723e5594f3e7c70896ffeeef32b9c950ywan d[r&15] = s[0]; 301233d2500723e5594f3e7c70896ffeeef32b9c950ywan 302233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (sumsq * 15 - sum * sum < flimit) 303233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 304233d2500723e5594f3e7c70896ffeeef32b9c950ywan d[r&15] = (rv2[r&127] + sum + s[0]) >> 4; 305233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 306233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (r >= 8) 307233d2500723e5594f3e7c70896ffeeef32b9c950ywan s[-8*pitch] = d[(r-8)&15]; 308233d2500723e5594f3e7c70896ffeeef32b9c950ywan s += pitch; 309233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 310233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 311233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 312233d2500723e5594f3e7c70896ffeeef32b9c950ywan 313233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void vp8_de_mblock(YV12_BUFFER_CONFIG *post, 314233d2500723e5594f3e7c70896ffeeef32b9c950ywan int q) 315233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 316233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_mbpost_proc_across_ip(post->y_buffer, post->y_stride, post->y_height, 317233d2500723e5594f3e7c70896ffeeef32b9c950ywan post->y_width, q2mbl(q)); 318233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_mbpost_proc_down(post->y_buffer, post->y_stride, post->y_height, 319233d2500723e5594f3e7c70896ffeeef32b9c950ywan post->y_width, q2mbl(q)); 320233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 321233d2500723e5594f3e7c70896ffeeef32b9c950ywan 322233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_deblock(VP8_COMMON *cm, 323233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *source, 324233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *post, 325233d2500723e5594f3e7c70896ffeeef32b9c950ywan int q, 326233d2500723e5594f3e7c70896ffeeef32b9c950ywan int low_var_thresh, 327233d2500723e5594f3e7c70896ffeeef32b9c950ywan int flag) 328233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 329233d2500723e5594f3e7c70896ffeeef32b9c950ywan double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065; 330233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ppl = (int)(level + .5); 331233d2500723e5594f3e7c70896ffeeef32b9c950ywan 332233d2500723e5594f3e7c70896ffeeef32b9c950ywan const MODE_INFO *mode_info_context = cm->show_frame_mi; 333233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mbr, mbc; 334233d2500723e5594f3e7c70896ffeeef32b9c950ywan 335233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* The pixel thresholds are adjusted according to if or not the macroblock 336233d2500723e5594f3e7c70896ffeeef32b9c950ywan * is a skipped block. */ 337233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ylimits = cm->pp_limits_buffer; 338233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *uvlimits = cm->pp_limits_buffer + 16 * cm->mb_cols; 339233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void) low_var_thresh; 340233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void) flag; 341233d2500723e5594f3e7c70896ffeeef32b9c950ywan 342233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ppl > 0) 343233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 344233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (mbr = 0; mbr < cm->mb_rows; mbr++) 345233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 346233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *ylptr = ylimits; 347233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *uvlptr = uvlimits; 348233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (mbc = 0; mbc < cm->mb_cols; mbc++) 349233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 350233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char mb_ppl; 351233d2500723e5594f3e7c70896ffeeef32b9c950ywan 352233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mode_info_context->mbmi.mb_skip_coeff) 353233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_ppl = (unsigned char)ppl >> 1; 354233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 355233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_ppl = (unsigned char)ppl; 356233d2500723e5594f3e7c70896ffeeef32b9c950ywan 357233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(ylptr, mb_ppl, 16); 358233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(uvlptr, mb_ppl, 8); 359233d2500723e5594f3e7c70896ffeeef32b9c950ywan 360233d2500723e5594f3e7c70896ffeeef32b9c950ywan ylptr += 16; 361233d2500723e5594f3e7c70896ffeeef32b9c950ywan uvlptr += 8; 362233d2500723e5594f3e7c70896ffeeef32b9c950ywan mode_info_context++; 363233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 364233d2500723e5594f3e7c70896ffeeef32b9c950ywan mode_info_context++; 365233d2500723e5594f3e7c70896ffeeef32b9c950ywan 366233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_post_proc_down_and_across_mb_row( 367233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->y_buffer + 16 * mbr * source->y_stride, 368233d2500723e5594f3e7c70896ffeeef32b9c950ywan post->y_buffer + 16 * mbr * post->y_stride, source->y_stride, 369233d2500723e5594f3e7c70896ffeeef32b9c950ywan post->y_stride, source->y_width, ylimits, 16); 370233d2500723e5594f3e7c70896ffeeef32b9c950ywan 371233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_post_proc_down_and_across_mb_row( 372233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->u_buffer + 8 * mbr * source->uv_stride, 373233d2500723e5594f3e7c70896ffeeef32b9c950ywan post->u_buffer + 8 * mbr * post->uv_stride, source->uv_stride, 374233d2500723e5594f3e7c70896ffeeef32b9c950ywan post->uv_stride, source->uv_width, uvlimits, 8); 375233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_post_proc_down_and_across_mb_row( 376233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->v_buffer + 8 * mbr * source->uv_stride, 377233d2500723e5594f3e7c70896ffeeef32b9c950ywan post->v_buffer + 8 * mbr * post->uv_stride, source->uv_stride, 378233d2500723e5594f3e7c70896ffeeef32b9c950ywan post->uv_stride, source->uv_width, uvlimits, 8); 379233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 380233d2500723e5594f3e7c70896ffeeef32b9c950ywan } else 381233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 382233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_yv12_copy_frame(source, post); 383233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 384233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 385233d2500723e5594f3e7c70896ffeeef32b9c950ywan 386233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if !(CONFIG_TEMPORAL_DENOISING) 387233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_de_noise(VP8_COMMON *cm, 388233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *source, 389233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *post, 390233d2500723e5594f3e7c70896ffeeef32b9c950ywan int q, 391233d2500723e5594f3e7c70896ffeeef32b9c950ywan int low_var_thresh, 392233d2500723e5594f3e7c70896ffeeef32b9c950ywan int flag) 393233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 394233d2500723e5594f3e7c70896ffeeef32b9c950ywan double level = 6.0e-05 * q * q * q - .0067 * q * q + .306 * q + .0065; 395233d2500723e5594f3e7c70896ffeeef32b9c950ywan int ppl = (int)(level + .5); 396233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_rows = source->y_width >> 4; 397233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_cols = source->y_height >> 4; 398233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *limits = cm->pp_limits_buffer;; 399233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mbr, mbc; 400233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void) post; 401233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void) low_var_thresh; 402233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void) flag; 403233d2500723e5594f3e7c70896ffeeef32b9c950ywan 404233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset(limits, (unsigned char)ppl, 16 * mb_cols); 405233d2500723e5594f3e7c70896ffeeef32b9c950ywan 406233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* TODO: The original code don't filter the 2 outer rows and columns. */ 407233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (mbr = 0; mbr < mb_rows; mbr++) 408233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 409233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_post_proc_down_and_across_mb_row( 410233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->y_buffer + 16 * mbr * source->y_stride, 411233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->y_buffer + 16 * mbr * source->y_stride, 412233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->y_stride, source->y_stride, source->y_width, limits, 16); 413233d2500723e5594f3e7c70896ffeeef32b9c950ywan 414233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_post_proc_down_and_across_mb_row( 415233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->u_buffer + 8 * mbr * source->uv_stride, 416233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->u_buffer + 8 * mbr * source->uv_stride, 417233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->uv_stride, source->uv_stride, source->uv_width, limits, 8); 418233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_post_proc_down_and_across_mb_row( 419233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->v_buffer + 8 * mbr * source->uv_stride, 420233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->v_buffer + 8 * mbr * source->uv_stride, 421233d2500723e5594f3e7c70896ffeeef32b9c950ywan source->uv_stride, source->uv_stride, source->uv_width, limits, 8); 422233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 423233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 424233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 425233d2500723e5594f3e7c70896ffeeef32b9c950ywan 426233d2500723e5594f3e7c70896ffeeef32b9c950ywandouble vp8_gaussian(double sigma, double mu, double x) 427233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 428233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 1 / (sigma * sqrt(2.0 * 3.14159265)) * 429233d2500723e5594f3e7c70896ffeeef32b9c950ywan (exp(-(x - mu) * (x - mu) / (2 * sigma * sigma))); 430233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 431233d2500723e5594f3e7c70896ffeeef32b9c950ywan 432233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void fillrd(struct postproc_state *state, int q, int a) 433233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 434233d2500723e5594f3e7c70896ffeeef32b9c950ywan char char_dist[300]; 435233d2500723e5594f3e7c70896ffeeef32b9c950ywan 436233d2500723e5594f3e7c70896ffeeef32b9c950ywan double sigma; 437233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 438233d2500723e5594f3e7c70896ffeeef32b9c950ywan 439233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 440233d2500723e5594f3e7c70896ffeeef32b9c950ywan 441233d2500723e5594f3e7c70896ffeeef32b9c950ywan 442233d2500723e5594f3e7c70896ffeeef32b9c950ywan sigma = a + .5 + .6 * (63 - q) / 63.0; 443233d2500723e5594f3e7c70896ffeeef32b9c950ywan 444233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* set up a lookup table of 256 entries that matches 445233d2500723e5594f3e7c70896ffeeef32b9c950ywan * a gaussian distribution with sigma determined by q. 446233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 447233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 448233d2500723e5594f3e7c70896ffeeef32b9c950ywan int next, j; 449233d2500723e5594f3e7c70896ffeeef32b9c950ywan 450233d2500723e5594f3e7c70896ffeeef32b9c950ywan next = 0; 451233d2500723e5594f3e7c70896ffeeef32b9c950ywan 452233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = -32; i < 32; i++) 453233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 454233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int v = (int)(.5 + 256 * vp8_gaussian(sigma, 0, i)); 455233d2500723e5594f3e7c70896ffeeef32b9c950ywan 456233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (v) 457233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 458233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < v; j++) 459233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 460233d2500723e5594f3e7c70896ffeeef32b9c950ywan char_dist[next+j] = (char) i; 461233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 462233d2500723e5594f3e7c70896ffeeef32b9c950ywan 463233d2500723e5594f3e7c70896ffeeef32b9c950ywan next = next + j; 464233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 465233d2500723e5594f3e7c70896ffeeef32b9c950ywan 466233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 467233d2500723e5594f3e7c70896ffeeef32b9c950ywan 468233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (; next < 256; next++) 469233d2500723e5594f3e7c70896ffeeef32b9c950ywan char_dist[next] = 0; 470233d2500723e5594f3e7c70896ffeeef32b9c950ywan 471233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 472233d2500723e5594f3e7c70896ffeeef32b9c950ywan 473233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 3072; i++) 474233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 475233d2500723e5594f3e7c70896ffeeef32b9c950ywan state->noise[i] = char_dist[rand() & 0xff]; 476233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 477233d2500723e5594f3e7c70896ffeeef32b9c950ywan 478233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 16; i++) 479233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 480233d2500723e5594f3e7c70896ffeeef32b9c950ywan state->blackclamp[i] = -char_dist[0]; 481233d2500723e5594f3e7c70896ffeeef32b9c950ywan state->whiteclamp[i] = -char_dist[0]; 482233d2500723e5594f3e7c70896ffeeef32b9c950ywan state->bothclamp[i] = -2 * char_dist[0]; 483233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 484233d2500723e5594f3e7c70896ffeeef32b9c950ywan 485233d2500723e5594f3e7c70896ffeeef32b9c950ywan state->last_q = q; 486233d2500723e5594f3e7c70896ffeeef32b9c950ywan state->last_noise = a; 487233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 488233d2500723e5594f3e7c70896ffeeef32b9c950ywan 489233d2500723e5594f3e7c70896ffeeef32b9c950ywan/**************************************************************************** 490233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 491233d2500723e5594f3e7c70896ffeeef32b9c950ywan * ROUTINE : plane_add_noise_c 492233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 493233d2500723e5594f3e7c70896ffeeef32b9c950ywan * INPUTS : unsigned char *Start starting address of buffer to add gaussian 494233d2500723e5594f3e7c70896ffeeef32b9c950ywan * noise to 495233d2500723e5594f3e7c70896ffeeef32b9c950ywan * unsigned int Width width of plane 496233d2500723e5594f3e7c70896ffeeef32b9c950ywan * unsigned int Height height of plane 497233d2500723e5594f3e7c70896ffeeef32b9c950ywan * int Pitch distance between subsequent lines of frame 498233d2500723e5594f3e7c70896ffeeef32b9c950ywan * int q quantizer used to determine amount of noise 499233d2500723e5594f3e7c70896ffeeef32b9c950ywan * to add 500233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 501233d2500723e5594f3e7c70896ffeeef32b9c950ywan * OUTPUTS : None. 502233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 503233d2500723e5594f3e7c70896ffeeef32b9c950ywan * RETURNS : void. 504233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 505233d2500723e5594f3e7c70896ffeeef32b9c950ywan * FUNCTION : adds gaussian noise to a plane of pixels 506233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 507233d2500723e5594f3e7c70896ffeeef32b9c950ywan * SPECIAL NOTES : None. 508233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 509233d2500723e5594f3e7c70896ffeeef32b9c950ywan ****************************************************************************/ 510233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_plane_add_noise_c(unsigned char *Start, char *noise, 511233d2500723e5594f3e7c70896ffeeef32b9c950ywan char blackclamp[16], 512233d2500723e5594f3e7c70896ffeeef32b9c950ywan char whiteclamp[16], 513233d2500723e5594f3e7c70896ffeeef32b9c950ywan char bothclamp[16], 514233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int Width, unsigned int Height, int Pitch) 515233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 516233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned int i, j; 517233d2500723e5594f3e7c70896ffeeef32b9c950ywan (void)bothclamp; 518233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < Height; i++) 519233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 520233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *Pos = Start + i * Pitch; 521233d2500723e5594f3e7c70896ffeeef32b9c950ywan char *Ref = (char *)(noise + (rand() & 0xff)); 522233d2500723e5594f3e7c70896ffeeef32b9c950ywan 523233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < Width; j++) 524233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 525233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Pos[j] < blackclamp[0]) 526233d2500723e5594f3e7c70896ffeeef32b9c950ywan Pos[j] = blackclamp[0]; 527233d2500723e5594f3e7c70896ffeeef32b9c950ywan 528233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (Pos[j] > 255 + whiteclamp[0]) 529233d2500723e5594f3e7c70896ffeeef32b9c950ywan Pos[j] = 255 + whiteclamp[0]; 530233d2500723e5594f3e7c70896ffeeef32b9c950ywan 531233d2500723e5594f3e7c70896ffeeef32b9c950ywan Pos[j] += Ref[j]; 532233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 533233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 534233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 535233d2500723e5594f3e7c70896ffeeef32b9c950ywan 536233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Blend the macro block with a solid colored square. Leave the 537233d2500723e5594f3e7c70896ffeeef32b9c950ywan * edges unblended to give distinction to macro blocks in areas 538233d2500723e5594f3e7c70896ffeeef32b9c950ywan * filled with the same color block. 539233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 540233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_blend_mb_inner_c (unsigned char *y, unsigned char *u, unsigned char *v, 541233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y_1, int u_1, int v_1, int alpha, int stride) 542233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 543233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 544233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y1_const = y_1*((1<<16)-alpha); 545233d2500723e5594f3e7c70896ffeeef32b9c950ywan int u1_const = u_1*((1<<16)-alpha); 546233d2500723e5594f3e7c70896ffeeef32b9c950ywan int v1_const = v_1*((1<<16)-alpha); 547233d2500723e5594f3e7c70896ffeeef32b9c950ywan 548233d2500723e5594f3e7c70896ffeeef32b9c950ywan y += 2*stride + 2; 549233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 12; i++) 550233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 551233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 12; j++) 552233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 553233d2500723e5594f3e7c70896ffeeef32b9c950ywan y[j] = (y[j]*alpha + y1_const)>>16; 554233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 555233d2500723e5594f3e7c70896ffeeef32b9c950ywan y += stride; 556233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 557233d2500723e5594f3e7c70896ffeeef32b9c950ywan 558233d2500723e5594f3e7c70896ffeeef32b9c950ywan stride >>= 1; 559233d2500723e5594f3e7c70896ffeeef32b9c950ywan 560233d2500723e5594f3e7c70896ffeeef32b9c950ywan u += stride + 1; 561233d2500723e5594f3e7c70896ffeeef32b9c950ywan v += stride + 1; 562233d2500723e5594f3e7c70896ffeeef32b9c950ywan 563233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 6; i++) 564233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 565233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 6; j++) 566233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 567233d2500723e5594f3e7c70896ffeeef32b9c950ywan u[j] = (u[j]*alpha + u1_const)>>16; 568233d2500723e5594f3e7c70896ffeeef32b9c950ywan v[j] = (v[j]*alpha + v1_const)>>16; 569233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 570233d2500723e5594f3e7c70896ffeeef32b9c950ywan u += stride; 571233d2500723e5594f3e7c70896ffeeef32b9c950ywan v += stride; 572233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 573233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 574233d2500723e5594f3e7c70896ffeeef32b9c950ywan 575233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Blend only the edge of the macro block. Leave center 576233d2500723e5594f3e7c70896ffeeef32b9c950ywan * unblended to allow for other visualizations to be layered. 577233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 578233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_blend_mb_outer_c (unsigned char *y, unsigned char *u, unsigned char *v, 579233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y_1, int u_1, int v_1, int alpha, int stride) 580233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 581233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 582233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y1_const = y_1*((1<<16)-alpha); 583233d2500723e5594f3e7c70896ffeeef32b9c950ywan int u1_const = u_1*((1<<16)-alpha); 584233d2500723e5594f3e7c70896ffeeef32b9c950ywan int v1_const = v_1*((1<<16)-alpha); 585233d2500723e5594f3e7c70896ffeeef32b9c950ywan 586233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 2; i++) 587233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 588233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 16; j++) 589233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 590233d2500723e5594f3e7c70896ffeeef32b9c950ywan y[j] = (y[j]*alpha + y1_const)>>16; 591233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 592233d2500723e5594f3e7c70896ffeeef32b9c950ywan y += stride; 593233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 594233d2500723e5594f3e7c70896ffeeef32b9c950ywan 595233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 12; i++) 596233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 597233d2500723e5594f3e7c70896ffeeef32b9c950ywan y[0] = (y[0]*alpha + y1_const)>>16; 598233d2500723e5594f3e7c70896ffeeef32b9c950ywan y[1] = (y[1]*alpha + y1_const)>>16; 599233d2500723e5594f3e7c70896ffeeef32b9c950ywan y[14] = (y[14]*alpha + y1_const)>>16; 600233d2500723e5594f3e7c70896ffeeef32b9c950ywan y[15] = (y[15]*alpha + y1_const)>>16; 601233d2500723e5594f3e7c70896ffeeef32b9c950ywan y += stride; 602233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 603233d2500723e5594f3e7c70896ffeeef32b9c950ywan 604233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 2; i++) 605233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 606233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 16; j++) 607233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 608233d2500723e5594f3e7c70896ffeeef32b9c950ywan y[j] = (y[j]*alpha + y1_const)>>16; 609233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 610233d2500723e5594f3e7c70896ffeeef32b9c950ywan y += stride; 611233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 612233d2500723e5594f3e7c70896ffeeef32b9c950ywan 613233d2500723e5594f3e7c70896ffeeef32b9c950ywan stride >>= 1; 614233d2500723e5594f3e7c70896ffeeef32b9c950ywan 615233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 8; j++) 616233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 617233d2500723e5594f3e7c70896ffeeef32b9c950ywan u[j] = (u[j]*alpha + u1_const)>>16; 618233d2500723e5594f3e7c70896ffeeef32b9c950ywan v[j] = (v[j]*alpha + v1_const)>>16; 619233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 620233d2500723e5594f3e7c70896ffeeef32b9c950ywan u += stride; 621233d2500723e5594f3e7c70896ffeeef32b9c950ywan v += stride; 622233d2500723e5594f3e7c70896ffeeef32b9c950ywan 623233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 6; i++) 624233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 625233d2500723e5594f3e7c70896ffeeef32b9c950ywan u[0] = (u[0]*alpha + u1_const)>>16; 626233d2500723e5594f3e7c70896ffeeef32b9c950ywan v[0] = (v[0]*alpha + v1_const)>>16; 627233d2500723e5594f3e7c70896ffeeef32b9c950ywan 628233d2500723e5594f3e7c70896ffeeef32b9c950ywan u[7] = (u[7]*alpha + u1_const)>>16; 629233d2500723e5594f3e7c70896ffeeef32b9c950ywan v[7] = (v[7]*alpha + v1_const)>>16; 630233d2500723e5594f3e7c70896ffeeef32b9c950ywan 631233d2500723e5594f3e7c70896ffeeef32b9c950ywan u += stride; 632233d2500723e5594f3e7c70896ffeeef32b9c950ywan v += stride; 633233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 634233d2500723e5594f3e7c70896ffeeef32b9c950ywan 635233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 8; j++) 636233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 637233d2500723e5594f3e7c70896ffeeef32b9c950ywan u[j] = (u[j]*alpha + u1_const)>>16; 638233d2500723e5594f3e7c70896ffeeef32b9c950ywan v[j] = (v[j]*alpha + v1_const)>>16; 639233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 640233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 641233d2500723e5594f3e7c70896ffeeef32b9c950ywan 642233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_blend_b_c (unsigned char *y, unsigned char *u, unsigned char *v, 643233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y_1, int u_1, int v_1, int alpha, int stride) 644233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 645233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 646233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y1_const = y_1*((1<<16)-alpha); 647233d2500723e5594f3e7c70896ffeeef32b9c950ywan int u1_const = u_1*((1<<16)-alpha); 648233d2500723e5594f3e7c70896ffeeef32b9c950ywan int v1_const = v_1*((1<<16)-alpha); 649233d2500723e5594f3e7c70896ffeeef32b9c950ywan 650233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 4; i++) 651233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 652233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 4; j++) 653233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 654233d2500723e5594f3e7c70896ffeeef32b9c950ywan y[j] = (y[j]*alpha + y1_const)>>16; 655233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 656233d2500723e5594f3e7c70896ffeeef32b9c950ywan y += stride; 657233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 658233d2500723e5594f3e7c70896ffeeef32b9c950ywan 659233d2500723e5594f3e7c70896ffeeef32b9c950ywan stride >>= 1; 660233d2500723e5594f3e7c70896ffeeef32b9c950ywan 661233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 2; i++) 662233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 663233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < 2; j++) 664233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 665233d2500723e5594f3e7c70896ffeeef32b9c950ywan u[j] = (u[j]*alpha + u1_const)>>16; 666233d2500723e5594f3e7c70896ffeeef32b9c950ywan v[j] = (v[j]*alpha + v1_const)>>16; 667233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 668233d2500723e5594f3e7c70896ffeeef32b9c950ywan u += stride; 669233d2500723e5594f3e7c70896ffeeef32b9c950ywan v += stride; 670233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 671233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 672233d2500723e5594f3e7c70896ffeeef32b9c950ywan 673233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void constrain_line (int x_0, int *x_1, int y_0, int *y_1, int width, int height) 674233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 675233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dx; 676233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dy; 677233d2500723e5594f3e7c70896ffeeef32b9c950ywan 678233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (*x_1 > width) 679233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 680233d2500723e5594f3e7c70896ffeeef32b9c950ywan dx = *x_1 - x_0; 681233d2500723e5594f3e7c70896ffeeef32b9c950ywan dy = *y_1 - y_0; 682233d2500723e5594f3e7c70896ffeeef32b9c950ywan 683233d2500723e5594f3e7c70896ffeeef32b9c950ywan *x_1 = width; 684233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (dx) 685233d2500723e5594f3e7c70896ffeeef32b9c950ywan *y_1 = ((width-x_0)*dy)/dx + y_0; 686233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 687233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (*x_1 < 0) 688233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 689233d2500723e5594f3e7c70896ffeeef32b9c950ywan dx = *x_1 - x_0; 690233d2500723e5594f3e7c70896ffeeef32b9c950ywan dy = *y_1 - y_0; 691233d2500723e5594f3e7c70896ffeeef32b9c950ywan 692233d2500723e5594f3e7c70896ffeeef32b9c950ywan *x_1 = 0; 693233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (dx) 694233d2500723e5594f3e7c70896ffeeef32b9c950ywan *y_1 = ((0-x_0)*dy)/dx + y_0; 695233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 696233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (*y_1 > height) 697233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 698233d2500723e5594f3e7c70896ffeeef32b9c950ywan dx = *x_1 - x_0; 699233d2500723e5594f3e7c70896ffeeef32b9c950ywan dy = *y_1 - y_0; 700233d2500723e5594f3e7c70896ffeeef32b9c950ywan 701233d2500723e5594f3e7c70896ffeeef32b9c950ywan *y_1 = height; 702233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (dy) 703233d2500723e5594f3e7c70896ffeeef32b9c950ywan *x_1 = ((height-y_0)*dx)/dy + x_0; 704233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 705233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (*y_1 < 0) 706233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 707233d2500723e5594f3e7c70896ffeeef32b9c950ywan dx = *x_1 - x_0; 708233d2500723e5594f3e7c70896ffeeef32b9c950ywan dy = *y_1 - y_0; 709233d2500723e5594f3e7c70896ffeeef32b9c950ywan 710233d2500723e5594f3e7c70896ffeeef32b9c950ywan *y_1 = 0; 711233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (dy) 712233d2500723e5594f3e7c70896ffeeef32b9c950ywan *x_1 = ((0-y_0)*dx)/dy + x_0; 713233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 714233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 715233d2500723e5594f3e7c70896ffeeef32b9c950ywan 716233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_POSTPROC 717233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t *ppflags) 718233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 719233d2500723e5594f3e7c70896ffeeef32b9c950ywan int q = oci->filter_level * 10 / 6; 720233d2500723e5594f3e7c70896ffeeef32b9c950ywan int flags = ppflags->post_proc_flag; 721233d2500723e5594f3e7c70896ffeeef32b9c950ywan int deblock_level = ppflags->deblocking_level; 722233d2500723e5594f3e7c70896ffeeef32b9c950ywan int noise_level = ppflags->noise_level; 723233d2500723e5594f3e7c70896ffeeef32b9c950ywan 724233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!oci->frame_to_show) 725233d2500723e5594f3e7c70896ffeeef32b9c950ywan return -1; 726233d2500723e5594f3e7c70896ffeeef32b9c950ywan 727233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (q > 63) 728233d2500723e5594f3e7c70896ffeeef32b9c950ywan q = 63; 729233d2500723e5594f3e7c70896ffeeef32b9c950ywan 730233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!flags) 731233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 732233d2500723e5594f3e7c70896ffeeef32b9c950ywan *dest = *oci->frame_to_show; 733233d2500723e5594f3e7c70896ffeeef32b9c950ywan 734233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* handle problem with extending borders */ 735233d2500723e5594f3e7c70896ffeeef32b9c950ywan dest->y_width = oci->Width; 736233d2500723e5594f3e7c70896ffeeef32b9c950ywan dest->y_height = oci->Height; 737233d2500723e5594f3e7c70896ffeeef32b9c950ywan dest->uv_height = dest->y_height / 2; 738233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.last_base_qindex = oci->base_qindex; 739233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.last_frame_valid = 1; 740233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 0; 741233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 742233d2500723e5594f3e7c70896ffeeef32b9c950ywan 743233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Allocate post_proc_buffer_int if needed */ 744233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((flags & VP8D_MFQE) && !oci->post_proc_buffer_int_used) 745233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 746233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((flags & VP8D_DEBLOCK) || (flags & VP8D_DEMACROBLOCK)) 747233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 748233d2500723e5594f3e7c70896ffeeef32b9c950ywan int width = (oci->Width + 15) & ~15; 749233d2500723e5594f3e7c70896ffeeef32b9c950ywan int height = (oci->Height + 15) & ~15; 750233d2500723e5594f3e7c70896ffeeef32b9c950ywan 751233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (vp8_yv12_alloc_frame_buffer(&oci->post_proc_buffer_int, 752233d2500723e5594f3e7c70896ffeeef32b9c950ywan width, height, VP8BORDERINPIXELS)) 753233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_internal_error(&oci->error, VPX_CODEC_MEM_ERROR, 754233d2500723e5594f3e7c70896ffeeef32b9c950ywan "Failed to allocate MFQE framebuffer"); 755233d2500723e5594f3e7c70896ffeeef32b9c950ywan 756233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->post_proc_buffer_int_used = 1; 757233d2500723e5594f3e7c70896ffeeef32b9c950ywan 758233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* insure that postproc is set to all 0's so that post proc 759233d2500723e5594f3e7c70896ffeeef32b9c950ywan * doesn't pull random data in from edge 760233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 761233d2500723e5594f3e7c70896ffeeef32b9c950ywan vpx_memset((&oci->post_proc_buffer_int)->buffer_alloc,128,(&oci->post_proc_buffer)->frame_size); 762233d2500723e5594f3e7c70896ffeeef32b9c950ywan 763233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 764233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 765233d2500723e5594f3e7c70896ffeeef32b9c950ywan 766233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_clear_system_state(); 767233d2500723e5594f3e7c70896ffeeef32b9c950ywan 768233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((flags & VP8D_MFQE) && 769233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.last_frame_valid && 770233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->current_video_frame >= 2 && 771233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.last_base_qindex < 60 && 772233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->base_qindex - oci->postproc_state.last_base_qindex >= 20) 773233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 774233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_multiframe_quality_enhance(oci); 775233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (((flags & VP8D_DEBLOCK) || (flags & VP8D_DEMACROBLOCK)) && 776233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->post_proc_buffer_int_used) 777233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 778233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_yv12_copy_frame(&oci->post_proc_buffer, &oci->post_proc_buffer_int); 779233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8D_DEMACROBLOCK) 780233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 781233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_deblock(oci, &oci->post_proc_buffer_int, &oci->post_proc_buffer, 782233d2500723e5594f3e7c70896ffeeef32b9c950ywan q + (deblock_level - 5) * 10, 1, 0); 783233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_de_mblock(&oci->post_proc_buffer, 784233d2500723e5594f3e7c70896ffeeef32b9c950ywan q + (deblock_level - 5) * 10); 785233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 786233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (flags & VP8D_DEBLOCK) 787233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 788233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_deblock(oci, &oci->post_proc_buffer_int, &oci->post_proc_buffer, 789233d2500723e5594f3e7c70896ffeeef32b9c950ywan q, 1, 0); 790233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 791233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 792233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Move partially towards the base q of the previous frame */ 793233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.last_base_qindex = (3*oci->postproc_state.last_base_qindex + oci->base_qindex)>>2; 794233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 795233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (flags & VP8D_DEMACROBLOCK) 796233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 797233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_deblock(oci, oci->frame_to_show, &oci->post_proc_buffer, 798233d2500723e5594f3e7c70896ffeeef32b9c950ywan q + (deblock_level - 5) * 10, 1, 0); 799233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_de_mblock(&oci->post_proc_buffer, q + (deblock_level - 5) * 10); 800233d2500723e5594f3e7c70896ffeeef32b9c950ywan 801233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.last_base_qindex = oci->base_qindex; 802233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 803233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (flags & VP8D_DEBLOCK) 804233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 805233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_deblock(oci, oci->frame_to_show, &oci->post_proc_buffer, 806233d2500723e5594f3e7c70896ffeeef32b9c950ywan q, 1, 0); 807233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.last_base_qindex = oci->base_qindex; 808233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 809233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 810233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 811233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_yv12_copy_frame(oci->frame_to_show, &oci->post_proc_buffer); 812233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.last_base_qindex = oci->base_qindex; 813233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 814233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.last_frame_valid = 1; 815233d2500723e5594f3e7c70896ffeeef32b9c950ywan 816233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8D_ADDNOISE) 817233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 818233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (oci->postproc_state.last_q != q 819233d2500723e5594f3e7c70896ffeeef32b9c950ywan || oci->postproc_state.last_noise != noise_level) 820233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 821233d2500723e5594f3e7c70896ffeeef32b9c950ywan fillrd(&oci->postproc_state, 63 - q, noise_level); 822233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 823233d2500723e5594f3e7c70896ffeeef32b9c950ywan 824233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_plane_add_noise 825233d2500723e5594f3e7c70896ffeeef32b9c950ywan (oci->post_proc_buffer.y_buffer, 826233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.noise, 827233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.blackclamp, 828233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.whiteclamp, 829233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->postproc_state.bothclamp, 830233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->post_proc_buffer.y_width, oci->post_proc_buffer.y_height, 831233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->post_proc_buffer.y_stride); 832233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 833233d2500723e5594f3e7c70896ffeeef32b9c950ywan 834233d2500723e5594f3e7c70896ffeeef32b9c950ywan#if CONFIG_POSTPROC_VISUALIZER 835233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8D_DEBUG_TXT_FRAME_INFO) 836233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 837233d2500723e5594f3e7c70896ffeeef32b9c950ywan char message[512]; 838233d2500723e5594f3e7c70896ffeeef32b9c950ywan sprintf(message, "F%1dG%1dQ%3dF%3dP%d_s%dx%d", 839233d2500723e5594f3e7c70896ffeeef32b9c950ywan (oci->frame_type == KEY_FRAME), 840233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->refresh_golden_frame, 841233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->base_qindex, 842233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->filter_level, 843233d2500723e5594f3e7c70896ffeeef32b9c950ywan flags, 844233d2500723e5594f3e7c70896ffeeef32b9c950ywan oci->mb_cols, oci->mb_rows); 845233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_text(message, oci->post_proc_buffer.y_buffer, oci->post_proc_buffer.y_stride); 846233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 847233d2500723e5594f3e7c70896ffeeef32b9c950ywan 848233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8D_DEBUG_TXT_MBLK_MODES) 849233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 850233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 851233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *y_ptr; 852233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer; 853233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_rows = post->y_height >> 4; 854233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_cols = post->y_width >> 4; 855233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_index = 0; 856233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_INFO *mi = oci->mi; 857233d2500723e5594f3e7c70896ffeeef32b9c950ywan 858233d2500723e5594f3e7c70896ffeeef32b9c950ywan y_ptr = post->y_buffer + 4 * post->y_stride + 4; 859233d2500723e5594f3e7c70896ffeeef32b9c950ywan 860233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* vp8_filter each macro block */ 861233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < mb_rows; i++) 862233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 863233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < mb_cols; j++) 864233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 865233d2500723e5594f3e7c70896ffeeef32b9c950ywan char zz[4]; 866233d2500723e5594f3e7c70896ffeeef32b9c950ywan 867233d2500723e5594f3e7c70896ffeeef32b9c950ywan sprintf(zz, "%c", mi[mb_index].mbmi.mode + 'a'); 868233d2500723e5594f3e7c70896ffeeef32b9c950ywan 869233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_text(zz, y_ptr, post->y_stride); 870233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_index ++; 871233d2500723e5594f3e7c70896ffeeef32b9c950ywan y_ptr += 16; 872233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 873233d2500723e5594f3e7c70896ffeeef32b9c950ywan 874233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_index ++; /* border */ 875233d2500723e5594f3e7c70896ffeeef32b9c950ywan y_ptr += post->y_stride * 16 - post->y_width; 876233d2500723e5594f3e7c70896ffeeef32b9c950ywan 877233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 878233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 879233d2500723e5594f3e7c70896ffeeef32b9c950ywan 880233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8D_DEBUG_TXT_DC_DIFF) 881233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 882233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i, j; 883233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *y_ptr; 884233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer; 885233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_rows = post->y_height >> 4; 886233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_cols = post->y_width >> 4; 887233d2500723e5594f3e7c70896ffeeef32b9c950ywan int mb_index = 0; 888233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_INFO *mi = oci->mi; 889233d2500723e5594f3e7c70896ffeeef32b9c950ywan 890233d2500723e5594f3e7c70896ffeeef32b9c950ywan y_ptr = post->y_buffer + 4 * post->y_stride + 4; 891233d2500723e5594f3e7c70896ffeeef32b9c950ywan 892233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* vp8_filter each macro block */ 893233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < mb_rows; i++) 894233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 895233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (j = 0; j < mb_cols; j++) 896233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 897233d2500723e5594f3e7c70896ffeeef32b9c950ywan char zz[4]; 898233d2500723e5594f3e7c70896ffeeef32b9c950ywan int dc_diff = !(mi[mb_index].mbmi.mode != B_PRED && 899233d2500723e5594f3e7c70896ffeeef32b9c950ywan mi[mb_index].mbmi.mode != SPLITMV && 900233d2500723e5594f3e7c70896ffeeef32b9c950ywan mi[mb_index].mbmi.mb_skip_coeff); 901233d2500723e5594f3e7c70896ffeeef32b9c950ywan 902233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (oci->frame_type == KEY_FRAME) 903233d2500723e5594f3e7c70896ffeeef32b9c950ywan sprintf(zz, "a"); 904233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 905233d2500723e5594f3e7c70896ffeeef32b9c950ywan sprintf(zz, "%c", dc_diff + '0'); 906233d2500723e5594f3e7c70896ffeeef32b9c950ywan 907233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_text(zz, y_ptr, post->y_stride); 908233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_index ++; 909233d2500723e5594f3e7c70896ffeeef32b9c950ywan y_ptr += 16; 910233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 911233d2500723e5594f3e7c70896ffeeef32b9c950ywan 912233d2500723e5594f3e7c70896ffeeef32b9c950ywan mb_index ++; /* border */ 913233d2500723e5594f3e7c70896ffeeef32b9c950ywan y_ptr += post->y_stride * 16 - post->y_width; 914233d2500723e5594f3e7c70896ffeeef32b9c950ywan 915233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 916233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 917233d2500723e5594f3e7c70896ffeeef32b9c950ywan 918233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (flags & VP8D_DEBUG_TXT_RATE_INFO) 919233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 920233d2500723e5594f3e7c70896ffeeef32b9c950ywan char message[512]; 921233d2500723e5594f3e7c70896ffeeef32b9c950ywan sprintf(message, "Bitrate: %10.2f framerate: %10.2f ", oci->bitrate, oci->framerate); 922233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_text(message, oci->post_proc_buffer.y_buffer, oci->post_proc_buffer.y_stride); 923233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 924233d2500723e5594f3e7c70896ffeeef32b9c950ywan 925233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Draw motion vectors */ 926233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((flags & VP8D_DEBUG_DRAW_MV) && ppflags->display_mv_flag) 927233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 928233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer; 929233d2500723e5594f3e7c70896ffeeef32b9c950ywan int width = post->y_width; 930233d2500723e5594f3e7c70896ffeeef32b9c950ywan int height = post->y_height; 931233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *y_buffer = oci->post_proc_buffer.y_buffer; 932233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y_stride = oci->post_proc_buffer.y_stride; 933233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_INFO *mi = oci->mi; 934233d2500723e5594f3e7c70896ffeeef32b9c950ywan int x0, y0; 935233d2500723e5594f3e7c70896ffeeef32b9c950ywan 936233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (y0 = 0; y0 < height; y0 += 16) 937233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 938233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (x0 = 0; x0 < width; x0 += 16) 939233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 940233d2500723e5594f3e7c70896ffeeef32b9c950ywan int x1, y1; 941233d2500723e5594f3e7c70896ffeeef32b9c950ywan 942233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (!(ppflags->display_mv_flag & (1<<mi->mbmi.mode))) 943233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 944233d2500723e5594f3e7c70896ffeeef32b9c950ywan mi++; 945233d2500723e5594f3e7c70896ffeeef32b9c950ywan continue; 946233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 947233d2500723e5594f3e7c70896ffeeef32b9c950ywan 948233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mi->mbmi.mode == SPLITMV) 949233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 950233d2500723e5594f3e7c70896ffeeef32b9c950ywan switch (mi->mbmi.partitioning) 951233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 952233d2500723e5594f3e7c70896ffeeef32b9c950ywan case 0 : /* mv_top_bottom */ 953233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 954233d2500723e5594f3e7c70896ffeeef32b9c950ywan union b_mode_info *bmi = &mi->bmi[0]; 955233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV *mv = &bmi->mv.as_mv; 956233d2500723e5594f3e7c70896ffeeef32b9c950ywan 957233d2500723e5594f3e7c70896ffeeef32b9c950ywan x1 = x0 + 8 + (mv->col >> 3); 958233d2500723e5594f3e7c70896ffeeef32b9c950ywan y1 = y0 + 4 + (mv->row >> 3); 959233d2500723e5594f3e7c70896ffeeef32b9c950ywan 960233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (x0+8, &x1, y0+4, &y1, width, height); 961233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (x0+8, x1, y0+4, y1, y_buffer, y_stride); 962233d2500723e5594f3e7c70896ffeeef32b9c950ywan 963233d2500723e5594f3e7c70896ffeeef32b9c950ywan bmi = &mi->bmi[8]; 964233d2500723e5594f3e7c70896ffeeef32b9c950ywan 965233d2500723e5594f3e7c70896ffeeef32b9c950ywan x1 = x0 + 8 + (mv->col >> 3); 966233d2500723e5594f3e7c70896ffeeef32b9c950ywan y1 = y0 +12 + (mv->row >> 3); 967233d2500723e5594f3e7c70896ffeeef32b9c950ywan 968233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (x0+8, &x1, y0+12, &y1, width, height); 969233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (x0+8, x1, y0+12, y1, y_buffer, y_stride); 970233d2500723e5594f3e7c70896ffeeef32b9c950ywan 971233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 972233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 973233d2500723e5594f3e7c70896ffeeef32b9c950ywan case 1 : /* mv_left_right */ 974233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 975233d2500723e5594f3e7c70896ffeeef32b9c950ywan union b_mode_info *bmi = &mi->bmi[0]; 976233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV *mv = &bmi->mv.as_mv; 977233d2500723e5594f3e7c70896ffeeef32b9c950ywan 978233d2500723e5594f3e7c70896ffeeef32b9c950ywan x1 = x0 + 4 + (mv->col >> 3); 979233d2500723e5594f3e7c70896ffeeef32b9c950ywan y1 = y0 + 8 + (mv->row >> 3); 980233d2500723e5594f3e7c70896ffeeef32b9c950ywan 981233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (x0+4, &x1, y0+8, &y1, width, height); 982233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (x0+4, x1, y0+8, y1, y_buffer, y_stride); 983233d2500723e5594f3e7c70896ffeeef32b9c950ywan 984233d2500723e5594f3e7c70896ffeeef32b9c950ywan bmi = &mi->bmi[2]; 985233d2500723e5594f3e7c70896ffeeef32b9c950ywan 986233d2500723e5594f3e7c70896ffeeef32b9c950ywan x1 = x0 +12 + (mv->col >> 3); 987233d2500723e5594f3e7c70896ffeeef32b9c950ywan y1 = y0 + 8 + (mv->row >> 3); 988233d2500723e5594f3e7c70896ffeeef32b9c950ywan 989233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (x0+12, &x1, y0+8, &y1, width, height); 990233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (x0+12, x1, y0+8, y1, y_buffer, y_stride); 991233d2500723e5594f3e7c70896ffeeef32b9c950ywan 992233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 993233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 994233d2500723e5594f3e7c70896ffeeef32b9c950ywan case 2 : /* mv_quarters */ 995233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 996233d2500723e5594f3e7c70896ffeeef32b9c950ywan union b_mode_info *bmi = &mi->bmi[0]; 997233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV *mv = &bmi->mv.as_mv; 998233d2500723e5594f3e7c70896ffeeef32b9c950ywan 999233d2500723e5594f3e7c70896ffeeef32b9c950ywan x1 = x0 + 4 + (mv->col >> 3); 1000233d2500723e5594f3e7c70896ffeeef32b9c950ywan y1 = y0 + 4 + (mv->row >> 3); 1001233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1002233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (x0+4, &x1, y0+4, &y1, width, height); 1003233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (x0+4, x1, y0+4, y1, y_buffer, y_stride); 1004233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1005233d2500723e5594f3e7c70896ffeeef32b9c950ywan bmi = &mi->bmi[2]; 1006233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1007233d2500723e5594f3e7c70896ffeeef32b9c950ywan x1 = x0 +12 + (mv->col >> 3); 1008233d2500723e5594f3e7c70896ffeeef32b9c950ywan y1 = y0 + 4 + (mv->row >> 3); 1009233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1010233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (x0+12, &x1, y0+4, &y1, width, height); 1011233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (x0+12, x1, y0+4, y1, y_buffer, y_stride); 1012233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1013233d2500723e5594f3e7c70896ffeeef32b9c950ywan bmi = &mi->bmi[8]; 1014233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1015233d2500723e5594f3e7c70896ffeeef32b9c950ywan x1 = x0 + 4 + (mv->col >> 3); 1016233d2500723e5594f3e7c70896ffeeef32b9c950ywan y1 = y0 +12 + (mv->row >> 3); 1017233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1018233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (x0+4, &x1, y0+12, &y1, width, height); 1019233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (x0+4, x1, y0+12, y1, y_buffer, y_stride); 1020233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1021233d2500723e5594f3e7c70896ffeeef32b9c950ywan bmi = &mi->bmi[10]; 1022233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1023233d2500723e5594f3e7c70896ffeeef32b9c950ywan x1 = x0 +12 + (mv->col >> 3); 1024233d2500723e5594f3e7c70896ffeeef32b9c950ywan y1 = y0 +12 + (mv->row >> 3); 1025233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1026233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (x0+12, &x1, y0+12, &y1, width, height); 1027233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (x0+12, x1, y0+12, y1, y_buffer, y_stride); 1028233d2500723e5594f3e7c70896ffeeef32b9c950ywan break; 1029233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1030233d2500723e5594f3e7c70896ffeeef32b9c950ywan default : 1031233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1032233d2500723e5594f3e7c70896ffeeef32b9c950ywan union b_mode_info *bmi = mi->bmi; 1033233d2500723e5594f3e7c70896ffeeef32b9c950ywan int bx0, by0; 1034233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1035233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (by0 = y0; by0 < (y0+16); by0 += 4) 1036233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1037233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (bx0 = x0; bx0 < (x0+16); bx0 += 4) 1038233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1039233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV *mv = &bmi->mv.as_mv; 1040233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1041233d2500723e5594f3e7c70896ffeeef32b9c950ywan x1 = bx0 + 2 + (mv->col >> 3); 1042233d2500723e5594f3e7c70896ffeeef32b9c950ywan y1 = by0 + 2 + (mv->row >> 3); 1043233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1044233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (bx0+2, &x1, by0+2, &y1, width, height); 1045233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (bx0+2, x1, by0+2, y1, y_buffer, y_stride); 1046233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1047233d2500723e5594f3e7c70896ffeeef32b9c950ywan bmi++; 1048233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1049233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1050233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1051233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1052233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1053233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (mi->mbmi.mode >= NEARESTMV) 1054233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1055233d2500723e5594f3e7c70896ffeeef32b9c950ywan MV *mv = &mi->mbmi.mv.as_mv; 1056233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int lx0 = x0 + 8; 1057233d2500723e5594f3e7c70896ffeeef32b9c950ywan const int ly0 = y0 + 8; 1058233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1059233d2500723e5594f3e7c70896ffeeef32b9c950ywan x1 = lx0 + (mv->col >> 3); 1060233d2500723e5594f3e7c70896ffeeef32b9c950ywan y1 = ly0 + (mv->row >> 3); 1061233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1062233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (x1 != lx0 && y1 != ly0) 1063233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1064233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (lx0, &x1, ly0-1, &y1, width, height); 1065233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (lx0, x1, ly0-1, y1, y_buffer, y_stride); 1066233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1067233d2500723e5594f3e7c70896ffeeef32b9c950ywan constrain_line (lx0, &x1, ly0+1, &y1, width, height); 1068233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (lx0, x1, ly0+1, y1, y_buffer, y_stride); 1069233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1070233d2500723e5594f3e7c70896ffeeef32b9c950ywan else 1071233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blit_line (lx0, x1, ly0, y1, y_buffer, y_stride); 1072233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1073233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1074233d2500723e5594f3e7c70896ffeeef32b9c950ywan mi++; 1075233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1076233d2500723e5594f3e7c70896ffeeef32b9c950ywan mi++; 1077233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1078233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1079233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1080233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Color in block modes */ 1081233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((flags & VP8D_DEBUG_CLR_BLK_MODES) 1082233d2500723e5594f3e7c70896ffeeef32b9c950ywan && (ppflags->display_mb_modes_flag || ppflags->display_b_modes_flag)) 1083233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1084233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y, x; 1085233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer; 1086233d2500723e5594f3e7c70896ffeeef32b9c950ywan int width = post->y_width; 1087233d2500723e5594f3e7c70896ffeeef32b9c950ywan int height = post->y_height; 1088233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *y_ptr = oci->post_proc_buffer.y_buffer; 1089233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *u_ptr = oci->post_proc_buffer.u_buffer; 1090233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *v_ptr = oci->post_proc_buffer.v_buffer; 1091233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y_stride = oci->post_proc_buffer.y_stride; 1092233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_INFO *mi = oci->mi; 1093233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1094233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (y = 0; y < height; y += 16) 1095233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1096233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (x = 0; x < width; x += 16) 1097233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1098233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Y = 0, U = 0, V = 0; 1099233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1100233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (mi->mbmi.mode == B_PRED && 1101233d2500723e5594f3e7c70896ffeeef32b9c950ywan ((ppflags->display_mb_modes_flag & B_PRED) || ppflags->display_b_modes_flag)) 1102233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1103233d2500723e5594f3e7c70896ffeeef32b9c950ywan int by, bx; 1104233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *yl, *ul, *vl; 1105233d2500723e5594f3e7c70896ffeeef32b9c950ywan union b_mode_info *bmi = mi->bmi; 1106233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1107233d2500723e5594f3e7c70896ffeeef32b9c950ywan yl = y_ptr + x; 1108233d2500723e5594f3e7c70896ffeeef32b9c950ywan ul = u_ptr + (x>>1); 1109233d2500723e5594f3e7c70896ffeeef32b9c950ywan vl = v_ptr + (x>>1); 1110233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1111233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (by = 0; by < 16; by += 4) 1112233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1113233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (bx = 0; bx < 16; bx += 4) 1114233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1115233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((ppflags->display_b_modes_flag & (1<<mi->mbmi.mode)) 1116233d2500723e5594f3e7c70896ffeeef32b9c950ywan || (ppflags->display_mb_modes_flag & B_PRED)) 1117233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1118233d2500723e5594f3e7c70896ffeeef32b9c950ywan Y = B_PREDICTION_MODE_colors[bmi->as_mode][0]; 1119233d2500723e5594f3e7c70896ffeeef32b9c950ywan U = B_PREDICTION_MODE_colors[bmi->as_mode][1]; 1120233d2500723e5594f3e7c70896ffeeef32b9c950ywan V = B_PREDICTION_MODE_colors[bmi->as_mode][2]; 1121233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1122233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blend_b 1123233d2500723e5594f3e7c70896ffeeef32b9c950ywan (yl+bx, ul+(bx>>1), vl+(bx>>1), Y, U, V, 0xc000, y_stride); 1124233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1125233d2500723e5594f3e7c70896ffeeef32b9c950ywan bmi++; 1126233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1127233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1128233d2500723e5594f3e7c70896ffeeef32b9c950ywan yl += y_stride*4; 1129233d2500723e5594f3e7c70896ffeeef32b9c950ywan ul += y_stride*1; 1130233d2500723e5594f3e7c70896ffeeef32b9c950ywan vl += y_stride*1; 1131233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1132233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1133233d2500723e5594f3e7c70896ffeeef32b9c950ywan else if (ppflags->display_mb_modes_flag & (1<<mi->mbmi.mode)) 1134233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1135233d2500723e5594f3e7c70896ffeeef32b9c950ywan Y = MB_PREDICTION_MODE_colors[mi->mbmi.mode][0]; 1136233d2500723e5594f3e7c70896ffeeef32b9c950ywan U = MB_PREDICTION_MODE_colors[mi->mbmi.mode][1]; 1137233d2500723e5594f3e7c70896ffeeef32b9c950ywan V = MB_PREDICTION_MODE_colors[mi->mbmi.mode][2]; 1138233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1139233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blend_mb_inner 1140233d2500723e5594f3e7c70896ffeeef32b9c950ywan (y_ptr+x, u_ptr+(x>>1), v_ptr+(x>>1), Y, U, V, 0xc000, y_stride); 1141233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1142233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1143233d2500723e5594f3e7c70896ffeeef32b9c950ywan mi++; 1144233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1145233d2500723e5594f3e7c70896ffeeef32b9c950ywan y_ptr += y_stride*16; 1146233d2500723e5594f3e7c70896ffeeef32b9c950ywan u_ptr += y_stride*4; 1147233d2500723e5594f3e7c70896ffeeef32b9c950ywan v_ptr += y_stride*4; 1148233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1149233d2500723e5594f3e7c70896ffeeef32b9c950ywan mi++; 1150233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1151233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1152233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1153233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* Color in frame reference blocks */ 1154233d2500723e5594f3e7c70896ffeeef32b9c950ywan if ((flags & VP8D_DEBUG_CLR_FRM_REF_BLKS) && ppflags->display_ref_frame_flag) 1155233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1156233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y, x; 1157233d2500723e5594f3e7c70896ffeeef32b9c950ywan YV12_BUFFER_CONFIG *post = &oci->post_proc_buffer; 1158233d2500723e5594f3e7c70896ffeeef32b9c950ywan int width = post->y_width; 1159233d2500723e5594f3e7c70896ffeeef32b9c950ywan int height = post->y_height; 1160233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *y_ptr = oci->post_proc_buffer.y_buffer; 1161233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *u_ptr = oci->post_proc_buffer.u_buffer; 1162233d2500723e5594f3e7c70896ffeeef32b9c950ywan unsigned char *v_ptr = oci->post_proc_buffer.v_buffer; 1163233d2500723e5594f3e7c70896ffeeef32b9c950ywan int y_stride = oci->post_proc_buffer.y_stride; 1164233d2500723e5594f3e7c70896ffeeef32b9c950ywan MODE_INFO *mi = oci->mi; 1165233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1166233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (y = 0; y < height; y += 16) 1167233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1168233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (x = 0; x < width; x +=16) 1169233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1170233d2500723e5594f3e7c70896ffeeef32b9c950ywan int Y = 0, U = 0, V = 0; 1171233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1172233d2500723e5594f3e7c70896ffeeef32b9c950ywan if (ppflags->display_ref_frame_flag & (1<<mi->mbmi.ref_frame)) 1173233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 1174233d2500723e5594f3e7c70896ffeeef32b9c950ywan Y = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][0]; 1175233d2500723e5594f3e7c70896ffeeef32b9c950ywan U = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][1]; 1176233d2500723e5594f3e7c70896ffeeef32b9c950ywan V = MV_REFERENCE_FRAME_colors[mi->mbmi.ref_frame][2]; 1177233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1178233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_blend_mb_outer 1179233d2500723e5594f3e7c70896ffeeef32b9c950ywan (y_ptr+x, u_ptr+(x>>1), v_ptr+(x>>1), Y, U, V, 0xc000, y_stride); 1180233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1181233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1182233d2500723e5594f3e7c70896ffeeef32b9c950ywan mi++; 1183233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1184233d2500723e5594f3e7c70896ffeeef32b9c950ywan y_ptr += y_stride*16; 1185233d2500723e5594f3e7c70896ffeeef32b9c950ywan u_ptr += y_stride*4; 1186233d2500723e5594f3e7c70896ffeeef32b9c950ywan v_ptr += y_stride*4; 1187233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1188233d2500723e5594f3e7c70896ffeeef32b9c950ywan mi++; 1189233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1190233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 1191233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1192233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1193233d2500723e5594f3e7c70896ffeeef32b9c950ywan *dest = oci->post_proc_buffer; 1194233d2500723e5594f3e7c70896ffeeef32b9c950ywan 1195233d2500723e5594f3e7c70896ffeeef32b9c950ywan /* handle problem with extending borders */ 1196233d2500723e5594f3e7c70896ffeeef32b9c950ywan dest->y_width = oci->Width; 1197233d2500723e5594f3e7c70896ffeeef32b9c950ywan dest->y_height = oci->Height; 1198233d2500723e5594f3e7c70896ffeeef32b9c950ywan dest->uv_height = dest->y_height / 2; 1199233d2500723e5594f3e7c70896ffeeef32b9c950ywan return 0; 1200233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 1201233d2500723e5594f3e7c70896ffeeef32b9c950ywan#endif 1202