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